17db96d56Sopenharmony_ciimport functools 27db96d56Sopenharmony_ciimport inspect 37db96d56Sopenharmony_ciimport os 47db96d56Sopenharmony_ciimport string 57db96d56Sopenharmony_ciimport sys 67db96d56Sopenharmony_ciimport tempfile 77db96d56Sopenharmony_ciimport unittest 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_cifrom test.support import (requires, verbose, SaveSignals, cpython_only, 107db96d56Sopenharmony_ci check_disallow_instantiation) 117db96d56Sopenharmony_cifrom test.support.import_helper import import_module 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ci# Optionally test curses module. This currently requires that the 147db96d56Sopenharmony_ci# 'curses' resource be given on the regrtest command line using the -u 157db96d56Sopenharmony_ci# option. If not available, nothing after this line will be executed. 167db96d56Sopenharmony_cirequires('curses') 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_ci# If either of these don't exist, skip the tests. 197db96d56Sopenharmony_cicurses = import_module('curses') 207db96d56Sopenharmony_ciimport_module('curses.ascii') 217db96d56Sopenharmony_ciimport_module('curses.textpad') 227db96d56Sopenharmony_citry: 237db96d56Sopenharmony_ci import curses.panel 247db96d56Sopenharmony_ciexcept ImportError: 257db96d56Sopenharmony_ci pass 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_cidef requires_curses_func(name): 287db96d56Sopenharmony_ci return unittest.skipUnless(hasattr(curses, name), 297db96d56Sopenharmony_ci 'requires curses.%s' % name) 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_cidef requires_curses_window_meth(name): 327db96d56Sopenharmony_ci def deco(test): 337db96d56Sopenharmony_ci @functools.wraps(test) 347db96d56Sopenharmony_ci def wrapped(self, *args, **kwargs): 357db96d56Sopenharmony_ci if not hasattr(self.stdscr, name): 367db96d56Sopenharmony_ci raise unittest.SkipTest('requires curses.window.%s' % name) 377db96d56Sopenharmony_ci test(self, *args, **kwargs) 387db96d56Sopenharmony_ci return wrapped 397db96d56Sopenharmony_ci return deco 407db96d56Sopenharmony_ci 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_cidef requires_colors(test): 437db96d56Sopenharmony_ci @functools.wraps(test) 447db96d56Sopenharmony_ci def wrapped(self, *args, **kwargs): 457db96d56Sopenharmony_ci if not curses.has_colors(): 467db96d56Sopenharmony_ci self.skipTest('requires colors support') 477db96d56Sopenharmony_ci curses.start_color() 487db96d56Sopenharmony_ci test(self, *args, **kwargs) 497db96d56Sopenharmony_ci return wrapped 507db96d56Sopenharmony_ci 517db96d56Sopenharmony_citerm = os.environ.get('TERM') 527db96d56Sopenharmony_ciSHORT_MAX = 0x7fff 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci# If newterm was supported we could use it instead of initscr and not exit 557db96d56Sopenharmony_ci@unittest.skipIf(not term or term == 'unknown', 567db96d56Sopenharmony_ci "$TERM=%r, calling initscr() may cause exit" % term) 577db96d56Sopenharmony_ci@unittest.skipIf(sys.platform == "cygwin", 587db96d56Sopenharmony_ci "cygwin's curses mostly just hangs") 597db96d56Sopenharmony_ciclass TestCurses(unittest.TestCase): 607db96d56Sopenharmony_ci 617db96d56Sopenharmony_ci @classmethod 627db96d56Sopenharmony_ci def setUpClass(cls): 637db96d56Sopenharmony_ci if verbose: 647db96d56Sopenharmony_ci print(f'TERM={term}', file=sys.stderr, flush=True) 657db96d56Sopenharmony_ci # testing setupterm() inside initscr/endwin 667db96d56Sopenharmony_ci # causes terminal breakage 677db96d56Sopenharmony_ci stdout_fd = sys.__stdout__.fileno() 687db96d56Sopenharmony_ci curses.setupterm(fd=stdout_fd) 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_ci def setUp(self): 717db96d56Sopenharmony_ci self.isatty = True 727db96d56Sopenharmony_ci self.output = sys.__stdout__ 737db96d56Sopenharmony_ci stdout_fd = sys.__stdout__.fileno() 747db96d56Sopenharmony_ci if not sys.__stdout__.isatty(): 757db96d56Sopenharmony_ci # initstr() unconditionally uses C stdout. 767db96d56Sopenharmony_ci # If it is redirected to file or pipe, try to attach it 777db96d56Sopenharmony_ci # to terminal. 787db96d56Sopenharmony_ci # First, save a copy of the file descriptor of stdout, so it 797db96d56Sopenharmony_ci # can be restored after finishing the test. 807db96d56Sopenharmony_ci dup_fd = os.dup(stdout_fd) 817db96d56Sopenharmony_ci self.addCleanup(os.close, dup_fd) 827db96d56Sopenharmony_ci self.addCleanup(os.dup2, dup_fd, stdout_fd) 837db96d56Sopenharmony_ci 847db96d56Sopenharmony_ci if sys.__stderr__.isatty(): 857db96d56Sopenharmony_ci # If stderr is connected to terminal, use it. 867db96d56Sopenharmony_ci tmp = sys.__stderr__ 877db96d56Sopenharmony_ci self.output = sys.__stderr__ 887db96d56Sopenharmony_ci else: 897db96d56Sopenharmony_ci try: 907db96d56Sopenharmony_ci # Try to open the terminal device. 917db96d56Sopenharmony_ci tmp = open('/dev/tty', 'wb', buffering=0) 927db96d56Sopenharmony_ci except OSError: 937db96d56Sopenharmony_ci # As a fallback, use regular file to write control codes. 947db96d56Sopenharmony_ci # Some functions (like savetty) will not work, but at 957db96d56Sopenharmony_ci # least the garbage control sequences will not be mixed 967db96d56Sopenharmony_ci # with the testing report. 977db96d56Sopenharmony_ci tmp = tempfile.TemporaryFile(mode='wb', buffering=0) 987db96d56Sopenharmony_ci self.isatty = False 997db96d56Sopenharmony_ci self.addCleanup(tmp.close) 1007db96d56Sopenharmony_ci self.output = None 1017db96d56Sopenharmony_ci os.dup2(tmp.fileno(), stdout_fd) 1027db96d56Sopenharmony_ci 1037db96d56Sopenharmony_ci self.save_signals = SaveSignals() 1047db96d56Sopenharmony_ci self.save_signals.save() 1057db96d56Sopenharmony_ci self.addCleanup(self.save_signals.restore) 1067db96d56Sopenharmony_ci if verbose and self.output is not None: 1077db96d56Sopenharmony_ci # just to make the test output a little more readable 1087db96d56Sopenharmony_ci sys.stderr.flush() 1097db96d56Sopenharmony_ci sys.stdout.flush() 1107db96d56Sopenharmony_ci print(file=self.output, flush=True) 1117db96d56Sopenharmony_ci self.stdscr = curses.initscr() 1127db96d56Sopenharmony_ci if self.isatty: 1137db96d56Sopenharmony_ci curses.savetty() 1147db96d56Sopenharmony_ci self.addCleanup(curses.endwin) 1157db96d56Sopenharmony_ci self.addCleanup(curses.resetty) 1167db96d56Sopenharmony_ci self.stdscr.erase() 1177db96d56Sopenharmony_ci 1187db96d56Sopenharmony_ci @requires_curses_func('filter') 1197db96d56Sopenharmony_ci def test_filter(self): 1207db96d56Sopenharmony_ci # TODO: Should be called before initscr() or newterm() are called. 1217db96d56Sopenharmony_ci # TODO: nofilter() 1227db96d56Sopenharmony_ci curses.filter() 1237db96d56Sopenharmony_ci 1247db96d56Sopenharmony_ci @requires_curses_func('use_env') 1257db96d56Sopenharmony_ci def test_use_env(self): 1267db96d56Sopenharmony_ci # TODO: Should be called before initscr() or newterm() are called. 1277db96d56Sopenharmony_ci # TODO: use_tioctl() 1287db96d56Sopenharmony_ci curses.use_env(False) 1297db96d56Sopenharmony_ci curses.use_env(True) 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci def test_create_windows(self): 1327db96d56Sopenharmony_ci win = curses.newwin(5, 10) 1337db96d56Sopenharmony_ci self.assertEqual(win.getbegyx(), (0, 0)) 1347db96d56Sopenharmony_ci self.assertEqual(win.getparyx(), (-1, -1)) 1357db96d56Sopenharmony_ci self.assertEqual(win.getmaxyx(), (5, 10)) 1367db96d56Sopenharmony_ci 1377db96d56Sopenharmony_ci win = curses.newwin(10, 15, 2, 5) 1387db96d56Sopenharmony_ci self.assertEqual(win.getbegyx(), (2, 5)) 1397db96d56Sopenharmony_ci self.assertEqual(win.getparyx(), (-1, -1)) 1407db96d56Sopenharmony_ci self.assertEqual(win.getmaxyx(), (10, 15)) 1417db96d56Sopenharmony_ci 1427db96d56Sopenharmony_ci win2 = win.subwin(3, 7) 1437db96d56Sopenharmony_ci self.assertEqual(win2.getbegyx(), (3, 7)) 1447db96d56Sopenharmony_ci self.assertEqual(win2.getparyx(), (1, 2)) 1457db96d56Sopenharmony_ci self.assertEqual(win2.getmaxyx(), (9, 13)) 1467db96d56Sopenharmony_ci 1477db96d56Sopenharmony_ci win2 = win.subwin(5, 10, 3, 7) 1487db96d56Sopenharmony_ci self.assertEqual(win2.getbegyx(), (3, 7)) 1497db96d56Sopenharmony_ci self.assertEqual(win2.getparyx(), (1, 2)) 1507db96d56Sopenharmony_ci self.assertEqual(win2.getmaxyx(), (5, 10)) 1517db96d56Sopenharmony_ci 1527db96d56Sopenharmony_ci win3 = win.derwin(2, 3) 1537db96d56Sopenharmony_ci self.assertEqual(win3.getbegyx(), (4, 8)) 1547db96d56Sopenharmony_ci self.assertEqual(win3.getparyx(), (2, 3)) 1557db96d56Sopenharmony_ci self.assertEqual(win3.getmaxyx(), (8, 12)) 1567db96d56Sopenharmony_ci 1577db96d56Sopenharmony_ci win3 = win.derwin(6, 11, 2, 3) 1587db96d56Sopenharmony_ci self.assertEqual(win3.getbegyx(), (4, 8)) 1597db96d56Sopenharmony_ci self.assertEqual(win3.getparyx(), (2, 3)) 1607db96d56Sopenharmony_ci self.assertEqual(win3.getmaxyx(), (6, 11)) 1617db96d56Sopenharmony_ci 1627db96d56Sopenharmony_ci win.mvwin(0, 1) 1637db96d56Sopenharmony_ci self.assertEqual(win.getbegyx(), (0, 1)) 1647db96d56Sopenharmony_ci self.assertEqual(win.getparyx(), (-1, -1)) 1657db96d56Sopenharmony_ci self.assertEqual(win.getmaxyx(), (10, 15)) 1667db96d56Sopenharmony_ci self.assertEqual(win2.getbegyx(), (3, 7)) 1677db96d56Sopenharmony_ci self.assertEqual(win2.getparyx(), (1, 2)) 1687db96d56Sopenharmony_ci self.assertEqual(win2.getmaxyx(), (5, 10)) 1697db96d56Sopenharmony_ci self.assertEqual(win3.getbegyx(), (4, 8)) 1707db96d56Sopenharmony_ci self.assertEqual(win3.getparyx(), (2, 3)) 1717db96d56Sopenharmony_ci self.assertEqual(win3.getmaxyx(), (6, 11)) 1727db96d56Sopenharmony_ci 1737db96d56Sopenharmony_ci win2.mvderwin(2, 1) 1747db96d56Sopenharmony_ci self.assertEqual(win2.getbegyx(), (3, 7)) 1757db96d56Sopenharmony_ci self.assertEqual(win2.getparyx(), (2, 1)) 1767db96d56Sopenharmony_ci self.assertEqual(win2.getmaxyx(), (5, 10)) 1777db96d56Sopenharmony_ci 1787db96d56Sopenharmony_ci win3.mvderwin(2, 1) 1797db96d56Sopenharmony_ci self.assertEqual(win3.getbegyx(), (4, 8)) 1807db96d56Sopenharmony_ci self.assertEqual(win3.getparyx(), (2, 1)) 1817db96d56Sopenharmony_ci self.assertEqual(win3.getmaxyx(), (6, 11)) 1827db96d56Sopenharmony_ci 1837db96d56Sopenharmony_ci def test_move_cursor(self): 1847db96d56Sopenharmony_ci stdscr = self.stdscr 1857db96d56Sopenharmony_ci win = stdscr.subwin(10, 15, 2, 5) 1867db96d56Sopenharmony_ci stdscr.move(1, 2) 1877db96d56Sopenharmony_ci win.move(2, 4) 1887db96d56Sopenharmony_ci self.assertEqual(stdscr.getyx(), (1, 2)) 1897db96d56Sopenharmony_ci self.assertEqual(win.getyx(), (2, 4)) 1907db96d56Sopenharmony_ci 1917db96d56Sopenharmony_ci win.cursyncup() 1927db96d56Sopenharmony_ci self.assertEqual(stdscr.getyx(), (4, 9)) 1937db96d56Sopenharmony_ci 1947db96d56Sopenharmony_ci def test_refresh_control(self): 1957db96d56Sopenharmony_ci stdscr = self.stdscr 1967db96d56Sopenharmony_ci # touchwin()/untouchwin()/is_wintouched() 1977db96d56Sopenharmony_ci stdscr.refresh() 1987db96d56Sopenharmony_ci self.assertIs(stdscr.is_wintouched(), False) 1997db96d56Sopenharmony_ci stdscr.touchwin() 2007db96d56Sopenharmony_ci self.assertIs(stdscr.is_wintouched(), True) 2017db96d56Sopenharmony_ci stdscr.refresh() 2027db96d56Sopenharmony_ci self.assertIs(stdscr.is_wintouched(), False) 2037db96d56Sopenharmony_ci stdscr.touchwin() 2047db96d56Sopenharmony_ci self.assertIs(stdscr.is_wintouched(), True) 2057db96d56Sopenharmony_ci stdscr.untouchwin() 2067db96d56Sopenharmony_ci self.assertIs(stdscr.is_wintouched(), False) 2077db96d56Sopenharmony_ci 2087db96d56Sopenharmony_ci # touchline()/untouchline()/is_linetouched() 2097db96d56Sopenharmony_ci stdscr.touchline(5, 2) 2107db96d56Sopenharmony_ci self.assertIs(stdscr.is_linetouched(5), True) 2117db96d56Sopenharmony_ci self.assertIs(stdscr.is_linetouched(6), True) 2127db96d56Sopenharmony_ci self.assertIs(stdscr.is_wintouched(), True) 2137db96d56Sopenharmony_ci stdscr.touchline(5, 1, False) 2147db96d56Sopenharmony_ci self.assertIs(stdscr.is_linetouched(5), False) 2157db96d56Sopenharmony_ci 2167db96d56Sopenharmony_ci # syncup() 2177db96d56Sopenharmony_ci win = stdscr.subwin(10, 15, 2, 5) 2187db96d56Sopenharmony_ci win2 = win.subwin(5, 10, 3, 7) 2197db96d56Sopenharmony_ci win2.touchwin() 2207db96d56Sopenharmony_ci stdscr.untouchwin() 2217db96d56Sopenharmony_ci win2.syncup() 2227db96d56Sopenharmony_ci self.assertIs(win.is_wintouched(), True) 2237db96d56Sopenharmony_ci self.assertIs(stdscr.is_wintouched(), True) 2247db96d56Sopenharmony_ci 2257db96d56Sopenharmony_ci # syncdown() 2267db96d56Sopenharmony_ci stdscr.touchwin() 2277db96d56Sopenharmony_ci win.untouchwin() 2287db96d56Sopenharmony_ci win2.untouchwin() 2297db96d56Sopenharmony_ci win2.syncdown() 2307db96d56Sopenharmony_ci self.assertIs(win2.is_wintouched(), True) 2317db96d56Sopenharmony_ci 2327db96d56Sopenharmony_ci # syncok() 2337db96d56Sopenharmony_ci if hasattr(stdscr, 'syncok') and not sys.platform.startswith("sunos"): 2347db96d56Sopenharmony_ci win.untouchwin() 2357db96d56Sopenharmony_ci stdscr.untouchwin() 2367db96d56Sopenharmony_ci for syncok in [False, True]: 2377db96d56Sopenharmony_ci win2.syncok(syncok) 2387db96d56Sopenharmony_ci win2.addch('a') 2397db96d56Sopenharmony_ci self.assertIs(win.is_wintouched(), syncok) 2407db96d56Sopenharmony_ci self.assertIs(stdscr.is_wintouched(), syncok) 2417db96d56Sopenharmony_ci 2427db96d56Sopenharmony_ci def test_output_character(self): 2437db96d56Sopenharmony_ci stdscr = self.stdscr 2447db96d56Sopenharmony_ci encoding = stdscr.encoding 2457db96d56Sopenharmony_ci # addch() 2467db96d56Sopenharmony_ci stdscr.refresh() 2477db96d56Sopenharmony_ci stdscr.move(0, 0) 2487db96d56Sopenharmony_ci stdscr.addch('A') 2497db96d56Sopenharmony_ci stdscr.addch(b'A') 2507db96d56Sopenharmony_ci stdscr.addch(65) 2517db96d56Sopenharmony_ci c = '\u20ac' 2527db96d56Sopenharmony_ci try: 2537db96d56Sopenharmony_ci stdscr.addch(c) 2547db96d56Sopenharmony_ci except UnicodeEncodeError: 2557db96d56Sopenharmony_ci self.assertRaises(UnicodeEncodeError, c.encode, encoding) 2567db96d56Sopenharmony_ci except OverflowError: 2577db96d56Sopenharmony_ci encoded = c.encode(encoding) 2587db96d56Sopenharmony_ci self.assertNotEqual(len(encoded), 1, repr(encoded)) 2597db96d56Sopenharmony_ci stdscr.addch('A', curses.A_BOLD) 2607db96d56Sopenharmony_ci stdscr.addch(1, 2, 'A') 2617db96d56Sopenharmony_ci stdscr.addch(2, 3, 'A', curses.A_BOLD) 2627db96d56Sopenharmony_ci self.assertIs(stdscr.is_wintouched(), True) 2637db96d56Sopenharmony_ci 2647db96d56Sopenharmony_ci # echochar() 2657db96d56Sopenharmony_ci stdscr.refresh() 2667db96d56Sopenharmony_ci stdscr.move(0, 0) 2677db96d56Sopenharmony_ci stdscr.echochar('A') 2687db96d56Sopenharmony_ci stdscr.echochar(b'A') 2697db96d56Sopenharmony_ci stdscr.echochar(65) 2707db96d56Sopenharmony_ci with self.assertRaises((UnicodeEncodeError, OverflowError)): 2717db96d56Sopenharmony_ci # Unicode is not fully supported yet, but at least it does 2727db96d56Sopenharmony_ci # not crash. 2737db96d56Sopenharmony_ci # It is supposed to fail because either the character is 2747db96d56Sopenharmony_ci # not encodable with the current encoding, or it is encoded to 2757db96d56Sopenharmony_ci # a multibyte sequence. 2767db96d56Sopenharmony_ci stdscr.echochar('\u0114') 2777db96d56Sopenharmony_ci stdscr.echochar('A', curses.A_BOLD) 2787db96d56Sopenharmony_ci self.assertIs(stdscr.is_wintouched(), False) 2797db96d56Sopenharmony_ci 2807db96d56Sopenharmony_ci def test_output_string(self): 2817db96d56Sopenharmony_ci stdscr = self.stdscr 2827db96d56Sopenharmony_ci encoding = stdscr.encoding 2837db96d56Sopenharmony_ci # addstr()/insstr() 2847db96d56Sopenharmony_ci for func in [stdscr.addstr, stdscr.insstr]: 2857db96d56Sopenharmony_ci with self.subTest(func.__qualname__): 2867db96d56Sopenharmony_ci stdscr.move(0, 0) 2877db96d56Sopenharmony_ci func('abcd') 2887db96d56Sopenharmony_ci func(b'abcd') 2897db96d56Sopenharmony_ci s = 'àßçđ' 2907db96d56Sopenharmony_ci try: 2917db96d56Sopenharmony_ci func(s) 2927db96d56Sopenharmony_ci except UnicodeEncodeError: 2937db96d56Sopenharmony_ci self.assertRaises(UnicodeEncodeError, s.encode, encoding) 2947db96d56Sopenharmony_ci func('abcd', curses.A_BOLD) 2957db96d56Sopenharmony_ci func(1, 2, 'abcd') 2967db96d56Sopenharmony_ci func(2, 3, 'abcd', curses.A_BOLD) 2977db96d56Sopenharmony_ci 2987db96d56Sopenharmony_ci # addnstr()/insnstr() 2997db96d56Sopenharmony_ci for func in [stdscr.addnstr, stdscr.insnstr]: 3007db96d56Sopenharmony_ci with self.subTest(func.__qualname__): 3017db96d56Sopenharmony_ci stdscr.move(0, 0) 3027db96d56Sopenharmony_ci func('1234', 3) 3037db96d56Sopenharmony_ci func(b'1234', 3) 3047db96d56Sopenharmony_ci s = '\u0661\u0662\u0663\u0664' 3057db96d56Sopenharmony_ci try: 3067db96d56Sopenharmony_ci func(s, 3) 3077db96d56Sopenharmony_ci except UnicodeEncodeError: 3087db96d56Sopenharmony_ci self.assertRaises(UnicodeEncodeError, s.encode, encoding) 3097db96d56Sopenharmony_ci func('1234', 5) 3107db96d56Sopenharmony_ci func('1234', 3, curses.A_BOLD) 3117db96d56Sopenharmony_ci func(1, 2, '1234', 3) 3127db96d56Sopenharmony_ci func(2, 3, '1234', 3, curses.A_BOLD) 3137db96d56Sopenharmony_ci 3147db96d56Sopenharmony_ci def test_output_string_embedded_null_chars(self): 3157db96d56Sopenharmony_ci # reject embedded null bytes and characters 3167db96d56Sopenharmony_ci stdscr = self.stdscr 3177db96d56Sopenharmony_ci for arg in ['a\0', b'a\0']: 3187db96d56Sopenharmony_ci with self.subTest(arg=arg): 3197db96d56Sopenharmony_ci self.assertRaises(ValueError, stdscr.addstr, arg) 3207db96d56Sopenharmony_ci self.assertRaises(ValueError, stdscr.addnstr, arg, 1) 3217db96d56Sopenharmony_ci self.assertRaises(ValueError, stdscr.insstr, arg) 3227db96d56Sopenharmony_ci self.assertRaises(ValueError, stdscr.insnstr, arg, 1) 3237db96d56Sopenharmony_ci 3247db96d56Sopenharmony_ci def test_read_from_window(self): 3257db96d56Sopenharmony_ci stdscr = self.stdscr 3267db96d56Sopenharmony_ci stdscr.addstr(0, 1, 'ABCD', curses.A_BOLD) 3277db96d56Sopenharmony_ci # inch() 3287db96d56Sopenharmony_ci stdscr.move(0, 1) 3297db96d56Sopenharmony_ci self.assertEqual(stdscr.inch(), 65 | curses.A_BOLD) 3307db96d56Sopenharmony_ci self.assertEqual(stdscr.inch(0, 3), 67 | curses.A_BOLD) 3317db96d56Sopenharmony_ci stdscr.move(0, 0) 3327db96d56Sopenharmony_ci # instr() 3337db96d56Sopenharmony_ci self.assertEqual(stdscr.instr()[:6], b' ABCD ') 3347db96d56Sopenharmony_ci self.assertEqual(stdscr.instr(3)[:6], b' AB') 3357db96d56Sopenharmony_ci self.assertEqual(stdscr.instr(0, 2)[:4], b'BCD ') 3367db96d56Sopenharmony_ci self.assertEqual(stdscr.instr(0, 2, 4), b'BCD ') 3377db96d56Sopenharmony_ci self.assertRaises(ValueError, stdscr.instr, -2) 3387db96d56Sopenharmony_ci self.assertRaises(ValueError, stdscr.instr, 0, 2, -2) 3397db96d56Sopenharmony_ci 3407db96d56Sopenharmony_ci def test_getch(self): 3417db96d56Sopenharmony_ci win = curses.newwin(5, 12, 5, 2) 3427db96d56Sopenharmony_ci 3437db96d56Sopenharmony_ci # TODO: Test with real input by writing to master fd. 3447db96d56Sopenharmony_ci for c in 'spam\n'[::-1]: 3457db96d56Sopenharmony_ci curses.ungetch(c) 3467db96d56Sopenharmony_ci self.assertEqual(win.getch(3, 1), b's'[0]) 3477db96d56Sopenharmony_ci self.assertEqual(win.getyx(), (3, 1)) 3487db96d56Sopenharmony_ci self.assertEqual(win.getch(3, 4), b'p'[0]) 3497db96d56Sopenharmony_ci self.assertEqual(win.getyx(), (3, 4)) 3507db96d56Sopenharmony_ci self.assertEqual(win.getch(), b'a'[0]) 3517db96d56Sopenharmony_ci self.assertEqual(win.getyx(), (3, 4)) 3527db96d56Sopenharmony_ci self.assertEqual(win.getch(), b'm'[0]) 3537db96d56Sopenharmony_ci self.assertEqual(win.getch(), b'\n'[0]) 3547db96d56Sopenharmony_ci 3557db96d56Sopenharmony_ci def test_getstr(self): 3567db96d56Sopenharmony_ci win = curses.newwin(5, 12, 5, 2) 3577db96d56Sopenharmony_ci curses.echo() 3587db96d56Sopenharmony_ci self.addCleanup(curses.noecho) 3597db96d56Sopenharmony_ci 3607db96d56Sopenharmony_ci self.assertRaises(ValueError, win.getstr, -400) 3617db96d56Sopenharmony_ci self.assertRaises(ValueError, win.getstr, 2, 3, -400) 3627db96d56Sopenharmony_ci 3637db96d56Sopenharmony_ci # TODO: Test with real input by writing to master fd. 3647db96d56Sopenharmony_ci for c in 'Lorem\nipsum\ndolor\nsit\namet\n'[::-1]: 3657db96d56Sopenharmony_ci curses.ungetch(c) 3667db96d56Sopenharmony_ci self.assertEqual(win.getstr(3, 1, 2), b'Lo') 3677db96d56Sopenharmony_ci self.assertEqual(win.instr(3, 0), b' Lo ') 3687db96d56Sopenharmony_ci self.assertEqual(win.getstr(3, 5, 10), b'ipsum') 3697db96d56Sopenharmony_ci self.assertEqual(win.instr(3, 0), b' Lo ipsum ') 3707db96d56Sopenharmony_ci self.assertEqual(win.getstr(1, 5), b'dolor') 3717db96d56Sopenharmony_ci self.assertEqual(win.instr(1, 0), b' dolor ') 3727db96d56Sopenharmony_ci self.assertEqual(win.getstr(2), b'si') 3737db96d56Sopenharmony_ci self.assertEqual(win.instr(1, 0), b'si dolor ') 3747db96d56Sopenharmony_ci self.assertEqual(win.getstr(), b'amet') 3757db96d56Sopenharmony_ci self.assertEqual(win.instr(1, 0), b'amet dolor ') 3767db96d56Sopenharmony_ci 3777db96d56Sopenharmony_ci def test_clear(self): 3787db96d56Sopenharmony_ci win = curses.newwin(5, 15, 5, 2) 3797db96d56Sopenharmony_ci lorem_ipsum(win) 3807db96d56Sopenharmony_ci 3817db96d56Sopenharmony_ci win.move(0, 8) 3827db96d56Sopenharmony_ci win.clrtoeol() 3837db96d56Sopenharmony_ci self.assertEqual(win.instr(0, 0).rstrip(), b'Lorem ip') 3847db96d56Sopenharmony_ci self.assertEqual(win.instr(1, 0).rstrip(), b'dolor sit amet,') 3857db96d56Sopenharmony_ci 3867db96d56Sopenharmony_ci win.move(0, 3) 3877db96d56Sopenharmony_ci win.clrtobot() 3887db96d56Sopenharmony_ci self.assertEqual(win.instr(0, 0).rstrip(), b'Lor') 3897db96d56Sopenharmony_ci self.assertEqual(win.instr(1, 0).rstrip(), b'') 3907db96d56Sopenharmony_ci 3917db96d56Sopenharmony_ci for func in [win.erase, win.clear]: 3927db96d56Sopenharmony_ci lorem_ipsum(win) 3937db96d56Sopenharmony_ci func() 3947db96d56Sopenharmony_ci self.assertEqual(win.instr(0, 0).rstrip(), b'') 3957db96d56Sopenharmony_ci self.assertEqual(win.instr(1, 0).rstrip(), b'') 3967db96d56Sopenharmony_ci 3977db96d56Sopenharmony_ci def test_insert_delete(self): 3987db96d56Sopenharmony_ci win = curses.newwin(5, 15, 5, 2) 3997db96d56Sopenharmony_ci lorem_ipsum(win) 4007db96d56Sopenharmony_ci 4017db96d56Sopenharmony_ci win.move(0, 2) 4027db96d56Sopenharmony_ci win.delch() 4037db96d56Sopenharmony_ci self.assertEqual(win.instr(0, 0), b'Loem ipsum ') 4047db96d56Sopenharmony_ci win.delch(0, 7) 4057db96d56Sopenharmony_ci self.assertEqual(win.instr(0, 0), b'Loem ipum ') 4067db96d56Sopenharmony_ci 4077db96d56Sopenharmony_ci win.move(1, 5) 4087db96d56Sopenharmony_ci win.deleteln() 4097db96d56Sopenharmony_ci self.assertEqual(win.instr(0, 0), b'Loem ipum ') 4107db96d56Sopenharmony_ci self.assertEqual(win.instr(1, 0), b'consectetur ') 4117db96d56Sopenharmony_ci self.assertEqual(win.instr(2, 0), b'adipiscing elit') 4127db96d56Sopenharmony_ci self.assertEqual(win.instr(3, 0), b'sed do eiusmod ') 4137db96d56Sopenharmony_ci self.assertEqual(win.instr(4, 0), b' ') 4147db96d56Sopenharmony_ci 4157db96d56Sopenharmony_ci win.move(1, 5) 4167db96d56Sopenharmony_ci win.insertln() 4177db96d56Sopenharmony_ci self.assertEqual(win.instr(0, 0), b'Loem ipum ') 4187db96d56Sopenharmony_ci self.assertEqual(win.instr(1, 0), b' ') 4197db96d56Sopenharmony_ci self.assertEqual(win.instr(2, 0), b'consectetur ') 4207db96d56Sopenharmony_ci 4217db96d56Sopenharmony_ci win.clear() 4227db96d56Sopenharmony_ci lorem_ipsum(win) 4237db96d56Sopenharmony_ci win.move(1, 5) 4247db96d56Sopenharmony_ci win.insdelln(2) 4257db96d56Sopenharmony_ci self.assertEqual(win.instr(0, 0), b'Lorem ipsum ') 4267db96d56Sopenharmony_ci self.assertEqual(win.instr(1, 0), b' ') 4277db96d56Sopenharmony_ci self.assertEqual(win.instr(2, 0), b' ') 4287db96d56Sopenharmony_ci self.assertEqual(win.instr(3, 0), b'dolor sit amet,') 4297db96d56Sopenharmony_ci 4307db96d56Sopenharmony_ci win.clear() 4317db96d56Sopenharmony_ci lorem_ipsum(win) 4327db96d56Sopenharmony_ci win.move(1, 5) 4337db96d56Sopenharmony_ci win.insdelln(-2) 4347db96d56Sopenharmony_ci self.assertEqual(win.instr(0, 0), b'Lorem ipsum ') 4357db96d56Sopenharmony_ci self.assertEqual(win.instr(1, 0), b'adipiscing elit') 4367db96d56Sopenharmony_ci self.assertEqual(win.instr(2, 0), b'sed do eiusmod ') 4377db96d56Sopenharmony_ci self.assertEqual(win.instr(3, 0), b' ') 4387db96d56Sopenharmony_ci 4397db96d56Sopenharmony_ci def test_scroll(self): 4407db96d56Sopenharmony_ci win = curses.newwin(5, 15, 5, 2) 4417db96d56Sopenharmony_ci lorem_ipsum(win) 4427db96d56Sopenharmony_ci win.scrollok(True) 4437db96d56Sopenharmony_ci win.scroll() 4447db96d56Sopenharmony_ci self.assertEqual(win.instr(0, 0), b'dolor sit amet,') 4457db96d56Sopenharmony_ci win.scroll(2) 4467db96d56Sopenharmony_ci self.assertEqual(win.instr(0, 0), b'adipiscing elit') 4477db96d56Sopenharmony_ci win.scroll(-3) 4487db96d56Sopenharmony_ci self.assertEqual(win.instr(0, 0), b' ') 4497db96d56Sopenharmony_ci self.assertEqual(win.instr(2, 0), b' ') 4507db96d56Sopenharmony_ci self.assertEqual(win.instr(3, 0), b'adipiscing elit') 4517db96d56Sopenharmony_ci win.scrollok(False) 4527db96d56Sopenharmony_ci 4537db96d56Sopenharmony_ci def test_attributes(self): 4547db96d56Sopenharmony_ci # TODO: attr_get(), attr_set(), ... 4557db96d56Sopenharmony_ci win = curses.newwin(5, 15, 5, 2) 4567db96d56Sopenharmony_ci win.attron(curses.A_BOLD) 4577db96d56Sopenharmony_ci win.attroff(curses.A_BOLD) 4587db96d56Sopenharmony_ci win.attrset(curses.A_BOLD) 4597db96d56Sopenharmony_ci 4607db96d56Sopenharmony_ci win.standout() 4617db96d56Sopenharmony_ci win.standend() 4627db96d56Sopenharmony_ci 4637db96d56Sopenharmony_ci @requires_curses_window_meth('chgat') 4647db96d56Sopenharmony_ci def test_chgat(self): 4657db96d56Sopenharmony_ci win = curses.newwin(5, 15, 5, 2) 4667db96d56Sopenharmony_ci win.addstr(2, 0, 'Lorem ipsum') 4677db96d56Sopenharmony_ci win.addstr(3, 0, 'dolor sit amet') 4687db96d56Sopenharmony_ci 4697db96d56Sopenharmony_ci win.move(2, 8) 4707db96d56Sopenharmony_ci win.chgat(curses.A_BLINK) 4717db96d56Sopenharmony_ci self.assertEqual(win.inch(2, 7), b'p'[0]) 4727db96d56Sopenharmony_ci self.assertEqual(win.inch(2, 8), b's'[0] | curses.A_BLINK) 4737db96d56Sopenharmony_ci self.assertEqual(win.inch(2, 14), b' '[0] | curses.A_BLINK) 4747db96d56Sopenharmony_ci 4757db96d56Sopenharmony_ci win.move(2, 1) 4767db96d56Sopenharmony_ci win.chgat(3, curses.A_BOLD) 4777db96d56Sopenharmony_ci self.assertEqual(win.inch(2, 0), b'L'[0]) 4787db96d56Sopenharmony_ci self.assertEqual(win.inch(2, 1), b'o'[0] | curses.A_BOLD) 4797db96d56Sopenharmony_ci self.assertEqual(win.inch(2, 3), b'e'[0] | curses.A_BOLD) 4807db96d56Sopenharmony_ci self.assertEqual(win.inch(2, 4), b'm'[0]) 4817db96d56Sopenharmony_ci 4827db96d56Sopenharmony_ci win.chgat(3, 2, curses.A_UNDERLINE) 4837db96d56Sopenharmony_ci self.assertEqual(win.inch(3, 1), b'o'[0]) 4847db96d56Sopenharmony_ci self.assertEqual(win.inch(3, 2), b'l'[0] | curses.A_UNDERLINE) 4857db96d56Sopenharmony_ci self.assertEqual(win.inch(3, 14), b' '[0] | curses.A_UNDERLINE) 4867db96d56Sopenharmony_ci 4877db96d56Sopenharmony_ci win.chgat(3, 4, 7, curses.A_BLINK) 4887db96d56Sopenharmony_ci self.assertEqual(win.inch(3, 3), b'o'[0] | curses.A_UNDERLINE) 4897db96d56Sopenharmony_ci self.assertEqual(win.inch(3, 4), b'r'[0] | curses.A_BLINK) 4907db96d56Sopenharmony_ci self.assertEqual(win.inch(3, 10), b'a'[0] | curses.A_BLINK) 4917db96d56Sopenharmony_ci self.assertEqual(win.inch(3, 11), b'm'[0] | curses.A_UNDERLINE) 4927db96d56Sopenharmony_ci self.assertEqual(win.inch(3, 14), b' '[0] | curses.A_UNDERLINE) 4937db96d56Sopenharmony_ci 4947db96d56Sopenharmony_ci def test_background(self): 4957db96d56Sopenharmony_ci win = curses.newwin(5, 15, 5, 2) 4967db96d56Sopenharmony_ci win.addstr(0, 0, 'Lorem ipsum') 4977db96d56Sopenharmony_ci 4987db96d56Sopenharmony_ci self.assertIn(win.getbkgd(), (0, 32)) 4997db96d56Sopenharmony_ci 5007db96d56Sopenharmony_ci # bkgdset() 5017db96d56Sopenharmony_ci win.bkgdset('_') 5027db96d56Sopenharmony_ci self.assertEqual(win.getbkgd(), b'_'[0]) 5037db96d56Sopenharmony_ci win.bkgdset(b'#') 5047db96d56Sopenharmony_ci self.assertEqual(win.getbkgd(), b'#'[0]) 5057db96d56Sopenharmony_ci win.bkgdset(65) 5067db96d56Sopenharmony_ci self.assertEqual(win.getbkgd(), 65) 5077db96d56Sopenharmony_ci win.bkgdset(0) 5087db96d56Sopenharmony_ci self.assertEqual(win.getbkgd(), 32) 5097db96d56Sopenharmony_ci 5107db96d56Sopenharmony_ci win.bkgdset('#', curses.A_REVERSE) 5117db96d56Sopenharmony_ci self.assertEqual(win.getbkgd(), b'#'[0] | curses.A_REVERSE) 5127db96d56Sopenharmony_ci self.assertEqual(win.inch(0, 0), b'L'[0]) 5137db96d56Sopenharmony_ci self.assertEqual(win.inch(0, 5), b' '[0]) 5147db96d56Sopenharmony_ci win.bkgdset(0) 5157db96d56Sopenharmony_ci 5167db96d56Sopenharmony_ci # bkgd() 5177db96d56Sopenharmony_ci win.bkgd('_') 5187db96d56Sopenharmony_ci self.assertEqual(win.getbkgd(), b'_'[0]) 5197db96d56Sopenharmony_ci self.assertEqual(win.inch(0, 0), b'L'[0]) 5207db96d56Sopenharmony_ci self.assertEqual(win.inch(0, 5), b'_'[0]) 5217db96d56Sopenharmony_ci 5227db96d56Sopenharmony_ci win.bkgd('#', curses.A_REVERSE) 5237db96d56Sopenharmony_ci self.assertEqual(win.getbkgd(), b'#'[0] | curses.A_REVERSE) 5247db96d56Sopenharmony_ci self.assertEqual(win.inch(0, 0), b'L'[0] | curses.A_REVERSE) 5257db96d56Sopenharmony_ci self.assertEqual(win.inch(0, 5), b'#'[0] | curses.A_REVERSE) 5267db96d56Sopenharmony_ci 5277db96d56Sopenharmony_ci def test_overlay(self): 5287db96d56Sopenharmony_ci srcwin = curses.newwin(5, 18, 3, 4) 5297db96d56Sopenharmony_ci lorem_ipsum(srcwin) 5307db96d56Sopenharmony_ci dstwin = curses.newwin(7, 17, 5, 7) 5317db96d56Sopenharmony_ci for i in range(6): 5327db96d56Sopenharmony_ci dstwin.addstr(i, 0, '_'*17) 5337db96d56Sopenharmony_ci 5347db96d56Sopenharmony_ci srcwin.overlay(dstwin) 5357db96d56Sopenharmony_ci self.assertEqual(dstwin.instr(0, 0), b'sectetur_________') 5367db96d56Sopenharmony_ci self.assertEqual(dstwin.instr(1, 0), b'piscing_elit,____') 5377db96d56Sopenharmony_ci self.assertEqual(dstwin.instr(2, 0), b'_do_eiusmod______') 5387db96d56Sopenharmony_ci self.assertEqual(dstwin.instr(3, 0), b'_________________') 5397db96d56Sopenharmony_ci 5407db96d56Sopenharmony_ci srcwin.overwrite(dstwin) 5417db96d56Sopenharmony_ci self.assertEqual(dstwin.instr(0, 0), b'sectetur __') 5427db96d56Sopenharmony_ci self.assertEqual(dstwin.instr(1, 0), b'piscing elit, __') 5437db96d56Sopenharmony_ci self.assertEqual(dstwin.instr(2, 0), b' do eiusmod __') 5447db96d56Sopenharmony_ci self.assertEqual(dstwin.instr(3, 0), b'_________________') 5457db96d56Sopenharmony_ci 5467db96d56Sopenharmony_ci srcwin.overlay(dstwin, 1, 4, 3, 2, 4, 11) 5477db96d56Sopenharmony_ci self.assertEqual(dstwin.instr(3, 0), b'__r_sit_amet_____') 5487db96d56Sopenharmony_ci self.assertEqual(dstwin.instr(4, 0), b'__ectetur________') 5497db96d56Sopenharmony_ci self.assertEqual(dstwin.instr(5, 0), b'_________________') 5507db96d56Sopenharmony_ci 5517db96d56Sopenharmony_ci srcwin.overwrite(dstwin, 1, 4, 3, 2, 4, 11) 5527db96d56Sopenharmony_ci self.assertEqual(dstwin.instr(3, 0), b'__r sit amet_____') 5537db96d56Sopenharmony_ci self.assertEqual(dstwin.instr(4, 0), b'__ectetur _____') 5547db96d56Sopenharmony_ci self.assertEqual(dstwin.instr(5, 0), b'_________________') 5557db96d56Sopenharmony_ci 5567db96d56Sopenharmony_ci def test_refresh(self): 5577db96d56Sopenharmony_ci win = curses.newwin(5, 15, 2, 5) 5587db96d56Sopenharmony_ci win.noutrefresh() 5597db96d56Sopenharmony_ci win.redrawln(1, 2) 5607db96d56Sopenharmony_ci win.redrawwin() 5617db96d56Sopenharmony_ci win.refresh() 5627db96d56Sopenharmony_ci curses.doupdate() 5637db96d56Sopenharmony_ci 5647db96d56Sopenharmony_ci @requires_curses_window_meth('resize') 5657db96d56Sopenharmony_ci def test_resize(self): 5667db96d56Sopenharmony_ci win = curses.newwin(5, 15, 2, 5) 5677db96d56Sopenharmony_ci win.resize(4, 20) 5687db96d56Sopenharmony_ci self.assertEqual(win.getmaxyx(), (4, 20)) 5697db96d56Sopenharmony_ci win.resize(5, 15) 5707db96d56Sopenharmony_ci self.assertEqual(win.getmaxyx(), (5, 15)) 5717db96d56Sopenharmony_ci 5727db96d56Sopenharmony_ci @requires_curses_window_meth('enclose') 5737db96d56Sopenharmony_ci def test_enclose(self): 5747db96d56Sopenharmony_ci win = curses.newwin(5, 15, 2, 5) 5757db96d56Sopenharmony_ci self.assertIs(win.enclose(2, 5), True) 5767db96d56Sopenharmony_ci self.assertIs(win.enclose(1, 5), False) 5777db96d56Sopenharmony_ci self.assertIs(win.enclose(2, 4), False) 5787db96d56Sopenharmony_ci self.assertIs(win.enclose(6, 19), True) 5797db96d56Sopenharmony_ci self.assertIs(win.enclose(7, 19), False) 5807db96d56Sopenharmony_ci self.assertIs(win.enclose(6, 20), False) 5817db96d56Sopenharmony_ci 5827db96d56Sopenharmony_ci def test_putwin(self): 5837db96d56Sopenharmony_ci win = curses.newwin(5, 12, 1, 2) 5847db96d56Sopenharmony_ci win.addstr(2, 1, 'Lorem ipsum') 5857db96d56Sopenharmony_ci with tempfile.TemporaryFile() as f: 5867db96d56Sopenharmony_ci win.putwin(f) 5877db96d56Sopenharmony_ci del win 5887db96d56Sopenharmony_ci f.seek(0) 5897db96d56Sopenharmony_ci win = curses.getwin(f) 5907db96d56Sopenharmony_ci self.assertEqual(win.getbegyx(), (1, 2)) 5917db96d56Sopenharmony_ci self.assertEqual(win.getmaxyx(), (5, 12)) 5927db96d56Sopenharmony_ci self.assertEqual(win.instr(2, 0), b' Lorem ipsum') 5937db96d56Sopenharmony_ci 5947db96d56Sopenharmony_ci def test_borders_and_lines(self): 5957db96d56Sopenharmony_ci win = curses.newwin(5, 10, 5, 2) 5967db96d56Sopenharmony_ci win.border('|', '!', '-', '_', 5977db96d56Sopenharmony_ci '+', '\\', '#', '/') 5987db96d56Sopenharmony_ci self.assertEqual(win.instr(0, 0), b'+--------\\') 5997db96d56Sopenharmony_ci self.assertEqual(win.instr(1, 0), b'| !') 6007db96d56Sopenharmony_ci self.assertEqual(win.instr(4, 0), b'#________/') 6017db96d56Sopenharmony_ci win.border(b'|', b'!', b'-', b'_', 6027db96d56Sopenharmony_ci b'+', b'\\', b'#', b'/') 6037db96d56Sopenharmony_ci win.border(65, 66, 67, 68, 6047db96d56Sopenharmony_ci 69, 70, 71, 72) 6057db96d56Sopenharmony_ci self.assertRaises(TypeError, win.border, 6067db96d56Sopenharmony_ci 65, 66, 67, 68, 69, [], 71, 72) 6077db96d56Sopenharmony_ci self.assertRaises(TypeError, win.border, 6087db96d56Sopenharmony_ci 65, 66, 67, 68, 69, 70, 71, 72, 73) 6097db96d56Sopenharmony_ci self.assertRaises(TypeError, win.border, 6107db96d56Sopenharmony_ci 65, 66, 67, 68, 69, 70, 71, 72, 73) 6117db96d56Sopenharmony_ci win.border(65, 66, 67, 68, 69, 70, 71) 6127db96d56Sopenharmony_ci win.border(65, 66, 67, 68, 69, 70) 6137db96d56Sopenharmony_ci win.border(65, 66, 67, 68, 69) 6147db96d56Sopenharmony_ci win.border(65, 66, 67, 68) 6157db96d56Sopenharmony_ci win.border(65, 66, 67) 6167db96d56Sopenharmony_ci win.border(65, 66) 6177db96d56Sopenharmony_ci win.border(65) 6187db96d56Sopenharmony_ci win.border() 6197db96d56Sopenharmony_ci 6207db96d56Sopenharmony_ci win.box(':', '~') 6217db96d56Sopenharmony_ci self.assertEqual(win.instr(0, 1, 8), b'~~~~~~~~') 6227db96d56Sopenharmony_ci self.assertEqual(win.instr(1, 0), b': :') 6237db96d56Sopenharmony_ci self.assertEqual(win.instr(4, 1, 8), b'~~~~~~~~') 6247db96d56Sopenharmony_ci win.box(b':', b'~') 6257db96d56Sopenharmony_ci win.box(65, 67) 6267db96d56Sopenharmony_ci self.assertRaises(TypeError, win.box, 65, 66, 67) 6277db96d56Sopenharmony_ci self.assertRaises(TypeError, win.box, 65) 6287db96d56Sopenharmony_ci win.box() 6297db96d56Sopenharmony_ci 6307db96d56Sopenharmony_ci win.move(1, 2) 6317db96d56Sopenharmony_ci win.hline('-', 5) 6327db96d56Sopenharmony_ci self.assertEqual(win.instr(1, 1, 7), b' ----- ') 6337db96d56Sopenharmony_ci win.hline(b'-', 5) 6347db96d56Sopenharmony_ci win.hline(45, 5) 6357db96d56Sopenharmony_ci win.hline('-', 5, curses.A_BOLD) 6367db96d56Sopenharmony_ci win.hline(1, 1, '-', 5) 6377db96d56Sopenharmony_ci win.hline(1, 1, '-', 5, curses.A_BOLD) 6387db96d56Sopenharmony_ci 6397db96d56Sopenharmony_ci win.move(1, 2) 6407db96d56Sopenharmony_ci win.vline('a', 3) 6417db96d56Sopenharmony_ci win.vline(b'a', 3) 6427db96d56Sopenharmony_ci win.vline(97, 3) 6437db96d56Sopenharmony_ci win.vline('a', 3, curses.A_STANDOUT) 6447db96d56Sopenharmony_ci win.vline(1, 1, 'a', 3) 6457db96d56Sopenharmony_ci win.vline(1, 1, ';', 2, curses.A_STANDOUT) 6467db96d56Sopenharmony_ci self.assertEqual(win.inch(1, 1), b';'[0] | curses.A_STANDOUT) 6477db96d56Sopenharmony_ci self.assertEqual(win.inch(2, 1), b';'[0] | curses.A_STANDOUT) 6487db96d56Sopenharmony_ci self.assertEqual(win.inch(3, 1), b'a'[0]) 6497db96d56Sopenharmony_ci 6507db96d56Sopenharmony_ci def test_unctrl(self): 6517db96d56Sopenharmony_ci # TODO: wunctrl() 6527db96d56Sopenharmony_ci self.assertEqual(curses.unctrl(b'A'), b'A') 6537db96d56Sopenharmony_ci self.assertEqual(curses.unctrl('A'), b'A') 6547db96d56Sopenharmony_ci self.assertEqual(curses.unctrl(65), b'A') 6557db96d56Sopenharmony_ci self.assertEqual(curses.unctrl(b'\n'), b'^J') 6567db96d56Sopenharmony_ci self.assertEqual(curses.unctrl('\n'), b'^J') 6577db96d56Sopenharmony_ci self.assertEqual(curses.unctrl(10), b'^J') 6587db96d56Sopenharmony_ci self.assertRaises(TypeError, curses.unctrl, b'') 6597db96d56Sopenharmony_ci self.assertRaises(TypeError, curses.unctrl, b'AB') 6607db96d56Sopenharmony_ci self.assertRaises(TypeError, curses.unctrl, '') 6617db96d56Sopenharmony_ci self.assertRaises(TypeError, curses.unctrl, 'AB') 6627db96d56Sopenharmony_ci self.assertRaises(OverflowError, curses.unctrl, 2**64) 6637db96d56Sopenharmony_ci 6647db96d56Sopenharmony_ci def test_endwin(self): 6657db96d56Sopenharmony_ci if not self.isatty: 6667db96d56Sopenharmony_ci self.skipTest('requires terminal') 6677db96d56Sopenharmony_ci self.assertIs(curses.isendwin(), False) 6687db96d56Sopenharmony_ci curses.endwin() 6697db96d56Sopenharmony_ci self.assertIs(curses.isendwin(), True) 6707db96d56Sopenharmony_ci curses.doupdate() 6717db96d56Sopenharmony_ci self.assertIs(curses.isendwin(), False) 6727db96d56Sopenharmony_ci 6737db96d56Sopenharmony_ci def test_terminfo(self): 6747db96d56Sopenharmony_ci self.assertIsInstance(curses.tigetflag('hc'), int) 6757db96d56Sopenharmony_ci self.assertEqual(curses.tigetflag('cols'), -1) 6767db96d56Sopenharmony_ci self.assertEqual(curses.tigetflag('cr'), -1) 6777db96d56Sopenharmony_ci 6787db96d56Sopenharmony_ci self.assertIsInstance(curses.tigetnum('cols'), int) 6797db96d56Sopenharmony_ci self.assertEqual(curses.tigetnum('hc'), -2) 6807db96d56Sopenharmony_ci self.assertEqual(curses.tigetnum('cr'), -2) 6817db96d56Sopenharmony_ci 6827db96d56Sopenharmony_ci self.assertIsInstance(curses.tigetstr('cr'), (bytes, type(None))) 6837db96d56Sopenharmony_ci self.assertIsNone(curses.tigetstr('hc')) 6847db96d56Sopenharmony_ci self.assertIsNone(curses.tigetstr('cols')) 6857db96d56Sopenharmony_ci 6867db96d56Sopenharmony_ci cud = curses.tigetstr('cud') 6877db96d56Sopenharmony_ci if cud is not None: 6887db96d56Sopenharmony_ci # See issue10570. 6897db96d56Sopenharmony_ci self.assertIsInstance(cud, bytes) 6907db96d56Sopenharmony_ci curses.tparm(cud, 2) 6917db96d56Sopenharmony_ci cud_2 = curses.tparm(cud, 2) 6927db96d56Sopenharmony_ci self.assertIsInstance(cud_2, bytes) 6937db96d56Sopenharmony_ci curses.putp(cud_2) 6947db96d56Sopenharmony_ci 6957db96d56Sopenharmony_ci curses.putp(b'abc\n') 6967db96d56Sopenharmony_ci 6977db96d56Sopenharmony_ci def test_misc_module_funcs(self): 6987db96d56Sopenharmony_ci curses.delay_output(1) 6997db96d56Sopenharmony_ci curses.flushinp() 7007db96d56Sopenharmony_ci 7017db96d56Sopenharmony_ci curses.doupdate() 7027db96d56Sopenharmony_ci self.assertIs(curses.isendwin(), False) 7037db96d56Sopenharmony_ci 7047db96d56Sopenharmony_ci curses.napms(100) 7057db96d56Sopenharmony_ci 7067db96d56Sopenharmony_ci curses.newpad(50, 50) 7077db96d56Sopenharmony_ci 7087db96d56Sopenharmony_ci def test_env_queries(self): 7097db96d56Sopenharmony_ci # TODO: term_attrs(), erasewchar(), killwchar() 7107db96d56Sopenharmony_ci self.assertIsInstance(curses.termname(), bytes) 7117db96d56Sopenharmony_ci self.assertIsInstance(curses.longname(), bytes) 7127db96d56Sopenharmony_ci self.assertIsInstance(curses.baudrate(), int) 7137db96d56Sopenharmony_ci self.assertIsInstance(curses.has_ic(), bool) 7147db96d56Sopenharmony_ci self.assertIsInstance(curses.has_il(), bool) 7157db96d56Sopenharmony_ci self.assertIsInstance(curses.termattrs(), int) 7167db96d56Sopenharmony_ci 7177db96d56Sopenharmony_ci c = curses.killchar() 7187db96d56Sopenharmony_ci self.assertIsInstance(c, bytes) 7197db96d56Sopenharmony_ci self.assertEqual(len(c), 1) 7207db96d56Sopenharmony_ci c = curses.erasechar() 7217db96d56Sopenharmony_ci self.assertIsInstance(c, bytes) 7227db96d56Sopenharmony_ci self.assertEqual(len(c), 1) 7237db96d56Sopenharmony_ci 7247db96d56Sopenharmony_ci def test_output_options(self): 7257db96d56Sopenharmony_ci stdscr = self.stdscr 7267db96d56Sopenharmony_ci 7277db96d56Sopenharmony_ci stdscr.clearok(True) 7287db96d56Sopenharmony_ci stdscr.clearok(False) 7297db96d56Sopenharmony_ci 7307db96d56Sopenharmony_ci stdscr.idcok(True) 7317db96d56Sopenharmony_ci stdscr.idcok(False) 7327db96d56Sopenharmony_ci 7337db96d56Sopenharmony_ci stdscr.idlok(False) 7347db96d56Sopenharmony_ci stdscr.idlok(True) 7357db96d56Sopenharmony_ci 7367db96d56Sopenharmony_ci if hasattr(stdscr, 'immedok'): 7377db96d56Sopenharmony_ci stdscr.immedok(True) 7387db96d56Sopenharmony_ci stdscr.immedok(False) 7397db96d56Sopenharmony_ci 7407db96d56Sopenharmony_ci stdscr.leaveok(True) 7417db96d56Sopenharmony_ci stdscr.leaveok(False) 7427db96d56Sopenharmony_ci 7437db96d56Sopenharmony_ci stdscr.scrollok(True) 7447db96d56Sopenharmony_ci stdscr.scrollok(False) 7457db96d56Sopenharmony_ci 7467db96d56Sopenharmony_ci stdscr.setscrreg(5, 10) 7477db96d56Sopenharmony_ci 7487db96d56Sopenharmony_ci curses.nonl() 7497db96d56Sopenharmony_ci curses.nl(True) 7507db96d56Sopenharmony_ci curses.nl(False) 7517db96d56Sopenharmony_ci curses.nl() 7527db96d56Sopenharmony_ci 7537db96d56Sopenharmony_ci 7547db96d56Sopenharmony_ci def test_input_options(self): 7557db96d56Sopenharmony_ci stdscr = self.stdscr 7567db96d56Sopenharmony_ci 7577db96d56Sopenharmony_ci if self.isatty: 7587db96d56Sopenharmony_ci curses.nocbreak() 7597db96d56Sopenharmony_ci curses.cbreak() 7607db96d56Sopenharmony_ci curses.cbreak(False) 7617db96d56Sopenharmony_ci curses.cbreak(True) 7627db96d56Sopenharmony_ci 7637db96d56Sopenharmony_ci curses.intrflush(True) 7647db96d56Sopenharmony_ci curses.intrflush(False) 7657db96d56Sopenharmony_ci 7667db96d56Sopenharmony_ci curses.raw() 7677db96d56Sopenharmony_ci curses.raw(False) 7687db96d56Sopenharmony_ci curses.raw(True) 7697db96d56Sopenharmony_ci curses.noraw() 7707db96d56Sopenharmony_ci 7717db96d56Sopenharmony_ci curses.noecho() 7727db96d56Sopenharmony_ci curses.echo() 7737db96d56Sopenharmony_ci curses.echo(False) 7747db96d56Sopenharmony_ci curses.echo(True) 7757db96d56Sopenharmony_ci 7767db96d56Sopenharmony_ci curses.halfdelay(255) 7777db96d56Sopenharmony_ci curses.halfdelay(1) 7787db96d56Sopenharmony_ci 7797db96d56Sopenharmony_ci stdscr.keypad(True) 7807db96d56Sopenharmony_ci stdscr.keypad(False) 7817db96d56Sopenharmony_ci 7827db96d56Sopenharmony_ci curses.meta(True) 7837db96d56Sopenharmony_ci curses.meta(False) 7847db96d56Sopenharmony_ci 7857db96d56Sopenharmony_ci stdscr.nodelay(True) 7867db96d56Sopenharmony_ci stdscr.nodelay(False) 7877db96d56Sopenharmony_ci 7887db96d56Sopenharmony_ci curses.noqiflush() 7897db96d56Sopenharmony_ci curses.qiflush(True) 7907db96d56Sopenharmony_ci curses.qiflush(False) 7917db96d56Sopenharmony_ci curses.qiflush() 7927db96d56Sopenharmony_ci 7937db96d56Sopenharmony_ci stdscr.notimeout(True) 7947db96d56Sopenharmony_ci stdscr.notimeout(False) 7957db96d56Sopenharmony_ci 7967db96d56Sopenharmony_ci stdscr.timeout(-1) 7977db96d56Sopenharmony_ci stdscr.timeout(0) 7987db96d56Sopenharmony_ci stdscr.timeout(5) 7997db96d56Sopenharmony_ci 8007db96d56Sopenharmony_ci @requires_curses_func('typeahead') 8017db96d56Sopenharmony_ci def test_typeahead(self): 8027db96d56Sopenharmony_ci curses.typeahead(sys.__stdin__.fileno()) 8037db96d56Sopenharmony_ci curses.typeahead(-1) 8047db96d56Sopenharmony_ci 8057db96d56Sopenharmony_ci def test_prog_mode(self): 8067db96d56Sopenharmony_ci if not self.isatty: 8077db96d56Sopenharmony_ci self.skipTest('requires terminal') 8087db96d56Sopenharmony_ci curses.def_prog_mode() 8097db96d56Sopenharmony_ci curses.reset_prog_mode() 8107db96d56Sopenharmony_ci 8117db96d56Sopenharmony_ci def test_beep(self): 8127db96d56Sopenharmony_ci if (curses.tigetstr("bel") is not None 8137db96d56Sopenharmony_ci or curses.tigetstr("flash") is not None): 8147db96d56Sopenharmony_ci curses.beep() 8157db96d56Sopenharmony_ci else: 8167db96d56Sopenharmony_ci try: 8177db96d56Sopenharmony_ci curses.beep() 8187db96d56Sopenharmony_ci except curses.error: 8197db96d56Sopenharmony_ci self.skipTest('beep() failed') 8207db96d56Sopenharmony_ci 8217db96d56Sopenharmony_ci def test_flash(self): 8227db96d56Sopenharmony_ci if (curses.tigetstr("bel") is not None 8237db96d56Sopenharmony_ci or curses.tigetstr("flash") is not None): 8247db96d56Sopenharmony_ci curses.flash() 8257db96d56Sopenharmony_ci else: 8267db96d56Sopenharmony_ci try: 8277db96d56Sopenharmony_ci curses.flash() 8287db96d56Sopenharmony_ci except curses.error: 8297db96d56Sopenharmony_ci self.skipTest('flash() failed') 8307db96d56Sopenharmony_ci 8317db96d56Sopenharmony_ci def test_curs_set(self): 8327db96d56Sopenharmony_ci for vis, cap in [(0, 'civis'), (2, 'cvvis'), (1, 'cnorm')]: 8337db96d56Sopenharmony_ci if curses.tigetstr(cap) is not None: 8347db96d56Sopenharmony_ci curses.curs_set(vis) 8357db96d56Sopenharmony_ci else: 8367db96d56Sopenharmony_ci try: 8377db96d56Sopenharmony_ci curses.curs_set(vis) 8387db96d56Sopenharmony_ci except curses.error: 8397db96d56Sopenharmony_ci pass 8407db96d56Sopenharmony_ci 8417db96d56Sopenharmony_ci @requires_curses_func('get_escdelay') 8427db96d56Sopenharmony_ci def test_escdelay(self): 8437db96d56Sopenharmony_ci escdelay = curses.get_escdelay() 8447db96d56Sopenharmony_ci self.assertIsInstance(escdelay, int) 8457db96d56Sopenharmony_ci curses.set_escdelay(25) 8467db96d56Sopenharmony_ci self.assertEqual(curses.get_escdelay(), 25) 8477db96d56Sopenharmony_ci curses.set_escdelay(escdelay) 8487db96d56Sopenharmony_ci 8497db96d56Sopenharmony_ci @requires_curses_func('get_tabsize') 8507db96d56Sopenharmony_ci def test_tabsize(self): 8517db96d56Sopenharmony_ci tabsize = curses.get_tabsize() 8527db96d56Sopenharmony_ci self.assertIsInstance(tabsize, int) 8537db96d56Sopenharmony_ci curses.set_tabsize(4) 8547db96d56Sopenharmony_ci self.assertEqual(curses.get_tabsize(), 4) 8557db96d56Sopenharmony_ci curses.set_tabsize(tabsize) 8567db96d56Sopenharmony_ci 8577db96d56Sopenharmony_ci @requires_curses_func('getsyx') 8587db96d56Sopenharmony_ci def test_getsyx(self): 8597db96d56Sopenharmony_ci y, x = curses.getsyx() 8607db96d56Sopenharmony_ci self.assertIsInstance(y, int) 8617db96d56Sopenharmony_ci self.assertIsInstance(x, int) 8627db96d56Sopenharmony_ci curses.setsyx(4, 5) 8637db96d56Sopenharmony_ci self.assertEqual(curses.getsyx(), (4, 5)) 8647db96d56Sopenharmony_ci 8657db96d56Sopenharmony_ci def bad_colors(self): 8667db96d56Sopenharmony_ci return (-1, curses.COLORS, -2**31 - 1, 2**31, -2**63 - 1, 2**63, 2**64) 8677db96d56Sopenharmony_ci 8687db96d56Sopenharmony_ci def bad_colors2(self): 8697db96d56Sopenharmony_ci return (curses.COLORS, 2**31, 2**63, 2**64) 8707db96d56Sopenharmony_ci 8717db96d56Sopenharmony_ci def bad_pairs(self): 8727db96d56Sopenharmony_ci return (-1, -2**31 - 1, 2**31, -2**63 - 1, 2**63, 2**64) 8737db96d56Sopenharmony_ci 8747db96d56Sopenharmony_ci def test_has_colors(self): 8757db96d56Sopenharmony_ci self.assertIsInstance(curses.has_colors(), bool) 8767db96d56Sopenharmony_ci self.assertIsInstance(curses.can_change_color(), bool) 8777db96d56Sopenharmony_ci 8787db96d56Sopenharmony_ci def test_start_color(self): 8797db96d56Sopenharmony_ci if not curses.has_colors(): 8807db96d56Sopenharmony_ci self.skipTest('requires colors support') 8817db96d56Sopenharmony_ci curses.start_color() 8827db96d56Sopenharmony_ci if verbose: 8837db96d56Sopenharmony_ci print(f'COLORS = {curses.COLORS}', file=sys.stderr) 8847db96d56Sopenharmony_ci print(f'COLOR_PAIRS = {curses.COLOR_PAIRS}', file=sys.stderr) 8857db96d56Sopenharmony_ci 8867db96d56Sopenharmony_ci @requires_colors 8877db96d56Sopenharmony_ci def test_color_content(self): 8887db96d56Sopenharmony_ci self.assertEqual(curses.color_content(curses.COLOR_BLACK), (0, 0, 0)) 8897db96d56Sopenharmony_ci curses.color_content(0) 8907db96d56Sopenharmony_ci maxcolor = curses.COLORS - 1 8917db96d56Sopenharmony_ci curses.color_content(maxcolor) 8927db96d56Sopenharmony_ci 8937db96d56Sopenharmony_ci for color in self.bad_colors(): 8947db96d56Sopenharmony_ci self.assertRaises(ValueError, curses.color_content, color) 8957db96d56Sopenharmony_ci 8967db96d56Sopenharmony_ci @requires_colors 8977db96d56Sopenharmony_ci def test_init_color(self): 8987db96d56Sopenharmony_ci if not curses.can_change_color(): 8997db96d56Sopenharmony_ci self.skipTest('cannot change color') 9007db96d56Sopenharmony_ci 9017db96d56Sopenharmony_ci old = curses.color_content(0) 9027db96d56Sopenharmony_ci try: 9037db96d56Sopenharmony_ci curses.init_color(0, *old) 9047db96d56Sopenharmony_ci except curses.error: 9057db96d56Sopenharmony_ci self.skipTest('cannot change color (init_color() failed)') 9067db96d56Sopenharmony_ci self.addCleanup(curses.init_color, 0, *old) 9077db96d56Sopenharmony_ci curses.init_color(0, 0, 0, 0) 9087db96d56Sopenharmony_ci self.assertEqual(curses.color_content(0), (0, 0, 0)) 9097db96d56Sopenharmony_ci curses.init_color(0, 1000, 1000, 1000) 9107db96d56Sopenharmony_ci self.assertEqual(curses.color_content(0), (1000, 1000, 1000)) 9117db96d56Sopenharmony_ci 9127db96d56Sopenharmony_ci maxcolor = curses.COLORS - 1 9137db96d56Sopenharmony_ci old = curses.color_content(maxcolor) 9147db96d56Sopenharmony_ci curses.init_color(maxcolor, *old) 9157db96d56Sopenharmony_ci self.addCleanup(curses.init_color, maxcolor, *old) 9167db96d56Sopenharmony_ci curses.init_color(maxcolor, 0, 500, 1000) 9177db96d56Sopenharmony_ci self.assertEqual(curses.color_content(maxcolor), (0, 500, 1000)) 9187db96d56Sopenharmony_ci 9197db96d56Sopenharmony_ci for color in self.bad_colors(): 9207db96d56Sopenharmony_ci self.assertRaises(ValueError, curses.init_color, color, 0, 0, 0) 9217db96d56Sopenharmony_ci for comp in (-1, 1001): 9227db96d56Sopenharmony_ci self.assertRaises(ValueError, curses.init_color, 0, comp, 0, 0) 9237db96d56Sopenharmony_ci self.assertRaises(ValueError, curses.init_color, 0, 0, comp, 0) 9247db96d56Sopenharmony_ci self.assertRaises(ValueError, curses.init_color, 0, 0, 0, comp) 9257db96d56Sopenharmony_ci 9267db96d56Sopenharmony_ci def get_pair_limit(self): 9277db96d56Sopenharmony_ci pair_limit = curses.COLOR_PAIRS 9287db96d56Sopenharmony_ci if hasattr(curses, 'ncurses_version'): 9297db96d56Sopenharmony_ci if curses.has_extended_color_support(): 9307db96d56Sopenharmony_ci pair_limit += 2*curses.COLORS + 1 9317db96d56Sopenharmony_ci if (not curses.has_extended_color_support() 9327db96d56Sopenharmony_ci or (6, 1) <= curses.ncurses_version < (6, 2)): 9337db96d56Sopenharmony_ci pair_limit = min(pair_limit, SHORT_MAX) 9347db96d56Sopenharmony_ci # If use_default_colors() is called, the upper limit of the extended 9357db96d56Sopenharmony_ci # range may be restricted, so we need to check if the limit is still 9367db96d56Sopenharmony_ci # correct 9377db96d56Sopenharmony_ci try: 9387db96d56Sopenharmony_ci curses.init_pair(pair_limit - 1, 0, 0) 9397db96d56Sopenharmony_ci except ValueError: 9407db96d56Sopenharmony_ci pair_limit = curses.COLOR_PAIRS 9417db96d56Sopenharmony_ci return pair_limit 9427db96d56Sopenharmony_ci 9437db96d56Sopenharmony_ci @requires_colors 9447db96d56Sopenharmony_ci def test_pair_content(self): 9457db96d56Sopenharmony_ci if not hasattr(curses, 'use_default_colors'): 9467db96d56Sopenharmony_ci self.assertEqual(curses.pair_content(0), 9477db96d56Sopenharmony_ci (curses.COLOR_WHITE, curses.COLOR_BLACK)) 9487db96d56Sopenharmony_ci curses.pair_content(0) 9497db96d56Sopenharmony_ci maxpair = self.get_pair_limit() - 1 9507db96d56Sopenharmony_ci if maxpair > 0: 9517db96d56Sopenharmony_ci curses.pair_content(maxpair) 9527db96d56Sopenharmony_ci 9537db96d56Sopenharmony_ci for pair in self.bad_pairs(): 9547db96d56Sopenharmony_ci self.assertRaises(ValueError, curses.pair_content, pair) 9557db96d56Sopenharmony_ci 9567db96d56Sopenharmony_ci @requires_colors 9577db96d56Sopenharmony_ci def test_init_pair(self): 9587db96d56Sopenharmony_ci old = curses.pair_content(1) 9597db96d56Sopenharmony_ci curses.init_pair(1, *old) 9607db96d56Sopenharmony_ci self.addCleanup(curses.init_pair, 1, *old) 9617db96d56Sopenharmony_ci 9627db96d56Sopenharmony_ci curses.init_pair(1, 0, 0) 9637db96d56Sopenharmony_ci self.assertEqual(curses.pair_content(1), (0, 0)) 9647db96d56Sopenharmony_ci maxcolor = curses.COLORS - 1 9657db96d56Sopenharmony_ci curses.init_pair(1, maxcolor, 0) 9667db96d56Sopenharmony_ci self.assertEqual(curses.pair_content(1), (maxcolor, 0)) 9677db96d56Sopenharmony_ci curses.init_pair(1, 0, maxcolor) 9687db96d56Sopenharmony_ci self.assertEqual(curses.pair_content(1), (0, maxcolor)) 9697db96d56Sopenharmony_ci maxpair = self.get_pair_limit() - 1 9707db96d56Sopenharmony_ci if maxpair > 1: 9717db96d56Sopenharmony_ci curses.init_pair(maxpair, 0, 0) 9727db96d56Sopenharmony_ci self.assertEqual(curses.pair_content(maxpair), (0, 0)) 9737db96d56Sopenharmony_ci 9747db96d56Sopenharmony_ci for pair in self.bad_pairs(): 9757db96d56Sopenharmony_ci self.assertRaises(ValueError, curses.init_pair, pair, 0, 0) 9767db96d56Sopenharmony_ci for color in self.bad_colors2(): 9777db96d56Sopenharmony_ci self.assertRaises(ValueError, curses.init_pair, 1, color, 0) 9787db96d56Sopenharmony_ci self.assertRaises(ValueError, curses.init_pair, 1, 0, color) 9797db96d56Sopenharmony_ci 9807db96d56Sopenharmony_ci @requires_colors 9817db96d56Sopenharmony_ci def test_color_attrs(self): 9827db96d56Sopenharmony_ci for pair in 0, 1, 255: 9837db96d56Sopenharmony_ci attr = curses.color_pair(pair) 9847db96d56Sopenharmony_ci self.assertEqual(curses.pair_number(attr), pair, attr) 9857db96d56Sopenharmony_ci self.assertEqual(curses.pair_number(attr | curses.A_BOLD), pair) 9867db96d56Sopenharmony_ci self.assertEqual(curses.color_pair(0), 0) 9877db96d56Sopenharmony_ci self.assertEqual(curses.pair_number(0), 0) 9887db96d56Sopenharmony_ci 9897db96d56Sopenharmony_ci @requires_curses_func('use_default_colors') 9907db96d56Sopenharmony_ci @requires_colors 9917db96d56Sopenharmony_ci def test_use_default_colors(self): 9927db96d56Sopenharmony_ci old = curses.pair_content(0) 9937db96d56Sopenharmony_ci try: 9947db96d56Sopenharmony_ci curses.use_default_colors() 9957db96d56Sopenharmony_ci except curses.error: 9967db96d56Sopenharmony_ci self.skipTest('cannot change color (use_default_colors() failed)') 9977db96d56Sopenharmony_ci self.assertEqual(curses.pair_content(0), (-1, -1)) 9987db96d56Sopenharmony_ci self.assertIn(old, [(curses.COLOR_WHITE, curses.COLOR_BLACK), (-1, -1), (0, 0)]) 9997db96d56Sopenharmony_ci 10007db96d56Sopenharmony_ci def test_keyname(self): 10017db96d56Sopenharmony_ci # TODO: key_name() 10027db96d56Sopenharmony_ci self.assertEqual(curses.keyname(65), b'A') 10037db96d56Sopenharmony_ci self.assertEqual(curses.keyname(13), b'^M') 10047db96d56Sopenharmony_ci self.assertEqual(curses.keyname(127), b'^?') 10057db96d56Sopenharmony_ci self.assertEqual(curses.keyname(0), b'^@') 10067db96d56Sopenharmony_ci self.assertRaises(ValueError, curses.keyname, -1) 10077db96d56Sopenharmony_ci self.assertIsInstance(curses.keyname(256), bytes) 10087db96d56Sopenharmony_ci 10097db96d56Sopenharmony_ci @requires_curses_func('has_key') 10107db96d56Sopenharmony_ci def test_has_key(self): 10117db96d56Sopenharmony_ci curses.has_key(13) 10127db96d56Sopenharmony_ci 10137db96d56Sopenharmony_ci @requires_curses_func('getmouse') 10147db96d56Sopenharmony_ci def test_getmouse(self): 10157db96d56Sopenharmony_ci (availmask, oldmask) = curses.mousemask(curses.BUTTON1_PRESSED) 10167db96d56Sopenharmony_ci if availmask == 0: 10177db96d56Sopenharmony_ci self.skipTest('mouse stuff not available') 10187db96d56Sopenharmony_ci curses.mouseinterval(10) 10197db96d56Sopenharmony_ci # just verify these don't cause errors 10207db96d56Sopenharmony_ci curses.ungetmouse(0, 0, 0, 0, curses.BUTTON1_PRESSED) 10217db96d56Sopenharmony_ci m = curses.getmouse() 10227db96d56Sopenharmony_ci 10237db96d56Sopenharmony_ci @requires_curses_func('panel') 10247db96d56Sopenharmony_ci def test_userptr_without_set(self): 10257db96d56Sopenharmony_ci w = curses.newwin(10, 10) 10267db96d56Sopenharmony_ci p = curses.panel.new_panel(w) 10277db96d56Sopenharmony_ci # try to access userptr() before calling set_userptr() -- segfaults 10287db96d56Sopenharmony_ci with self.assertRaises(curses.panel.error, 10297db96d56Sopenharmony_ci msg='userptr should fail since not set'): 10307db96d56Sopenharmony_ci p.userptr() 10317db96d56Sopenharmony_ci 10327db96d56Sopenharmony_ci @requires_curses_func('panel') 10337db96d56Sopenharmony_ci def test_userptr_memory_leak(self): 10347db96d56Sopenharmony_ci w = curses.newwin(10, 10) 10357db96d56Sopenharmony_ci p = curses.panel.new_panel(w) 10367db96d56Sopenharmony_ci obj = object() 10377db96d56Sopenharmony_ci nrefs = sys.getrefcount(obj) 10387db96d56Sopenharmony_ci for i in range(100): 10397db96d56Sopenharmony_ci p.set_userptr(obj) 10407db96d56Sopenharmony_ci 10417db96d56Sopenharmony_ci p.set_userptr(None) 10427db96d56Sopenharmony_ci self.assertEqual(sys.getrefcount(obj), nrefs, 10437db96d56Sopenharmony_ci "set_userptr leaked references") 10447db96d56Sopenharmony_ci 10457db96d56Sopenharmony_ci @requires_curses_func('panel') 10467db96d56Sopenharmony_ci def test_userptr_segfault(self): 10477db96d56Sopenharmony_ci w = curses.newwin(10, 10) 10487db96d56Sopenharmony_ci panel = curses.panel.new_panel(w) 10497db96d56Sopenharmony_ci class A: 10507db96d56Sopenharmony_ci def __del__(self): 10517db96d56Sopenharmony_ci panel.set_userptr(None) 10527db96d56Sopenharmony_ci panel.set_userptr(A()) 10537db96d56Sopenharmony_ci panel.set_userptr(None) 10547db96d56Sopenharmony_ci 10557db96d56Sopenharmony_ci @cpython_only 10567db96d56Sopenharmony_ci @requires_curses_func('panel') 10577db96d56Sopenharmony_ci def test_disallow_instantiation(self): 10587db96d56Sopenharmony_ci # Ensure that the type disallows instantiation (bpo-43916) 10597db96d56Sopenharmony_ci w = curses.newwin(10, 10) 10607db96d56Sopenharmony_ci panel = curses.panel.new_panel(w) 10617db96d56Sopenharmony_ci check_disallow_instantiation(self, type(panel)) 10627db96d56Sopenharmony_ci 10637db96d56Sopenharmony_ci @requires_curses_func('is_term_resized') 10647db96d56Sopenharmony_ci def test_is_term_resized(self): 10657db96d56Sopenharmony_ci lines, cols = curses.LINES, curses.COLS 10667db96d56Sopenharmony_ci self.assertIs(curses.is_term_resized(lines, cols), False) 10677db96d56Sopenharmony_ci self.assertIs(curses.is_term_resized(lines-1, cols-1), True) 10687db96d56Sopenharmony_ci 10697db96d56Sopenharmony_ci @requires_curses_func('resize_term') 10707db96d56Sopenharmony_ci def test_resize_term(self): 10717db96d56Sopenharmony_ci curses.update_lines_cols() 10727db96d56Sopenharmony_ci lines, cols = curses.LINES, curses.COLS 10737db96d56Sopenharmony_ci new_lines = lines - 1 10747db96d56Sopenharmony_ci new_cols = cols + 1 10757db96d56Sopenharmony_ci curses.resize_term(new_lines, new_cols) 10767db96d56Sopenharmony_ci self.assertEqual(curses.LINES, new_lines) 10777db96d56Sopenharmony_ci self.assertEqual(curses.COLS, new_cols) 10787db96d56Sopenharmony_ci 10797db96d56Sopenharmony_ci curses.resize_term(lines, cols) 10807db96d56Sopenharmony_ci self.assertEqual(curses.LINES, lines) 10817db96d56Sopenharmony_ci self.assertEqual(curses.COLS, cols) 10827db96d56Sopenharmony_ci 10837db96d56Sopenharmony_ci @requires_curses_func('resizeterm') 10847db96d56Sopenharmony_ci def test_resizeterm(self): 10857db96d56Sopenharmony_ci curses.update_lines_cols() 10867db96d56Sopenharmony_ci lines, cols = curses.LINES, curses.COLS 10877db96d56Sopenharmony_ci new_lines = lines - 1 10887db96d56Sopenharmony_ci new_cols = cols + 1 10897db96d56Sopenharmony_ci curses.resizeterm(new_lines, new_cols) 10907db96d56Sopenharmony_ci self.assertEqual(curses.LINES, new_lines) 10917db96d56Sopenharmony_ci self.assertEqual(curses.COLS, new_cols) 10927db96d56Sopenharmony_ci 10937db96d56Sopenharmony_ci curses.resizeterm(lines, cols) 10947db96d56Sopenharmony_ci self.assertEqual(curses.LINES, lines) 10957db96d56Sopenharmony_ci self.assertEqual(curses.COLS, cols) 10967db96d56Sopenharmony_ci 10977db96d56Sopenharmony_ci def test_ungetch(self): 10987db96d56Sopenharmony_ci curses.ungetch(b'A') 10997db96d56Sopenharmony_ci self.assertEqual(self.stdscr.getkey(), 'A') 11007db96d56Sopenharmony_ci curses.ungetch('B') 11017db96d56Sopenharmony_ci self.assertEqual(self.stdscr.getkey(), 'B') 11027db96d56Sopenharmony_ci curses.ungetch(67) 11037db96d56Sopenharmony_ci self.assertEqual(self.stdscr.getkey(), 'C') 11047db96d56Sopenharmony_ci 11057db96d56Sopenharmony_ci def test_issue6243(self): 11067db96d56Sopenharmony_ci curses.ungetch(1025) 11077db96d56Sopenharmony_ci self.stdscr.getkey() 11087db96d56Sopenharmony_ci 11097db96d56Sopenharmony_ci @requires_curses_func('unget_wch') 11107db96d56Sopenharmony_ci @unittest.skipIf(getattr(curses, 'ncurses_version', (99,)) < (5, 8), 11117db96d56Sopenharmony_ci "unget_wch is broken in ncurses 5.7 and earlier") 11127db96d56Sopenharmony_ci def test_unget_wch(self): 11137db96d56Sopenharmony_ci stdscr = self.stdscr 11147db96d56Sopenharmony_ci encoding = stdscr.encoding 11157db96d56Sopenharmony_ci for ch in ('a', '\xe9', '\u20ac', '\U0010FFFF'): 11167db96d56Sopenharmony_ci try: 11177db96d56Sopenharmony_ci ch.encode(encoding) 11187db96d56Sopenharmony_ci except UnicodeEncodeError: 11197db96d56Sopenharmony_ci continue 11207db96d56Sopenharmony_ci try: 11217db96d56Sopenharmony_ci curses.unget_wch(ch) 11227db96d56Sopenharmony_ci except Exception as err: 11237db96d56Sopenharmony_ci self.fail("unget_wch(%a) failed with encoding %s: %s" 11247db96d56Sopenharmony_ci % (ch, stdscr.encoding, err)) 11257db96d56Sopenharmony_ci read = stdscr.get_wch() 11267db96d56Sopenharmony_ci self.assertEqual(read, ch) 11277db96d56Sopenharmony_ci 11287db96d56Sopenharmony_ci code = ord(ch) 11297db96d56Sopenharmony_ci curses.unget_wch(code) 11307db96d56Sopenharmony_ci read = stdscr.get_wch() 11317db96d56Sopenharmony_ci self.assertEqual(read, ch) 11327db96d56Sopenharmony_ci 11337db96d56Sopenharmony_ci def test_encoding(self): 11347db96d56Sopenharmony_ci stdscr = self.stdscr 11357db96d56Sopenharmony_ci import codecs 11367db96d56Sopenharmony_ci encoding = stdscr.encoding 11377db96d56Sopenharmony_ci codecs.lookup(encoding) 11387db96d56Sopenharmony_ci with self.assertRaises(TypeError): 11397db96d56Sopenharmony_ci stdscr.encoding = 10 11407db96d56Sopenharmony_ci stdscr.encoding = encoding 11417db96d56Sopenharmony_ci with self.assertRaises(TypeError): 11427db96d56Sopenharmony_ci del stdscr.encoding 11437db96d56Sopenharmony_ci 11447db96d56Sopenharmony_ci def test_issue21088(self): 11457db96d56Sopenharmony_ci stdscr = self.stdscr 11467db96d56Sopenharmony_ci # 11477db96d56Sopenharmony_ci # http://bugs.python.org/issue21088 11487db96d56Sopenharmony_ci # 11497db96d56Sopenharmony_ci # the bug: 11507db96d56Sopenharmony_ci # when converting curses.window.addch to Argument Clinic 11517db96d56Sopenharmony_ci # the first two parameters were switched. 11527db96d56Sopenharmony_ci 11537db96d56Sopenharmony_ci # if someday we can represent the signature of addch 11547db96d56Sopenharmony_ci # we will need to rewrite this test. 11557db96d56Sopenharmony_ci try: 11567db96d56Sopenharmony_ci signature = inspect.signature(stdscr.addch) 11577db96d56Sopenharmony_ci self.assertFalse(signature) 11587db96d56Sopenharmony_ci except ValueError: 11597db96d56Sopenharmony_ci # not generating a signature is fine. 11607db96d56Sopenharmony_ci pass 11617db96d56Sopenharmony_ci 11627db96d56Sopenharmony_ci # So. No signature for addch. 11637db96d56Sopenharmony_ci # But Argument Clinic gave us a human-readable equivalent 11647db96d56Sopenharmony_ci # as the first line of the docstring. So we parse that, 11657db96d56Sopenharmony_ci # and ensure that the parameters appear in the correct order. 11667db96d56Sopenharmony_ci # Since this is parsing output from Argument Clinic, we can 11677db96d56Sopenharmony_ci # be reasonably certain the generated parsing code will be 11687db96d56Sopenharmony_ci # correct too. 11697db96d56Sopenharmony_ci human_readable_signature = stdscr.addch.__doc__.split("\n")[0] 11707db96d56Sopenharmony_ci self.assertIn("[y, x,]", human_readable_signature) 11717db96d56Sopenharmony_ci 11727db96d56Sopenharmony_ci @requires_curses_window_meth('resize') 11737db96d56Sopenharmony_ci def test_issue13051(self): 11747db96d56Sopenharmony_ci win = curses.newwin(5, 15, 2, 5) 11757db96d56Sopenharmony_ci box = curses.textpad.Textbox(win, insert_mode=True) 11767db96d56Sopenharmony_ci lines, cols = win.getmaxyx() 11777db96d56Sopenharmony_ci win.resize(lines-2, cols-2) 11787db96d56Sopenharmony_ci # this may cause infinite recursion, leading to a RuntimeError 11797db96d56Sopenharmony_ci box._insert_printable_char('a') 11807db96d56Sopenharmony_ci 11817db96d56Sopenharmony_ci 11827db96d56Sopenharmony_ciclass MiscTests(unittest.TestCase): 11837db96d56Sopenharmony_ci 11847db96d56Sopenharmony_ci @requires_curses_func('update_lines_cols') 11857db96d56Sopenharmony_ci def test_update_lines_cols(self): 11867db96d56Sopenharmony_ci curses.update_lines_cols() 11877db96d56Sopenharmony_ci lines, cols = curses.LINES, curses.COLS 11887db96d56Sopenharmony_ci curses.LINES = curses.COLS = 0 11897db96d56Sopenharmony_ci curses.update_lines_cols() 11907db96d56Sopenharmony_ci self.assertEqual(curses.LINES, lines) 11917db96d56Sopenharmony_ci self.assertEqual(curses.COLS, cols) 11927db96d56Sopenharmony_ci 11937db96d56Sopenharmony_ci @requires_curses_func('ncurses_version') 11947db96d56Sopenharmony_ci def test_ncurses_version(self): 11957db96d56Sopenharmony_ci v = curses.ncurses_version 11967db96d56Sopenharmony_ci if verbose: 11977db96d56Sopenharmony_ci print(f'ncurses_version = {curses.ncurses_version}', flush=True) 11987db96d56Sopenharmony_ci self.assertIsInstance(v[:], tuple) 11997db96d56Sopenharmony_ci self.assertEqual(len(v), 3) 12007db96d56Sopenharmony_ci self.assertIsInstance(v[0], int) 12017db96d56Sopenharmony_ci self.assertIsInstance(v[1], int) 12027db96d56Sopenharmony_ci self.assertIsInstance(v[2], int) 12037db96d56Sopenharmony_ci self.assertIsInstance(v.major, int) 12047db96d56Sopenharmony_ci self.assertIsInstance(v.minor, int) 12057db96d56Sopenharmony_ci self.assertIsInstance(v.patch, int) 12067db96d56Sopenharmony_ci self.assertEqual(v[0], v.major) 12077db96d56Sopenharmony_ci self.assertEqual(v[1], v.minor) 12087db96d56Sopenharmony_ci self.assertEqual(v[2], v.patch) 12097db96d56Sopenharmony_ci self.assertGreaterEqual(v.major, 0) 12107db96d56Sopenharmony_ci self.assertGreaterEqual(v.minor, 0) 12117db96d56Sopenharmony_ci self.assertGreaterEqual(v.patch, 0) 12127db96d56Sopenharmony_ci 12137db96d56Sopenharmony_ci def test_has_extended_color_support(self): 12147db96d56Sopenharmony_ci r = curses.has_extended_color_support() 12157db96d56Sopenharmony_ci self.assertIsInstance(r, bool) 12167db96d56Sopenharmony_ci 12177db96d56Sopenharmony_ci 12187db96d56Sopenharmony_ciclass TestAscii(unittest.TestCase): 12197db96d56Sopenharmony_ci 12207db96d56Sopenharmony_ci def test_controlnames(self): 12217db96d56Sopenharmony_ci for name in curses.ascii.controlnames: 12227db96d56Sopenharmony_ci self.assertTrue(hasattr(curses.ascii, name), name) 12237db96d56Sopenharmony_ci 12247db96d56Sopenharmony_ci def test_ctypes(self): 12257db96d56Sopenharmony_ci def check(func, expected): 12267db96d56Sopenharmony_ci with self.subTest(ch=c, func=func): 12277db96d56Sopenharmony_ci self.assertEqual(func(i), expected) 12287db96d56Sopenharmony_ci self.assertEqual(func(c), expected) 12297db96d56Sopenharmony_ci 12307db96d56Sopenharmony_ci for i in range(256): 12317db96d56Sopenharmony_ci c = chr(i) 12327db96d56Sopenharmony_ci b = bytes([i]) 12337db96d56Sopenharmony_ci check(curses.ascii.isalnum, b.isalnum()) 12347db96d56Sopenharmony_ci check(curses.ascii.isalpha, b.isalpha()) 12357db96d56Sopenharmony_ci check(curses.ascii.isdigit, b.isdigit()) 12367db96d56Sopenharmony_ci check(curses.ascii.islower, b.islower()) 12377db96d56Sopenharmony_ci check(curses.ascii.isspace, b.isspace()) 12387db96d56Sopenharmony_ci check(curses.ascii.isupper, b.isupper()) 12397db96d56Sopenharmony_ci 12407db96d56Sopenharmony_ci check(curses.ascii.isascii, i < 128) 12417db96d56Sopenharmony_ci check(curses.ascii.ismeta, i >= 128) 12427db96d56Sopenharmony_ci check(curses.ascii.isctrl, i < 32) 12437db96d56Sopenharmony_ci check(curses.ascii.iscntrl, i < 32 or i == 127) 12447db96d56Sopenharmony_ci check(curses.ascii.isblank, c in ' \t') 12457db96d56Sopenharmony_ci check(curses.ascii.isgraph, 32 < i <= 126) 12467db96d56Sopenharmony_ci check(curses.ascii.isprint, 32 <= i <= 126) 12477db96d56Sopenharmony_ci check(curses.ascii.ispunct, c in string.punctuation) 12487db96d56Sopenharmony_ci check(curses.ascii.isxdigit, c in string.hexdigits) 12497db96d56Sopenharmony_ci 12507db96d56Sopenharmony_ci for i in (-2, -1, 256, sys.maxunicode, sys.maxunicode+1): 12517db96d56Sopenharmony_ci self.assertFalse(curses.ascii.isalnum(i)) 12527db96d56Sopenharmony_ci self.assertFalse(curses.ascii.isalpha(i)) 12537db96d56Sopenharmony_ci self.assertFalse(curses.ascii.isdigit(i)) 12547db96d56Sopenharmony_ci self.assertFalse(curses.ascii.islower(i)) 12557db96d56Sopenharmony_ci self.assertFalse(curses.ascii.isspace(i)) 12567db96d56Sopenharmony_ci self.assertFalse(curses.ascii.isupper(i)) 12577db96d56Sopenharmony_ci 12587db96d56Sopenharmony_ci self.assertFalse(curses.ascii.isascii(i)) 12597db96d56Sopenharmony_ci self.assertFalse(curses.ascii.isctrl(i)) 12607db96d56Sopenharmony_ci self.assertFalse(curses.ascii.iscntrl(i)) 12617db96d56Sopenharmony_ci self.assertFalse(curses.ascii.isblank(i)) 12627db96d56Sopenharmony_ci self.assertFalse(curses.ascii.isgraph(i)) 12637db96d56Sopenharmony_ci self.assertFalse(curses.ascii.isprint(i)) 12647db96d56Sopenharmony_ci self.assertFalse(curses.ascii.ispunct(i)) 12657db96d56Sopenharmony_ci self.assertFalse(curses.ascii.isxdigit(i)) 12667db96d56Sopenharmony_ci 12677db96d56Sopenharmony_ci self.assertFalse(curses.ascii.ismeta(-1)) 12687db96d56Sopenharmony_ci 12697db96d56Sopenharmony_ci def test_ascii(self): 12707db96d56Sopenharmony_ci ascii = curses.ascii.ascii 12717db96d56Sopenharmony_ci self.assertEqual(ascii('\xc1'), 'A') 12727db96d56Sopenharmony_ci self.assertEqual(ascii('A'), 'A') 12737db96d56Sopenharmony_ci self.assertEqual(ascii(ord('\xc1')), ord('A')) 12747db96d56Sopenharmony_ci 12757db96d56Sopenharmony_ci def test_ctrl(self): 12767db96d56Sopenharmony_ci ctrl = curses.ascii.ctrl 12777db96d56Sopenharmony_ci self.assertEqual(ctrl('J'), '\n') 12787db96d56Sopenharmony_ci self.assertEqual(ctrl('\n'), '\n') 12797db96d56Sopenharmony_ci self.assertEqual(ctrl('@'), '\0') 12807db96d56Sopenharmony_ci self.assertEqual(ctrl(ord('J')), ord('\n')) 12817db96d56Sopenharmony_ci 12827db96d56Sopenharmony_ci def test_alt(self): 12837db96d56Sopenharmony_ci alt = curses.ascii.alt 12847db96d56Sopenharmony_ci self.assertEqual(alt('\n'), '\x8a') 12857db96d56Sopenharmony_ci self.assertEqual(alt('A'), '\xc1') 12867db96d56Sopenharmony_ci self.assertEqual(alt(ord('A')), 0xc1) 12877db96d56Sopenharmony_ci 12887db96d56Sopenharmony_ci def test_unctrl(self): 12897db96d56Sopenharmony_ci unctrl = curses.ascii.unctrl 12907db96d56Sopenharmony_ci self.assertEqual(unctrl('a'), 'a') 12917db96d56Sopenharmony_ci self.assertEqual(unctrl('A'), 'A') 12927db96d56Sopenharmony_ci self.assertEqual(unctrl(';'), ';') 12937db96d56Sopenharmony_ci self.assertEqual(unctrl(' '), ' ') 12947db96d56Sopenharmony_ci self.assertEqual(unctrl('\x7f'), '^?') 12957db96d56Sopenharmony_ci self.assertEqual(unctrl('\n'), '^J') 12967db96d56Sopenharmony_ci self.assertEqual(unctrl('\0'), '^@') 12977db96d56Sopenharmony_ci self.assertEqual(unctrl(ord('A')), 'A') 12987db96d56Sopenharmony_ci self.assertEqual(unctrl(ord('\n')), '^J') 12997db96d56Sopenharmony_ci # Meta-bit characters 13007db96d56Sopenharmony_ci self.assertEqual(unctrl('\x8a'), '!^J') 13017db96d56Sopenharmony_ci self.assertEqual(unctrl('\xc1'), '!A') 13027db96d56Sopenharmony_ci self.assertEqual(unctrl(ord('\x8a')), '!^J') 13037db96d56Sopenharmony_ci self.assertEqual(unctrl(ord('\xc1')), '!A') 13047db96d56Sopenharmony_ci 13057db96d56Sopenharmony_ci 13067db96d56Sopenharmony_cidef lorem_ipsum(win): 13077db96d56Sopenharmony_ci text = [ 13087db96d56Sopenharmony_ci 'Lorem ipsum', 13097db96d56Sopenharmony_ci 'dolor sit amet,', 13107db96d56Sopenharmony_ci 'consectetur', 13117db96d56Sopenharmony_ci 'adipiscing elit,', 13127db96d56Sopenharmony_ci 'sed do eiusmod', 13137db96d56Sopenharmony_ci 'tempor incididunt', 13147db96d56Sopenharmony_ci 'ut labore et', 13157db96d56Sopenharmony_ci 'dolore magna', 13167db96d56Sopenharmony_ci 'aliqua.', 13177db96d56Sopenharmony_ci ] 13187db96d56Sopenharmony_ci maxy, maxx = win.getmaxyx() 13197db96d56Sopenharmony_ci for y, line in enumerate(text[:maxy]): 13207db96d56Sopenharmony_ci win.addstr(y, 0, line[:maxx - (y == maxy - 1)]) 13217db96d56Sopenharmony_ci 13227db96d56Sopenharmony_ciif __name__ == '__main__': 13237db96d56Sopenharmony_ci unittest.main() 1324