blob: c7e5b4abd36f98d6306ef5bce2a323f44fd47e37 [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):
Miss Islington (bot)6a9a3312017-11-03 13:11:12 -0700322 w = curses.newwin(10, 10)
323 panel = curses.panel.new_panel(w)
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300324 class A:
325 def __del__(self):
326 panel.set_userptr(None)
327 panel.set_userptr(A())
328 panel.set_userptr(None)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000329
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200330 @requires_curses_func('panel')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300331 def test_new_curses_panel(self):
Miss Islington (bot)6a9a3312017-11-03 13:11:12 -0700332 w = curses.newwin(10, 10)
333 panel = curses.panel.new_panel(w)
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300334 self.assertRaises(TypeError, type(panel))
Andrew Kuchlinga49dcc52013-06-15 13:53:10 -0400335
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300336 @requires_curses_func('is_term_resized')
337 def test_is_term_resized(self):
338 curses.is_term_resized(*self.stdscr.getmaxyx())
Andrew Kuchlinga49dcc52013-06-15 13:53:10 -0400339
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300340 @requires_curses_func('resize_term')
341 def test_resize_term(self):
342 curses.resize_term(*self.stdscr.getmaxyx())
Andrew Kuchlingaa6c2972013-06-22 12:33:05 -0400343
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300344 @requires_curses_func('resizeterm')
345 def test_resizeterm(self):
346 stdscr = self.stdscr
Walter Dörwaldd391f082007-03-06 20:38:57 +0000347 lines, cols = curses.LINES, curses.COLS
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300348 new_lines = lines - 1
349 new_cols = cols + 1
350 curses.resizeterm(new_lines, new_cols)
Tim Petersea5962f2007-03-12 18:07:52 +0000351
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300352 self.assertEqual(curses.LINES, new_lines)
353 self.assertEqual(curses.COLS, new_cols)
Walter Dörwaldd391f082007-03-06 20:38:57 +0000354
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300355 def test_issue6243(self):
356 curses.ungetch(1025)
357 self.stdscr.getkey()
Andrew M. Kuchlingb49e53e2009-09-25 22:23:54 +0000358
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300359 def test_issue10570(self):
360 b = curses.tparm(curses.tigetstr("cup"), 5, 3)
361 self.assertIs(type(b), bytes)
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000362
Serhiy Storchaka4d42af12016-12-28 10:16:06 +0200363 def test_issue13051(self):
364 stdscr = self.stdscr
Miss Islington (bot)87c66e42017-11-01 06:11:18 -0700365 if not hasattr(stdscr, 'resize'):
366 raise unittest.SkipTest('requires curses.window.resize')
Serhiy Storchaka4d42af12016-12-28 10:16:06 +0200367 box = curses.textpad.Textbox(stdscr, insert_mode=True)
368 lines, cols = stdscr.getmaxyx()
369 stdscr.resize(lines-2, cols-2)
370 # this may cause infinite recursion, leading to a RuntimeError
371 box._insert_printable_char('a')
372
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300373
374class TestAscii(unittest.TestCase):
375
Serhiy Storchaka41833872016-06-18 22:08:49 +0300376 def test_controlnames(self):
377 for name in curses.ascii.controlnames:
378 self.assertTrue(hasattr(curses.ascii, name), name)
379
380 def test_ctypes(self):
381 def check(func, expected):
382 self.assertEqual(func(i), expected)
383 self.assertEqual(func(c), expected)
384
385 for i in range(256):
386 c = b = chr(i)
387 check(curses.ascii.isalnum, b.isalnum())
388 check(curses.ascii.isalpha, b.isalpha())
389 check(curses.ascii.isdigit, b.isdigit())
390 check(curses.ascii.islower, b.islower())
391 check(curses.ascii.isspace, b.isspace())
392 check(curses.ascii.isupper, b.isupper())
393
394 check(curses.ascii.isascii, i < 128)
395 check(curses.ascii.ismeta, i >= 128)
396 check(curses.ascii.isctrl, i < 32)
397 check(curses.ascii.iscntrl, i < 32 or i == 127)
398 check(curses.ascii.isblank, c in ' \t')
399 check(curses.ascii.isgraph, 32 < i <= 126)
400 check(curses.ascii.isprint, 32 <= i <= 126)
401 check(curses.ascii.ispunct, c in string.punctuation)
402 check(curses.ascii.isxdigit, c in string.hexdigits)
403
Serhiy Storchakaf77fe6b2016-12-28 10:04:27 +0200404 for i in (-2, -1, 256, sys.maxunicode, sys.maxunicode+1):
405 self.assertFalse(curses.ascii.isalnum(i))
406 self.assertFalse(curses.ascii.isalpha(i))
407 self.assertFalse(curses.ascii.isdigit(i))
408 self.assertFalse(curses.ascii.islower(i))
409 self.assertFalse(curses.ascii.isspace(i))
410 self.assertFalse(curses.ascii.isupper(i))
411
412 self.assertFalse(curses.ascii.isascii(i))
413 self.assertFalse(curses.ascii.isctrl(i))
414 self.assertFalse(curses.ascii.iscntrl(i))
415 self.assertFalse(curses.ascii.isblank(i))
416 self.assertFalse(curses.ascii.isgraph(i))
417 self.assertFalse(curses.ascii.isprint(i))
418 self.assertFalse(curses.ascii.ispunct(i))
419 self.assertFalse(curses.ascii.isxdigit(i))
420
421 self.assertFalse(curses.ascii.ismeta(-1))
422
Serhiy Storchaka41833872016-06-18 22:08:49 +0300423 def test_ascii(self):
424 ascii = curses.ascii.ascii
425 self.assertEqual(ascii('\xc1'), 'A')
426 self.assertEqual(ascii('A'), 'A')
427 self.assertEqual(ascii(ord('\xc1')), ord('A'))
428
429 def test_ctrl(self):
430 ctrl = curses.ascii.ctrl
431 self.assertEqual(ctrl('J'), '\n')
432 self.assertEqual(ctrl('\n'), '\n')
433 self.assertEqual(ctrl('@'), '\0')
434 self.assertEqual(ctrl(ord('J')), ord('\n'))
435
436 def test_alt(self):
437 alt = curses.ascii.alt
438 self.assertEqual(alt('\n'), '\x8a')
439 self.assertEqual(alt('A'), '\xc1')
440 self.assertEqual(alt(ord('A')), 0xc1)
441
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300442 def test_unctrl(self):
443 unctrl = curses.ascii.unctrl
444 self.assertEqual(unctrl('a'), 'a')
445 self.assertEqual(unctrl('A'), 'A')
446 self.assertEqual(unctrl(';'), ';')
447 self.assertEqual(unctrl(' '), ' ')
448 self.assertEqual(unctrl('\x7f'), '^?')
449 self.assertEqual(unctrl('\n'), '^J')
450 self.assertEqual(unctrl('\0'), '^@')
Serhiy Storchaka41833872016-06-18 22:08:49 +0300451 self.assertEqual(unctrl(ord('A')), 'A')
452 self.assertEqual(unctrl(ord('\n')), '^J')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300453 # Meta-bit characters
454 self.assertEqual(unctrl('\x8a'), '!^J')
455 self.assertEqual(unctrl('\xc1'), '!A')
Serhiy Storchaka41833872016-06-18 22:08:49 +0300456 self.assertEqual(unctrl(ord('\x8a')), '!^J')
457 self.assertEqual(unctrl(ord('\xc1')), '!A')
Serhiy Storchakaa8a259e2016-05-22 18:24:48 +0300458
459
460def test_main():
461 run_unittest(TestCurses, TestAscii)
462
463
464if __name__ == "__main__":
465 unittest.main()