]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/python/contrib/Lib/test/test_curses.py
Inital import
[l4.git] / l4 / pkg / python / contrib / Lib / test / test_curses.py
1 #
2 # Test script for the curses module
3 #
4 # This script doesn't actually display anything very coherent. but it
5 # does call every method and function.
6 #
7 # Functions not tested: {def,reset}_{shell,prog}_mode, getch(), getstr(),
8 # init_color()
9 # Only called, not tested: getmouse(), ungetmouse()
10 #
11
12 import curses, sys, tempfile, os
13 import curses.panel
14
15 # Optionally test curses module.  This currently requires that the
16 # 'curses' resource be given on the regrtest command line using the -u
17 # option.  If not available, nothing after this line will be executed.
18
19 from test.test_support import requires, TestSkipped
20 requires('curses')
21
22 # XXX: if newterm was supported we could use it instead of initscr and not exit
23 term = os.environ.get('TERM')
24 if not term or term == 'unknown':
25     raise TestSkipped, "$TERM=%r, calling initscr() may cause exit" % term
26
27 if sys.platform == "cygwin":
28     raise TestSkipped("cygwin's curses mostly just hangs")
29
30 def window_funcs(stdscr):
31     "Test the methods of windows"
32     win = curses.newwin(10,10)
33     win = curses.newwin(5,5, 5,5)
34     win2 = curses.newwin(15,15, 5,5)
35
36     for meth in [stdscr.addch, stdscr.addstr]:
37         for args in [('a'), ('a', curses.A_BOLD),
38                      (4,4, 'a'), (5,5, 'a', curses.A_BOLD)]:
39             meth(*args)
40
41     for meth in [stdscr.box, stdscr.clear, stdscr.clrtobot,
42                  stdscr.clrtoeol, stdscr.cursyncup, stdscr.delch,
43                  stdscr.deleteln, stdscr.erase, stdscr.getbegyx,
44                  stdscr.getbkgd, stdscr.getkey, stdscr.getmaxyx,
45                  stdscr.getparyx, stdscr.getyx, stdscr.inch,
46                  stdscr.insertln, stdscr.instr, stdscr.is_wintouched,
47                  win.noutrefresh, stdscr.redrawwin, stdscr.refresh,
48                  stdscr.standout, stdscr.standend, stdscr.syncdown,
49                  stdscr.syncup, stdscr.touchwin, stdscr.untouchwin]:
50         meth()
51
52     stdscr.addnstr('1234', 3)
53     stdscr.addnstr('1234', 3, curses.A_BOLD)
54     stdscr.addnstr(4,4, '1234', 3)
55     stdscr.addnstr(5,5, '1234', 3, curses.A_BOLD)
56
57     stdscr.attron(curses.A_BOLD)
58     stdscr.attroff(curses.A_BOLD)
59     stdscr.attrset(curses.A_BOLD)
60     stdscr.bkgd(' ')
61     stdscr.bkgd(' ', curses.A_REVERSE)
62     stdscr.bkgdset(' ')
63     stdscr.bkgdset(' ', curses.A_REVERSE)
64
65     win.border(65, 66, 67, 68,
66                69, 70, 71, 72)
67     win.border('|', '!', '-', '_',
68                '+', '\\', '#', '/')
69     try:
70         win.border(65, 66, 67, 68,
71                    69, [], 71, 72)
72     except TypeError:
73         pass
74     else:
75         raise RuntimeError, "Expected win.border() to raise TypeError"
76
77     stdscr.clearok(1)
78
79     win4 = stdscr.derwin(2,2)
80     win4 = stdscr.derwin(1,1, 5,5)
81     win4.mvderwin(9,9)
82
83     stdscr.echochar('a')
84     stdscr.echochar('a', curses.A_BOLD)
85     stdscr.hline('-', 5)
86     stdscr.hline('-', 5, curses.A_BOLD)
87     stdscr.hline(1,1,'-', 5)
88     stdscr.hline(1,1,'-', 5, curses.A_BOLD)
89
90     stdscr.idcok(1)
91     stdscr.idlok(1)
92     stdscr.immedok(1)
93     stdscr.insch('c')
94     stdscr.insdelln(1)
95     stdscr.insnstr('abc', 3)
96     stdscr.insnstr('abc', 3, curses.A_BOLD)
97     stdscr.insnstr(5, 5, 'abc', 3)
98     stdscr.insnstr(5, 5, 'abc', 3, curses.A_BOLD)
99
100     stdscr.insstr('def')
101     stdscr.insstr('def', curses.A_BOLD)
102     stdscr.insstr(5, 5, 'def')
103     stdscr.insstr(5, 5, 'def', curses.A_BOLD)
104     stdscr.is_linetouched(0)
105     stdscr.keypad(1)
106     stdscr.leaveok(1)
107     stdscr.move(3,3)
108     win.mvwin(2,2)
109     stdscr.nodelay(1)
110     stdscr.notimeout(1)
111     win2.overlay(win)
112     win2.overwrite(win)
113     win2.overlay(win, 1, 2, 3, 3, 2, 1)
114     win2.overwrite(win, 1, 2, 3, 3, 2, 1)
115     stdscr.redrawln(1,2)
116
117     stdscr.scrollok(1)
118     stdscr.scroll()
119     stdscr.scroll(2)
120     stdscr.scroll(-3)
121
122     stdscr.move(12, 2)
123     stdscr.setscrreg(10,15)
124     win3 = stdscr.subwin(10,10)
125     win3 = stdscr.subwin(10,10, 5,5)
126     stdscr.syncok(1)
127     stdscr.timeout(5)
128     stdscr.touchline(5,5)
129     stdscr.touchline(5,5,0)
130     stdscr.vline('a', 3)
131     stdscr.vline('a', 3, curses.A_STANDOUT)
132     stdscr.chgat(5, 2, 3, curses.A_BLINK)
133     stdscr.chgat(3, curses.A_BOLD)
134     stdscr.chgat(5, 8, curses.A_UNDERLINE)
135     stdscr.chgat(curses.A_BLINK)
136     stdscr.refresh()
137
138     stdscr.vline(1,1, 'a', 3)
139     stdscr.vline(1,1, 'a', 3, curses.A_STANDOUT)
140
141     if hasattr(curses, 'resize'):
142         stdscr.resize()
143     if hasattr(curses, 'enclose'):
144         stdscr.enclose()
145
146
147 def module_funcs(stdscr):
148     "Test module-level functions"
149
150     for func in [curses.baudrate, curses.beep, curses.can_change_color,
151                  curses.cbreak, curses.def_prog_mode, curses.doupdate,
152                  curses.filter, curses.flash, curses.flushinp,
153                  curses.has_colors, curses.has_ic, curses.has_il,
154                  curses.isendwin, curses.killchar, curses.longname,
155                  curses.nocbreak, curses.noecho, curses.nonl,
156                  curses.noqiflush, curses.noraw,
157                  curses.reset_prog_mode, curses.termattrs,
158                  curses.termname, curses.erasechar, curses.getsyx]:
159         func()
160
161     # Functions that actually need arguments
162     if curses.tigetstr("cnorm"):
163         curses.curs_set(1)
164     curses.delay_output(1)
165     curses.echo() ; curses.echo(1)
166
167     f = tempfile.TemporaryFile()
168     stdscr.putwin(f)
169     f.seek(0)
170     curses.getwin(f)
171     f.close()
172
173     curses.halfdelay(1)
174     curses.intrflush(1)
175     curses.meta(1)
176     curses.napms(100)
177     curses.newpad(50,50)
178     win = curses.newwin(5,5)
179     win = curses.newwin(5,5, 1,1)
180     curses.nl() ; curses.nl(1)
181     curses.putp('abc')
182     curses.qiflush()
183     curses.raw() ; curses.raw(1)
184     curses.setsyx(5,5)
185     curses.tigetflag('hc')
186     curses.tigetnum('co')
187     curses.tigetstr('cr')
188     curses.tparm('cr')
189     curses.typeahead(sys.__stdin__.fileno())
190     curses.unctrl('a')
191     curses.ungetch('a')
192     curses.use_env(1)
193
194     # Functions only available on a few platforms
195     if curses.has_colors():
196         curses.start_color()
197         curses.init_pair(2, 1,1)
198         curses.color_content(1)
199         curses.color_pair(2)
200         curses.pair_content(curses.COLOR_PAIRS - 1)
201         curses.pair_number(0)
202
203         if hasattr(curses, 'use_default_colors'):
204             curses.use_default_colors()
205
206     if hasattr(curses, 'keyname'):
207         curses.keyname(13)
208
209     if hasattr(curses, 'has_key'):
210         curses.has_key(13)
211
212     if hasattr(curses, 'getmouse'):
213         (availmask, oldmask) = curses.mousemask(curses.BUTTON1_PRESSED)
214         # availmask indicates that mouse stuff not available.
215         if availmask != 0:
216             curses.mouseinterval(10)
217             # just verify these don't cause errors
218             m = curses.getmouse()
219             curses.ungetmouse(*m)
220
221     if hasattr(curses, 'is_term_resized'):
222         curses.is_term_resized(*stdscr.getmaxyx())
223     if hasattr(curses, 'resizeterm'):
224         curses.resizeterm(*stdscr.getmaxyx())
225     if hasattr(curses, 'resize_term'):
226         curses.resize_term(*stdscr.getmaxyx())
227
228 def unit_tests():
229     from curses import ascii
230     for ch, expected in [('a', 'a'), ('A', 'A'),
231                          (';', ';'), (' ', ' '),
232                          ('\x7f', '^?'), ('\n', '^J'), ('\0', '^@'),
233                          # Meta-bit characters
234                          ('\x8a', '!^J'), ('\xc1', '!A'),
235                          ]:
236         if ascii.unctrl(ch) != expected:
237             print 'curses.unctrl fails on character', repr(ch)
238
239
240 def test_userptr_without_set(stdscr):
241     w = curses.newwin(10, 10)
242     p = curses.panel.new_panel(w)
243     # try to access userptr() before calling set_userptr() -- segfaults
244     try:
245         p.userptr()
246         raise RuntimeError, 'userptr should fail since not set'
247     except curses.panel.error:
248         pass
249
250 def test_resize_term(stdscr):
251     if hasattr(curses, 'resizeterm'):
252         lines, cols = curses.LINES, curses.COLS
253         curses.resizeterm(lines - 1, cols + 1)
254
255         if curses.LINES != lines - 1 or curses.COLS != cols + 1:
256             raise RuntimeError, "Expected resizeterm to update LINES and COLS"
257
258 def main(stdscr):
259     curses.savetty()
260     try:
261         module_funcs(stdscr)
262         window_funcs(stdscr)
263         test_userptr_without_set(stdscr)
264         test_resize_term(stdscr)
265     finally:
266         curses.resetty()
267
268 if __name__ == '__main__':
269     curses.wrapper(main)
270     unit_tests()
271 else:
272     # testing setupterm() inside initscr/endwin
273     # causes terminal breakage
274     curses.setupterm(fd=sys.__stdout__.fileno())
275     try:
276         stdscr = curses.initscr()
277         main(stdscr)
278     finally:
279         curses.endwin()
280     unit_tests()