17db96d56Sopenharmony_ciimport functools
27db96d56Sopenharmony_ciimport unittest
37db96d56Sopenharmony_ciimport tkinter
47db96d56Sopenharmony_ciimport enum
57db96d56Sopenharmony_cifrom test import support
67db96d56Sopenharmony_cifrom tkinter.test.support import AbstractTkTest, AbstractDefaultRootTest
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_cisupport.requires('gui')
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ciclass MiscTest(AbstractTkTest, unittest.TestCase):
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci    def test_all(self):
137db96d56Sopenharmony_ci        self.assertIn("Widget", tkinter.__all__)
147db96d56Sopenharmony_ci        # Check that variables from tkinter.constants are also in tkinter.__all__
157db96d56Sopenharmony_ci        self.assertIn("CASCADE", tkinter.__all__)
167db96d56Sopenharmony_ci        self.assertIsNotNone(tkinter.CASCADE)
177db96d56Sopenharmony_ci        # Check that sys, re, and constants are not in tkinter.__all__
187db96d56Sopenharmony_ci        self.assertNotIn("re", tkinter.__all__)
197db96d56Sopenharmony_ci        self.assertNotIn("sys", tkinter.__all__)
207db96d56Sopenharmony_ci        self.assertNotIn("constants", tkinter.__all__)
217db96d56Sopenharmony_ci        # Check that an underscored functions is not in tkinter.__all__
227db96d56Sopenharmony_ci        self.assertNotIn("_tkerror", tkinter.__all__)
237db96d56Sopenharmony_ci        # Check that wantobjects is not in tkinter.__all__
247db96d56Sopenharmony_ci        self.assertNotIn("wantobjects", tkinter.__all__)
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci    def test_repr(self):
277db96d56Sopenharmony_ci        t = tkinter.Toplevel(self.root, name='top')
287db96d56Sopenharmony_ci        f = tkinter.Frame(t, name='child')
297db96d56Sopenharmony_ci        self.assertEqual(repr(f), '<tkinter.Frame object .top.child>')
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci    def test_generated_names(self):
327db96d56Sopenharmony_ci        t = tkinter.Toplevel(self.root)
337db96d56Sopenharmony_ci        f = tkinter.Frame(t)
347db96d56Sopenharmony_ci        f2 = tkinter.Frame(t)
357db96d56Sopenharmony_ci        b = tkinter.Button(f2)
367db96d56Sopenharmony_ci        for name in str(b).split('.'):
377db96d56Sopenharmony_ci            self.assertFalse(name.isidentifier(), msg=repr(name))
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ci    def test_tk_setPalette(self):
407db96d56Sopenharmony_ci        root = self.root
417db96d56Sopenharmony_ci        root.tk_setPalette('black')
427db96d56Sopenharmony_ci        self.assertEqual(root['background'], 'black')
437db96d56Sopenharmony_ci        root.tk_setPalette('white')
447db96d56Sopenharmony_ci        self.assertEqual(root['background'], 'white')
457db96d56Sopenharmony_ci        self.assertRaisesRegex(tkinter.TclError,
467db96d56Sopenharmony_ci                '^unknown color name "spam"$',
477db96d56Sopenharmony_ci                root.tk_setPalette, 'spam')
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci        root.tk_setPalette(background='black')
507db96d56Sopenharmony_ci        self.assertEqual(root['background'], 'black')
517db96d56Sopenharmony_ci        root.tk_setPalette(background='blue', highlightColor='yellow')
527db96d56Sopenharmony_ci        self.assertEqual(root['background'], 'blue')
537db96d56Sopenharmony_ci        self.assertEqual(root['highlightcolor'], 'yellow')
547db96d56Sopenharmony_ci        root.tk_setPalette(background='yellow', highlightColor='blue')
557db96d56Sopenharmony_ci        self.assertEqual(root['background'], 'yellow')
567db96d56Sopenharmony_ci        self.assertEqual(root['highlightcolor'], 'blue')
577db96d56Sopenharmony_ci        self.assertRaisesRegex(tkinter.TclError,
587db96d56Sopenharmony_ci                '^unknown color name "spam"$',
597db96d56Sopenharmony_ci                root.tk_setPalette, background='spam')
607db96d56Sopenharmony_ci        self.assertRaisesRegex(tkinter.TclError,
617db96d56Sopenharmony_ci                '^must specify a background color$',
627db96d56Sopenharmony_ci                root.tk_setPalette, spam='white')
637db96d56Sopenharmony_ci        self.assertRaisesRegex(tkinter.TclError,
647db96d56Sopenharmony_ci                '^must specify a background color$',
657db96d56Sopenharmony_ci                root.tk_setPalette, highlightColor='blue')
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci    def test_after(self):
687db96d56Sopenharmony_ci        root = self.root
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci        def callback(start=0, step=1):
717db96d56Sopenharmony_ci            nonlocal count
727db96d56Sopenharmony_ci            count = start + step
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_ci        # Without function, sleeps for ms.
757db96d56Sopenharmony_ci        self.assertIsNone(root.after(1))
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ci        # Set up with callback with no args.
787db96d56Sopenharmony_ci        count = 0
797db96d56Sopenharmony_ci        timer1 = root.after(0, callback)
807db96d56Sopenharmony_ci        self.assertIn(timer1, root.tk.call('after', 'info'))
817db96d56Sopenharmony_ci        (script, _) = root.tk.splitlist(root.tk.call('after', 'info', timer1))
827db96d56Sopenharmony_ci        root.update()  # Process all pending events.
837db96d56Sopenharmony_ci        self.assertEqual(count, 1)
847db96d56Sopenharmony_ci        with self.assertRaises(tkinter.TclError):
857db96d56Sopenharmony_ci            root.tk.call(script)
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci        # Set up with callback with args.
887db96d56Sopenharmony_ci        count = 0
897db96d56Sopenharmony_ci        timer1 = root.after(0, callback, 42, 11)
907db96d56Sopenharmony_ci        root.update()  # Process all pending events.
917db96d56Sopenharmony_ci        self.assertEqual(count, 53)
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci        # Cancel before called.
947db96d56Sopenharmony_ci        timer1 = root.after(1000, callback)
957db96d56Sopenharmony_ci        self.assertIn(timer1, root.tk.call('after', 'info'))
967db96d56Sopenharmony_ci        (script, _) = root.tk.splitlist(root.tk.call('after', 'info', timer1))
977db96d56Sopenharmony_ci        root.after_cancel(timer1)  # Cancel this event.
987db96d56Sopenharmony_ci        self.assertEqual(count, 53)
997db96d56Sopenharmony_ci        with self.assertRaises(tkinter.TclError):
1007db96d56Sopenharmony_ci            root.tk.call(script)
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci        # Call with a callable class
1037db96d56Sopenharmony_ci        count = 0
1047db96d56Sopenharmony_ci        timer1 = root.after(0, functools.partial(callback, 42, 11))
1057db96d56Sopenharmony_ci        root.update()  # Process all pending events.
1067db96d56Sopenharmony_ci        self.assertEqual(count, 53)
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci    def test_after_idle(self):
1097db96d56Sopenharmony_ci        root = self.root
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci        def callback(start=0, step=1):
1127db96d56Sopenharmony_ci            nonlocal count
1137db96d56Sopenharmony_ci            count = start + step
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci        # Set up with callback with no args.
1167db96d56Sopenharmony_ci        count = 0
1177db96d56Sopenharmony_ci        idle1 = root.after_idle(callback)
1187db96d56Sopenharmony_ci        self.assertIn(idle1, root.tk.call('after', 'info'))
1197db96d56Sopenharmony_ci        (script, _) = root.tk.splitlist(root.tk.call('after', 'info', idle1))
1207db96d56Sopenharmony_ci        root.update_idletasks()  # Process all pending events.
1217db96d56Sopenharmony_ci        self.assertEqual(count, 1)
1227db96d56Sopenharmony_ci        with self.assertRaises(tkinter.TclError):
1237db96d56Sopenharmony_ci            root.tk.call(script)
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ci        # Set up with callback with args.
1267db96d56Sopenharmony_ci        count = 0
1277db96d56Sopenharmony_ci        idle1 = root.after_idle(callback, 42, 11)
1287db96d56Sopenharmony_ci        root.update_idletasks()  # Process all pending events.
1297db96d56Sopenharmony_ci        self.assertEqual(count, 53)
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci        # Cancel before called.
1327db96d56Sopenharmony_ci        idle1 = root.after_idle(callback)
1337db96d56Sopenharmony_ci        self.assertIn(idle1, root.tk.call('after', 'info'))
1347db96d56Sopenharmony_ci        (script, _) = root.tk.splitlist(root.tk.call('after', 'info', idle1))
1357db96d56Sopenharmony_ci        root.after_cancel(idle1)  # Cancel this event.
1367db96d56Sopenharmony_ci        self.assertEqual(count, 53)
1377db96d56Sopenharmony_ci        with self.assertRaises(tkinter.TclError):
1387db96d56Sopenharmony_ci            root.tk.call(script)
1397db96d56Sopenharmony_ci
1407db96d56Sopenharmony_ci    def test_after_cancel(self):
1417db96d56Sopenharmony_ci        root = self.root
1427db96d56Sopenharmony_ci
1437db96d56Sopenharmony_ci        def callback():
1447db96d56Sopenharmony_ci            nonlocal count
1457db96d56Sopenharmony_ci            count += 1
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci        timer1 = root.after(5000, callback)
1487db96d56Sopenharmony_ci        idle1 = root.after_idle(callback)
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci        # No value for id raises a ValueError.
1517db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
1527db96d56Sopenharmony_ci            root.after_cancel(None)
1537db96d56Sopenharmony_ci
1547db96d56Sopenharmony_ci        # Cancel timer event.
1557db96d56Sopenharmony_ci        count = 0
1567db96d56Sopenharmony_ci        (script, _) = root.tk.splitlist(root.tk.call('after', 'info', timer1))
1577db96d56Sopenharmony_ci        root.tk.call(script)
1587db96d56Sopenharmony_ci        self.assertEqual(count, 1)
1597db96d56Sopenharmony_ci        root.after_cancel(timer1)
1607db96d56Sopenharmony_ci        with self.assertRaises(tkinter.TclError):
1617db96d56Sopenharmony_ci            root.tk.call(script)
1627db96d56Sopenharmony_ci        self.assertEqual(count, 1)
1637db96d56Sopenharmony_ci        with self.assertRaises(tkinter.TclError):
1647db96d56Sopenharmony_ci            root.tk.call('after', 'info', timer1)
1657db96d56Sopenharmony_ci
1667db96d56Sopenharmony_ci        # Cancel same event - nothing happens.
1677db96d56Sopenharmony_ci        root.after_cancel(timer1)
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ci        # Cancel idle event.
1707db96d56Sopenharmony_ci        count = 0
1717db96d56Sopenharmony_ci        (script, _) = root.tk.splitlist(root.tk.call('after', 'info', idle1))
1727db96d56Sopenharmony_ci        root.tk.call(script)
1737db96d56Sopenharmony_ci        self.assertEqual(count, 1)
1747db96d56Sopenharmony_ci        root.after_cancel(idle1)
1757db96d56Sopenharmony_ci        with self.assertRaises(tkinter.TclError):
1767db96d56Sopenharmony_ci            root.tk.call(script)
1777db96d56Sopenharmony_ci        self.assertEqual(count, 1)
1787db96d56Sopenharmony_ci        with self.assertRaises(tkinter.TclError):
1797db96d56Sopenharmony_ci            root.tk.call('after', 'info', idle1)
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci    def test_clipboard(self):
1827db96d56Sopenharmony_ci        root = self.root
1837db96d56Sopenharmony_ci        root.clipboard_clear()
1847db96d56Sopenharmony_ci        root.clipboard_append('Ùñî')
1857db96d56Sopenharmony_ci        self.assertEqual(root.clipboard_get(), 'Ùñî')
1867db96d56Sopenharmony_ci        root.clipboard_append('çōđě')
1877db96d56Sopenharmony_ci        self.assertEqual(root.clipboard_get(), 'Ùñîçōđě')
1887db96d56Sopenharmony_ci        root.clipboard_clear()
1897db96d56Sopenharmony_ci        with self.assertRaises(tkinter.TclError):
1907db96d56Sopenharmony_ci            root.clipboard_get()
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci    def test_clipboard_astral(self):
1937db96d56Sopenharmony_ci        root = self.root
1947db96d56Sopenharmony_ci        root.clipboard_clear()
1957db96d56Sopenharmony_ci        root.clipboard_append('���')
1967db96d56Sopenharmony_ci        self.assertEqual(root.clipboard_get(), '���')
1977db96d56Sopenharmony_ci        root.clipboard_append('����')
1987db96d56Sopenharmony_ci        self.assertEqual(root.clipboard_get(), '�������')
1997db96d56Sopenharmony_ci        root.clipboard_clear()
2007db96d56Sopenharmony_ci        with self.assertRaises(tkinter.TclError):
2017db96d56Sopenharmony_ci            root.clipboard_get()
2027db96d56Sopenharmony_ci
2037db96d56Sopenharmony_ci    def test_winfo_rgb(self):
2047db96d56Sopenharmony_ci
2057db96d56Sopenharmony_ci        def assertApprox(col1, col2):
2067db96d56Sopenharmony_ci            # A small amount of flexibility is required (bpo-45496)
2077db96d56Sopenharmony_ci            # 33 is ~0.05% of 65535, which is a reasonable margin
2087db96d56Sopenharmony_ci            for col1_channel, col2_channel in zip(col1, col2):
2097db96d56Sopenharmony_ci                self.assertAlmostEqual(col1_channel, col2_channel, delta=33)
2107db96d56Sopenharmony_ci
2117db96d56Sopenharmony_ci        root = self.root
2127db96d56Sopenharmony_ci        rgb = root.winfo_rgb
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci        # Color name.
2157db96d56Sopenharmony_ci        self.assertEqual(rgb('red'), (65535, 0, 0))
2167db96d56Sopenharmony_ci        self.assertEqual(rgb('dark slate blue'), (18504, 15677, 35723))
2177db96d56Sopenharmony_ci        # #RGB - extends each 4-bit hex value to be 16-bit.
2187db96d56Sopenharmony_ci        self.assertEqual(rgb('#F0F'), (0xFFFF, 0x0000, 0xFFFF))
2197db96d56Sopenharmony_ci        # #RRGGBB - extends each 8-bit hex value to be 16-bit.
2207db96d56Sopenharmony_ci        assertApprox(rgb('#4a3c8c'), (0x4a4a, 0x3c3c, 0x8c8c))
2217db96d56Sopenharmony_ci        # #RRRRGGGGBBBB
2227db96d56Sopenharmony_ci        assertApprox(rgb('#dede14143939'), (0xdede, 0x1414, 0x3939))
2237db96d56Sopenharmony_ci        # Invalid string.
2247db96d56Sopenharmony_ci        with self.assertRaises(tkinter.TclError):
2257db96d56Sopenharmony_ci            rgb('#123456789a')
2267db96d56Sopenharmony_ci        # RGB triplet is invalid input.
2277db96d56Sopenharmony_ci        with self.assertRaises(tkinter.TclError):
2287db96d56Sopenharmony_ci            rgb((111, 78, 55))
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci    def test_event_repr_defaults(self):
2317db96d56Sopenharmony_ci        e = tkinter.Event()
2327db96d56Sopenharmony_ci        e.serial = 12345
2337db96d56Sopenharmony_ci        e.num = '??'
2347db96d56Sopenharmony_ci        e.height = '??'
2357db96d56Sopenharmony_ci        e.keycode = '??'
2367db96d56Sopenharmony_ci        e.state = 0
2377db96d56Sopenharmony_ci        e.time = 123456789
2387db96d56Sopenharmony_ci        e.width = '??'
2397db96d56Sopenharmony_ci        e.x = '??'
2407db96d56Sopenharmony_ci        e.y = '??'
2417db96d56Sopenharmony_ci        e.char = ''
2427db96d56Sopenharmony_ci        e.keysym = '??'
2437db96d56Sopenharmony_ci        e.keysym_num = '??'
2447db96d56Sopenharmony_ci        e.type = '100'
2457db96d56Sopenharmony_ci        e.widget = '??'
2467db96d56Sopenharmony_ci        e.x_root = '??'
2477db96d56Sopenharmony_ci        e.y_root = '??'
2487db96d56Sopenharmony_ci        e.delta = 0
2497db96d56Sopenharmony_ci        self.assertEqual(repr(e), '<100 event>')
2507db96d56Sopenharmony_ci
2517db96d56Sopenharmony_ci    def test_event_repr(self):
2527db96d56Sopenharmony_ci        e = tkinter.Event()
2537db96d56Sopenharmony_ci        e.serial = 12345
2547db96d56Sopenharmony_ci        e.num = 3
2557db96d56Sopenharmony_ci        e.focus = True
2567db96d56Sopenharmony_ci        e.height = 200
2577db96d56Sopenharmony_ci        e.keycode = 65
2587db96d56Sopenharmony_ci        e.state = 0x30405
2597db96d56Sopenharmony_ci        e.time = 123456789
2607db96d56Sopenharmony_ci        e.width = 300
2617db96d56Sopenharmony_ci        e.x = 10
2627db96d56Sopenharmony_ci        e.y = 20
2637db96d56Sopenharmony_ci        e.char = 'A'
2647db96d56Sopenharmony_ci        e.send_event = True
2657db96d56Sopenharmony_ci        e.keysym = 'Key-A'
2667db96d56Sopenharmony_ci        e.keysym_num = ord('A')
2677db96d56Sopenharmony_ci        e.type = tkinter.EventType.Configure
2687db96d56Sopenharmony_ci        e.widget = '.text'
2697db96d56Sopenharmony_ci        e.x_root = 1010
2707db96d56Sopenharmony_ci        e.y_root = 1020
2717db96d56Sopenharmony_ci        e.delta = -1
2727db96d56Sopenharmony_ci        self.assertEqual(repr(e),
2737db96d56Sopenharmony_ci                         "<Configure event send_event=True"
2747db96d56Sopenharmony_ci                         " state=Shift|Control|Button3|0x30000"
2757db96d56Sopenharmony_ci                         " keysym=Key-A keycode=65 char='A'"
2767db96d56Sopenharmony_ci                         " num=3 delta=-1 focus=True"
2777db96d56Sopenharmony_ci                         " x=10 y=20 width=300 height=200>")
2787db96d56Sopenharmony_ci
2797db96d56Sopenharmony_ci    def test_eventtype_enum(self):
2807db96d56Sopenharmony_ci        class CheckedEventType(enum.StrEnum):
2817db96d56Sopenharmony_ci            KeyPress = '2'
2827db96d56Sopenharmony_ci            Key = KeyPress
2837db96d56Sopenharmony_ci            KeyRelease = '3'
2847db96d56Sopenharmony_ci            ButtonPress = '4'
2857db96d56Sopenharmony_ci            Button = ButtonPress
2867db96d56Sopenharmony_ci            ButtonRelease = '5'
2877db96d56Sopenharmony_ci            Motion = '6'
2887db96d56Sopenharmony_ci            Enter = '7'
2897db96d56Sopenharmony_ci            Leave = '8'
2907db96d56Sopenharmony_ci            FocusIn = '9'
2917db96d56Sopenharmony_ci            FocusOut = '10'
2927db96d56Sopenharmony_ci            Keymap = '11'           # undocumented
2937db96d56Sopenharmony_ci            Expose = '12'
2947db96d56Sopenharmony_ci            GraphicsExpose = '13'   # undocumented
2957db96d56Sopenharmony_ci            NoExpose = '14'         # undocumented
2967db96d56Sopenharmony_ci            Visibility = '15'
2977db96d56Sopenharmony_ci            Create = '16'
2987db96d56Sopenharmony_ci            Destroy = '17'
2997db96d56Sopenharmony_ci            Unmap = '18'
3007db96d56Sopenharmony_ci            Map = '19'
3017db96d56Sopenharmony_ci            MapRequest = '20'
3027db96d56Sopenharmony_ci            Reparent = '21'
3037db96d56Sopenharmony_ci            Configure = '22'
3047db96d56Sopenharmony_ci            ConfigureRequest = '23'
3057db96d56Sopenharmony_ci            Gravity = '24'
3067db96d56Sopenharmony_ci            ResizeRequest = '25'
3077db96d56Sopenharmony_ci            Circulate = '26'
3087db96d56Sopenharmony_ci            CirculateRequest = '27'
3097db96d56Sopenharmony_ci            Property = '28'
3107db96d56Sopenharmony_ci            SelectionClear = '29'   # undocumented
3117db96d56Sopenharmony_ci            SelectionRequest = '30' # undocumented
3127db96d56Sopenharmony_ci            Selection = '31'        # undocumented
3137db96d56Sopenharmony_ci            Colormap = '32'
3147db96d56Sopenharmony_ci            ClientMessage = '33'    # undocumented
3157db96d56Sopenharmony_ci            Mapping = '34'          # undocumented
3167db96d56Sopenharmony_ci            VirtualEvent = '35'     # undocumented
3177db96d56Sopenharmony_ci            Activate = '36'
3187db96d56Sopenharmony_ci            Deactivate = '37'
3197db96d56Sopenharmony_ci            MouseWheel = '38'
3207db96d56Sopenharmony_ci        enum._test_simple_enum(CheckedEventType, tkinter.EventType)
3217db96d56Sopenharmony_ci
3227db96d56Sopenharmony_ci    def test_getboolean(self):
3237db96d56Sopenharmony_ci        for v in 'true', 'yes', 'on', '1', 't', 'y', 1, True:
3247db96d56Sopenharmony_ci            self.assertIs(self.root.getboolean(v), True)
3257db96d56Sopenharmony_ci        for v in 'false', 'no', 'off', '0', 'f', 'n', 0, False:
3267db96d56Sopenharmony_ci            self.assertIs(self.root.getboolean(v), False)
3277db96d56Sopenharmony_ci        self.assertRaises(ValueError, self.root.getboolean, 'yea')
3287db96d56Sopenharmony_ci        self.assertRaises(ValueError, self.root.getboolean, '')
3297db96d56Sopenharmony_ci        self.assertRaises(TypeError, self.root.getboolean, None)
3307db96d56Sopenharmony_ci        self.assertRaises(TypeError, self.root.getboolean, ())
3317db96d56Sopenharmony_ci
3327db96d56Sopenharmony_ci    def test_mainloop(self):
3337db96d56Sopenharmony_ci        log = []
3347db96d56Sopenharmony_ci        def callback():
3357db96d56Sopenharmony_ci            log.append(1)
3367db96d56Sopenharmony_ci            self.root.after(100, self.root.quit)
3377db96d56Sopenharmony_ci        self.root.after(100, callback)
3387db96d56Sopenharmony_ci        self.root.mainloop(1)
3397db96d56Sopenharmony_ci        self.assertEqual(log, [])
3407db96d56Sopenharmony_ci        self.root.mainloop(0)
3417db96d56Sopenharmony_ci        self.assertEqual(log, [1])
3427db96d56Sopenharmony_ci        self.assertTrue(self.root.winfo_exists())
3437db96d56Sopenharmony_ci
3447db96d56Sopenharmony_ci    def test_info_patchlevel(self):
3457db96d56Sopenharmony_ci        vi = self.root.info_patchlevel()
3467db96d56Sopenharmony_ci        f = tkinter.Frame(self.root)
3477db96d56Sopenharmony_ci        self.assertEqual(f.info_patchlevel(), vi)
3487db96d56Sopenharmony_ci        # The following is almost a copy of tests for sys.version_info.
3497db96d56Sopenharmony_ci        self.assertIsInstance(vi[:], tuple)
3507db96d56Sopenharmony_ci        self.assertEqual(len(vi), 5)
3517db96d56Sopenharmony_ci        self.assertIsInstance(vi[0], int)
3527db96d56Sopenharmony_ci        self.assertIsInstance(vi[1], int)
3537db96d56Sopenharmony_ci        self.assertIsInstance(vi[2], int)
3547db96d56Sopenharmony_ci        self.assertIn(vi[3], ("alpha", "beta", "candidate", "final"))
3557db96d56Sopenharmony_ci        self.assertIsInstance(vi[4], int)
3567db96d56Sopenharmony_ci        self.assertIsInstance(vi.major, int)
3577db96d56Sopenharmony_ci        self.assertIsInstance(vi.minor, int)
3587db96d56Sopenharmony_ci        self.assertIsInstance(vi.micro, int)
3597db96d56Sopenharmony_ci        self.assertIn(vi.releaselevel, ("alpha", "beta", "final"))
3607db96d56Sopenharmony_ci        self.assertIsInstance(vi.serial, int)
3617db96d56Sopenharmony_ci        self.assertEqual(vi[0], vi.major)
3627db96d56Sopenharmony_ci        self.assertEqual(vi[1], vi.minor)
3637db96d56Sopenharmony_ci        self.assertEqual(vi[2], vi.micro)
3647db96d56Sopenharmony_ci        self.assertEqual(vi[3], vi.releaselevel)
3657db96d56Sopenharmony_ci        self.assertEqual(vi[4], vi.serial)
3667db96d56Sopenharmony_ci        self.assertTrue(vi > (1,0,0))
3677db96d56Sopenharmony_ci        if vi.releaselevel == 'final':
3687db96d56Sopenharmony_ci            self.assertEqual(vi.serial, 0)
3697db96d56Sopenharmony_ci        else:
3707db96d56Sopenharmony_ci            self.assertEqual(vi.micro, 0)
3717db96d56Sopenharmony_ci        self.assertTrue(str(vi).startswith(f'{vi.major}.{vi.minor}'))
3727db96d56Sopenharmony_ci
3737db96d56Sopenharmony_ci
3747db96d56Sopenharmony_ciclass DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase):
3757db96d56Sopenharmony_ci
3767db96d56Sopenharmony_ci    def test_default_root(self):
3777db96d56Sopenharmony_ci        self.assertIs(tkinter._support_default_root, True)
3787db96d56Sopenharmony_ci        self.assertIsNone(tkinter._default_root)
3797db96d56Sopenharmony_ci        root = tkinter.Tk()
3807db96d56Sopenharmony_ci        root2 = tkinter.Tk()
3817db96d56Sopenharmony_ci        root3 = tkinter.Tk()
3827db96d56Sopenharmony_ci        self.assertIs(tkinter._default_root, root)
3837db96d56Sopenharmony_ci        root2.destroy()
3847db96d56Sopenharmony_ci        self.assertIs(tkinter._default_root, root)
3857db96d56Sopenharmony_ci        root.destroy()
3867db96d56Sopenharmony_ci        self.assertIsNone(tkinter._default_root)
3877db96d56Sopenharmony_ci        root3.destroy()
3887db96d56Sopenharmony_ci        self.assertIsNone(tkinter._default_root)
3897db96d56Sopenharmony_ci
3907db96d56Sopenharmony_ci    def test_no_default_root(self):
3917db96d56Sopenharmony_ci        self.assertIs(tkinter._support_default_root, True)
3927db96d56Sopenharmony_ci        self.assertIsNone(tkinter._default_root)
3937db96d56Sopenharmony_ci        root = tkinter.Tk()
3947db96d56Sopenharmony_ci        self.assertIs(tkinter._default_root, root)
3957db96d56Sopenharmony_ci        tkinter.NoDefaultRoot()
3967db96d56Sopenharmony_ci        self.assertIs(tkinter._support_default_root, False)
3977db96d56Sopenharmony_ci        self.assertFalse(hasattr(tkinter, '_default_root'))
3987db96d56Sopenharmony_ci        # repeated call is no-op
3997db96d56Sopenharmony_ci        tkinter.NoDefaultRoot()
4007db96d56Sopenharmony_ci        self.assertIs(tkinter._support_default_root, False)
4017db96d56Sopenharmony_ci        self.assertFalse(hasattr(tkinter, '_default_root'))
4027db96d56Sopenharmony_ci        root.destroy()
4037db96d56Sopenharmony_ci        self.assertIs(tkinter._support_default_root, False)
4047db96d56Sopenharmony_ci        self.assertFalse(hasattr(tkinter, '_default_root'))
4057db96d56Sopenharmony_ci        root = tkinter.Tk()
4067db96d56Sopenharmony_ci        self.assertIs(tkinter._support_default_root, False)
4077db96d56Sopenharmony_ci        self.assertFalse(hasattr(tkinter, '_default_root'))
4087db96d56Sopenharmony_ci        root.destroy()
4097db96d56Sopenharmony_ci
4107db96d56Sopenharmony_ci    def test_getboolean(self):
4117db96d56Sopenharmony_ci        self.assertRaises(RuntimeError, tkinter.getboolean, '1')
4127db96d56Sopenharmony_ci        root = tkinter.Tk()
4137db96d56Sopenharmony_ci        self.assertIs(tkinter.getboolean('1'), True)
4147db96d56Sopenharmony_ci        self.assertRaises(ValueError, tkinter.getboolean, 'yea')
4157db96d56Sopenharmony_ci        root.destroy()
4167db96d56Sopenharmony_ci        tkinter.NoDefaultRoot()
4177db96d56Sopenharmony_ci        self.assertRaises(RuntimeError, tkinter.getboolean, '1')
4187db96d56Sopenharmony_ci
4197db96d56Sopenharmony_ci    def test_mainloop(self):
4207db96d56Sopenharmony_ci        self.assertRaises(RuntimeError, tkinter.mainloop)
4217db96d56Sopenharmony_ci        root = tkinter.Tk()
4227db96d56Sopenharmony_ci        root.after_idle(root.quit)
4237db96d56Sopenharmony_ci        tkinter.mainloop()
4247db96d56Sopenharmony_ci        root.destroy()
4257db96d56Sopenharmony_ci        tkinter.NoDefaultRoot()
4267db96d56Sopenharmony_ci        self.assertRaises(RuntimeError, tkinter.mainloop)
4277db96d56Sopenharmony_ci
4287db96d56Sopenharmony_ci
4297db96d56Sopenharmony_ciif __name__ == "__main__":
4307db96d56Sopenharmony_ci    unittest.main()
431