17db96d56Sopenharmony_ciimport unittest
27db96d56Sopenharmony_cifrom test import support
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ciimport gc
57db96d56Sopenharmony_ciimport tkinter
67db96d56Sopenharmony_cifrom tkinter import (Variable, StringVar, IntVar, DoubleVar, BooleanVar, Tcl,
77db96d56Sopenharmony_ci                     TclError)
87db96d56Sopenharmony_cifrom test.support import ALWAYS_EQ
97db96d56Sopenharmony_cifrom tkinter.test.support import AbstractDefaultRootTest
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ciclass Var(Variable):
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci    _default = "default"
157db96d56Sopenharmony_ci    side_effect = False
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci    def set(self, value):
187db96d56Sopenharmony_ci        self.side_effect = True
197db96d56Sopenharmony_ci        super().set(value)
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ciclass TestBase(unittest.TestCase):
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci    def setUp(self):
257db96d56Sopenharmony_ci        self.root = Tcl()
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ci    def tearDown(self):
287db96d56Sopenharmony_ci        del self.root
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ciclass TestVariable(TestBase):
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_ci    def info_exists(self, *args):
347db96d56Sopenharmony_ci        return self.root.getboolean(self.root.call("info", "exists", *args))
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci    def test_default(self):
377db96d56Sopenharmony_ci        v = Variable(self.root)
387db96d56Sopenharmony_ci        self.assertEqual("", v.get())
397db96d56Sopenharmony_ci        self.assertRegex(str(v), r"^PY_VAR(\d+)$")
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ci    def test_name_and_value(self):
427db96d56Sopenharmony_ci        v = Variable(self.root, "sample string", "varname")
437db96d56Sopenharmony_ci        self.assertEqual("sample string", v.get())
447db96d56Sopenharmony_ci        self.assertEqual("varname", str(v))
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ci    def test___del__(self):
477db96d56Sopenharmony_ci        self.assertFalse(self.info_exists("varname"))
487db96d56Sopenharmony_ci        v = Variable(self.root, "sample string", "varname")
497db96d56Sopenharmony_ci        self.assertTrue(self.info_exists("varname"))
507db96d56Sopenharmony_ci        del v
517db96d56Sopenharmony_ci        support.gc_collect()  # For PyPy or other GCs.
527db96d56Sopenharmony_ci        self.assertFalse(self.info_exists("varname"))
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci    def test_dont_unset_not_existing(self):
557db96d56Sopenharmony_ci        self.assertFalse(self.info_exists("varname"))
567db96d56Sopenharmony_ci        v1 = Variable(self.root, name="name")
577db96d56Sopenharmony_ci        v2 = Variable(self.root, name="name")
587db96d56Sopenharmony_ci        del v1
597db96d56Sopenharmony_ci        support.gc_collect()  # For PyPy or other GCs.
607db96d56Sopenharmony_ci        self.assertFalse(self.info_exists("name"))
617db96d56Sopenharmony_ci        # shouldn't raise exception
627db96d56Sopenharmony_ci        del v2
637db96d56Sopenharmony_ci        support.gc_collect()  # For PyPy or other GCs.
647db96d56Sopenharmony_ci        self.assertFalse(self.info_exists("name"))
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci    def test_equality(self):
677db96d56Sopenharmony_ci        # values doesn't matter, only class and name are checked
687db96d56Sopenharmony_ci        v1 = Variable(self.root, name="abc")
697db96d56Sopenharmony_ci        v2 = Variable(self.root, name="abc")
707db96d56Sopenharmony_ci        self.assertIsNot(v1, v2)
717db96d56Sopenharmony_ci        self.assertEqual(v1, v2)
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ci        v3 = Variable(self.root, name="cba")
747db96d56Sopenharmony_ci        self.assertNotEqual(v1, v3)
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci        v4 = StringVar(self.root, name="abc")
777db96d56Sopenharmony_ci        self.assertEqual(str(v1), str(v4))
787db96d56Sopenharmony_ci        self.assertNotEqual(v1, v4)
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci        V = type('Variable', (), {})
817db96d56Sopenharmony_ci        self.assertNotEqual(v1, V())
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci        self.assertNotEqual(v1, object())
847db96d56Sopenharmony_ci        self.assertEqual(v1, ALWAYS_EQ)
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci        root2 = tkinter.Tk()
877db96d56Sopenharmony_ci        self.addCleanup(root2.destroy)
887db96d56Sopenharmony_ci        v5 = Variable(root2, name="abc")
897db96d56Sopenharmony_ci        self.assertEqual(str(v1), str(v5))
907db96d56Sopenharmony_ci        self.assertNotEqual(v1, v5)
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci    def test_invalid_name(self):
937db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
947db96d56Sopenharmony_ci            Variable(self.root, name=123)
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci    def test_null_in_name(self):
977db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
987db96d56Sopenharmony_ci            Variable(self.root, name='var\x00name')
997db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
1007db96d56Sopenharmony_ci            self.root.globalsetvar('var\x00name', "value")
1017db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
1027db96d56Sopenharmony_ci            self.root.globalsetvar(b'var\x00name', "value")
1037db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
1047db96d56Sopenharmony_ci            self.root.setvar('var\x00name', "value")
1057db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
1067db96d56Sopenharmony_ci            self.root.setvar(b'var\x00name', "value")
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci    def test_initialize(self):
1097db96d56Sopenharmony_ci        v = Var(self.root)
1107db96d56Sopenharmony_ci        self.assertFalse(v.side_effect)
1117db96d56Sopenharmony_ci        v.set("value")
1127db96d56Sopenharmony_ci        self.assertTrue(v.side_effect)
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_ci    def test_trace_old(self):
1157db96d56Sopenharmony_ci        # Old interface
1167db96d56Sopenharmony_ci        v = Variable(self.root)
1177db96d56Sopenharmony_ci        vname = str(v)
1187db96d56Sopenharmony_ci        trace = []
1197db96d56Sopenharmony_ci        def read_tracer(*args):
1207db96d56Sopenharmony_ci            trace.append(('read',) + args)
1217db96d56Sopenharmony_ci        def write_tracer(*args):
1227db96d56Sopenharmony_ci            trace.append(('write',) + args)
1237db96d56Sopenharmony_ci        cb1 = v.trace_variable('r', read_tracer)
1247db96d56Sopenharmony_ci        cb2 = v.trace_variable('wu', write_tracer)
1257db96d56Sopenharmony_ci        self.assertEqual(sorted(v.trace_vinfo()), [('r', cb1), ('wu', cb2)])
1267db96d56Sopenharmony_ci        self.assertEqual(trace, [])
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_ci        v.set('spam')
1297db96d56Sopenharmony_ci        self.assertEqual(trace, [('write', vname, '', 'w')])
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci        trace = []
1327db96d56Sopenharmony_ci        v.get()
1337db96d56Sopenharmony_ci        self.assertEqual(trace, [('read', vname, '', 'r')])
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci        trace = []
1367db96d56Sopenharmony_ci        info = sorted(v.trace_vinfo())
1377db96d56Sopenharmony_ci        v.trace_vdelete('w', cb1)  # Wrong mode
1387db96d56Sopenharmony_ci        self.assertEqual(sorted(v.trace_vinfo()), info)
1397db96d56Sopenharmony_ci        with self.assertRaises(TclError):
1407db96d56Sopenharmony_ci            v.trace_vdelete('r', 'spam')  # Wrong command name
1417db96d56Sopenharmony_ci        self.assertEqual(sorted(v.trace_vinfo()), info)
1427db96d56Sopenharmony_ci        v.trace_vdelete('r', (cb1, 43)) # Wrong arguments
1437db96d56Sopenharmony_ci        self.assertEqual(sorted(v.trace_vinfo()), info)
1447db96d56Sopenharmony_ci        v.get()
1457db96d56Sopenharmony_ci        self.assertEqual(trace, [('read', vname, '', 'r')])
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci        trace = []
1487db96d56Sopenharmony_ci        v.trace_vdelete('r', cb1)
1497db96d56Sopenharmony_ci        self.assertEqual(v.trace_vinfo(), [('wu', cb2)])
1507db96d56Sopenharmony_ci        v.get()
1517db96d56Sopenharmony_ci        self.assertEqual(trace, [])
1527db96d56Sopenharmony_ci
1537db96d56Sopenharmony_ci        trace = []
1547db96d56Sopenharmony_ci        del write_tracer
1557db96d56Sopenharmony_ci        gc.collect()
1567db96d56Sopenharmony_ci        v.set('eggs')
1577db96d56Sopenharmony_ci        self.assertEqual(trace, [('write', vname, '', 'w')])
1587db96d56Sopenharmony_ci
1597db96d56Sopenharmony_ci        trace = []
1607db96d56Sopenharmony_ci        del v
1617db96d56Sopenharmony_ci        gc.collect()
1627db96d56Sopenharmony_ci        self.assertEqual(trace, [('write', vname, '', 'u')])
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci    def test_trace(self):
1657db96d56Sopenharmony_ci        v = Variable(self.root)
1667db96d56Sopenharmony_ci        vname = str(v)
1677db96d56Sopenharmony_ci        trace = []
1687db96d56Sopenharmony_ci        def read_tracer(*args):
1697db96d56Sopenharmony_ci            trace.append(('read',) + args)
1707db96d56Sopenharmony_ci        def write_tracer(*args):
1717db96d56Sopenharmony_ci            trace.append(('write',) + args)
1727db96d56Sopenharmony_ci        tr1 = v.trace_add('read', read_tracer)
1737db96d56Sopenharmony_ci        tr2 = v.trace_add(['write', 'unset'], write_tracer)
1747db96d56Sopenharmony_ci        self.assertEqual(sorted(v.trace_info()), [
1757db96d56Sopenharmony_ci                         (('read',), tr1),
1767db96d56Sopenharmony_ci                         (('write', 'unset'), tr2)])
1777db96d56Sopenharmony_ci        self.assertEqual(trace, [])
1787db96d56Sopenharmony_ci
1797db96d56Sopenharmony_ci        v.set('spam')
1807db96d56Sopenharmony_ci        self.assertEqual(trace, [('write', vname, '', 'write')])
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ci        trace = []
1837db96d56Sopenharmony_ci        v.get()
1847db96d56Sopenharmony_ci        self.assertEqual(trace, [('read', vname, '', 'read')])
1857db96d56Sopenharmony_ci
1867db96d56Sopenharmony_ci        trace = []
1877db96d56Sopenharmony_ci        info = sorted(v.trace_info())
1887db96d56Sopenharmony_ci        v.trace_remove('write', tr1)  # Wrong mode
1897db96d56Sopenharmony_ci        self.assertEqual(sorted(v.trace_info()), info)
1907db96d56Sopenharmony_ci        with self.assertRaises(TclError):
1917db96d56Sopenharmony_ci            v.trace_remove('read', 'spam')  # Wrong command name
1927db96d56Sopenharmony_ci        self.assertEqual(sorted(v.trace_info()), info)
1937db96d56Sopenharmony_ci        v.get()
1947db96d56Sopenharmony_ci        self.assertEqual(trace, [('read', vname, '', 'read')])
1957db96d56Sopenharmony_ci
1967db96d56Sopenharmony_ci        trace = []
1977db96d56Sopenharmony_ci        v.trace_remove('read', tr1)
1987db96d56Sopenharmony_ci        self.assertEqual(v.trace_info(), [(('write', 'unset'), tr2)])
1997db96d56Sopenharmony_ci        v.get()
2007db96d56Sopenharmony_ci        self.assertEqual(trace, [])
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci        trace = []
2037db96d56Sopenharmony_ci        del write_tracer
2047db96d56Sopenharmony_ci        gc.collect()
2057db96d56Sopenharmony_ci        v.set('eggs')
2067db96d56Sopenharmony_ci        self.assertEqual(trace, [('write', vname, '', 'write')])
2077db96d56Sopenharmony_ci
2087db96d56Sopenharmony_ci        trace = []
2097db96d56Sopenharmony_ci        del v
2107db96d56Sopenharmony_ci        gc.collect()
2117db96d56Sopenharmony_ci        self.assertEqual(trace, [('write', vname, '', 'unset')])
2127db96d56Sopenharmony_ci
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ciclass TestStringVar(TestBase):
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ci    def test_default(self):
2177db96d56Sopenharmony_ci        v = StringVar(self.root)
2187db96d56Sopenharmony_ci        self.assertEqual("", v.get())
2197db96d56Sopenharmony_ci
2207db96d56Sopenharmony_ci    def test_get(self):
2217db96d56Sopenharmony_ci        v = StringVar(self.root, "abc", "name")
2227db96d56Sopenharmony_ci        self.assertEqual("abc", v.get())
2237db96d56Sopenharmony_ci        self.root.globalsetvar("name", "value")
2247db96d56Sopenharmony_ci        self.assertEqual("value", v.get())
2257db96d56Sopenharmony_ci
2267db96d56Sopenharmony_ci    def test_get_null(self):
2277db96d56Sopenharmony_ci        v = StringVar(self.root, "abc\x00def", "name")
2287db96d56Sopenharmony_ci        self.assertEqual("abc\x00def", v.get())
2297db96d56Sopenharmony_ci        self.root.globalsetvar("name", "val\x00ue")
2307db96d56Sopenharmony_ci        self.assertEqual("val\x00ue", v.get())
2317db96d56Sopenharmony_ci
2327db96d56Sopenharmony_ci
2337db96d56Sopenharmony_ciclass TestIntVar(TestBase):
2347db96d56Sopenharmony_ci
2357db96d56Sopenharmony_ci    def test_default(self):
2367db96d56Sopenharmony_ci        v = IntVar(self.root)
2377db96d56Sopenharmony_ci        self.assertEqual(0, v.get())
2387db96d56Sopenharmony_ci
2397db96d56Sopenharmony_ci    def test_get(self):
2407db96d56Sopenharmony_ci        v = IntVar(self.root, 123, "name")
2417db96d56Sopenharmony_ci        self.assertEqual(123, v.get())
2427db96d56Sopenharmony_ci        self.root.globalsetvar("name", "345")
2437db96d56Sopenharmony_ci        self.assertEqual(345, v.get())
2447db96d56Sopenharmony_ci        self.root.globalsetvar("name", "876.5")
2457db96d56Sopenharmony_ci        self.assertEqual(876, v.get())
2467db96d56Sopenharmony_ci
2477db96d56Sopenharmony_ci    def test_invalid_value(self):
2487db96d56Sopenharmony_ci        v = IntVar(self.root, name="name")
2497db96d56Sopenharmony_ci        self.root.globalsetvar("name", "value")
2507db96d56Sopenharmony_ci        with self.assertRaises((ValueError, TclError)):
2517db96d56Sopenharmony_ci            v.get()
2527db96d56Sopenharmony_ci
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ciclass TestDoubleVar(TestBase):
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci    def test_default(self):
2577db96d56Sopenharmony_ci        v = DoubleVar(self.root)
2587db96d56Sopenharmony_ci        self.assertEqual(0.0, v.get())
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ci    def test_get(self):
2617db96d56Sopenharmony_ci        v = DoubleVar(self.root, 1.23, "name")
2627db96d56Sopenharmony_ci        self.assertAlmostEqual(1.23, v.get())
2637db96d56Sopenharmony_ci        self.root.globalsetvar("name", "3.45")
2647db96d56Sopenharmony_ci        self.assertAlmostEqual(3.45, v.get())
2657db96d56Sopenharmony_ci
2667db96d56Sopenharmony_ci    def test_get_from_int(self):
2677db96d56Sopenharmony_ci        v = DoubleVar(self.root, 1.23, "name")
2687db96d56Sopenharmony_ci        self.assertAlmostEqual(1.23, v.get())
2697db96d56Sopenharmony_ci        self.root.globalsetvar("name", "3.45")
2707db96d56Sopenharmony_ci        self.assertAlmostEqual(3.45, v.get())
2717db96d56Sopenharmony_ci        self.root.globalsetvar("name", "456")
2727db96d56Sopenharmony_ci        self.assertAlmostEqual(456, v.get())
2737db96d56Sopenharmony_ci
2747db96d56Sopenharmony_ci    def test_invalid_value(self):
2757db96d56Sopenharmony_ci        v = DoubleVar(self.root, name="name")
2767db96d56Sopenharmony_ci        self.root.globalsetvar("name", "value")
2777db96d56Sopenharmony_ci        with self.assertRaises((ValueError, TclError)):
2787db96d56Sopenharmony_ci            v.get()
2797db96d56Sopenharmony_ci
2807db96d56Sopenharmony_ci
2817db96d56Sopenharmony_ciclass TestBooleanVar(TestBase):
2827db96d56Sopenharmony_ci
2837db96d56Sopenharmony_ci    def test_default(self):
2847db96d56Sopenharmony_ci        v = BooleanVar(self.root)
2857db96d56Sopenharmony_ci        self.assertIs(v.get(), False)
2867db96d56Sopenharmony_ci
2877db96d56Sopenharmony_ci    def test_get(self):
2887db96d56Sopenharmony_ci        v = BooleanVar(self.root, True, "name")
2897db96d56Sopenharmony_ci        self.assertIs(v.get(), True)
2907db96d56Sopenharmony_ci        self.root.globalsetvar("name", "0")
2917db96d56Sopenharmony_ci        self.assertIs(v.get(), False)
2927db96d56Sopenharmony_ci        self.root.globalsetvar("name", 42 if self.root.wantobjects() else 1)
2937db96d56Sopenharmony_ci        self.assertIs(v.get(), True)
2947db96d56Sopenharmony_ci        self.root.globalsetvar("name", 0)
2957db96d56Sopenharmony_ci        self.assertIs(v.get(), False)
2967db96d56Sopenharmony_ci        self.root.globalsetvar("name", "on")
2977db96d56Sopenharmony_ci        self.assertIs(v.get(), True)
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci    def test_set(self):
3007db96d56Sopenharmony_ci        true = 1 if self.root.wantobjects() else "1"
3017db96d56Sopenharmony_ci        false = 0 if self.root.wantobjects() else "0"
3027db96d56Sopenharmony_ci        v = BooleanVar(self.root, name="name")
3037db96d56Sopenharmony_ci        v.set(True)
3047db96d56Sopenharmony_ci        self.assertEqual(self.root.globalgetvar("name"), true)
3057db96d56Sopenharmony_ci        v.set("0")
3067db96d56Sopenharmony_ci        self.assertEqual(self.root.globalgetvar("name"), false)
3077db96d56Sopenharmony_ci        v.set(42)
3087db96d56Sopenharmony_ci        self.assertEqual(self.root.globalgetvar("name"), true)
3097db96d56Sopenharmony_ci        v.set(0)
3107db96d56Sopenharmony_ci        self.assertEqual(self.root.globalgetvar("name"), false)
3117db96d56Sopenharmony_ci        v.set("on")
3127db96d56Sopenharmony_ci        self.assertEqual(self.root.globalgetvar("name"), true)
3137db96d56Sopenharmony_ci
3147db96d56Sopenharmony_ci    def test_invalid_value_domain(self):
3157db96d56Sopenharmony_ci        false = 0 if self.root.wantobjects() else "0"
3167db96d56Sopenharmony_ci        v = BooleanVar(self.root, name="name")
3177db96d56Sopenharmony_ci        with self.assertRaises(TclError):
3187db96d56Sopenharmony_ci            v.set("value")
3197db96d56Sopenharmony_ci        self.assertEqual(self.root.globalgetvar("name"), false)
3207db96d56Sopenharmony_ci        self.root.globalsetvar("name", "value")
3217db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
3227db96d56Sopenharmony_ci            v.get()
3237db96d56Sopenharmony_ci        self.root.globalsetvar("name", "1.0")
3247db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
3257db96d56Sopenharmony_ci            v.get()
3267db96d56Sopenharmony_ci
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ciclass DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase):
3297db96d56Sopenharmony_ci
3307db96d56Sopenharmony_ci    def test_variable(self):
3317db96d56Sopenharmony_ci        self.assertRaises(RuntimeError, Variable)
3327db96d56Sopenharmony_ci        root = tkinter.Tk()
3337db96d56Sopenharmony_ci        v = Variable()
3347db96d56Sopenharmony_ci        v.set("value")
3357db96d56Sopenharmony_ci        self.assertEqual(v.get(), "value")
3367db96d56Sopenharmony_ci        root.destroy()
3377db96d56Sopenharmony_ci        tkinter.NoDefaultRoot()
3387db96d56Sopenharmony_ci        self.assertRaises(RuntimeError, Variable)
3397db96d56Sopenharmony_ci
3407db96d56Sopenharmony_ci
3417db96d56Sopenharmony_ciif __name__ == "__main__":
3427db96d56Sopenharmony_ci    unittest.main()
343