bpo-27313: Fix ttk_guionly tests failing on Framework builds on macOS… · python/cpython@885e57c

@@ -61,7 +61,6 @@ def setUp(self):

6161

self.widget = ttk.Button(self.root, width=0, text="Text")

6262

self.widget.pack()

636364-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, '')

767577-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'

290289291290

def setUp(self):

292291

super().setUp()

@@ -319,30 +318,23 @@ def test_configure_validatecommand(self):

319318

widget = self.create()

320319

self.checkCommandParam(widget, 'validatecommand')

321320322-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)

327325328-329326

def test_identify(self):

330327

self.entry.pack()

331328

self.entry.update()

332329333330

# 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), "")

340333341334

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, '')

344337345-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)

372364373-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')

390381391-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'

427418428419

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):

461453462454

self.assertTrue(success)

463455464-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)

479470480-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)

594584595-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)

603592604-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)))

638626639-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')

655642656-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):

801787802788

self.assertFalse(failure)

803789804-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, '')

821806822-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")

954938955-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)

983966984-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))

9999811000-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)

10099901010-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)

104210221043-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)

106210411063-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')

107610541077-10781055

def test_configure_tabs(self):

10791056

self.assertEqual(len(self.nb.tabs()), 2)

10801057

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

1083106010841061

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

108510621086-10871063

def test_traversal(self):

10881064

self.nb.pack()

10891065

self.nb.update()

1090106610911067

self.nb.select(0)

109210681093-

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))

1104108111051082

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+1115110111161102

@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'

1125111211261113

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), '')

137213591373-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(), ())

140013861401-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)

142614111427-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())

145014341451-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), ())

149214751493-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)

150314851504-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')

151814991519-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)

157015501571-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)

160115801602-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', '')

167816561679-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))

174917261750-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')

178217581783-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))

181517901816-18171791

def test_tag_configure(self):

18181792

# Just testing parameter passing for now

18191793

self.assertRaises(TypeError, self.tv.tag_configure)