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