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