Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
deef967
gh-104855: Update more tk tests for 8.7
terryjreedy May 29, 2023
358bb74
whitespace
terryjreedy May 29, 2023
ca70095
Merge branch 'main' into tk87tests
serhiy-storchaka May 31, 2024
11629b8
Fix errmsg for the last empty value.
serhiy-storchaka May 31, 2024
907abd0
Simplify the errmsg for place_configure().
serhiy-storchaka May 31, 2024
d9d7dc8
Merge branch 'main' into tk87tests
serhiy-storchaka May 31, 2024
a1279f3
Fix fixes for options -underline, -to and -from.
serhiy-storchaka May 31, 2024
f90b94d
Fix test_create_polygon.
serhiy-storchaka May 31, 2024
6ccd8fe
Fix more tests.
serhiy-storchaka May 31, 2024
fae9d85
Fix test_configure_from and test_configure_to.
serhiy-storchaka Jun 1, 2024
f6b26cf
Polishing.
serhiy-storchaka Jun 1, 2024
9441f07
Fix more tests.
serhiy-storchaka Jun 1, 2024
63d9480
Fix for wantobjects=0.
serhiy-storchaka Jun 1, 2024
dfebcde
Update the NEWS entry.
serhiy-storchaka Jun 1, 2024
d48dca6
Merge branch 'main' into tk87tests
serhiy-storchaka Jun 1, 2024
d30d55c
Fix tests with Tcl/Tk 8.6.
serhiy-storchaka Jun 1, 2024
d18b841
Fix tests for newer Tk 8.7.
serhiy-storchaka Jun 4, 2024
93ffd33
Fix tests on Tcl/Tk 9.0.
serhiy-storchaka Jun 4, 2024
8f18aca
Fix tests on Tcl/Tk 8.7.
serhiy-storchaka Jun 4, 2024
f6ce718
Simplify test code.
serhiy-storchaka Jun 4, 2024
66f0cd5
Merge branch 'main' into tk87tests
serhiy-storchaka Jun 4, 2024
55a96fc
Update NEWS.
serhiy-storchaka Jun 4, 2024
10baa24
Remove the NEWS entry.
serhiy-storchaka Jun 4, 2024
f784360
Polishing.
serhiy-storchaka Jun 5, 2024
b72910f
Refactor test_configure_underline.
serhiy-storchaka Jun 5, 2024
bfd47d1
Remove special test_configure_padx for the message widget.
serhiy-storchaka Jun 6, 2024
289c4ae
Refactor test_configure_highlightthickness.
serhiy-storchaka Jun 6, 2024
19232e7
Polishing.
serhiy-storchaka Jun 6, 2024
dea00ba
Merge branch 'main' into tk87tests
serhiy-storchaka Jun 6, 2024
1224d11
Merge branch 'main' into tk87tests
serhiy-storchaka Jun 7, 2024
59e0b40
Fix some typos.
serhiy-storchaka Jun 7, 2024
be01369
Update Tcl/Tk.
serhiy-storchaka Jun 21, 2024
2aa56da
Merge branch 'main' into tk90tests
serhiy-storchaka Jun 21, 2024
0c7d851
Refactor.
serhiy-storchaka Jun 21, 2024
c9ab1a5
Polishing.
serhiy-storchaka Jun 21, 2024
c25d025
Polishing.
serhiy-storchaka Jun 21, 2024
7dc7b5a
Match full errmsg.
serhiy-storchaka Jun 21, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Fix tests for newer Tk 8.7.
  • Loading branch information
serhiy-storchaka committed Jun 4, 2024
commit d18b84190899a3a7a0eb8ac8a002935e57361679
33 changes: 23 additions & 10 deletions Lib/test/test_tkinter/test_geometry_managers.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
requires('gui')


EXPECTED_SCREEN_DISTANCE_ERRMSG = '(bad|expected) screen distance (but got )?"{}"'
EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG = '(bad|expected) screen distance (or "" but got )?"{}"'

class PackTest(AbstractWidgetTest, unittest.TestCase):

test_keys = None
Expand Down Expand Up @@ -317,7 +320,8 @@ def test_place_configure_x(self):
self.assertEqual(f2.place_info()['x'], '-10')
self.root.update()
self.assertEqual(f2.winfo_x(), 190)
with self.assertRaisesRegex(TclError, 'bad screen distance "spam"'):
with self.assertRaisesRegex(TclError,
EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG.format('spam')):
f2.place_configure(in_=f, x='spam')

def test_place_configure_y(self):
Expand All @@ -334,7 +338,8 @@ def test_place_configure_y(self):
self.assertEqual(f2.place_info()['y'], '-10')
self.root.update()
self.assertEqual(f2.winfo_y(), 110)
with self.assertRaisesRegex(TclError, 'bad screen distance "spam"'):
with self.assertRaisesRegex(TclError,
EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG.format('spam')):
f2.place_configure(in_=f, y='spam')

def test_place_configure_relx(self):
Expand Down Expand Up @@ -391,7 +396,8 @@ def test_place_configure_width(self):
f2.place_configure(width='')
self.root.update()
self.assertEqual(f2.winfo_width(), 30)
with self.assertRaisesRegex(TclError, 'bad screen distance "abcd"'):
with self.assertRaisesRegex(TclError,
EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG.format('abcd')):
f2.place_configure(width='abcd')

def test_place_configure_height(self):
Expand All @@ -402,7 +408,8 @@ def test_place_configure_height(self):
f2.place_configure(height='')
self.root.update()
self.assertEqual(f2.winfo_height(), 60)
with self.assertRaisesRegex(TclError, 'bad screen distance "abcd"'):
with self.assertRaisesRegex(TclError,
EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG.format('abcd')):
f2.place_configure(height='abcd')

def test_place_configure_relwidth(self):
Expand Down Expand Up @@ -629,7 +636,8 @@ def test_grid_columnconfigure(self):
self.assertEqual(self.root.grid_columnconfigure(0, 'weight'), 4)

def test_grid_columnconfigure_minsize(self):
with self.assertRaisesRegex(TclError, 'bad screen distance "foo"'):
with self.assertRaisesRegex(TclError,
EXPECTED_SCREEN_DISTANCE_ERRMSG.format('foo')):
self.root.grid_columnconfigure(0, minsize='foo')
self.root.grid_columnconfigure(0, minsize=10)
self.assertEqual(self.root.grid_columnconfigure(0, 'minsize'), 10)
Expand All @@ -646,7 +654,8 @@ def test_grid_columnconfigure_weight(self):
self.assertEqual(self.root.grid_columnconfigure(0)['weight'], 3)

def test_grid_columnconfigure_pad(self):
with self.assertRaisesRegex(TclError, 'bad screen distance "foo"'):
with self.assertRaisesRegex(TclError,
EXPECTED_SCREEN_DISTANCE_ERRMSG.format('foo')):
self.root.grid_columnconfigure(0, pad='foo')
with self.assertRaisesRegex(TclError, 'invalid arg "-pad": '
'should be non-negative'):
Expand Down Expand Up @@ -683,7 +692,8 @@ def test_grid_rowconfigure(self):
self.assertEqual(self.root.grid_rowconfigure(0, 'weight'), 4)

def test_grid_rowconfigure_minsize(self):
with self.assertRaisesRegex(TclError, 'bad screen distance "foo"'):
with self.assertRaisesRegex(TclError,
EXPECTED_SCREEN_DISTANCE_ERRMSG.format('foo')):
self.root.grid_rowconfigure(0, minsize='foo')
self.root.grid_rowconfigure(0, minsize=10)
self.assertEqual(self.root.grid_rowconfigure(0, 'minsize'), 10)
Expand All @@ -700,7 +710,8 @@ def test_grid_rowconfigure_weight(self):
self.assertEqual(self.root.grid_rowconfigure(0)['weight'], 3)

def test_grid_rowconfigure_pad(self):
with self.assertRaisesRegex(TclError, 'bad screen distance "foo"'):
with self.assertRaisesRegex(TclError,
EXPECTED_SCREEN_DISTANCE_ERRMSG.format('foo')):
self.root.grid_rowconfigure(0, pad='foo')
with self.assertRaisesRegex(TclError, 'invalid arg "-pad": '
'should be non-negative'):
Expand Down Expand Up @@ -818,9 +829,11 @@ def test_grid_location(self):
self.root.grid_location(0)
with self.assertRaises(TypeError):
self.root.grid_location(0, 0, 0)
with self.assertRaisesRegex(TclError, 'bad screen distance "x"'):
with self.assertRaisesRegex(TclError,
EXPECTED_SCREEN_DISTANCE_ERRMSG.format('x')):
self.root.grid_location('x', 'y')
with self.assertRaisesRegex(TclError, 'bad screen distance "y"'):
with self.assertRaisesRegex(TclError,
EXPECTED_SCREEN_DISTANCE_ERRMSG.format('y')):
self.root.grid_location('1c', 'y')
t = self.root
# de-maximize
Expand Down
33 changes: 27 additions & 6 deletions Lib/test/test_tkinter/test_widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
requires('gui')


EXPECTED_SCREEN_DISTANCE_ERRMSG = '(bad|expected) screen distance (but got )?"{}"'
EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG = '(bad|expected) screen distance (or "" but got )?"{}"'

def float_round(x):
return float(round(x))

Expand Down Expand Up @@ -674,7 +677,7 @@ def test_configure_tabs(self):
self.checkParam(widget, 'tabs', '2c left 4c 6c center',
expected=('2c', 'left', '4c', '6c', 'center'))
self.checkInvalidParam(widget, 'tabs', 'spam',
errmsg='bad screen distance "spam"')
errmsg=EXPECTED_SCREEN_DISTANCE_ERRMSG.format('spam'))

def test_configure_tabstyle(self):
widget = self.create()
Expand Down Expand Up @@ -1343,7 +1346,7 @@ def test_paneconfigure_height(self):
p, b, c = self.create2()
self.check_paneconfigure(p, b, 'height', 10, 10)
self.check_paneconfigure_bad(p, b, 'height',
'bad screen distance "badValue"')
EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG.format('badValue'))

def test_paneconfigure_hide(self):
p, b, c = self.create2()
Expand All @@ -1355,19 +1358,19 @@ def test_paneconfigure_minsize(self):
p, b, c = self.create2()
self.check_paneconfigure(p, b, 'minsize', 10, 10)
self.check_paneconfigure_bad(p, b, 'minsize',
'bad screen distance "badValue"')
EXPECTED_SCREEN_DISTANCE_ERRMSG.format('badValue'))

def test_paneconfigure_padx(self):
p, b, c = self.create2()
self.check_paneconfigure(p, b, 'padx', 1.3, 1)
self.check_paneconfigure_bad(p, b, 'padx',
'bad screen distance "badValue"')
EXPECTED_SCREEN_DISTANCE_ERRMSG.format('badValue'))

def test_paneconfigure_pady(self):
p, b, c = self.create2()
self.check_paneconfigure(p, b, 'pady', 1.3, 1)
self.check_paneconfigure_bad(p, b, 'pady',
'bad screen distance "badValue"')
EXPECTED_SCREEN_DISTANCE_ERRMSG.format('badValue'))

def test_paneconfigure_sticky(self):
p, b, c = self.create2()
Expand All @@ -1388,7 +1391,7 @@ def test_paneconfigure_width(self):
p, b, c = self.create2()
self.check_paneconfigure(p, b, 'width', 10, 10)
self.check_paneconfigure_bad(p, b, 'width',
'bad screen distance "badValue"')
EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG.format('badValue'))


@add_standard_options(StandardOptionsTests)
Expand Down Expand Up @@ -1479,6 +1482,8 @@ class MessageTest(AbstractWidgetTest, unittest.TestCase):
'takefocus', 'text', 'textvariable', 'width',
)
_conv_pad_pixels = False
if tk_version >= (8, 7):
_conv_pixels = False

def create(self, **kwargs):
return tkinter.Message(self.root, **kwargs)
Expand All @@ -1487,6 +1492,22 @@ def test_configure_aspect(self):
widget = self.create()
self.checkIntegerParam(widget, 'aspect', 250, 0, -300)

def test_configure_highlightthickness(self):
widget = self.create()
self.checkPixelsParam(widget, 'highlightthickness',
0, 1.3, 2.6, 6, '10p')
expected = -2 if tk_version >= (8, 7) else 0
self.checkParam(widget, 'highlightthickness', -2, expected=expected,
conv=self._conv_pad_pixels)

def test_configure_padx(self):
widget = self.create()
self.checkPixelsParam(widget, 'padx', 3, 4.4, 5.6, '12m',
conv=self._conv_pad_pixels)
expected = '' if tk_version >= (8, 7) else -2
self.checkParam(widget, 'padx', -2, expected=expected,
conv=self._conv_pad_pixels)


class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase):

Expand Down
30 changes: 12 additions & 18 deletions Lib/test/test_tkinter/widget_tests.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Common tests for test_tkinter/test_widgets.py and test_ttk/test_widgets.py

import re
import tkinter
from test.test_tkinter.support import (AbstractTkTest, tk_version,
pixels_conv, tcl_obj_eq)
Expand Down Expand Up @@ -56,16 +57,12 @@ def checkParam(self, widget, name, value, *, expected=_sentinel,
def checkInvalidParam(self, widget, name, value, errmsg=None):
orig = widget[name]
if errmsg is not None:
errmsg = errmsg.format(value)
with self.assertRaises(tkinter.TclError) as cm:
errmsg = errmsg.format(re.escape(str(value)))
with self.assertRaisesRegex(tkinter.TclError, errmsg or ''):
widget[name] = value
if errmsg is not None:
self.assertEqual(str(cm.exception), errmsg)
self.assertEqual(widget[name], orig)
with self.assertRaises(tkinter.TclError) as cm:
with self.assertRaisesRegex(tkinter.TclError, errmsg or ''):
widget.configure({name: value})
if errmsg is not None:
self.assertEqual(str(cm.exception), errmsg)
self.assertEqual(widget[name], orig)

def checkParams(self, widget, name, *values, **kwargs):
Expand Down Expand Up @@ -120,11 +117,12 @@ def command(*args):
self.checkParams(widget, name, '')

def checkEnumParam(self, widget, name, *values,
errmsg=None, allow_empty=False, **kwargs):
errmsg=None, allow_empty=False, fullname=None,
**kwargs):
self.checkParams(widget, name, *values, **kwargs)
if errmsg is None:
errmsg2 = ' %s "{}": must be %s%s or %s' % (
name,
fullname or name,
', '.join(values[:-1]),
',' if len(values) > 2 else '',
values[-1] or '""')
Expand All @@ -148,9 +146,9 @@ def checkPixelsParam(self, widget, name, *values,
self.checkParam(widget, name, value, expected=expected,
conv=conv1, **kwargs)
self.checkInvalidParam(widget, name, '6x',
errmsg='bad screen distance "6x"')
errmsg='(bad|expected) screen distance ((or "" )?but got )?"6x"')
self.checkInvalidParam(widget, name, 'spam',
errmsg='bad screen distance "spam"')
errmsg='(bad|expected) screen distance ((or "" )?but got )?"spam"')

def checkReliefParam(self, widget, name, *, allow_empty=False):
options = ['flat', 'groove', 'raised', 'ridge', 'solid', 'sunken']
Expand Down Expand Up @@ -347,11 +345,7 @@ def test_configure_jump(self):
def test_configure_justify(self):
widget = self.create()
self.checkEnumParam(widget, 'justify', 'left', 'right', 'center',
errmsg='bad justification "{}": must be '
'left, right, or center')
self.checkInvalidParam(widget, 'justify', '',
errmsg='ambiguous justification "": must be '
'left, right, or center')
fullname='justification')

def test_configure_orient(self):
widget = self.create()
Expand Down Expand Up @@ -422,8 +416,8 @@ def test_configure_underline(self, *, empty_value=-1):
if tk_version >= (8, 7):
self.checkParams(widget, 'underline', 0, 1, 10)
self.checkParam(widget, 'underline', '', expected=empty_value)
errmsg = ('bad index "{}": must be integer?[+-]integer?, '
'end?[+-]integer?, or ""')
errmsg = (r'bad index "{}": must be integer\?\[\+-\]integer\?, '
r'end\?\[\+-\]integer\?, or ""')
self.checkInvalidParam(widget, 'underline', '10p', errmsg=errmsg)
self.checkInvalidParam(widget, 'underline', 3.2, errmsg=errmsg)
else:
Expand Down
52 changes: 20 additions & 32 deletions Lib/test/test_ttk/test_widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,11 +214,13 @@ def test_configure_font(self):
self.checkParam(widget, 'font',
'-Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*')

def test_keys(self):
if get_tk_patchlevel(self.root) == (8, 7, 0, 'beta', 1):
self.skipTest('Bug in Tk8.7b1')
super().test_keys()

def test_configure_justify(self):
widget = self.create()
values = ('left', 'right', 'center')
if tk_version >= (8, 7):
values += ('',)
self.checkEnumParam(widget, 'justify', *values,
fullname='justification')

@add_standard_options(StandardTtkOptionsTests)
class ButtonTest(AbstractLabelTest, unittest.TestCase):
Expand Down Expand Up @@ -634,27 +636,18 @@ def test_add(self):
other_child = ttk.Label(self.paned)
self.paned.add(other_child)
self.assertEqual(self.paned.pane(0), self.paned.pane(1))
if tk_version >= (8, 7):
self.assertEqual(self.paned.pane(2), self.paned.pane(1))
else:
self.assertRaises(tkinter.TclError, self.paned.pane, 2)
self.assertRaises(tkinter.TclError, self.paned.pane, 2)
good_child.destroy()
other_child.destroy()
if get_tk_patchlevel(self.root) != (8, 7, 0, 'beta', 1):
# BUG: Crash in Tk 8.7b1
self.assertRaises(tkinter.TclError, self.paned.pane, 0)
self.assertRaises(tkinter.TclError, self.paned.pane, 0)

def test_forget(self):
if get_tk_patchlevel(self.root) != (8, 7, 0, 'beta', 1):
# BUG: Crash in Tk 8.7b1
self.assertRaises(tkinter.TclError, self.paned.forget, None)
self.assertRaises(tkinter.TclError, self.paned.forget, 0)
self.assertRaises(tkinter.TclError, self.paned.forget, None)
self.assertRaises(tkinter.TclError, self.paned.forget, 0)

self.paned.add(ttk.Label(self.root))
self.paned.forget(0)
if get_tk_patchlevel(self.root) != (8, 7, 0, 'beta', 1):
# BUG: Crash in Tk 8.7b1
self.assertRaises(tkinter.TclError, self.paned.forget, 0)
self.assertRaises(tkinter.TclError, self.paned.forget, 0)

def test_insert(self):
self.assertRaises(tkinter.TclError, self.paned.insert, None, 0)
Expand Down Expand Up @@ -697,9 +690,7 @@ def test_insert(self):
(str(child3), str(child2), str(child)))

def test_pane(self):
if get_tk_patchlevel(self.root) != (8, 7, 0, 'beta', 1):
# BUG: Crash in Tk 8.7b1
self.assertRaises(tkinter.TclError, self.paned.pane, 0)
self.assertRaises(tkinter.TclError, self.paned.pane, 0)

child = ttk.Label(self.root)
self.paned.add(child)
Expand Down Expand Up @@ -800,10 +791,13 @@ class MenubuttonTest(AbstractLabelTest, unittest.TestCase):
def create(self, **kwargs):
return ttk.Menubutton(self.root, **kwargs)

def test_direction(self):
def test_configure_direction(self):
widget = self.create()
self.checkEnumParam(widget, 'direction',
'above', 'below', 'left', 'right', 'flush')
if tk_version >= (8, 7):
values = 'above', 'below', 'flush', 'left', 'right'
else:
values = 'above', 'below', 'left', 'right', 'flush'
self.checkEnumParam(widget, 'direction', *values)

def test_configure_menu(self):
widget = self.create()
Expand Down Expand Up @@ -1093,13 +1087,7 @@ def test_insert(self):
self.nb.insert('end', 0)
self.assertEqual(self.nb.tabs(), tabs)
# bad moves
if tk_version >= (8, 7):
self.nb.insert(2, tabs[0])
self.assertEqual(self.nb.tabs(), (tabs[1], tabs[0]))
self.nb.insert(2, tabs[1])
self.assertEqual(self.nb.tabs(), tabs)
else:
self.assertRaises(tkinter.TclError, self.nb.insert, 2, tabs[0])
self.assertRaises(tkinter.TclError, self.nb.insert, 2, tabs[0])
self.assertRaises(tkinter.TclError, self.nb.insert, -1, tabs[0])

# new tab
Expand Down