Kaydet (Commit) 3d7281d2 authored tarafından Terry Jan Reedy's avatar Terry Jan Reedy

Issue 20567: Revise idle_test/README.txt and some tests to match new advice.

......@@ -56,40 +56,44 @@ requires('gui')
To guard a test class, put "requires('gui')" in its setUpClass function.
To avoid interfering with other GUI tests, all GUI objects must be
destroyed and deleted by the end of the test. Widgets, such as a Tk
root, created in a setUpX function, should be destroyed in the
corresponding tearDownX. Module and class widget attributes should also
be deleted.
To avoid interfering with other gui tests, all gui objects must be destroyed and
deleted by the end of the test. The Tk root created in a setUpX function should
be destroyed in the corresponding tearDownX and the module or class attribute
deleted. Others widgets should descend from the single root and the attributes
deleted BEFORE root is destroyed. See https://bugs.python.org/issue20567.
@classmethod
def setUpClass(cls):
requires('gui')
cls.root = tk.Tk()
cls.text = tk.Text(root)
@classmethod
def tearDownClass(cls):
del cls.text
cls.root.destroy()
del cls.root
Requires('gui') causes the test(s) it guards to be skipped if any of
a few conditions are met:
these conditions are met:
- The tests are being run by regrtest.py, and it was started without
enabling the "gui" resource with the "-u" command line option.
- The tests are being run on Windows by a service that is not allowed
to interact with the graphical environment.
- The tests are being run on Linux and X Windows is not available.
- The tests are being run on Mac OSX in a process that cannot make a
window manager connection.
- tkinter.Tk cannot be successfully instantiated for some reason.
- test.support.use_resources has been set by something other than
regrtest.py and does not contain "gui".
Tests of non-GUI operations should avoid creating tk widgets. Incidental
uses of tk variables and messageboxes can be replaced by the mock
classes in idle_test/mock_tk.py. The mock text handles some uses of the
......
......@@ -33,9 +33,8 @@ class AutoCompleteTest(unittest.TestCase):
@classmethod
def tearDownClass(cls):
del cls.editor, cls.text
cls.root.destroy()
del cls.text
del cls.editor
del cls.root
def setUp(self):
......
......@@ -25,10 +25,10 @@ class AutoExpandTest(unittest.TestCase):
@classmethod
def tearDownClass(cls):
del cls.text, cls.auto_expand
if hasattr(cls, 'tk'):
cls.tk.destroy()
del cls.tk
del cls.text, cls.auto_expand
def tearDown(self):
self.text.delete('1.0', 'end')
......
......@@ -276,10 +276,9 @@ class FormatEventTest(unittest.TestCase):
@classmethod
def tearDownClass(cls):
del cls.text, cls.formatter
cls.root.destroy()
del cls.root
del cls.text
del cls.formatter
def test_short_line(self):
self.text.insert('1.0', "Short line\n")
......
......@@ -40,9 +40,9 @@ class PercolatorTest(unittest.TestCase):
@classmethod
def tearDownClass(cls):
cls.text.destroy()
del cls.text
cls.root.destroy()
del cls.text, cls.root
del cls.root
def setUp(self):
self.percolator = Percolator(self.text)
......
......@@ -14,14 +14,14 @@ class InitCloseTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
requires('gui')
cls.tk = Tk()
cls.text = Text(cls.tk)
cls.root = Tk()
cls.text = Text(cls.root)
@classmethod
def tearDownClass(cls):
cls.text.destroy()
cls.tk.destroy()
del cls.text, cls.tk
del cls.text
cls.root.destroy()
del cls.root
def test_init(self):
redir = WidgetRedirector(self.text)
......@@ -43,14 +43,15 @@ class WidgetRedirectorTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
requires('gui')
cls.tk = Tk()
cls.text = Text(cls.tk)
cls.root = Tk()
cls.text = Text(cls.root)
@classmethod
def tearDownClass(cls):
cls.text.destroy()
cls.tk.destroy()
del cls.text, cls.tk
del cls.text
cls.root.destroy()
del cls.root
def setUp(self):
self.redir = WidgetRedirector(self.text)
......@@ -108,14 +109,13 @@ class WidgetRedirectorTest(unittest.TestCase):
def test_command_dispatch(self):
# Test that .__init__ causes redirection of tk calls
# through redir.dispatch
self.tk.call(self.text._w, 'insert', 'hello')
self.root.call(self.text._w, 'insert', 'hello')
self.assertEqual(self.func.args, ('hello',))
self.assertEqual(self.text.get('1.0', 'end'), '\n')
# Ensure that called through redir .dispatch and not through
# self.text.insert by having mock raise TclError.
self.func.__init__(TclError())
self.assertEqual(self.tk.call(self.text._w, 'insert', 'boo'), '')
self.assertEqual(self.root.call(self.text._w, 'insert', 'boo'), '')
if __name__ == '__main__':
......
......@@ -31,8 +31,9 @@ class ReplaceDialogTest(unittest.TestCase):
@classmethod
def tearDownClass(cls):
se.tkMessageBox = orig_mbox
del cls.text, cls.dialog, cls.engine
cls.root.destroy()
del cls.text, cls.dialog, cls.engine, cls.root
del cls.root
def setUp(self):
self.text.insert('insert', 'This is a sample sTring')
......
......@@ -22,7 +22,8 @@ def setUpModule():
root = Tk()
def tearDownModule():
global root
global root, TV
del TV
root.destroy() # pyflakes falsely sees root as undefined
del root
......
......@@ -23,8 +23,9 @@ class UndoDelegatorTest(unittest.TestCase):
@classmethod
def tearDownClass(cls):
cls.percolator.redir.close()
del cls.percolator, cls.text
cls.root.destroy()
del cls.percolator, cls.text, cls.root
del cls.root
def setUp(self):
self.delegator = UndoDelegator()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment