blob: 0ee8f058c033533b363cedefad29cf026d0c207a [file] [log] [blame]
Andrew M. Kuchling2158df02001-10-22 15:26:09 +00001#
2# Test script for the curses module
3#
4# This script doesn't actually display anything very coherent. but it
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +03005# does call (nearly) every method and function.
Andrew M. Kuchling2158df02001-10-22 15:26:09 +00006#
7# Functions not tested: {def,reset}_{shell,prog}_mode, getch(), getstr(),
Neal Norwitz88bbd732006-01-10 07:05:44 +00008# init_color()
9# Only called, not tested: getmouse(), ungetmouse()
Andrew M. Kuchling2158df02001-10-22 15:26:09 +000010#
11
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +030012import os
Serhiy Storchaka41833872016-06-18 22:08:49 +030013import string
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +030014import sys
15import tempfile
16import unittest
17
Victor Stinner1d481822017-10-31 03:44:55 -070018from test.support import (requires, import_module, verbose, run_unittest,
19 SaveSignals)
20
Andrew M. Kuchling2158df02001-10-22 15:26:09 +000021
22# Optionally test curses module. This currently requires that the
23# 'curses' resource be given on the regrtest command line using the -u
24# option. If not available, nothing after this line will be executed.
Neal Norwitz9f39f682006-01-06 04:18:21 +000025requires('curses')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +030026
27# If either of these don't exist, skip the tests.
R. David Murray3db8a342009-03-30 23:05:48 +000028curses = import_module('curses')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +030029import_module('curses.ascii')
Serhiy Storchaka4d42af12016-12-28 10:16:06 +020030import_module('curses.textpad')
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +020031try:
32 import curses.panel
33except ImportError:
34 pass
Neal Norwitz9f39f682006-01-06 04:18:21 +000035
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +030036def requires_curses_func(name):
37 return unittest.skipUnless(hasattr(curses, name),
38 'requires curses.%s' % name)
Mark Dickinson45ad8012010-02-21 13:37:53 +000039
Neal Norwitz9f39f682006-01-06 04:18:21 +000040term = os.environ.get('TERM')
Andrew M. Kuchling2158df02001-10-22 15:26:09 +000041
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +030042# If newterm was supported we could use it instead of initscr and not exit
43@unittest.skipIf(not term or term == 'unknown',
44 "$TERM=%r, calling initscr() may cause exit" % term)
45@unittest.skipIf(sys.platform == "cygwin",
46 "cygwin's curses mostly just hangs")
47class TestCurses(unittest.TestCase):
Anthony Baxter76801852006-04-04 13:32:08 +000048
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +030049 @classmethod
50 def setUpClass(cls):
51 if not sys.__stdout__.isatty():
52 # Temporary skip tests on non-tty
53 raise unittest.SkipTest('sys.__stdout__ is not a tty')
54 cls.tmp = tempfile.TemporaryFile()
55 fd = cls.tmp.fileno()
56 else:
57 cls.tmp = None
58 fd = sys.__stdout__.fileno()
59 # testing setupterm() inside initscr/endwin
60 # causes terminal breakage
61 curses.setupterm(fd=fd)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +000062
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +030063 @classmethod
64 def tearDownClass(cls):
65 if cls.tmp:
66 cls.tmp.close()
67 del cls.tmp
Andrew M. Kuchling2158df02001-10-22 15:26:09 +000068
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +030069 def setUp(self):
Victor Stinner1d481822017-10-31 03:44:55 -070070 self.save_signals = SaveSignals()
71 self.save_signals.save()
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +030072 if verbose:
73 # just to make the test output a little more readable
Martin Panterad6a99c2016-09-10 10:38:22 +000074 print('')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +030075 self.stdscr = curses.initscr()
76 curses.savetty()
Andrew M. Kuchling2158df02001-10-22 15:26:09 +000077
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +030078 def tearDown(self):
79 curses.resetty()
80 curses.endwin()
Victor Stinner1d481822017-10-31 03:44:55 -070081 self.save_signals.restore()
Andrew M. Kuchling2158df02001-10-22 15:26:09 +000082
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +030083 def test_window_funcs(self):
84 "Test the methods of windows"
85 stdscr = self.stdscr
86 win = curses.newwin(10,10)
87 win = curses.newwin(5,5, 5,5)
88 win2 = curses.newwin(15,15, 5,5)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +000089
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +030090 for meth in [stdscr.addch, stdscr.addstr]:
91 for args in [('a'), ('a', curses.A_BOLD),
92 (4,4, 'a'), (5,5, 'a', curses.A_BOLD)]:
93 meth(*args)
94
95 for meth in [stdscr.box, stdscr.clear, stdscr.clrtobot,
96 stdscr.clrtoeol, stdscr.cursyncup, stdscr.delch,
97 stdscr.deleteln, stdscr.erase, stdscr.getbegyx,
98 stdscr.getbkgd, stdscr.getkey, stdscr.getmaxyx,
99 stdscr.getparyx, stdscr.getyx, stdscr.inch,
100 stdscr.insertln, stdscr.instr, stdscr.is_wintouched,
101 win.noutrefresh, stdscr.redrawwin, stdscr.refresh,
102 stdscr.standout, stdscr.standend, stdscr.syncdown,
103 stdscr.syncup, stdscr.touchwin, stdscr.untouchwin]:
104 meth()
105
106 stdscr.addnstr('1234', 3)
107 stdscr.addnstr('1234', 3, curses.A_BOLD)
108 stdscr.addnstr(4,4, '1234', 3)
109 stdscr.addnstr(5,5, '1234', 3, curses.A_BOLD)
110
111 stdscr.attron(curses.A_BOLD)
112 stdscr.attroff(curses.A_BOLD)
113 stdscr.attrset(curses.A_BOLD)
114 stdscr.bkgd(' ')
115 stdscr.bkgd(' ', curses.A_REVERSE)
116 stdscr.bkgdset(' ')
117 stdscr.bkgdset(' ', curses.A_REVERSE)
118
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000119 win.border(65, 66, 67, 68,
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300120 69, 70, 71, 72)
121 win.border('|', '!', '-', '_',
122 '+', '\\', '#', '/')
123 with self.assertRaises(TypeError,
124 msg="Expected win.border() to raise TypeError"):
125 win.border(65, 66, 67, 68,
126 69, [], 71, 72)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000127
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300128 stdscr.clearok(1)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000129
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300130 win4 = stdscr.derwin(2,2)
131 win4 = stdscr.derwin(1,1, 5,5)
132 win4.mvderwin(9,9)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000133
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300134 stdscr.echochar('a')
135 stdscr.echochar('a', curses.A_BOLD)
136 stdscr.hline('-', 5)
137 stdscr.hline('-', 5, curses.A_BOLD)
138 stdscr.hline(1,1,'-', 5)
139 stdscr.hline(1,1,'-', 5, curses.A_BOLD)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000140
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300141 stdscr.idcok(1)
142 stdscr.idlok(1)
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200143 if hasattr(stdscr, 'immedok'):
144 stdscr.immedok(1)
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300145 stdscr.insch('c')
146 stdscr.insdelln(1)
147 stdscr.insnstr('abc', 3)
148 stdscr.insnstr('abc', 3, curses.A_BOLD)
149 stdscr.insnstr(5, 5, 'abc', 3)
150 stdscr.insnstr(5, 5, 'abc', 3, curses.A_BOLD)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000151
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300152 stdscr.insstr('def')
153 stdscr.insstr('def', curses.A_BOLD)
154 stdscr.insstr(5, 5, 'def')
155 stdscr.insstr(5, 5, 'def', curses.A_BOLD)
156 stdscr.is_linetouched(0)
157 stdscr.keypad(1)
158 stdscr.leaveok(1)
159 stdscr.move(3,3)
160 win.mvwin(2,2)
161 stdscr.nodelay(1)
162 stdscr.notimeout(1)
163 win2.overlay(win)
164 win2.overwrite(win)
165 win2.overlay(win, 1, 2, 2, 1, 3, 3)
166 win2.overwrite(win, 1, 2, 2, 1, 3, 3)
167 stdscr.redrawln(1,2)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000168
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300169 stdscr.scrollok(1)
170 stdscr.scroll()
171 stdscr.scroll(2)
172 stdscr.scroll(-3)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000173
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300174 stdscr.move(12, 2)
175 stdscr.setscrreg(10,15)
176 win3 = stdscr.subwin(10,10)
177 win3 = stdscr.subwin(10,10, 5,5)
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200178 if hasattr(stdscr, 'syncok'):
179 stdscr.syncok(1)
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300180 stdscr.timeout(5)
181 stdscr.touchline(5,5)
182 stdscr.touchline(5,5,0)
183 stdscr.vline('a', 3)
184 stdscr.vline('a', 3, curses.A_STANDOUT)
185 stdscr.chgat(5, 2, 3, curses.A_BLINK)
186 stdscr.chgat(3, curses.A_BOLD)
187 stdscr.chgat(5, 8, curses.A_UNDERLINE)
188 stdscr.chgat(curses.A_BLINK)
189 stdscr.refresh()
Andrew M. Kuchling400a49b2007-04-11 13:39:00 +0000190
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300191 stdscr.vline(1,1, 'a', 3)
192 stdscr.vline(1,1, 'a', 3, curses.A_STANDOUT)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000193
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300194 if hasattr(curses, 'resize'):
195 stdscr.resize()
196 if hasattr(curses, 'enclose'):
197 stdscr.enclose()
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000198
Benjamin Petersonf6701202016-08-13 18:15:28 -0700199 self.assertRaises(ValueError, stdscr.getstr, -400)
200 self.assertRaises(ValueError, stdscr.getstr, 2, 3, -400)
Benjamin Peterson505989c2016-08-15 21:40:14 -0700201 self.assertRaises(ValueError, stdscr.instr, -2)
202 self.assertRaises(ValueError, stdscr.instr, 2, 3, -2)
Benjamin Petersonf6701202016-08-13 18:15:28 -0700203
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000204
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300205 def test_module_funcs(self):
206 "Test module-level functions"
207 for func in [curses.baudrate, curses.beep, curses.can_change_color,
208 curses.cbreak, curses.def_prog_mode, curses.doupdate,
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200209 curses.flash, curses.flushinp,
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300210 curses.has_colors, curses.has_ic, curses.has_il,
211 curses.isendwin, curses.killchar, curses.longname,
212 curses.nocbreak, curses.noecho, curses.nonl,
213 curses.noqiflush, curses.noraw,
214 curses.reset_prog_mode, curses.termattrs,
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200215 curses.termname, curses.erasechar]:
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300216 func()
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200217 if hasattr(curses, 'filter'):
218 curses.filter()
219 if hasattr(curses, 'getsyx'):
220 curses.getsyx()
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000221
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300222 # Functions that actually need arguments
223 if curses.tigetstr("cnorm"):
224 curses.curs_set(1)
225 curses.delay_output(1)
226 curses.echo() ; curses.echo(1)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000227
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300228 with tempfile.TemporaryFile() as f:
229 self.stdscr.putwin(f)
230 f.seek(0)
231 curses.getwin(f)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000232
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300233 curses.halfdelay(1)
234 curses.intrflush(1)
235 curses.meta(1)
236 curses.napms(100)
237 curses.newpad(50,50)
238 win = curses.newwin(5,5)
239 win = curses.newwin(5,5, 1,1)
240 curses.nl() ; curses.nl(1)
241 curses.putp(b'abc')
242 curses.qiflush()
243 curses.raw() ; curses.raw(1)
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200244 if hasattr(curses, 'setsyx'):
245 curses.setsyx(5,5)
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300246 curses.tigetflag('hc')
247 curses.tigetnum('co')
248 curses.tigetstr('cr')
249 curses.tparm(b'cr')
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200250 if hasattr(curses, 'typeahead'):
251 curses.typeahead(sys.__stdin__.fileno())
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300252 curses.unctrl('a')
253 curses.ungetch('a')
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200254 if hasattr(curses, 'use_env'):
255 curses.use_env(1)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000256
257 # Functions only available on a few platforms
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300258 def test_colors_funcs(self):
259 if not curses.has_colors():
Xavier de Gaye92201112017-01-06 09:44:36 +0100260 self.skipTest('requires colors support')
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000261 curses.start_color()
262 curses.init_pair(2, 1,1)
263 curses.color_content(1)
264 curses.color_pair(2)
Andrew M. Kuchlingd1badac2005-06-15 18:44:23 +0000265 curses.pair_content(curses.COLOR_PAIRS - 1)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000266 curses.pair_number(0)
267
Michael W. Hudson2b3feec2004-08-07 15:27:16 +0000268 if hasattr(curses, 'use_default_colors'):
269 curses.use_default_colors()
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +0000270
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300271 @requires_curses_func('keyname')
272 def test_keyname(self):
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000273 curses.keyname(13)
274
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300275 @requires_curses_func('has_key')
276 def test_has_key(self):
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000277 curses.has_key(13)
278
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300279 @requires_curses_func('getmouse')
280 def test_getmouse(self):
Anthony Baxtere94e3b42006-04-06 07:12:39 +0000281 (availmask, oldmask) = curses.mousemask(curses.BUTTON1_PRESSED)
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300282 if availmask == 0:
Xavier de Gaye92201112017-01-06 09:44:36 +0100283 self.skipTest('mouse stuff not available')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300284 curses.mouseinterval(10)
285 # just verify these don't cause errors
286 curses.ungetmouse(0, 0, 0, 0, curses.BUTTON1_PRESSED)
287 m = curses.getmouse()
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000288
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200289 @requires_curses_func('panel')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300290 def test_userptr_without_set(self):
291 w = curses.newwin(10, 10)
292 p = curses.panel.new_panel(w)
293 # try to access userptr() before calling set_userptr() -- segfaults
294 with self.assertRaises(curses.panel.error,
295 msg='userptr should fail since not set'):
296 p.userptr()
Walter Dörwald4994d952006-06-19 08:07:50 +0000297
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200298 @requires_curses_func('panel')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300299 def test_userptr_memory_leak(self):
300 w = curses.newwin(10, 10)
301 p = curses.panel.new_panel(w)
302 obj = object()
303 nrefs = sys.getrefcount(obj)
304 for i in range(100):
305 p.set_userptr(obj)
Tim Peters58eb11c2004-01-18 20:29:55 +0000306
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300307 p.set_userptr(None)
308 self.assertEqual(sys.getrefcount(obj), nrefs,
309 "set_userptr leaked references")
Andrew M. Kuchlinge752e202003-08-29 18:37:37 +0000310
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200311 @requires_curses_func('panel')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300312 def test_userptr_segfault(self):
313 panel = curses.panel.new_panel(self.stdscr)
314 class A:
315 def __del__(self):
316 panel.set_userptr(None)
317 panel.set_userptr(A())
318 panel.set_userptr(None)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000319
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200320 @requires_curses_func('panel')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300321 def test_new_curses_panel(self):
322 panel = curses.panel.new_panel(self.stdscr)
323 self.assertRaises(TypeError, type(panel))
Andrew Kuchlinga49dcc52013-06-15 13:53:10 -0400324
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300325 @requires_curses_func('is_term_resized')
326 def test_is_term_resized(self):
327 curses.is_term_resized(*self.stdscr.getmaxyx())
Andrew Kuchlinga49dcc52013-06-15 13:53:10 -0400328
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300329 @requires_curses_func('resize_term')
330 def test_resize_term(self):
331 curses.resize_term(*self.stdscr.getmaxyx())
Andrew Kuchlingaa6c2972013-06-22 12:33:05 -0400332
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300333 @requires_curses_func('resizeterm')
334 def test_resizeterm(self):
335 stdscr = self.stdscr
Walter Dörwaldd391f082007-03-06 20:38:57 +0000336 lines, cols = curses.LINES, curses.COLS
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300337 new_lines = lines - 1
338 new_cols = cols + 1
339 curses.resizeterm(new_lines, new_cols)
Tim Petersea5962f2007-03-12 18:07:52 +0000340
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300341 self.assertEqual(curses.LINES, new_lines)
342 self.assertEqual(curses.COLS, new_cols)
Walter Dörwaldd391f082007-03-06 20:38:57 +0000343
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300344 def test_issue6243(self):
345 curses.ungetch(1025)
346 self.stdscr.getkey()
Andrew M. Kuchlingb49e53e2009-09-25 22:23:54 +0000347
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300348 def test_issue10570(self):
349 b = curses.tparm(curses.tigetstr("cup"), 5, 3)
350 self.assertIs(type(b), bytes)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000351
Serhiy Storchaka4d42af12016-12-28 10:16:06 +0200352 def test_issue13051(self):
353 stdscr = self.stdscr
354 box = curses.textpad.Textbox(stdscr, insert_mode=True)
355 lines, cols = stdscr.getmaxyx()
356 stdscr.resize(lines-2, cols-2)
357 # this may cause infinite recursion, leading to a RuntimeError
358 box._insert_printable_char('a')
359
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300360
361class TestAscii(unittest.TestCase):
362
Serhiy Storchaka41833872016-06-18 22:08:49 +0300363 def test_controlnames(self):
364 for name in curses.ascii.controlnames:
365 self.assertTrue(hasattr(curses.ascii, name), name)
366
367 def test_ctypes(self):
368 def check(func, expected):
369 self.assertEqual(func(i), expected)
370 self.assertEqual(func(c), expected)
371
372 for i in range(256):
373 c = b = chr(i)
374 check(curses.ascii.isalnum, b.isalnum())
375 check(curses.ascii.isalpha, b.isalpha())
376 check(curses.ascii.isdigit, b.isdigit())
377 check(curses.ascii.islower, b.islower())
378 check(curses.ascii.isspace, b.isspace())
379 check(curses.ascii.isupper, b.isupper())
380
381 check(curses.ascii.isascii, i < 128)
382 check(curses.ascii.ismeta, i >= 128)
383 check(curses.ascii.isctrl, i < 32)
384 check(curses.ascii.iscntrl, i < 32 or i == 127)
385 check(curses.ascii.isblank, c in ' \t')
386 check(curses.ascii.isgraph, 32 < i <= 126)
387 check(curses.ascii.isprint, 32 <= i <= 126)
388 check(curses.ascii.ispunct, c in string.punctuation)
389 check(curses.ascii.isxdigit, c in string.hexdigits)
390
Serhiy Storchakaf77fe6b2016-12-28 10:04:27 +0200391 for i in (-2, -1, 256, sys.maxunicode, sys.maxunicode+1):
392 self.assertFalse(curses.ascii.isalnum(i))
393 self.assertFalse(curses.ascii.isalpha(i))
394 self.assertFalse(curses.ascii.isdigit(i))
395 self.assertFalse(curses.ascii.islower(i))
396 self.assertFalse(curses.ascii.isspace(i))
397 self.assertFalse(curses.ascii.isupper(i))
398
399 self.assertFalse(curses.ascii.isascii(i))
400 self.assertFalse(curses.ascii.isctrl(i))
401 self.assertFalse(curses.ascii.iscntrl(i))
402 self.assertFalse(curses.ascii.isblank(i))
403 self.assertFalse(curses.ascii.isgraph(i))
404 self.assertFalse(curses.ascii.isprint(i))
405 self.assertFalse(curses.ascii.ispunct(i))
406 self.assertFalse(curses.ascii.isxdigit(i))
407
408 self.assertFalse(curses.ascii.ismeta(-1))
409
Serhiy Storchaka41833872016-06-18 22:08:49 +0300410 def test_ascii(self):
411 ascii = curses.ascii.ascii
412 self.assertEqual(ascii('\xc1'), 'A')
413 self.assertEqual(ascii('A'), 'A')
414 self.assertEqual(ascii(ord('\xc1')), ord('A'))
415
416 def test_ctrl(self):
417 ctrl = curses.ascii.ctrl
418 self.assertEqual(ctrl('J'), '\n')
419 self.assertEqual(ctrl('\n'), '\n')
420 self.assertEqual(ctrl('@'), '\0')
421 self.assertEqual(ctrl(ord('J')), ord('\n'))
422
423 def test_alt(self):
424 alt = curses.ascii.alt
425 self.assertEqual(alt('\n'), '\x8a')
426 self.assertEqual(alt('A'), '\xc1')
427 self.assertEqual(alt(ord('A')), 0xc1)
428
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300429 def test_unctrl(self):
430 unctrl = curses.ascii.unctrl
431 self.assertEqual(unctrl('a'), 'a')
432 self.assertEqual(unctrl('A'), 'A')
433 self.assertEqual(unctrl(';'), ';')
434 self.assertEqual(unctrl(' '), ' ')
435 self.assertEqual(unctrl('\x7f'), '^?')
436 self.assertEqual(unctrl('\n'), '^J')
437 self.assertEqual(unctrl('\0'), '^@')
Serhiy Storchaka41833872016-06-18 22:08:49 +0300438 self.assertEqual(unctrl(ord('A')), 'A')
439 self.assertEqual(unctrl(ord('\n')), '^J')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300440 # Meta-bit characters
441 self.assertEqual(unctrl('\x8a'), '!^J')
442 self.assertEqual(unctrl('\xc1'), '!A')
Serhiy Storchaka41833872016-06-18 22:08:49 +0300443 self.assertEqual(unctrl(ord('\x8a')), '!^J')
444 self.assertEqual(unctrl(ord('\xc1')), '!A')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300445
446
447def test_main():
448 run_unittest(TestCurses, TestAscii)
449
450
451if __name__ == "__main__":
452 unittest.main()