From d9fb0c7c96ecd0ca1987dc1d67dd63d6f4e56891 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 16 Jan 2026 18:38:38 +0200 Subject: [PATCH] gh-65784: Add support for parametrized resource wantobjects in regrtests (GH-143570) This allows to run Tkinter tests with the specified value of tkinter.wantobjects, for example "-u wantobjects=0". (cherry picked from commit 21ed1e2a9401a2e96ccc910fcb66f22afc96efbd) Co-authored-by: Serhiy Storchaka --- Lib/test/libregrtest/cmdline.py | 3 +++ Lib/test/libregrtest/utils.py | 2 +- Lib/test/test_tcl.py | 4 ++++ Lib/test/test_tkinter/__init__.py | 6 ++++++ Lib/test/test_tkinter/support.py | 11 +++++++++++ Lib/test/test_tkinter/test_colorchooser.py | 1 + Lib/test/test_tkinter/test_font.py | 1 + Lib/test/test_tkinter/test_geometry_managers.py | 1 + Lib/test/test_tkinter/test_images.py | 1 + Lib/test/test_tkinter/test_loadtk.py | 1 + Lib/test/test_tkinter/test_messagebox.py | 1 + Lib/test/test_tkinter/test_misc.py | 1 + Lib/test/test_tkinter/test_simpledialog.py | 1 + Lib/test/test_tkinter/test_text.py | 1 + Lib/test/test_tkinter/test_variables.py | 1 + Lib/test/test_tkinter/test_widgets.py | 1 + Lib/test/test_ttk/__init__.py | 4 ++++ Lib/test/test_ttk/test_extensions.py | 1 + Lib/test/test_ttk/test_style.py | 1 + Lib/test/test_ttk/test_widgets.py | 1 + .../2026-01-08-16-56-59.gh-issue-65784.aKNo1U.rst | 3 +++ 21 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tests/2026-01-08-16-56-59.gh-issue-65784.aKNo1U.rst diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index a1882fa86f7083..9252bb497dcf82 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -124,6 +124,9 @@ and 3.9 to test backwards compatibility. These tests may take very long to complete. + wantobjects - Allows to run Tkinter tests with the specified value of + tkinter.wantobjects. + To enable all resources except one, use '-uall,-'. For example, to run all the tests except for the gui tests, give the option '-uall,-gui'. diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index 9cf8e9e3e9ab3b..4d7e2840c32596 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -42,7 +42,7 @@ # - tzdata: while needed to validate fully test_datetime, it makes # test_datetime too slow (15-20 min on some buildbots) and so is disabled by # default (see bpo-30822). -RESOURCE_NAMES = ALL_RESOURCES + ('extralargefile', 'tzdata', 'xpickle') +RESOURCE_NAMES = ALL_RESOURCES + ('extralargefile', 'tzdata', 'xpickle', 'wantobjects') # Types for types hints diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py index ef281f6d1fe53a..47450d3fd5976f 100644 --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -817,6 +817,10 @@ def test_huge_string_builtins2(self, size): def setUpModule(): + wantobjects = support.get_resource_value('wantobjects') + if wantobjects is not None: + unittest.enterModuleContext( + support.swap_attr(tkinter, 'wantobjects', int(wantobjects))) if support.verbose: tcl = Tcl() print('patchlevel =', tcl.call('info', 'patchlevel'), flush=True) diff --git a/Lib/test/test_tkinter/__init__.py b/Lib/test/test_tkinter/__init__.py index aa196c12c804ac..62890c705a6ca6 100644 --- a/Lib/test/test_tkinter/__init__.py +++ b/Lib/test/test_tkinter/__init__.py @@ -22,3 +22,9 @@ def load_tests(*args): return load_package_tests(os.path.dirname(__file__), *args) + +def setUpModule(): + wantobjects = support.get_resource_value('wantobjects') + if wantobjects is not None: + unittest.enterModuleContext( + support.swap_attr(tkinter, 'wantobjects', int(wantobjects))) diff --git a/Lib/test/test_tkinter/support.py b/Lib/test/test_tkinter/support.py index ebb9e00ff91bf0..ca4a1b5597c1ca 100644 --- a/Lib/test/test_tkinter/support.py +++ b/Lib/test/test_tkinter/support.py @@ -1,5 +1,14 @@ import functools import tkinter +import unittest +from test import support + + +def setUpModule(): + wantobjects = support.get_resource_value('wantobjects') + if wantobjects is not None: + unittest.enterModuleContext( + support.swap_attr(tkinter, 'wantobjects', int(wantobjects))) class AbstractTkTest: @@ -10,6 +19,8 @@ def setUpClass(cls): tkinter.NoDefaultRoot() cls.root = tkinter.Tk() cls.wantobjects = cls.root.wantobjects() + if support.is_resource_enabled('wantobjects'): + assert cls.wantobjects == int(support.get_resource_value('wantobjects')) # De-maximize main window. # Some window managers can maximize new windows. cls.root.wm_state('normal') diff --git a/Lib/test/test_tkinter/test_colorchooser.py b/Lib/test/test_tkinter/test_colorchooser.py index 9bba21392d8d14..8a7e97f207a41f 100644 --- a/Lib/test/test_tkinter/test_colorchooser.py +++ b/Lib/test/test_tkinter/test_colorchooser.py @@ -1,6 +1,7 @@ import unittest import tkinter from test.support import requires, swap_attr +from test.test_tkinter.support import setUpModule # noqa: F401 from test.test_tkinter.support import AbstractDefaultRootTest, AbstractTkTest from tkinter import colorchooser from tkinter.colorchooser import askcolor diff --git a/Lib/test/test_tkinter/test_font.py b/Lib/test/test_tkinter/test_font.py index 563707ddd2fa9b..f8b2f438bbc814 100644 --- a/Lib/test/test_tkinter/test_font.py +++ b/Lib/test/test_tkinter/test_font.py @@ -2,6 +2,7 @@ import tkinter from tkinter import font from test.support import requires, gc_collect, ALWAYS_EQ +from test.test_tkinter.support import setUpModule # noqa: F401 from test.test_tkinter.support import AbstractTkTest, AbstractDefaultRootTest requires('gui') diff --git a/Lib/test/test_tkinter/test_geometry_managers.py b/Lib/test/test_tkinter/test_geometry_managers.py index d71a634a767310..b2ce143ff0948f 100644 --- a/Lib/test/test_tkinter/test_geometry_managers.py +++ b/Lib/test/test_tkinter/test_geometry_managers.py @@ -4,6 +4,7 @@ from tkinter import TclError from test.support import requires +from test.test_tkinter.support import setUpModule # noqa: F401 from test.test_tkinter.support import pixels_conv from test.test_tkinter.widget_tests import AbstractWidgetTest diff --git a/Lib/test/test_tkinter/test_images.py b/Lib/test/test_tkinter/test_images.py index 38371fe00d6eb5..758a5e013b747b 100644 --- a/Lib/test/test_tkinter/test_images.py +++ b/Lib/test/test_tkinter/test_images.py @@ -2,6 +2,7 @@ import tkinter from test import support from test.support import os_helper +from test.test_tkinter.support import setUpModule # noqa: F401 from test.test_tkinter.support import AbstractTkTest, AbstractDefaultRootTest, requires_tk support.requires('gui') diff --git a/Lib/test/test_tkinter/test_loadtk.py b/Lib/test/test_tkinter/test_loadtk.py index 61b0eda2fc750a..7cff654621eb35 100644 --- a/Lib/test/test_tkinter/test_loadtk.py +++ b/Lib/test/test_tkinter/test_loadtk.py @@ -3,6 +3,7 @@ import unittest import test.support as test_support from test.support import os_helper +from test.test_tkinter.support import setUpModule # noqa: F401 from tkinter import Tcl, TclError test_support.requires('gui') diff --git a/Lib/test/test_tkinter/test_messagebox.py b/Lib/test/test_tkinter/test_messagebox.py index f41bdc98286283..f29f0c7ba59086 100644 --- a/Lib/test/test_tkinter/test_messagebox.py +++ b/Lib/test/test_tkinter/test_messagebox.py @@ -1,6 +1,7 @@ import unittest import tkinter from test.support import requires, swap_attr +from test.test_tkinter.support import setUpModule # noqa: F401 from test.test_tkinter.support import AbstractDefaultRootTest from tkinter.commondialog import Dialog from tkinter.messagebox import showinfo diff --git a/Lib/test/test_tkinter/test_misc.py b/Lib/test/test_tkinter/test_misc.py index dbaf970161ce78..64addf98bc37e8 100644 --- a/Lib/test/test_tkinter/test_misc.py +++ b/Lib/test/test_tkinter/test_misc.py @@ -4,6 +4,7 @@ from tkinter import TclError import enum from test import support +from test.test_tkinter.support import setUpModule # noqa: F401 from test.test_tkinter.support import (AbstractTkTest, AbstractDefaultRootTest, requires_tk, get_tk_patchlevel) diff --git a/Lib/test/test_tkinter/test_simpledialog.py b/Lib/test/test_tkinter/test_simpledialog.py index 502f7f7098a322..313ad82e0a2c0d 100644 --- a/Lib/test/test_tkinter/test_simpledialog.py +++ b/Lib/test/test_tkinter/test_simpledialog.py @@ -1,6 +1,7 @@ import unittest import tkinter from test.support import requires, swap_attr +from test.test_tkinter.support import setUpModule # noqa: F401 from test.test_tkinter.support import AbstractDefaultRootTest from tkinter.simpledialog import Dialog, askinteger diff --git a/Lib/test/test_tkinter/test_text.py b/Lib/test/test_tkinter/test_text.py index ed618c739019cc..17cf688722042d 100644 --- a/Lib/test/test_tkinter/test_text.py +++ b/Lib/test/test_tkinter/test_text.py @@ -1,6 +1,7 @@ import unittest import tkinter from test.support import requires +from test.test_tkinter.support import setUpModule # noqa: F401 from test.test_tkinter.support import AbstractTkTest requires('gui') diff --git a/Lib/test/test_tkinter/test_variables.py b/Lib/test/test_tkinter/test_variables.py index def7aec077e800..3d50a71285efc2 100644 --- a/Lib/test/test_tkinter/test_variables.py +++ b/Lib/test/test_tkinter/test_variables.py @@ -6,6 +6,7 @@ from tkinter import (Variable, StringVar, IntVar, DoubleVar, BooleanVar, Tcl, TclError) from test.support import ALWAYS_EQ +from test.test_tkinter.support import setUpModule # noqa: F401 from test.test_tkinter.support import AbstractDefaultRootTest, tcl_version diff --git a/Lib/test/test_tkinter/test_widgets.py b/Lib/test/test_tkinter/test_widgets.py index 9ea764ca2a39d8..178fd05fa48078 100644 --- a/Lib/test/test_tkinter/test_widgets.py +++ b/Lib/test/test_tkinter/test_widgets.py @@ -4,6 +4,7 @@ import os from test.support import requires +from test.test_tkinter.support import setUpModule # noqa: F401 from test.test_tkinter.support import (requires_tk, tk_version, get_tk_patchlevel, widget_eq, AbstractDefaultRootTest) diff --git a/Lib/test/test_ttk/__init__.py b/Lib/test/test_ttk/__init__.py index 7ee7ffbd6d7408..971a5d24f06eb4 100644 --- a/Lib/test/test_ttk/__init__.py +++ b/Lib/test/test_ttk/__init__.py @@ -20,6 +20,10 @@ def setUpModule(): + wantobjects = support.get_resource_value('wantobjects') + if wantobjects is not None: + unittest.enterModuleContext( + support.swap_attr(tkinter, 'wantobjects', int(wantobjects))) root = None try: root = tkinter.Tk() diff --git a/Lib/test/test_ttk/test_extensions.py b/Lib/test/test_ttk/test_extensions.py index d5e069716971fe..9688d94f07727a 100644 --- a/Lib/test/test_ttk/test_extensions.py +++ b/Lib/test/test_ttk/test_extensions.py @@ -3,6 +3,7 @@ import tkinter from tkinter import ttk from test.support import requires, gc_collect +from test.test_tkinter.support import setUpModule # noqa: F401 from test.test_tkinter.support import AbstractTkTest, AbstractDefaultRootTest requires('gui') diff --git a/Lib/test/test_ttk/test_style.py b/Lib/test/test_ttk/test_style.py index eeaf5de2e303f6..46365a13514906 100644 --- a/Lib/test/test_ttk/test_style.py +++ b/Lib/test/test_ttk/test_style.py @@ -5,6 +5,7 @@ from tkinter import TclError from test import support from test.support import requires +from test.test_tkinter.support import setUpModule # noqa: F401 from test.test_tkinter.support import AbstractTkTest, get_tk_patchlevel requires('gui') diff --git a/Lib/test/test_ttk/test_widgets.py b/Lib/test/test_ttk/test_widgets.py index 10bec33be617a1..f7c0e2e7c87bc0 100644 --- a/Lib/test/test_ttk/test_widgets.py +++ b/Lib/test/test_ttk/test_widgets.py @@ -5,6 +5,7 @@ import sys from test.test_ttk_textonly import MockTclObj +from test.test_tkinter.support import setUpModule # noqa: F401 from test.test_tkinter.support import ( AbstractTkTest, requires_tk, tk_version, get_tk_patchlevel, simulate_mouse_click, AbstractDefaultRootTest) diff --git a/Misc/NEWS.d/next/Tests/2026-01-08-16-56-59.gh-issue-65784.aKNo1U.rst b/Misc/NEWS.d/next/Tests/2026-01-08-16-56-59.gh-issue-65784.aKNo1U.rst new file mode 100644 index 00000000000000..7d1a153fc7a6ca --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2026-01-08-16-56-59.gh-issue-65784.aKNo1U.rst @@ -0,0 +1,3 @@ +Add support for parametrized resource ``wantobjects`` in regrtests, +which allows to run Tkinter tests with the specified value of +:data:`!tkinter.wantobjects`, for example ``-u wantobjects=0``.