Skip to content

Commit d1d378a

Browse files
serhiy-storchakamiss-islington
authored andcommitted
gh-151678: Add tests for ttk Menubutton and OptionMenu widget options (GH-151960)
Decorate ttk.MenubuttonTest with add_configure_tests() and make ttk.OptionMenuTest inherit it to cover the standard widget options. (cherry picked from commit ce14712) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
1 parent da45740 commit d1d378a

2 files changed

Lines changed: 48 additions & 2 deletions

File tree

Lib/test/test_ttk/test_extensions.py

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44
from tkinter import ttk
55
from test.support import requires, gc_collect
66
from test.test_tkinter.support import setUpModule # noqa: F401
7-
from test.test_tkinter.support import AbstractTkTest, AbstractDefaultRootTest
7+
from test.test_tkinter.support import (AbstractTkTest, AbstractDefaultRootTest,
8+
get_tk_patchlevel, widget_eq)
89

910
requires('gui')
1011

12+
from test.test_ttk import test_widgets
13+
14+
1115
class LabeledScaleTest(AbstractTkTest, unittest.TestCase):
1216

1317
def tearDown(self):
@@ -193,7 +197,7 @@ def test_resize(self):
193197
x.destroy()
194198

195199

196-
class OptionMenuTest(AbstractTkTest, unittest.TestCase):
200+
class OptionMenuTest(test_widgets.MenubuttonTest, unittest.TestCase):
197201

198202
def setUp(self):
199203
super().setUp()
@@ -203,6 +207,47 @@ def tearDown(self):
203207
del self.textvar
204208
super().tearDown()
205209

210+
def create(self, default='b', values=('a', 'b', 'c'), **kwargs):
211+
return ttk.OptionMenu(self.root, self.textvar, default, *values, **kwargs)
212+
213+
def test_bad_kwarg(self):
214+
with self.assertRaisesRegex(tkinter.TclError, r"^unknown option -image$"):
215+
ttk.OptionMenu(self.root, self.textvar, 'b', image='')
216+
217+
def test_configure_class(self):
218+
# Unlike a plain Menubutton, OptionMenu does not accept a class at
219+
# construction, so only the read-only nature of the option is tested.
220+
widget = self.create()
221+
self.assertEqual(widget['class'], '')
222+
errmsg = 'attempt to change read-only option'
223+
if get_tk_patchlevel(self.root) < (8, 6, 0, 'beta', 3):
224+
errmsg = 'Attempt to change read-only option'
225+
self.checkInvalidParam(widget, 'class', 'Foo', errmsg=errmsg)
226+
227+
def test_configure_style(self):
228+
# Like Menubutton, but OptionMenu does not accept a class at
229+
# construction, so the custom-class part of the standard test is omitted.
230+
widget = self.create()
231+
self.assertEqual(widget['style'], '')
232+
self.checkInvalidParam(widget, 'style', 'Foo',
233+
errmsg='Layout Foo not found')
234+
style = ttk.Style(self.root)
235+
style.configure('Custom.TMenubutton')
236+
self.checkParam(widget, 'style', 'Custom.TMenubutton')
237+
238+
def test_configure_menu(self):
239+
# OptionMenu manages its own menu; ['menu'] returns that Menu widget.
240+
widget = self.create()
241+
self.assertIsInstance(widget['menu'], tkinter.Menu)
242+
self.checkParam(widget, 'menu', widget['menu'], eq=widget_eq)
243+
244+
def test_configure_text(self):
245+
# The displayed text is governed by the textvariable.
246+
widget = self.create()
247+
self.textvar.set('a')
248+
self.assertEqual(widget['text'], 'a')
249+
self.textvar.set('c')
250+
self.assertEqual(widget['text'], 'c')
206251

207252
def test_widget_destroy(self):
208253
var = tkinter.StringVar(self.root)

Lib/test/test_ttk/test_widgets.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,7 @@ def cb_test():
768768
self.assertEqual(str(cbtn['variable']), str(cbtn2['variable']))
769769

770770

771+
@add_configure_tests(StandardTtkOptionsTests)
771772
class MenubuttonTest(AbstractLabelTest, unittest.TestCase):
772773
OPTIONS = (
773774
'class', 'compound', 'cursor', 'direction',

0 commit comments

Comments
 (0)