diff options
author | Terry Jan Reedy <tjreedy@udel.edu> | 2014-06-05 07:38:28 (GMT) |
---|---|---|
committer | Terry Jan Reedy <tjreedy@udel.edu> | 2014-06-05 07:38:28 (GMT) |
commit | 562495ab6150eb2eae346dcc9f06f3d5173d9a3a (patch) | |
tree | 5d8e3f177bbb37c5386f8ae465aecb0066f29416 /Lib | |
parent | 6e66cb03b7b8ee12d95f66175fe8061cdb188fa4 (diff) | |
download | cpython-562495ab6150eb2eae346dcc9f06f3d5173d9a3a.zip cpython-562495ab6150eb2eae346dcc9f06f3d5173d9a3a.tar.gz cpython-562495ab6150eb2eae346dcc9f06f3d5173d9a3a.tar.bz2 |
Issue #18910: Add unittest for textView. Patch by Phil Webster.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/idlelib/idle_test/mock_idle.py | 10 | ||||
-rw-r--r-- | Lib/idlelib/idle_test/test_textview.py | 98 | ||||
-rw-r--r-- | Lib/idlelib/textView.py | 9 |
3 files changed, 114 insertions, 3 deletions
diff --git a/Lib/idlelib/idle_test/mock_idle.py b/Lib/idlelib/idle_test/mock_idle.py index 0bb84ab..d76b783 100644 --- a/Lib/idlelib/idle_test/mock_idle.py +++ b/Lib/idlelib/idle_test/mock_idle.py @@ -8,14 +8,22 @@ from idlelib.idle_test.mock_tk import Text class Func(object): '''Mock function captures args and returns result set by test. + Attributes: + self.called - records call even if no args, kwds passed. + self.result - set by init, returned by call. + self.args - captures positional arguments. + self.kwds - captures keyword arguments. + Most common use will probably be to mock methods. - mock_tk.Var and Mbox_func are special cases of this. + Mock_tk.Var and Mbox_func are special variants of this. ''' def __init__(self, result=None): + self.called = False self.result = result self.args = None self.kwds = None def __call__(self, *args, **kwds): + self.called = True self.args = args self.kwds = kwds return self.result diff --git a/Lib/idlelib/idle_test/test_textview.py b/Lib/idlelib/idle_test/test_textview.py new file mode 100644 index 0000000..c5798ea --- /dev/null +++ b/Lib/idlelib/idle_test/test_textview.py @@ -0,0 +1,98 @@ +'''Test the functions and main class method of textView.py.''' + +import unittest +import os +from test.test_support import requires +from Tkinter import Tk, Text, TclError +from idlelib import textView as tv +from idlelib.idle_test.mock_idle import Func +from idlelib.idle_test.mock_tk import Mbox + +orig_mbox = tv.tkMessageBox + +class textviewClassTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = Tk() + cls.TV = TV = tv.TextViewer + TV.transient = Func() + TV.grab_set = Func() + TV.wait_window = Func() + + @classmethod + def tearDownClass(cls): + cls.root.destroy() + TV = cls.TV + del cls.root, cls.TV + del TV.transient, TV.grab_set, TV.wait_window + + def setUp(self): + TV = self.TV + TV.transient.__init__() + TV.grab_set.__init__() + TV.wait_window.__init__() + + + def test_init_modal(self): + TV = self.TV + view = TV(self.root, 'Title', 'test text') + self.assertTrue(TV.transient.called) + self.assertTrue(TV.grab_set.called) + self.assertTrue(TV.wait_window.called) + view.Ok() + + def test_init_nonmodal(self): + TV = self.TV + view = TV(self.root, 'Title', 'test text', modal=False) + self.assertFalse(TV.transient.called) + self.assertFalse(TV.grab_set.called) + self.assertFalse(TV.wait_window.called) + view.Ok() + + def test_ok(self): + view = self.TV(self.root, 'Title', 'test text', modal=False) + view.destroy = Func() + view.Ok() + self.assertTrue(view.destroy.called) + del view.destroy # unmask real function + view.destroy + + +class textviewTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = Tk() + tv.tkMessageBox = Mbox + + @classmethod + def tearDownClass(cls): + cls.root.destroy() + del cls.root + tv.tkMessageBox = orig_mbox + + def test_view_text(self): + # If modal True, tkinter will error with 'can't invoke "event" command' + view = tv.view_text(self.root, 'Title', 'test text', modal=False) + self.assertIsInstance(view, tv.TextViewer) + + def test_view_file(self): + test_dir = os.path.dirname(__file__) + testfile = os.path.join(test_dir, 'test_textview.py') + view = tv.view_file(self.root, 'Title', testfile, modal=False) + self.assertIsInstance(view, tv.TextViewer) + self.assertIn('Test', view.textView.get('1.0', '1.end')) + view.Ok() + + # Mock messagebox will be used and view_file will not return anything + testfile = os.path.join(test_dir, '../notthere.py') + view = tv.view_file(self.root, 'Title', testfile, modal=False) + self.assertIsNone(view) + +if __name__ == '__main__': + unittest.main(verbosity=2, exit=False) + from idlelib.idle_test.htest import run + run(TextViewer) diff --git a/Lib/idlelib/textView.py b/Lib/idlelib/textView.py index 4716d39..eb60274 100644 --- a/Lib/idlelib/textView.py +++ b/Lib/idlelib/textView.py @@ -12,7 +12,11 @@ class TextViewer(Toplevel): def __init__(self, parent, title, text, modal=True, _htest=False): """Show the given text in a scrollable window with a 'close' button - _htest - bool, change box location when running htest + 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. + + _htest - bool; change box location when running htest. """ Toplevel.__init__(self, parent) self.configure(borderwidth=5) @@ -72,7 +76,6 @@ def view_file(parent, title, filename, encoding=None, modal=True): else: textFile = open(filename, 'r') except IOError: - import tkMessageBox tkMessageBox.showerror(title='File Load Error', message='Unable to load file %r .' % filename, parent=parent) @@ -81,5 +84,7 @@ def view_file(parent, title, filename, encoding=None, modal=True): if __name__ == '__main__': + import unittest + unittest.main('idlelib.idle_test.test_textview', verbosity=2, exit=False) from idlelib.idle_test.htest import run run(TextViewer) |