blob: 6d3ab7c0400a203ea02ec3ea11bebf14b34efd63 [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)
Miss Islington (bot)87c66e42017-11-01 06:11:18 -0700145 stdscr.immedok(0)
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300146 stdscr.insch('c')
147 stdscr.insdelln(1)
148 stdscr.insnstr('abc', 3)
149 stdscr.insnstr('abc', 3, curses.A_BOLD)
150 stdscr.insnstr(5, 5, 'abc', 3)
151 stdscr.insnstr(5, 5, 'abc', 3, curses.A_BOLD)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000152
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300153 stdscr.insstr('def')
154 stdscr.insstr('def', curses.A_BOLD)
155 stdscr.insstr(5, 5, 'def')
156 stdscr.insstr(5, 5, 'def', curses.A_BOLD)
157 stdscr.is_linetouched(0)
158 stdscr.keypad(1)
159 stdscr.leaveok(1)
160 stdscr.move(3,3)
161 win.mvwin(2,2)
162 stdscr.nodelay(1)
163 stdscr.notimeout(1)
164 win2.overlay(win)
165 win2.overwrite(win)
166 win2.overlay(win, 1, 2, 2, 1, 3, 3)
167 win2.overwrite(win, 1, 2, 2, 1, 3, 3)
168 stdscr.redrawln(1,2)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000169
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300170 stdscr.scrollok(1)
171 stdscr.scroll()
172 stdscr.scroll(2)
173 stdscr.scroll(-3)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000174
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300175 stdscr.move(12, 2)
176 stdscr.setscrreg(10,15)
177 win3 = stdscr.subwin(10,10)
178 win3 = stdscr.subwin(10,10, 5,5)
Miss Islington (bot)87c66e42017-11-01 06:11:18 -0700179 if hasattr(stdscr, 'syncok') and not sys.platform.startswith("sunos"):
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200180 stdscr.syncok(1)
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300181 stdscr.timeout(5)
182 stdscr.touchline(5,5)
183 stdscr.touchline(5,5,0)
184 stdscr.vline('a', 3)
185 stdscr.vline('a', 3, curses.A_STANDOUT)
Miss Islington (bot)87c66e42017-11-01 06:11:18 -0700186 if hasattr(stdscr, 'chgat'):
187 stdscr.chgat(5, 2, 3, curses.A_BLINK)
188 stdscr.chgat(3, curses.A_BOLD)
189 stdscr.chgat(5, 8, curses.A_UNDERLINE)
190 stdscr.chgat(curses.A_BLINK)
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300191 stdscr.refresh()
Andrew M. Kuchling400a49b2007-04-11 13:39:00 +0000192
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300193 stdscr.vline(1,1, 'a', 3)
194 stdscr.vline(1,1, 'a', 3, curses.A_STANDOUT)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000195
Miss Islington (bot)87c66e42017-11-01 06:11:18 -0700196 if hasattr(stdscr, 'resize'):
197 stdscr.resize(25, 80)
198 if hasattr(stdscr, 'enclose'):
199 stdscr.enclose(10, 10)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000200
Benjamin Petersonf6701202016-08-13 18:15:28 -0700201 self.assertRaises(ValueError, stdscr.getstr, -400)
202 self.assertRaises(ValueError, stdscr.getstr, 2, 3, -400)
Benjamin Peterson505989c2016-08-15 21:40:14 -0700203 self.assertRaises(ValueError, stdscr.instr, -2)
204 self.assertRaises(ValueError, stdscr.instr, 2, 3, -2)
Benjamin Petersonf6701202016-08-13 18:15:28 -0700205
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000206
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300207 def test_module_funcs(self):
208 "Test module-level functions"
209 for func in [curses.baudrate, curses.beep, curses.can_change_color,
210 curses.cbreak, curses.def_prog_mode, curses.doupdate,
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200211 curses.flash, curses.flushinp,
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300212 curses.has_colors, curses.has_ic, curses.has_il,
213 curses.isendwin, curses.killchar, curses.longname,
214 curses.nocbreak, curses.noecho, curses.nonl,
215 curses.noqiflush, curses.noraw,
216 curses.reset_prog_mode, curses.termattrs,
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200217 curses.termname, curses.erasechar]:
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300218 func()
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200219 if hasattr(curses, 'filter'):
220 curses.filter()
221 if hasattr(curses, 'getsyx'):
222 curses.getsyx()
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000223
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300224 # Functions that actually need arguments
225 if curses.tigetstr("cnorm"):
226 curses.curs_set(1)
227 curses.delay_output(1)
228 curses.echo() ; curses.echo(1)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000229
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300230 with tempfile.TemporaryFile() as f:
231 self.stdscr.putwin(f)
232 f.seek(0)
233 curses.getwin(f)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000234
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300235 curses.halfdelay(1)
236 curses.intrflush(1)
237 curses.meta(1)
238 curses.napms(100)
239 curses.newpad(50,50)
240 win = curses.newwin(5,5)
241 win = curses.newwin(5,5, 1,1)
242 curses.nl() ; curses.nl(1)
243 curses.putp(b'abc')
244 curses.qiflush()
245 curses.raw() ; curses.raw(1)
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200246 if hasattr(curses, 'setsyx'):
247 curses.setsyx(5,5)
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300248 curses.tigetflag('hc')
249 curses.tigetnum('co')
250 curses.tigetstr('cr')
251 curses.tparm(b'cr')
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200252 if hasattr(curses, 'typeahead'):
253 curses.typeahead(sys.__stdin__.fileno())
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300254 curses.unctrl('a')
255 curses.ungetch('a')
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200256 if hasattr(curses, 'use_env'):
257 curses.use_env(1)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000258
259 # Functions only available on a few platforms
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300260 def test_colors_funcs(self):
261 if not curses.has_colors():
Xavier de Gaye92201112017-01-06 09:44:36 +0100262 self.skipTest('requires colors support')
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000263 curses.start_color()
264 curses.init_pair(2, 1,1)
265 curses.color_content(1)
266 curses.color_pair(2)
Andrew M. Kuchlingd1badac2005-06-15 18:44:23 +0000267 curses.pair_content(curses.COLOR_PAIRS - 1)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000268 curses.pair_number(0)
269
Michael W. Hudson2b3feec2004-08-07 15:27:16 +0000270 if hasattr(curses, 'use_default_colors'):
271 curses.use_default_colors()
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +0000272
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300273 @requires_curses_func('keyname')
274 def test_keyname(self):
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000275 curses.keyname(13)
276
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300277 @requires_curses_func('has_key')
278 def test_has_key(self):
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000279 curses.has_key(13)
280
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300281 @requires_curses_func('getmouse')
282 def test_getmouse(self):
Anthony Baxtere94e3b42006-04-06 07:12:39 +0000283 (availmask, oldmask) = curses.mousemask(curses.BUTTON1_PRESSED)
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300284 if availmask == 0:
Xavier de Gaye92201112017-01-06 09:44:36 +0100285 self.skipTest('mouse stuff not available')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300286 curses.mouseinterval(10)
287 # just verify these don't cause errors
288 curses.ungetmouse(0, 0, 0, 0, curses.BUTTON1_PRESSED)
289 m = curses.getmouse()
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000290
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200291 @requires_curses_func('panel')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300292 def test_userptr_without_set(self):
293 w = curses.newwin(10, 10)
294 p = curses.panel.new_panel(w)
295 # try to access userptr() before calling set_userptr() -- segfaults
296 with self.assertRaises(curses.panel.error,
297 msg='userptr should fail since not set'):
298 p.userptr()
Walter Dörwald4994d952006-06-19 08:07:50 +0000299
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200300 @requires_curses_func('panel')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300301 def test_userptr_memory_leak(self):
302 w = curses.newwin(10, 10)
303 p = curses.panel.new_panel(w)
304 obj = object()
305 nrefs = sys.getrefcount(obj)
306 for i in range(100):
307 p.set_userptr(obj)
Tim Peters58eb11c2004-01-18 20:29:55 +0000308
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300309 p.set_userptr(None)
310 self.assertEqual(sys.getrefcount(obj), nrefs,
311 "set_userptr leaked references")
Andrew M. Kuchlinge752e202003-08-29 18:37:37 +0000312
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200313 @requires_curses_func('panel')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300314 def test_userptr_segfault(self):
315 panel = curses.panel.new_panel(self.stdscr)
316 class A:
317 def __del__(self):
318 panel.set_userptr(None)
319 panel.set_userptr(A())
320 panel.set_userptr(None)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000321
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200322 @requires_curses_func('panel')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300323 def test_new_curses_panel(self):
324 panel = curses.panel.new_panel(self.stdscr)
325 self.assertRaises(TypeError, type(panel))
Andrew Kuchlinga49dcc52013-06-15 13:53:10 -0400326
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300327 @requires_curses_func('is_term_resized')
328 def test_is_term_resized(self):
329 curses.is_term_resized(*self.stdscr.getmaxyx())
Andrew Kuchlinga49dcc52013-06-15 13:53:10 -0400330
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300331 @requires_curses_func('resize_term')
332 def test_resize_term(self):
333 curses.resize_term(*self.stdscr.getmaxyx())
Andrew Kuchlingaa6c2972013-06-22 12:33:05 -0400334
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300335 @requires_curses_func('resizeterm')
336 def test_resizeterm(self):
337 stdscr = self.stdscr
Walter Dörwaldd391f082007-03-06 20:38:57 +0000338 lines, cols = curses.LINES, curses.COLS
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300339 new_lines = lines - 1
340 new_cols = cols + 1
341 curses.resizeterm(new_lines, new_cols)
Tim Petersea5962f2007-03-12 18:07:52 +0000342
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300343 self.assertEqual(curses.LINES, new_lines)
344 self.assertEqual(curses.COLS, new_cols)
Walter Dörwaldd391f082007-03-06 20:38:57 +0000345
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300346 def test_issue6243(self):
347 curses.ungetch(1025)
348 self.stdscr.getkey()
Andrew M. Kuchlingb49e53e2009-09-25 22:23:54 +0000349
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300350 def test_issue10570(self):
351 b = curses.tparm(curses.tigetstr("cup"), 5, 3)
352 self.assertIs(type(b), bytes)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000353
Serhiy Storchaka4d42af12016-12-28 10:16:06 +0200354 def test_issue13051(self):
355 stdscr = self.stdscr
Miss Islington (bot)87c66e42017-11-01 06:11:18 -0700356 if not hasattr(stdscr, 'resize'):
357 raise unittest.SkipTest('requires curses.window.resize')
Serhiy Storchaka4d42af12016-12-28 10:16:06 +0200358 box = curses.textpad.Textbox(stdscr, insert_mode=True)
359 lines, cols = stdscr.getmaxyx()
360 stdscr.resize(lines-2, cols-2)
361 # this may cause infinite recursion, leading to a RuntimeError
362 box._insert_printable_char('a')
363
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300364
365class TestAscii(unittest.TestCase):
366
Serhiy Storchaka41833872016-06-18 22:08:49 +0300367 def test_controlnames(self):
368 for name in curses.ascii.controlnames:
369 self.assertTrue(hasattr(curses.ascii, name), name)
370
371 def test_ctypes(self):
372 def check(func, expected):
373 self.assertEqual(func(i), expected)
374 self.assertEqual(func(c), expected)
375
376 for i in range(256):
377 c = b = chr(i)
378 check(curses.ascii.isalnum, b.isalnum())
379 check(curses.ascii.isalpha, b.isalpha())
380 check(curses.ascii.isdigit, b.isdigit())
381 check(curses.ascii.islower, b.islower())
382 check(curses.ascii.isspace, b.isspace())
383 check(curses.ascii.isupper, b.isupper())
384
385 check(curses.ascii.isascii, i < 128)
386 check(curses.ascii.ismeta, i >= 128)
387 check(curses.ascii.isctrl, i < 32)
388 check(curses.ascii.iscntrl, i < 32 or i == 127)
389 check(curses.ascii.isblank, c in ' \t')
390 check(curses.ascii.isgraph, 32 < i <= 126)
391 check(curses.ascii.isprint, 32 <= i <= 126)
392 check(curses.ascii.ispunct, c in string.punctuation)
393 check(curses.ascii.isxdigit, c in string.hexdigits)
394
Serhiy Storchakaf77fe6b2016-12-28 10:04:27 +0200395 for i in (-2, -1, 256, sys.maxunicode, sys.maxunicode+1):
396 self.assertFalse(curses.ascii.isalnum(i))
397 self.assertFalse(curses.ascii.isalpha(i))
398 self.assertFalse(curses.ascii.isdigit(i))
399 self.assertFalse(curses.ascii.islower(i))
400 self.assertFalse(curses.ascii.isspace(i))
401 self.assertFalse(curses.ascii.isupper(i))
402
403 self.assertFalse(curses.ascii.isascii(i))
404 self.assertFalse(curses.ascii.isctrl(i))
405 self.assertFalse(curses.ascii.iscntrl(i))
406 self.assertFalse(curses.ascii.isblank(i))
407 self.assertFalse(curses.ascii.isgraph(i))
408 self.assertFalse(curses.ascii.isprint(i))
409 self.assertFalse(curses.ascii.ispunct(i))
410 self.assertFalse(curses.ascii.isxdigit(i))
411
412 self.assertFalse(curses.ascii.ismeta(-1))
413
Serhiy Storchaka41833872016-06-18 22:08:49 +0300414 def test_ascii(self):
415 ascii = curses.ascii.ascii
416 self.assertEqual(ascii('\xc1'), 'A')
417 self.assertEqual(ascii('A'), 'A')
418 self.assertEqual(ascii(ord('\xc1')), ord('A'))
419
420 def test_ctrl(self):
421 ctrl = curses.ascii.ctrl
422 self.assertEqual(ctrl('J'), '\n')
423 self.assertEqual(ctrl('\n'), '\n')
424 self.assertEqual(ctrl('@'), '\0')
425 self.assertEqual(ctrl(ord('J')), ord('\n'))
426
427 def test_alt(self):
428 alt = curses.ascii.alt
429 self.assertEqual(alt('\n'), '\x8a')
430 self.assertEqual(alt('A'), '\xc1')
431 self.assertEqual(alt(ord('A')), 0xc1)
432
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300433 def test_unctrl(self):
434 unctrl = curses.ascii.unctrl
435 self.assertEqual(unctrl('a'), 'a')
436 self.assertEqual(unctrl('A'), 'A')
437 self.assertEqual(unctrl(';'), ';')
438 self.assertEqual(unctrl(' '), ' ')
439 self.assertEqual(unctrl('\x7f'), '^?')
440 self.assertEqual(unctrl('\n'), '^J')
441 self.assertEqual(unctrl('\0'), '^@')
Serhiy Storchaka41833872016-06-18 22:08:49 +0300442 self.assertEqual(unctrl(ord('A')), 'A')
443 self.assertEqual(unctrl(ord('\n')), '^J')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300444 # Meta-bit characters
445 self.assertEqual(unctrl('\x8a'), '!^J')
446 self.assertEqual(unctrl('\xc1'), '!A')
Serhiy Storchaka41833872016-06-18 22:08:49 +0300447 self.assertEqual(unctrl(ord('\x8a')), '!^J')
448 self.assertEqual(unctrl(ord('\xc1')), '!A')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300449
450
451def test_main():
452 run_unittest(TestCurses, TestAscii)
453
454
455if __name__ == "__main__":
456 unittest.main()