mirror of https://github.com/python/cpython
166 lines
4.6 KiB
Python
166 lines
4.6 KiB
Python
|
import unittest
|
||
|
|
||
|
from tkinter import Variable, StringVar, IntVar, DoubleVar, BooleanVar, Tk
|
||
|
|
||
|
|
||
|
class Var(Variable):
|
||
|
|
||
|
_default = "default"
|
||
|
side_effect = False
|
||
|
|
||
|
def set(self, value):
|
||
|
self.side_effect = True
|
||
|
super().set(value)
|
||
|
|
||
|
|
||
|
class TestBase(unittest.TestCase):
|
||
|
|
||
|
def setUp(self):
|
||
|
self.root = Tk()
|
||
|
|
||
|
def tearDown(self):
|
||
|
self.root.destroy()
|
||
|
|
||
|
|
||
|
class TestVariable(TestBase):
|
||
|
|
||
|
def test_default(self):
|
||
|
v = Variable(self.root)
|
||
|
self.assertEqual("", v.get())
|
||
|
self.assertRegex(str(v), r"^PY_VAR(\d+)$")
|
||
|
|
||
|
def test_name_and_value(self):
|
||
|
v = Variable(self.root, "sample string", "varname")
|
||
|
self.assertEqual("sample string", v.get())
|
||
|
self.assertEqual("varname", str(v))
|
||
|
|
||
|
def test___del__(self):
|
||
|
self.assertFalse(self.root.call("info", "exists", "varname"))
|
||
|
v = Variable(self.root, "sample string", "varname")
|
||
|
self.assertTrue(self.root.call("info", "exists", "varname"))
|
||
|
del v
|
||
|
self.assertFalse(self.root.call("info", "exists", "varname"))
|
||
|
|
||
|
def test_dont_unset_not_existing(self):
|
||
|
self.assertFalse(self.root.call("info", "exists", "varname"))
|
||
|
v1 = Variable(self.root, name="name")
|
||
|
v2 = Variable(self.root, name="name")
|
||
|
del v1
|
||
|
self.assertFalse(self.root.call("info", "exists", "name"))
|
||
|
# shouldn't raise exception
|
||
|
del v2
|
||
|
self.assertFalse(self.root.call("info", "exists", "name"))
|
||
|
|
||
|
def test___eq__(self):
|
||
|
# values doesn't matter, only class and name are checked
|
||
|
v1 = Variable(self.root, name="abc")
|
||
|
v2 = Variable(self.root, name="abc")
|
||
|
self.assertEqual(v1, v2)
|
||
|
|
||
|
v3 = Variable(self.root, name="abc")
|
||
|
v4 = StringVar(self.root, name="abc")
|
||
|
self.assertNotEqual(v3, v4)
|
||
|
|
||
|
def test_invalid_name(self):
|
||
|
with self.assertRaises(TypeError):
|
||
|
Variable(self.root, name=123)
|
||
|
|
||
|
def test_initialize(self):
|
||
|
v = Var()
|
||
|
self.assertFalse(v.side_effect)
|
||
|
v.set("value")
|
||
|
self.assertTrue(v.side_effect)
|
||
|
|
||
|
|
||
|
class TestStringVar(TestBase):
|
||
|
|
||
|
def test_default(self):
|
||
|
v = StringVar(self.root)
|
||
|
self.assertEqual("", v.get())
|
||
|
|
||
|
def test_get(self):
|
||
|
v = StringVar(self.root, "abc", "name")
|
||
|
self.assertEqual("abc", v.get())
|
||
|
self.root.globalsetvar("name", True)
|
||
|
self.assertEqual("1", v.get())
|
||
|
|
||
|
|
||
|
class TestIntVar(TestBase):
|
||
|
|
||
|
def test_default(self):
|
||
|
v = IntVar(self.root)
|
||
|
self.assertEqual(0, v.get())
|
||
|
|
||
|
def test_get(self):
|
||
|
v = IntVar(self.root, 123, "name")
|
||
|
self.assertEqual(123, v.get())
|
||
|
self.root.globalsetvar("name", "345")
|
||
|
self.assertEqual(345, v.get())
|
||
|
|
||
|
def test_invalid_value(self):
|
||
|
v = IntVar(self.root, name="name")
|
||
|
self.root.globalsetvar("name", "value")
|
||
|
with self.assertRaises(ValueError):
|
||
|
v.get()
|
||
|
self.root.globalsetvar("name", "345.0")
|
||
|
with self.assertRaises(ValueError):
|
||
|
v.get()
|
||
|
|
||
|
|
||
|
class TestDoubleVar(TestBase):
|
||
|
|
||
|
def test_default(self):
|
||
|
v = DoubleVar(self.root)
|
||
|
self.assertEqual(0.0, v.get())
|
||
|
|
||
|
def test_get(self):
|
||
|
v = DoubleVar(self.root, 1.23, "name")
|
||
|
self.assertAlmostEqual(1.23, v.get())
|
||
|
self.root.globalsetvar("name", "3.45")
|
||
|
self.assertAlmostEqual(3.45, v.get())
|
||
|
|
||
|
def test_get_from_int(self):
|
||
|
v = DoubleVar(self.root, 1.23, "name")
|
||
|
self.assertAlmostEqual(1.23, v.get())
|
||
|
self.root.globalsetvar("name", "3.45")
|
||
|
self.assertAlmostEqual(3.45, v.get())
|
||
|
self.root.globalsetvar("name", "456")
|
||
|
self.assertAlmostEqual(456, v.get())
|
||
|
|
||
|
def test_invalid_value(self):
|
||
|
v = DoubleVar(self.root, name="name")
|
||
|
self.root.globalsetvar("name", "value")
|
||
|
with self.assertRaises(ValueError):
|
||
|
v.get()
|
||
|
|
||
|
|
||
|
class TestBooleanVar(TestBase):
|
||
|
|
||
|
def test_default(self):
|
||
|
v = BooleanVar(self.root)
|
||
|
self.assertEqual(False, v.get())
|
||
|
|
||
|
def test_get(self):
|
||
|
v = BooleanVar(self.root, True, "name")
|
||
|
self.assertAlmostEqual(True, v.get())
|
||
|
self.root.globalsetvar("name", "0")
|
||
|
self.assertAlmostEqual(False, v.get())
|
||
|
|
||
|
def test_invalid_value_domain(self):
|
||
|
v = BooleanVar(self.root, name="name")
|
||
|
self.root.globalsetvar("name", "value")
|
||
|
with self.assertRaises(ValueError):
|
||
|
v.get()
|
||
|
self.root.globalsetvar("name", "1.0")
|
||
|
with self.assertRaises(ValueError):
|
||
|
v.get()
|
||
|
|
||
|
|
||
|
tests_gui = (TestVariable, TestStringVar, TestIntVar,
|
||
|
TestDoubleVar, TestBooleanVar)
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
from test.support import run_unittest
|
||
|
run_unittest(*tests_gui)
|