From 2dcc46be01b50ad174e7eece33bde44ba13a0754 Mon Sep 17 00:00:00 2001 From: Louie Lu Date: Mon, 8 May 2017 16:20:06 +0800 Subject: [PATCH 1/7] bpo-30303: Add _utest argument to textview --- Lib/idlelib/idle_test/test_textview.py | 51 +++++++++++++++++++++++++- Lib/idlelib/textview.py | 17 ++++++--- 2 files changed, 60 insertions(+), 8 deletions(-) diff --git a/Lib/idlelib/idle_test/test_textview.py b/Lib/idlelib/idle_test/test_textview.py index f018f5ef1975ba..c667f2c80b49ab 100644 --- a/Lib/idlelib/idle_test/test_textview.py +++ b/Lib/idlelib/idle_test/test_textview.py @@ -8,12 +8,12 @@ Coverage: 94%. ''' from idlelib import textview as tv -from test.support import requires +from test.support import requires, findfile requires('gui') import unittest import os -from tkinter import Tk +from tkinter import Tk, Button from idlelib.idle_test.mock_idle import Func from idlelib.idle_test.mock_tk import Mbox_func @@ -96,5 +96,52 @@ def test_view_file(self): self.assertIsNone(view) +class ButtonClickTextViewTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.root = Tk() + cls.root.withdraw() + cls._utest = True + + @classmethod + def tearDownClass(cls): + cls.root.update_idletasks() + cls.root.destroy() + del cls.root + + def setUp(self): + self.view = None + self.called = False + + def tearDown(self): + if self.view: + self.view.destroy() + + def test_view_text_bind_with_button(self): + def _command(): + self.called = True + self.view = tv.view_text(self.root, 'TITLE_TEXT', 'COMMAND', _utest=self._utest) + button = Button(self.root, text='BUTTON', command=_command) + button.invoke() + + self.assertEqual(self.called, True) + self.assertEqual(self.view.title(), 'TITLE_TEXT') + self.assertEqual(self.view.textView.get('1.0', '1.end'), 'COMMAND') + + def test_view_file_bind_with_button(self): + def _command(): + fn = findfile('CREDITS.txt', 'idlelib') + self.called = True + self.view = tv.view_file(self.root, 'TITLE_FILE', fn, _utest=self._utest) + button = Button(self.root, text='BUTTON', command=_command) + button.invoke() + + self.assertEqual(self.called, True) + self.assertEqual(self.view.title(), 'TITLE_FILE') + self.assertEqual(self.view.textView.get('1.0', '1.end'), + 'Guido van Rossum, as well as being the creator of the ' + 'Python language, is the') + + if __name__ == '__main__': unittest.main(verbosity=2) diff --git a/Lib/idlelib/textview.py b/Lib/idlelib/textview.py index adee326e1deb91..10610a71f0dc85 100644 --- a/Lib/idlelib/textview.py +++ b/Lib/idlelib/textview.py @@ -9,7 +9,7 @@ class TextViewer(Toplevel): "A simple text viewer dialog for IDLE." - def __init__(self, parent, title, text, modal=True, _htest=False): + def __init__(self, parent, title, text, modal=True, _htest=False, _utest=False): """Show the given text in a scrollable window with a 'close' button If modal option set to False, user can interact with other windows, @@ -17,6 +17,7 @@ def __init__(self, parent, title, text, modal=True, _htest=False): the textview window is closed. _htest - bool; change box location when running htest. + _utest - bool; don't wait_window when running unittest """ Toplevel.__init__(self, parent) self.configure(borderwidth=5) @@ -42,7 +43,9 @@ def __init__(self, parent, title, text, modal=True, _htest=False): if modal: self.transient(parent) self.grab_set() - self.wait_window() + + if not _utest: + self.wait_window() def CreateWidgets(self): frameText = Frame(self, relief=SUNKEN, height=700) @@ -65,10 +68,11 @@ def Ok(self, event=None): self.destroy() -def view_text(parent, title, text, modal=True): - return TextViewer(parent, title, text, modal) +def view_text(parent, title, text, modal=True, _utest=False): + return TextViewer(parent, title, text, modal, _utest=_utest) + -def view_file(parent, title, filename, encoding=None, modal=True): +def view_file(parent, title, filename, encoding=None, modal=True, _utest=False): try: with open(filename, 'r', encoding=encoding) as file: contents = file.read() @@ -81,7 +85,8 @@ def view_file(parent, title, filename, encoding=None, modal=True): message=str(err), parent=parent) else: - return view_text(parent, title, contents, modal) + return view_text(parent, title, contents, modal, _utest=_utest) + if __name__ == '__main__': import unittest From c09934295356a36c6061e71de329ce6fde7e8653 Mon Sep 17 00:00:00 2001 From: Louie Lu Date: Wed, 17 May 2017 14:50:26 +0800 Subject: [PATCH 2/7] Remove setUpClass and using global root for test --- Lib/idlelib/idle_test/test_textview.py | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/Lib/idlelib/idle_test/test_textview.py b/Lib/idlelib/idle_test/test_textview.py index c667f2c80b49ab..368bc1ac2b22cd 100644 --- a/Lib/idlelib/idle_test/test_textview.py +++ b/Lib/idlelib/idle_test/test_textview.py @@ -97,17 +97,7 @@ def test_view_file(self): class ButtonClickTextViewTest(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.root = Tk() - cls.root.withdraw() - cls._utest = True - - @classmethod - def tearDownClass(cls): - cls.root.update_idletasks() - cls.root.destroy() - del cls.root + _utest = True def setUp(self): self.view = None @@ -120,8 +110,8 @@ def tearDown(self): def test_view_text_bind_with_button(self): def _command(): self.called = True - self.view = tv.view_text(self.root, 'TITLE_TEXT', 'COMMAND', _utest=self._utest) - button = Button(self.root, text='BUTTON', command=_command) + self.view = tv.view_text(root, 'TITLE_TEXT', 'COMMAND', _utest=self._utest) + button = Button(root, text='BUTTON', command=_command) button.invoke() self.assertEqual(self.called, True) @@ -132,8 +122,8 @@ def test_view_file_bind_with_button(self): def _command(): fn = findfile('CREDITS.txt', 'idlelib') self.called = True - self.view = tv.view_file(self.root, 'TITLE_FILE', fn, _utest=self._utest) - button = Button(self.root, text='BUTTON', command=_command) + self.view = tv.view_file(root, 'TITLE_FILE', fn, _utest=self._utest) + button = Button(root, text='BUTTON', command=_command) button.invoke() self.assertEqual(self.called, True) From fccde832f0dad891b6624c5d80df1a1020eb3308 Mon Sep 17 00:00:00 2001 From: Louie Lu Date: Wed, 17 May 2017 14:50:50 +0800 Subject: [PATCH 3/7] Add cleanup for test button --- Lib/idlelib/idle_test/test_textview.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/idlelib/idle_test/test_textview.py b/Lib/idlelib/idle_test/test_textview.py index 368bc1ac2b22cd..bf0068a6e8f5f9 100644 --- a/Lib/idlelib/idle_test/test_textview.py +++ b/Lib/idlelib/idle_test/test_textview.py @@ -113,6 +113,7 @@ def _command(): self.view = tv.view_text(root, 'TITLE_TEXT', 'COMMAND', _utest=self._utest) button = Button(root, text='BUTTON', command=_command) button.invoke() + self.addCleanup(button.destroy) self.assertEqual(self.called, True) self.assertEqual(self.view.title(), 'TITLE_TEXT') @@ -125,6 +126,7 @@ def _command(): self.view = tv.view_file(root, 'TITLE_FILE', fn, _utest=self._utest) button = Button(root, text='BUTTON', command=_command) button.invoke() + self.addCleanup(button.destroy) self.assertEqual(self.called, True) self.assertEqual(self.view.title(), 'TITLE_FILE') From d30ae3f556935646d2530dc075e29475da7262d1 Mon Sep 17 00:00:00 2001 From: Louie Lu Date: Wed, 17 May 2017 14:55:30 +0800 Subject: [PATCH 4/7] Make view_file test self-contained --- Lib/idlelib/idle_test/test_textview.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Lib/idlelib/idle_test/test_textview.py b/Lib/idlelib/idle_test/test_textview.py index bf0068a6e8f5f9..18d33350be1e6d 100644 --- a/Lib/idlelib/idle_test/test_textview.py +++ b/Lib/idlelib/idle_test/test_textview.py @@ -121,9 +121,8 @@ def _command(): def test_view_file_bind_with_button(self): def _command(): - fn = findfile('CREDITS.txt', 'idlelib') self.called = True - self.view = tv.view_file(root, 'TITLE_FILE', fn, _utest=self._utest) + self.view = tv.view_file(root, 'TITLE_FILE', __file__, _utest=self._utest) button = Button(root, text='BUTTON', command=_command) button.invoke() self.addCleanup(button.destroy) @@ -131,8 +130,7 @@ def _command(): self.assertEqual(self.called, True) self.assertEqual(self.view.title(), 'TITLE_FILE') self.assertEqual(self.view.textView.get('1.0', '1.end'), - 'Guido van Rossum, as well as being the creator of the ' - 'Python language, is the') + "'''Test idlelib.textview.") if __name__ == '__main__': From 62e88f8582ef35019ec7064902ce378a4003ac19 Mon Sep 17 00:00:00 2001 From: Louie Lu Date: Wed, 17 May 2017 14:57:04 +0800 Subject: [PATCH 5/7] Remove unused import --- Lib/idlelib/idle_test/test_textview.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/idlelib/idle_test/test_textview.py b/Lib/idlelib/idle_test/test_textview.py index 18d33350be1e6d..b491a65d1947c0 100644 --- a/Lib/idlelib/idle_test/test_textview.py +++ b/Lib/idlelib/idle_test/test_textview.py @@ -8,7 +8,7 @@ Coverage: 94%. ''' from idlelib import textview as tv -from test.support import requires, findfile +from test.support import requires requires('gui') import unittest From 0c33759d601e5e5d32f4b760900edbf6bd8d7e13 Mon Sep 17 00:00:00 2001 From: Louie Lu Date: Wed, 17 May 2017 17:48:34 +0800 Subject: [PATCH 6/7] Make viewfile test self-compare --- Lib/idlelib/idle_test/test_textview.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Lib/idlelib/idle_test/test_textview.py b/Lib/idlelib/idle_test/test_textview.py index b491a65d1947c0..17f417bbd9ad55 100644 --- a/Lib/idlelib/idle_test/test_textview.py +++ b/Lib/idlelib/idle_test/test_textview.py @@ -129,8 +129,11 @@ def _command(): self.assertEqual(self.called, True) self.assertEqual(self.view.title(), 'TITLE_FILE') - self.assertEqual(self.view.textView.get('1.0', '1.end'), - "'''Test idlelib.textview.") + with open(__file__) as f: + self.assertEqual(self.view.textView.get('1.0', '1.end'), + f.readline().strip()) + self.assertEqual(self.view.textView.get('2.0', '2.end'), + f.readline().strip()) if __name__ == '__main__': From 766ddaa25296c1e60d6dc244fcc2327b17030614 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Wed, 17 May 2017 16:48:56 -0400 Subject: [PATCH 7/7] Tweak new test. Edit and add docstrings to textview. --- Lib/idlelib/idle_test/test_textview.py | 8 ++++---- Lib/idlelib/textview.py | 17 +++++++++-------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Lib/idlelib/idle_test/test_textview.py b/Lib/idlelib/idle_test/test_textview.py index 17f417bbd9ad55..67fc0b7c4f1c6d 100644 --- a/Lib/idlelib/idle_test/test_textview.py +++ b/Lib/idlelib/idle_test/test_textview.py @@ -97,7 +97,6 @@ def test_view_file(self): class ButtonClickTextViewTest(unittest.TestCase): - _utest = True def setUp(self): self.view = None @@ -110,7 +109,7 @@ def tearDown(self): def test_view_text_bind_with_button(self): def _command(): self.called = True - self.view = tv.view_text(root, 'TITLE_TEXT', 'COMMAND', _utest=self._utest) + self.view = tv.view_text(root, 'TITLE_TEXT', 'COMMAND', _utest=True) button = Button(root, text='BUTTON', command=_command) button.invoke() self.addCleanup(button.destroy) @@ -122,7 +121,7 @@ def _command(): def test_view_file_bind_with_button(self): def _command(): self.called = True - self.view = tv.view_file(root, 'TITLE_FILE', __file__, _utest=self._utest) + self.view = tv.view_file(root, 'TITLE_FILE', __file__, _utest=True) button = Button(root, text='BUTTON', command=_command) button.invoke() self.addCleanup(button.destroy) @@ -132,7 +131,8 @@ def _command(): with open(__file__) as f: self.assertEqual(self.view.textView.get('1.0', '1.end'), f.readline().strip()) - self.assertEqual(self.view.textView.get('2.0', '2.end'), + f.readline() + self.assertEqual(self.view.textView.get('3.0', '3.end'), f.readline().strip()) diff --git a/Lib/idlelib/textview.py b/Lib/idlelib/textview.py index 10610a71f0dc85..f33ac32a33a3bb 100644 --- a/Lib/idlelib/textview.py +++ b/Lib/idlelib/textview.py @@ -9,15 +9,15 @@ class TextViewer(Toplevel): "A simple text viewer dialog for IDLE." - def __init__(self, parent, title, text, modal=True, _htest=False, _utest=False): - """Show the given text in a scrollable window with a 'close' button + def __init__(self, parent, title, text, modal=True, + _htest=False, _utest=False): + """Show the given text in a scrollable window with a 'close' button. - If modal option set to False, user can interact with other windows, - otherwise they will be unable to interact with other windows until - the textview window is closed. + If modal is left True, users cannot interact with other windows + until the textview window is closed. _htest - bool; change box location when running htest. - _utest - bool; don't wait_window when running unittest + _utest - bool; don't wait_window when running unittest. """ Toplevel.__init__(self, parent) self.configure(borderwidth=5) @@ -43,11 +43,11 @@ def __init__(self, parent, title, text, modal=True, _htest=False, _utest=False): if modal: self.transient(parent) self.grab_set() - if not _utest: self.wait_window() def CreateWidgets(self): + "Create Frame with Text (with vertical Scrollbar) and Button." frameText = Frame(self, relief=SUNKEN, height=700) frameButtons = Frame(self) self.buttonOk = Button(frameButtons, text='Close', @@ -69,10 +69,11 @@ def Ok(self, event=None): def view_text(parent, title, text, modal=True, _utest=False): + "Display text in a TextViewer." return TextViewer(parent, title, text, modal, _utest=_utest) - def view_file(parent, title, filename, encoding=None, modal=True, _utest=False): + "Display file in a TextViever or show error message." try: with open(filename, 'r', encoding=encoding) as file: contents = file.read()