python (3.12.0)
1 import unittest
2 import tkinter
3 from tkinter import font
4 from test.support import requires, gc_collect, ALWAYS_EQ
5 from test.test_tkinter.support import AbstractTkTest, AbstractDefaultRootTest
6
7 requires('gui')
8
9 fontname = "TkDefaultFont"
10
11 class ESC[4;38;5;81mFontTest(ESC[4;38;5;149mAbstractTkTest, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
12
13 @classmethod
14 def setUpClass(cls):
15 AbstractTkTest.setUpClass.__func__(cls)
16 try:
17 cls.font = font.Font(root=cls.root, name=fontname, exists=True)
18 except tkinter.TclError:
19 cls.font = font.Font(root=cls.root, name=fontname, exists=False)
20
21 def test_configure(self):
22 options = self.font.configure()
23 self.assertGreaterEqual(set(options),
24 {'family', 'size', 'weight', 'slant', 'underline', 'overstrike'})
25 for key in options:
26 self.assertEqual(self.font.cget(key), options[key])
27 self.assertEqual(self.font[key], options[key])
28 for key in 'family', 'weight', 'slant':
29 self.assertIsInstance(options[key], str)
30 self.assertIsInstance(self.font.cget(key), str)
31 self.assertIsInstance(self.font[key], str)
32 sizetype = int if self.wantobjects else str
33 for key in 'size', 'underline', 'overstrike':
34 self.assertIsInstance(options[key], sizetype)
35 self.assertIsInstance(self.font.cget(key), sizetype)
36 self.assertIsInstance(self.font[key], sizetype)
37
38 def test_unicode_family(self):
39 family = 'MS \u30b4\u30b7\u30c3\u30af'
40 try:
41 f = font.Font(root=self.root, family=family, exists=True)
42 except tkinter.TclError:
43 f = font.Font(root=self.root, family=family, exists=False)
44 self.assertEqual(f.cget('family'), family)
45 del f
46 gc_collect()
47
48 def test_actual(self):
49 options = self.font.actual()
50 self.assertGreaterEqual(set(options),
51 {'family', 'size', 'weight', 'slant', 'underline', 'overstrike'})
52 for key in options:
53 self.assertEqual(self.font.actual(key), options[key])
54 for key in 'family', 'weight', 'slant':
55 self.assertIsInstance(options[key], str)
56 self.assertIsInstance(self.font.actual(key), str)
57 sizetype = int if self.wantobjects else str
58 for key in 'size', 'underline', 'overstrike':
59 self.assertIsInstance(options[key], sizetype)
60 self.assertIsInstance(self.font.actual(key), sizetype)
61
62 def test_name(self):
63 self.assertEqual(self.font.name, fontname)
64 self.assertEqual(str(self.font), fontname)
65
66 def test_equality(self):
67 font1 = font.Font(root=self.root, name=fontname, exists=True)
68 font2 = font.Font(root=self.root, name=fontname, exists=True)
69 self.assertIsNot(font1, font2)
70 self.assertEqual(font1, font2)
71 self.assertNotEqual(font1, font1.copy())
72
73 self.assertNotEqual(font1, 0)
74 self.assertEqual(font1, ALWAYS_EQ)
75
76 root2 = tkinter.Tk()
77 self.addCleanup(root2.destroy)
78 font3 = font.Font(root=root2, name=fontname, exists=True)
79 self.assertEqual(str(font1), str(font3))
80 self.assertNotEqual(font1, font3)
81
82 def test_measure(self):
83 self.assertIsInstance(self.font.measure('abc'), int)
84
85 def test_metrics(self):
86 metrics = self.font.metrics()
87 self.assertGreaterEqual(set(metrics),
88 {'ascent', 'descent', 'linespace', 'fixed'})
89 for key in metrics:
90 self.assertEqual(self.font.metrics(key), metrics[key])
91 self.assertIsInstance(metrics[key], int)
92 self.assertIsInstance(self.font.metrics(key), int)
93
94 def test_families(self):
95 families = font.families(self.root)
96 self.assertIsInstance(families, tuple)
97 self.assertTrue(families)
98 for family in families:
99 self.assertIsInstance(family, str)
100 self.assertTrue(family)
101
102 def test_names(self):
103 names = font.names(self.root)
104 self.assertIsInstance(names, tuple)
105 self.assertTrue(names)
106 for name in names:
107 self.assertIsInstance(name, str)
108 self.assertTrue(name)
109 self.assertIn(fontname, names)
110
111 def test_nametofont(self):
112 testfont = font.nametofont(fontname, root=self.root)
113 self.assertIsInstance(testfont, font.Font)
114 self.assertEqual(testfont.name, fontname)
115
116 def test_repr(self):
117 self.assertEqual(
118 repr(self.font), f'<tkinter.font.Font object {fontname!r}>'
119 )
120
121
122 class ESC[4;38;5;81mDefaultRootTest(ESC[4;38;5;149mAbstractDefaultRootTest, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
123
124 def test_families(self):
125 self.assertRaises(RuntimeError, font.families)
126 root = tkinter.Tk()
127 families = font.families()
128 self.assertIsInstance(families, tuple)
129 self.assertTrue(families)
130 for family in families:
131 self.assertIsInstance(family, str)
132 self.assertTrue(family)
133 root.destroy()
134 tkinter.NoDefaultRoot()
135 self.assertRaises(RuntimeError, font.families)
136
137 def test_names(self):
138 self.assertRaises(RuntimeError, font.names)
139 root = tkinter.Tk()
140 names = font.names()
141 self.assertIsInstance(names, tuple)
142 self.assertTrue(names)
143 for name in names:
144 self.assertIsInstance(name, str)
145 self.assertTrue(name)
146 self.assertIn(fontname, names)
147 root.destroy()
148 tkinter.NoDefaultRoot()
149 self.assertRaises(RuntimeError, font.names)
150
151 def test_nametofont(self):
152 self.assertRaises(RuntimeError, font.nametofont, fontname)
153 root = tkinter.Tk()
154 testfont = font.nametofont(fontname)
155 self.assertIsInstance(testfont, font.Font)
156 self.assertEqual(testfont.name, fontname)
157 root.destroy()
158 tkinter.NoDefaultRoot()
159 self.assertRaises(RuntimeError, font.nametofont, fontname)
160
161
162 if __name__ == "__main__":
163 unittest.main()