Skip to content

Commit e52f9be

Browse files
authored
bpo-27313: Fix ttk_guionly tests failing on Framework builds on macOS (GH-29411)
1 parent 54d1e3f commit e52f9be

File tree

1 file changed

+20
-46
lines changed

1 file changed

+20
-46
lines changed

Lib/tkinter/test/test_ttk/test_widgets.py

+20-46
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ def setUp(self):
6161
self.widget = ttk.Button(self.root, width=0, text="Text")
6262
self.widget.pack()
6363

64-
6564
def test_identify(self):
6665
self.widget.update()
6766
self.assertEqual(self.widget.identify(
@@ -74,7 +73,6 @@ def test_identify(self):
7473
self.assertRaises(tkinter.TclError, self.widget.identify, 5, None)
7574
self.assertRaises(tkinter.TclError, self.widget.identify, 5, '')
7675

77-
7876
def test_widget_state(self):
7977
# XXX not sure about the portability of all these tests
8078
self.assertEqual(self.widget.state(), ())
@@ -287,6 +285,7 @@ class EntryTest(AbstractWidgetTest, unittest.TestCase):
287285
'show', 'state', 'style', 'takefocus', 'textvariable',
288286
'validate', 'validatecommand', 'width', 'xscrollcommand',
289287
)
288+
IDENTIFY_AS = 'Entry.field' if sys.platform == 'darwin' else 'textarea'
290289

291290
def setUp(self):
292291
super().setUp()
@@ -319,30 +318,23 @@ def test_configure_validatecommand(self):
319318
widget = self.create()
320319
self.checkCommandParam(widget, 'validatecommand')
321320

322-
323321
def test_bbox(self):
324322
self.assertIsBoundingBox(self.entry.bbox(0))
325323
self.assertRaises(tkinter.TclError, self.entry.bbox, 'noindex')
326324
self.assertRaises(tkinter.TclError, self.entry.bbox, None)
327325

328-
329326
def test_identify(self):
330327
self.entry.pack()
331328
self.entry.update()
332329

333330
# bpo-27313: macOS Cocoa widget differs from X, allow either
334-
if sys.platform == 'darwin':
335-
self.assertIn(self.entry.identify(5, 5),
336-
("textarea", "Combobox.button") )
337-
else:
338-
self.assertEqual(self.entry.identify(5, 5), "textarea")
331+
self.assertEqual(self.entry.identify(5, 5), self.IDENTIFY_AS)
339332
self.assertEqual(self.entry.identify(-1, -1), "")
340333

341334
self.assertRaises(tkinter.TclError, self.entry.identify, None, 5)
342335
self.assertRaises(tkinter.TclError, self.entry.identify, 5, None)
343336
self.assertRaises(tkinter.TclError, self.entry.identify, 5, '')
344337

345-
346338
def test_validation_options(self):
347339
success = []
348340
test_invalid = lambda: success.append(True)
@@ -370,7 +362,6 @@ def test_validation_options(self):
370362
self.entry['validatecommand'] = True
371363
self.assertRaises(tkinter.TclError, self.entry.validate)
372364

373-
374365
def test_validation(self):
375366
validation = []
376367
def validate(to_insert):
@@ -388,7 +379,6 @@ def validate(to_insert):
388379
self.assertEqual(validation, [False, True])
389380
self.assertEqual(self.entry.get(), 'a')
390381

391-
392382
def test_revalidation(self):
393383
def validate(content):
394384
for letter in content:
@@ -424,6 +414,7 @@ class ComboboxTest(EntryTest, unittest.TestCase):
424414
'validate', 'validatecommand', 'values',
425415
'width', 'xscrollcommand',
426416
)
417+
IDENTIFY_AS = 'Combobox.button' if sys.platform == 'darwin' else 'textarea'
427418

428419
def setUp(self):
429420
super().setUp()
@@ -439,7 +430,8 @@ def test_configure_height(self):
439430
def _show_drop_down_listbox(self):
440431
width = self.combo.winfo_width()
441432
x, y = width - 5, 5
442-
self.assertRegex(self.combo.identify(x, y), r'.*downarrow\Z')
433+
if sys.platform != 'darwin': # there's no down arrow on macOS
434+
self.assertRegex(self.combo.identify(x, y), r'.*downarrow\Z')
443435
self.combo.event_generate('<ButtonPress-1>', x=x, y=y)
444436
self.combo.event_generate('<ButtonRelease-1>', x=x, y=y)
445437
self.combo.update_idletasks()
@@ -461,7 +453,6 @@ def test_virtual_event(self):
461453

462454
self.assertTrue(success)
463455

464-
465456
def test_configure_postcommand(self):
466457
success = []
467458

@@ -477,7 +468,6 @@ def test_configure_postcommand(self):
477468
self._show_drop_down_listbox()
478469
self.assertEqual(len(success), 1)
479470

480-
481471
def test_configure_values(self):
482472
def check_get_current(getval, currval):
483473
self.assertEqual(self.combo.get(), getval)
@@ -592,7 +582,6 @@ def test_add(self):
592582
other_child.destroy()
593583
self.assertRaises(tkinter.TclError, self.paned.pane, 0)
594584

595-
596585
def test_forget(self):
597586
self.assertRaises(tkinter.TclError, self.paned.forget, None)
598587
self.assertRaises(tkinter.TclError, self.paned.forget, 0)
@@ -601,7 +590,6 @@ def test_forget(self):
601590
self.paned.forget(0)
602591
self.assertRaises(tkinter.TclError, self.paned.forget, 0)
603592

604-
605593
def test_insert(self):
606594
self.assertRaises(tkinter.TclError, self.paned.insert, None, 0)
607595
self.assertRaises(tkinter.TclError, self.paned.insert, 0, None)
@@ -636,7 +624,6 @@ def test_insert(self):
636624
self.assertEqual(self.paned.panes(),
637625
(str(child3), str(child2), str(child)))
638626

639-
640627
def test_pane(self):
641628
self.assertRaises(tkinter.TclError, self.paned.pane, 0)
642629

@@ -653,7 +640,6 @@ def test_pane(self):
653640
self.assertRaises(tkinter.TclError, self.paned.pane, 0,
654641
badoption='somevalue')
655642

656-
657643
def test_sashpos(self):
658644
self.assertRaises(tkinter.TclError, self.paned.sashpos, None)
659645
self.assertRaises(tkinter.TclError, self.paned.sashpos, '')
@@ -801,7 +787,6 @@ def test_custom_event(self):
801787

802788
self.assertFalse(failure)
803789

804-
805790
def test_get(self):
806791
if self.wantobjects:
807792
conv = lambda x: x
@@ -819,7 +804,6 @@ def test_get(self):
819804
self.assertRaises(tkinter.TclError, self.scale.get, '', 0)
820805
self.assertRaises(tkinter.TclError, self.scale.get, 0, '')
821806

822-
823807
def test_set(self):
824808
if self.wantobjects:
825809
conv = lambda x: x
@@ -952,7 +936,6 @@ def test_tab_identifiers(self):
952936
else:
953937
self.fail("Tab with text 'a' not found")
954938

955-
956939
def test_add_and_hidden(self):
957940
self.assertRaises(tkinter.TclError, self.nb.hide, -1)
958941
self.assertRaises(tkinter.TclError, self.nb.hide, 'hi')
@@ -981,7 +964,6 @@ def test_add_and_hidden(self):
981964
# but the tab next to it (not hidden) is the one selected now
982965
self.assertEqual(self.nb.index('current'), curr + 1)
983966

984-
985967
def test_forget(self):
986968
self.assertRaises(tkinter.TclError, self.nb.forget, -1)
987969
self.assertRaises(tkinter.TclError, self.nb.forget, 'hi')
@@ -997,7 +979,6 @@ def test_forget(self):
997979
self.assertEqual(self.nb.index(self.child1), 1)
998980
self.assertNotEqual(child1_index, self.nb.index(self.child1))
999981

1000-
1001982
def test_index(self):
1002983
self.assertRaises(tkinter.TclError, self.nb.index, -1)
1003984
self.assertRaises(tkinter.TclError, self.nb.index, None)
@@ -1007,7 +988,6 @@ def test_index(self):
1007988
self.assertEqual(self.nb.index(self.child2), 1)
1008989
self.assertEqual(self.nb.index('end'), 2)
1009990

1010-
1011991
def test_insert(self):
1012992
# moving tabs
1013993
tabs = self.nb.tabs()
@@ -1040,7 +1020,6 @@ def test_insert(self):
10401020
self.assertRaises(tkinter.TclError, self.nb.insert, None, 0)
10411021
self.assertRaises(tkinter.TclError, self.nb.insert, None, None)
10421022

1043-
10441023
def test_select(self):
10451024
self.nb.pack()
10461025
self.nb.update()
@@ -1060,7 +1039,6 @@ def test_select(self):
10601039
self.nb.update()
10611040
self.assertTrue(tab_changed)
10621041

1063-
10641042
def test_tab(self):
10651043
self.assertRaises(tkinter.TclError, self.nb.tab, -1)
10661044
self.assertRaises(tkinter.TclError, self.nb.tab, 'notab')
@@ -1074,7 +1052,6 @@ def test_tab(self):
10741052
self.assertEqual(self.nb.tab(self.child1, text=None), 'abc')
10751053
self.assertEqual(self.nb.tab(self.child1, 'text'), 'abc')
10761054

1077-
10781055
def test_configure_tabs(self):
10791056
self.assertEqual(len(self.nb.tabs()), 2)
10801057

@@ -1083,14 +1060,14 @@ def test_configure_tabs(self):
10831060

10841061
self.assertEqual(self.nb.tabs(), ())
10851062

1086-
10871063
def test_traversal(self):
10881064
self.nb.pack()
10891065
self.nb.update()
10901066

10911067
self.nb.select(0)
10921068

1093-
self.assertEqual(self.nb.identify(5, 5), 'focus')
1069+
focus_identify_as = 'focus' if sys.platform != 'darwin' else ''
1070+
self.assertEqual(self.nb.identify(5, 5), focus_identify_as)
10941071
simulate_mouse_click(self.nb, 5, 5)
10951072
self.nb.focus_force()
10961073
self.nb.event_generate('<Control-Tab>')
@@ -1103,15 +1080,24 @@ def test_traversal(self):
11031080
self.assertEqual(self.nb.select(), str(self.child2))
11041081

11051082
self.nb.tab(self.child1, text='a', underline=0)
1083+
self.nb.tab(self.child2, text='e', underline=0)
11061084
self.nb.enable_traversal()
11071085
self.nb.focus_force()
1108-
self.assertEqual(self.nb.identify(5, 5), 'focus')
1086+
self.assertEqual(self.nb.identify(5, 5), focus_identify_as)
11091087
simulate_mouse_click(self.nb, 5, 5)
1088+
# on macOS Emacs-style keyboard shortcuts are region-dependent;
1089+
# let's use the regular arrow keys instead
11101090
if sys.platform == 'darwin':
1111-
self.nb.event_generate('<Option-a>')
1091+
begin = '<Left>'
1092+
end = '<Right>'
11121093
else:
1113-
self.nb.event_generate('<Alt-a>')
1094+
begin = '<Alt-a>'
1095+
end = '<Alt-e>'
1096+
self.nb.event_generate(begin)
11141097
self.assertEqual(self.nb.select(), str(self.child1))
1098+
self.nb.event_generate(end)
1099+
self.assertEqual(self.nb.select(), str(self.child2))
1100+
11151101

11161102
@add_standard_options(IntegerSizeTests, StandardTtkOptionsTests)
11171103
class SpinboxTest(EntryTest, unittest.TestCase):
@@ -1122,6 +1108,7 @@ class SpinboxTest(EntryTest, unittest.TestCase):
11221108
'takefocus', 'textvariable', 'to', 'validate', 'validatecommand',
11231109
'values', 'width', 'wrap', 'xscrollcommand',
11241110
)
1111+
IDENTIFY_AS = 'Spinbox.field' if sys.platform == 'darwin' else 'textarea'
11251112

11261113
def setUp(self):
11271114
super().setUp()
@@ -1370,7 +1357,6 @@ def test_bbox(self):
13701357
child1 = self.tv.insert(item_id, 'end')
13711358
self.assertEqual(self.tv.bbox(child1), '')
13721359

1373-
13741360
def test_children(self):
13751361
# no children yet, should get an empty tuple
13761362
self.assertEqual(self.tv.get_children(), ())
@@ -1398,7 +1384,6 @@ def test_children(self):
13981384
self.tv.set_children('')
13991385
self.assertEqual(self.tv.get_children(), ())
14001386

1401-
14021387
def test_column(self):
14031388
# return a dict with all options/values
14041389
self.assertIsInstance(self.tv.column('#0'), dict)
@@ -1424,7 +1409,6 @@ def test_column(self):
14241409
self.assertRaises(tkinter.TclError, self.tv.column, '#0',
14251410
**kw)
14261411

1427-
14281412
def test_delete(self):
14291413
self.assertRaises(tkinter.TclError, self.tv.delete, '#0')
14301414

@@ -1448,7 +1432,6 @@ def test_delete(self):
14481432
self.tv.delete(item1, item2)
14491433
self.assertFalse(self.tv.get_children())
14501434

1451-
14521435
def test_detach_reattach(self):
14531436
item_id = self.tv.insert('', 'end')
14541437
item2 = self.tv.insert(item_id, 'end')
@@ -1490,7 +1473,6 @@ def test_detach_reattach(self):
14901473
self.assertEqual(self.tv.get_children(), ())
14911474
self.assertEqual(self.tv.get_children(item_id), ())
14921475

1493-
14941476
def test_exists(self):
14951477
self.assertEqual(self.tv.exists('something'), False)
14961478
self.assertEqual(self.tv.exists(''), True)
@@ -1501,7 +1483,6 @@ def test_exists(self):
15011483
# in the tcl interpreter since tk requires an item.
15021484
self.assertRaises(tkinter.TclError, self.tv.exists, None)
15031485

1504-
15051486
def test_focus(self):
15061487
# nothing is focused right now
15071488
self.assertEqual(self.tv.focus(), '')
@@ -1516,7 +1497,6 @@ def test_focus(self):
15161497
# try focusing inexistent item
15171498
self.assertRaises(tkinter.TclError, self.tv.focus, 'hi')
15181499

1519-
15201500
def test_heading(self):
15211501
# check a dict is returned
15221502
self.assertIsInstance(self.tv.heading('#0'), dict)
@@ -1568,7 +1548,6 @@ def simulate_heading_click(x, y):
15681548
#self.tv.heading('#0', command='I dont exist')
15691549
#simulate_heading_click(5, 5)
15701550

1571-
15721551
def test_index(self):
15731552
# item 'what' doesn't exist
15741553
self.assertRaises(tkinter.TclError, self.tv.index, 'what')
@@ -1599,7 +1578,6 @@ def test_index(self):
15991578
self.tv.delete(item1)
16001579
self.assertRaises(tkinter.TclError, self.tv.index, c2)
16011580

1602-
16031581
def test_insert_item(self):
16041582
# parent 'none' doesn't exist
16051583
self.assertRaises(tkinter.TclError, self.tv.insert, 'none', 'end')
@@ -1676,7 +1654,6 @@ def test_insert_item(self):
16761654
self.assertRaises(tkinter.TclError, self.tv.insert, '', 'end', False)
16771655
self.assertRaises(tkinter.TclError, self.tv.insert, '', 'end', '')
16781656

1679-
16801657
def test_selection(self):
16811658
self.assertRaises(TypeError, self.tv.selection, 'spam')
16821659
# item 'none' doesn't exist
@@ -1747,7 +1724,6 @@ def test_selection(self):
17471724
self.tv.selection_toggle((c1, c3))
17481725
self.assertEqual(self.tv.selection(), (c3, item2))
17491726

1750-
17511727
def test_set(self):
17521728
self.tv['columns'] = ['A', 'B']
17531729
item = self.tv.insert('', 'end', values=['a', 'b'])
@@ -1780,7 +1756,6 @@ def test_set(self):
17801756
# inexistent item
17811757
self.assertRaises(tkinter.TclError, self.tv.set, 'notme')
17821758

1783-
17841759
def test_tag_bind(self):
17851760
events = []
17861761
item1 = self.tv.insert('', 'end', tags=['call'])
@@ -1813,7 +1788,6 @@ def test_tag_bind(self):
18131788
for evt in zip(events[::2], events[1::2]):
18141789
self.assertEqual(evt, (1, 2))
18151790

1816-
18171791
def test_tag_configure(self):
18181792
# Just testing parameter passing for now
18191793
self.assertRaises(TypeError, self.tv.tag_configure)

0 commit comments

Comments
 (0)