blob: 502c2228a5f137d2909f3150be8f2c505b9316fb [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
Miss Islington (bot)b6947702017-11-01 12:24:00 -070095 for meth in [stdscr.clear, stdscr.clrtobot,
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +030096 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
Miss Islington (bot)b6947702017-11-01 12:24:00 -0700128 win.box(65, 67)
129 win.box('!', '_')
130 win.box(b':', b'~')
131 self.assertRaises(TypeError, win.box, 65, 66, 67)
132 self.assertRaises(TypeError, win.box, 65)
133 win.box()
134
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300135 stdscr.clearok(1)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000136
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300137 win4 = stdscr.derwin(2,2)
138 win4 = stdscr.derwin(1,1, 5,5)
139 win4.mvderwin(9,9)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000140
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300141 stdscr.echochar('a')
142 stdscr.echochar('a', curses.A_BOLD)
143 stdscr.hline('-', 5)
144 stdscr.hline('-', 5, curses.A_BOLD)
145 stdscr.hline(1,1,'-', 5)
146 stdscr.hline(1,1,'-', 5, curses.A_BOLD)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000147
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300148 stdscr.idcok(1)
149 stdscr.idlok(1)
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200150 if hasattr(stdscr, 'immedok'):
151 stdscr.immedok(1)
Miss Islington (bot)87c66e42017-11-01 06:11:18 -0700152 stdscr.immedok(0)
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300153 stdscr.insch('c')
154 stdscr.insdelln(1)
155 stdscr.insnstr('abc', 3)
156 stdscr.insnstr('abc', 3, curses.A_BOLD)
157 stdscr.insnstr(5, 5, 'abc', 3)
158 stdscr.insnstr(5, 5, 'abc', 3, curses.A_BOLD)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000159
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300160 stdscr.insstr('def')
161 stdscr.insstr('def', curses.A_BOLD)
162 stdscr.insstr(5, 5, 'def')
163 stdscr.insstr(5, 5, 'def', curses.A_BOLD)
164 stdscr.is_linetouched(0)
165 stdscr.keypad(1)
166 stdscr.leaveok(1)
167 stdscr.move(3,3)
168 win.mvwin(2,2)
169 stdscr.nodelay(1)
170 stdscr.notimeout(1)
171 win2.overlay(win)
172 win2.overwrite(win)
173 win2.overlay(win, 1, 2, 2, 1, 3, 3)
174 win2.overwrite(win, 1, 2, 2, 1, 3, 3)
175 stdscr.redrawln(1,2)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000176
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300177 stdscr.scrollok(1)
178 stdscr.scroll()
179 stdscr.scroll(2)
180 stdscr.scroll(-3)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000181
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300182 stdscr.move(12, 2)
183 stdscr.setscrreg(10,15)
184 win3 = stdscr.subwin(10,10)
185 win3 = stdscr.subwin(10,10, 5,5)
Miss Islington (bot)87c66e42017-11-01 06:11:18 -0700186 if hasattr(stdscr, 'syncok') and not sys.platform.startswith("sunos"):
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200187 stdscr.syncok(1)
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300188 stdscr.timeout(5)
189 stdscr.touchline(5,5)
190 stdscr.touchline(5,5,0)
191 stdscr.vline('a', 3)
192 stdscr.vline('a', 3, curses.A_STANDOUT)
Miss Islington (bot)87c66e42017-11-01 06:11:18 -0700193 if hasattr(stdscr, 'chgat'):
194 stdscr.chgat(5, 2, 3, curses.A_BLINK)
195 stdscr.chgat(3, curses.A_BOLD)
196 stdscr.chgat(5, 8, curses.A_UNDERLINE)
197 stdscr.chgat(curses.A_BLINK)
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300198 stdscr.refresh()
Andrew M. Kuchling400a49b2007-04-11 13:39:00 +0000199
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300200 stdscr.vline(1,1, 'a', 3)
201 stdscr.vline(1,1, 'a', 3, curses.A_STANDOUT)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000202
Miss Islington (bot)87c66e42017-11-01 06:11:18 -0700203 if hasattr(stdscr, 'resize'):
204 stdscr.resize(25, 80)
205 if hasattr(stdscr, 'enclose'):
206 stdscr.enclose(10, 10)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000207
Benjamin Petersonf6701202016-08-13 18:15:28 -0700208 self.assertRaises(ValueError, stdscr.getstr, -400)
209 self.assertRaises(ValueError, stdscr.getstr, 2, 3, -400)
Benjamin Peterson505989c2016-08-15 21:40:14 -0700210 self.assertRaises(ValueError, stdscr.instr, -2)
211 self.assertRaises(ValueError, stdscr.instr, 2, 3, -2)
Benjamin Petersonf6701202016-08-13 18:15:28 -0700212
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000213
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300214 def test_module_funcs(self):
215 "Test module-level functions"
216 for func in [curses.baudrate, curses.beep, curses.can_change_color,
217 curses.cbreak, curses.def_prog_mode, curses.doupdate,
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200218 curses.flash, curses.flushinp,
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300219 curses.has_colors, curses.has_ic, curses.has_il,
220 curses.isendwin, curses.killchar, curses.longname,
221 curses.nocbreak, curses.noecho, curses.nonl,
222 curses.noqiflush, curses.noraw,
223 curses.reset_prog_mode, curses.termattrs,
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200224 curses.termname, curses.erasechar]:
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300225 func()
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200226 if hasattr(curses, 'filter'):
227 curses.filter()
228 if hasattr(curses, 'getsyx'):
229 curses.getsyx()
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000230
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300231 # Functions that actually need arguments
232 if curses.tigetstr("cnorm"):
233 curses.curs_set(1)
234 curses.delay_output(1)
235 curses.echo() ; curses.echo(1)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000236
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300237 with tempfile.TemporaryFile() as f:
238 self.stdscr.putwin(f)
239 f.seek(0)
240 curses.getwin(f)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000241
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300242 curses.halfdelay(1)
243 curses.intrflush(1)
244 curses.meta(1)
245 curses.napms(100)
246 curses.newpad(50,50)
247 win = curses.newwin(5,5)
248 win = curses.newwin(5,5, 1,1)
249 curses.nl() ; curses.nl(1)
250 curses.putp(b'abc')
251 curses.qiflush()
252 curses.raw() ; curses.raw(1)
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200253 if hasattr(curses, 'setsyx'):
254 curses.setsyx(5,5)
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300255 curses.tigetflag('hc')
256 curses.tigetnum('co')
257 curses.tigetstr('cr')
258 curses.tparm(b'cr')
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200259 if hasattr(curses, 'typeahead'):
260 curses.typeahead(sys.__stdin__.fileno())
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300261 curses.unctrl('a')
262 curses.ungetch('a')
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200263 if hasattr(curses, 'use_env'):
264 curses.use_env(1)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000265
266 # Functions only available on a few platforms
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300267 def test_colors_funcs(self):
268 if not curses.has_colors():
Xavier de Gaye92201112017-01-06 09:44:36 +0100269 self.skipTest('requires colors support')
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000270 curses.start_color()
271 curses.init_pair(2, 1,1)
272 curses.color_content(1)
273 curses.color_pair(2)
Andrew M. Kuchlingd1badac2005-06-15 18:44:23 +0000274 curses.pair_content(curses.COLOR_PAIRS - 1)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000275 curses.pair_number(0)
276
Michael W. Hudson2b3feec2004-08-07 15:27:16 +0000277 if hasattr(curses, 'use_default_colors'):
278 curses.use_default_colors()
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +0000279
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300280 @requires_curses_func('keyname')
281 def test_keyname(self):
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000282 curses.keyname(13)
283
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300284 @requires_curses_func('has_key')
285 def test_has_key(self):
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000286 curses.has_key(13)
287
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300288 @requires_curses_func('getmouse')
289 def test_getmouse(self):
Anthony Baxtere94e3b42006-04-06 07:12:39 +0000290 (availmask, oldmask) = curses.mousemask(curses.BUTTON1_PRESSED)
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300291 if availmask == 0:
Xavier de Gaye92201112017-01-06 09:44:36 +0100292 self.skipTest('mouse stuff not available')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300293 curses.mouseinterval(10)
294 # just verify these don't cause errors
295 curses.ungetmouse(0, 0, 0, 0, curses.BUTTON1_PRESSED)
296 m = curses.getmouse()
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000297
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200298 @requires_curses_func('panel')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300299 def test_userptr_without_set(self):
300 w = curses.newwin(10, 10)
301 p = curses.panel.new_panel(w)
302 # try to access userptr() before calling set_userptr() -- segfaults
303 with self.assertRaises(curses.panel.error,
304 msg='userptr should fail since not set'):
305 p.userptr()
Walter Dörwald4994d952006-06-19 08:07:50 +0000306
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200307 @requires_curses_func('panel')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300308 def test_userptr_memory_leak(self):
309 w = curses.newwin(10, 10)
310 p = curses.panel.new_panel(w)
311 obj = object()
312 nrefs = sys.getrefcount(obj)
313 for i in range(100):
314 p.set_userptr(obj)
Tim Peters58eb11c2004-01-18 20:29:55 +0000315
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300316 p.set_userptr(None)
317 self.assertEqual(sys.getrefcount(obj), nrefs,
318 "set_userptr leaked references")
Andrew M. Kuchlinge752e202003-08-29 18:37:37 +0000319
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200320 @requires_curses_func('panel')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300321 def test_userptr_segfault(self):
322 panel = curses.panel.new_panel(self.stdscr)
323 class A:
324 def __del__(self):
325 panel.set_userptr(None)
326 panel.set_userptr(A())
327 panel.set_userptr(None)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000328
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200329 @requires_curses_func('panel')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300330 def test_new_curses_panel(self):
331 panel = curses.panel.new_panel(self.stdscr)
332 self.assertRaises(TypeError, type(panel))
Andrew Kuchlinga49dcc52013-06-15 13:53:10 -0400333
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300334 @requires_curses_func('is_term_resized')
335 def test_is_term_resized(self):
336 curses.is_term_resized(*self.stdscr.getmaxyx())
Andrew Kuchlinga49dcc52013-06-15 13:53:10 -0400337
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300338 @requires_curses_func('resize_term')
339 def test_resize_term(self):
340 curses.resize_term(*self.stdscr.getmaxyx())
Andrew Kuchlingaa6c2972013-06-22 12:33:05 -0400341
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300342 @requires_curses_func('resizeterm')
343 def test_resizeterm(self):
344 stdscr = self.stdscr
Walter Dörwaldd391f082007-03-06 20:38:57 +0000345 lines, cols = curses.LINES, curses.COLS
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300346 new_lines = lines - 1
347 new_cols = cols + 1
348 curses.resizeterm(new_lines, new_cols)
Tim Petersea5962f2007-03-12 18:07:52 +0000349
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300350 self.assertEqual(curses.LINES, new_lines)
351 self.assertEqual(curses.COLS, new_cols)
Walter Dörwaldd391f082007-03-06 20:38:57 +0000352
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300353 def test_issue6243(self):
354 curses.ungetch(1025)
355 self.stdscr.getkey()
Andrew M. Kuchlingb49e53e2009-09-25 22:23:54 +0000356
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300357 def test_issue10570(self):
358 b = curses.tparm(curses.tigetstr("cup"), 5, 3)
359 self.assertIs(type(b), bytes)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000360
Serhiy Storchaka4d42af12016-12-28 10:16:06 +0200361 def test_issue13051(self):
362 stdscr = self.stdscr
Miss Islington (bot)87c66e42017-11-01 06:11:18 -0700363 if not hasattr(stdscr, 'resize'):
364 raise unittest.SkipTest('requires curses.window.resize')
Serhiy Storchaka4d42af12016-12-28 10:16:06 +0200365 box = curses.textpad.Textbox(stdscr, insert_mode=True)
366 lines, cols = stdscr.getmaxyx()
367 stdscr.resize(lines-2, cols-2)
368 # this may cause infinite recursion, leading to a RuntimeError
369 box._insert_printable_char('a')
370
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300371
372class TestAscii(unittest.TestCase):
373
Serhiy Storchaka41833872016-06-18 22:08:49 +0300374 def test_controlnames(self):
375 for name in curses.ascii.controlnames:
376 self.assertTrue(hasattr(curses.ascii, name), name)
377
378 def test_ctypes(self):
379 def check(func, expected):
380 self.assertEqual(func(i), expected)
381 self.assertEqual(func(c), expected)
382
383 for i in range(256):
384 c = b = chr(i)
385 check(curses.ascii.isalnum, b.isalnum())
386 check(curses.ascii.isalpha, b.isalpha())
387 check(curses.ascii.isdigit, b.isdigit())
388 check(curses.ascii.islower, b.islower())
389 check(curses.ascii.isspace, b.isspace())
390 check(curses.ascii.isupper, b.isupper())
391
392 check(curses.ascii.isascii, i < 128)
393 check(curses.ascii.ismeta, i >= 128)
394 check(curses.ascii.isctrl, i < 32)
395 check(curses.ascii.iscntrl, i < 32 or i == 127)
396 check(curses.ascii.isblank, c in ' \t')
397 check(curses.ascii.isgraph, 32 < i <= 126)
398 check(curses.ascii.isprint, 32 <= i <= 126)
399 check(curses.ascii.ispunct, c in string.punctuation)
400 check(curses.ascii.isxdigit, c in string.hexdigits)
401
Serhiy Storchakaf77fe6b2016-12-28 10:04:27 +0200402 for i in (-2, -1, 256, sys.maxunicode, sys.maxunicode+1):
403 self.assertFalse(curses.ascii.isalnum(i))
404 self.assertFalse(curses.ascii.isalpha(i))
405 self.assertFalse(curses.ascii.isdigit(i))
406 self.assertFalse(curses.ascii.islower(i))
407 self.assertFalse(curses.ascii.isspace(i))
408 self.assertFalse(curses.ascii.isupper(i))
409
410 self.assertFalse(curses.ascii.isascii(i))
411 self.assertFalse(curses.ascii.isctrl(i))
412 self.assertFalse(curses.ascii.iscntrl(i))
413 self.assertFalse(curses.ascii.isblank(i))
414 self.assertFalse(curses.ascii.isgraph(i))
415 self.assertFalse(curses.ascii.isprint(i))
416 self.assertFalse(curses.ascii.ispunct(i))
417 self.assertFalse(curses.ascii.isxdigit(i))
418
419 self.assertFalse(curses.ascii.ismeta(-1))
420
Serhiy Storchaka41833872016-06-18 22:08:49 +0300421 def test_ascii(self):
422 ascii = curses.ascii.ascii
423 self.assertEqual(ascii('\xc1'), 'A')
424 self.assertEqual(ascii('A'), 'A')
425 self.assertEqual(ascii(ord('\xc1')), ord('A'))
426
427 def test_ctrl(self):
428 ctrl = curses.ascii.ctrl
429 self.assertEqual(ctrl('J'), '\n')
430 self.assertEqual(ctrl('\n'), '\n')
431 self.assertEqual(ctrl('@'), '\0')
432 self.assertEqual(ctrl(ord('J')), ord('\n'))
433
434 def test_alt(self):
435 alt = curses.ascii.alt
436 self.assertEqual(alt('\n'), '\x8a')
437 self.assertEqual(alt('A'), '\xc1')
438 self.assertEqual(alt(ord('A')), 0xc1)
439
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300440 def test_unctrl(self):
441 unctrl = curses.ascii.unctrl
442 self.assertEqual(unctrl('a'), 'a')
443 self.assertEqual(unctrl('A'), 'A')
444 self.assertEqual(unctrl(';'), ';')
445 self.assertEqual(unctrl(' '), ' ')
446 self.assertEqual(unctrl('\x7f'), '^?')
447 self.assertEqual(unctrl('\n'), '^J')
448 self.assertEqual(unctrl('\0'), '^@')
Serhiy Storchaka41833872016-06-18 22:08:49 +0300449 self.assertEqual(unctrl(ord('A')), 'A')
450 self.assertEqual(unctrl(ord('\n')), '^J')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300451 # Meta-bit characters
452 self.assertEqual(unctrl('\x8a'), '!^J')
453 self.assertEqual(unctrl('\xc1'), '!A')
Serhiy Storchaka41833872016-06-18 22:08:49 +0300454 self.assertEqual(unctrl(ord('\x8a')), '!^J')
455 self.assertEqual(unctrl(ord('\xc1')), '!A')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300456
457
458def test_main():
459 run_unittest(TestCurses, TestAscii)
460
461
462if __name__ == "__main__":
463 unittest.main()