ยปCore Development>Code coverage>Lib/lib-tk/test/test_ttk/test_extensions.py

Python code coverage for Lib/lib-tk/test/test_ttk/test_extensions.py

#countcontent
1n/aimport sys
2n/aimport unittest
3n/aimport Tkinter
4n/aimport ttk
5n/afrom test.test_support import requires, run_unittest
6n/a
7n/aimport support
8n/a
9n/arequires('gui')
10n/a
11n/aclass LabeledScaleTest(unittest.TestCase):
12n/a
13n/a def setUp(self):
14n/a support.root_deiconify()
15n/a
16n/a def tearDown(self):
17n/a support.root_withdraw()
18n/a
19n/a
20n/a def test_widget_destroy(self):
21n/a # automatically created variable
22n/a x = ttk.LabeledScale()
23n/a var = x._variable._name
24n/a x.destroy()
25n/a self.assertRaises(Tkinter.TclError, x.tk.globalgetvar, var)
26n/a
27n/a # manually created variable
28n/a myvar = Tkinter.DoubleVar()
29n/a name = myvar._name
30n/a x = ttk.LabeledScale(variable=myvar)
31n/a x.destroy()
32n/a self.assertEqual(x.tk.globalgetvar(name), myvar.get())
33n/a del myvar
34n/a self.assertRaises(Tkinter.TclError, x.tk.globalgetvar, name)
35n/a
36n/a # checking that the tracing callback is properly removed
37n/a myvar = Tkinter.IntVar()
38n/a # LabeledScale will start tracing myvar
39n/a x = ttk.LabeledScale(variable=myvar)
40n/a x.destroy()
41n/a # Unless the tracing callback was removed, creating a new
42n/a # LabeledScale with the same var will cause an error now. This
43n/a # happens because the variable will be set to (possibly) a new
44n/a # value which causes the tracing callback to be called and then
45n/a # it tries calling instance attributes not yet defined.
46n/a ttk.LabeledScale(variable=myvar)
47n/a if hasattr(sys, 'last_type'):
48n/a self.assertFalse(sys.last_type == Tkinter.TclError)
49n/a
50n/a
51n/a def test_initialization(self):
52n/a # master passing
53n/a x = ttk.LabeledScale()
54n/a self.assertEqual(x.master, Tkinter._default_root)
55n/a x.destroy()
56n/a master = Tkinter.Frame()
57n/a x = ttk.LabeledScale(master)
58n/a self.assertEqual(x.master, master)
59n/a x.destroy()
60n/a
61n/a # variable initialization/passing
62n/a passed_expected = ((2.5, 2), ('0', 0), (0, 0), (10, 10),
63n/a (-1, -1), (sys.maxint + 1, sys.maxint + 1))
64n/a for pair in passed_expected:
65n/a x = ttk.LabeledScale(from_=pair[0])
66n/a self.assertEqual(x.value, pair[1])
67n/a x.destroy()
68n/a x = ttk.LabeledScale(from_='2.5')
69n/a self.assertRaises(ValueError, x._variable.get)
70n/a x.destroy()
71n/a x = ttk.LabeledScale(from_=None)
72n/a self.assertRaises(ValueError, x._variable.get)
73n/a x.destroy()
74n/a # variable should have its default value set to the from_ value
75n/a myvar = Tkinter.DoubleVar(value=20)
76n/a x = ttk.LabeledScale(variable=myvar)
77n/a self.assertEqual(x.value, 0)
78n/a x.destroy()
79n/a # check that it is really using a DoubleVar
80n/a x = ttk.LabeledScale(variable=myvar, from_=0.5)
81n/a self.assertEqual(x.value, 0.5)
82n/a self.assertEqual(x._variable._name, myvar._name)
83n/a x.destroy()
84n/a
85n/a # widget positionment
86n/a def check_positions(scale, scale_pos, label, label_pos):
87n/a self.assertEqual(scale.pack_info()['side'], scale_pos)
88n/a self.assertEqual(label.place_info()['anchor'], label_pos)
89n/a x = ttk.LabeledScale(compound='top')
90n/a check_positions(x.scale, 'bottom', x.label, 'n')
91n/a x.destroy()
92n/a x = ttk.LabeledScale(compound='bottom')
93n/a check_positions(x.scale, 'top', x.label, 's')
94n/a x.destroy()
95n/a x = ttk.LabeledScale(compound='unknown') # invert default positions
96n/a check_positions(x.scale, 'top', x.label, 's')
97n/a x.destroy()
98n/a x = ttk.LabeledScale() # take default positions
99n/a check_positions(x.scale, 'bottom', x.label, 'n')
100n/a x.destroy()
101n/a
102n/a # extra, and invalid, kwargs
103n/a self.assertRaises(Tkinter.TclError, ttk.LabeledScale, a='b')
104n/a
105n/a
106n/a def test_horizontal_range(self):
107n/a lscale = ttk.LabeledScale(from_=0, to=10)
108n/a lscale.pack()
109n/a lscale.wait_visibility()
110n/a lscale.update()
111n/a
112n/a linfo_1 = lscale.label.place_info()
113n/a prev_xcoord = lscale.scale.coords()[0]
114n/a self.assertEqual(prev_xcoord, int(linfo_1['x']))
115n/a # change range to: from -5 to 5. This should change the x coord of
116n/a # the scale widget, since 0 is at the middle of the new
117n/a # range.
118n/a lscale.scale.configure(from_=-5, to=5)
119n/a # The following update is needed since the test doesn't use mainloop,
120n/a # at the same time this shouldn't affect test outcome
121n/a lscale.update()
122n/a curr_xcoord = lscale.scale.coords()[0]
123n/a self.assertTrue(prev_xcoord != curr_xcoord)
124n/a # the label widget should have been repositioned too
125n/a linfo_2 = lscale.label.place_info()
126n/a self.assertEqual(lscale.label['text'], 0)
127n/a self.assertEqual(curr_xcoord, int(linfo_2['x']))
128n/a # change the range back
129n/a lscale.scale.configure(from_=0, to=10)
130n/a self.assertTrue(prev_xcoord != curr_xcoord)
131n/a self.assertEqual(prev_xcoord, int(linfo_1['x']))
132n/a
133n/a lscale.destroy()
134n/a
135n/a
136n/a def test_variable_change(self):
137n/a x = ttk.LabeledScale()
138n/a x.pack()
139n/a x.wait_visibility()
140n/a x.update()
141n/a
142n/a curr_xcoord = x.scale.coords()[0]
143n/a newval = x.value + 1
144n/a x.value = newval
145n/a # The following update is needed since the test doesn't use mainloop,
146n/a # at the same time this shouldn't affect test outcome
147n/a x.update()
148n/a self.assertEqual(x.label['text'], newval)
149n/a self.assertTrue(x.scale.coords()[0] > curr_xcoord)
150n/a self.assertEqual(x.scale.coords()[0],
151n/a int(x.label.place_info()['x']))
152n/a
153n/a # value outside range
154n/a x.value = x.scale['to'] + 1 # no changes shouldn't happen
155n/a x.update()
156n/a self.assertEqual(x.label['text'], newval)
157n/a self.assertEqual(x.scale.coords()[0],
158n/a int(x.label.place_info()['x']))
159n/a
160n/a x.destroy()
161n/a
162n/a
163n/a def test_resize(self):
164n/a x = ttk.LabeledScale()
165n/a x.pack(expand=True, fill='both')
166n/a x.wait_visibility()
167n/a x.update()
168n/a
169n/a width, height = x.master.winfo_width(), x.master.winfo_height()
170n/a width_new, height_new = width * 2, height * 2
171n/a
172n/a x.value = 3
173n/a x.update()
174n/a x.master.wm_geometry("%dx%d" % (width_new, height_new))
175n/a self.assertEqual(int(x.label.place_info()['x']),
176n/a x.scale.coords()[0])
177n/a
178n/a # Reset geometry
179n/a x.master.wm_geometry("%dx%d" % (width, height))
180n/a x.destroy()
181n/a
182n/a
183n/aclass OptionMenuTest(unittest.TestCase):
184n/a
185n/a def setUp(self):
186n/a support.root_deiconify()
187n/a self.textvar = Tkinter.StringVar()
188n/a
189n/a def tearDown(self):
190n/a del self.textvar
191n/a support.root_withdraw()
192n/a
193n/a
194n/a def test_widget_destroy(self):
195n/a var = Tkinter.StringVar()
196n/a optmenu = ttk.OptionMenu(None, var)
197n/a name = var._name
198n/a optmenu.update_idletasks()
199n/a optmenu.destroy()
200n/a self.assertEqual(optmenu.tk.globalgetvar(name), var.get())
201n/a del var
202n/a self.assertRaises(Tkinter.TclError, optmenu.tk.globalgetvar, name)
203n/a
204n/a
205n/a def test_initialization(self):
206n/a self.assertRaises(Tkinter.TclError,
207n/a ttk.OptionMenu, None, self.textvar, invalid='thing')
208n/a
209n/a optmenu = ttk.OptionMenu(None, self.textvar, 'b', 'a', 'b')
210n/a self.assertEqual(optmenu._variable.get(), 'b')
211n/a
212n/a self.assertTrue(optmenu['menu'])
213n/a self.assertTrue(optmenu['textvariable'])
214n/a
215n/a optmenu.destroy()
216n/a
217n/a
218n/a def test_menu(self):
219n/a items = ('a', 'b', 'c')
220n/a default = 'a'
221n/a optmenu = ttk.OptionMenu(None, self.textvar, default, *items)
222n/a found_default = False
223n/a for i in range(len(items)):
224n/a value = optmenu['menu'].entrycget(i, 'value')
225n/a self.assertEqual(value, items[i])
226n/a if value == default:
227n/a found_default = True
228n/a self.assertTrue(found_default)
229n/a optmenu.destroy()
230n/a
231n/a # default shouldn't be in menu if it is not part of values
232n/a default = 'd'
233n/a optmenu = ttk.OptionMenu(None, self.textvar, default, *items)
234n/a curr = None
235n/a i = 0
236n/a while True:
237n/a last, curr = curr, optmenu['menu'].entryconfigure(i, 'value')
238n/a if last == curr:
239n/a # no more menu entries
240n/a break
241n/a self.assertFalse(curr == default)
242n/a i += 1
243n/a self.assertEqual(i, len(items))
244n/a
245n/a # check that variable is updated correctly
246n/a optmenu.pack()
247n/a optmenu.wait_visibility()
248n/a optmenu['menu'].invoke(0)
249n/a self.assertEqual(optmenu._variable.get(), items[0])
250n/a
251n/a # changing to an invalid index shouldn't change the variable
252n/a self.assertRaises(Tkinter.TclError, optmenu['menu'].invoke, -1)
253n/a self.assertEqual(optmenu._variable.get(), items[0])
254n/a
255n/a optmenu.destroy()
256n/a
257n/a # specifying a callback
258n/a success = []
259n/a def cb_test(item):
260n/a self.assertEqual(item, items[1])
261n/a success.append(True)
262n/a optmenu = ttk.OptionMenu(None, self.textvar, 'a', command=cb_test,
263n/a *items)
264n/a optmenu['menu'].invoke(1)
265n/a if not success:
266n/a self.fail("Menu callback not invoked")
267n/a
268n/a optmenu.destroy()
269n/a
270n/a
271n/atests_gui = (LabeledScaleTest, OptionMenuTest)
272n/a
273n/aif __name__ == "__main__":
274n/a run_unittest(*tests_gui)