[Python-checkins] cpython (3.4): Issue #18910: Add unittest for textView. Patch by Phil Webster.

terry.reedy python-checkins at python.org
Thu Jun 5 09:54:54 CEST 2014


http://hg.python.org/cpython/rev/99047f3a19a9
changeset:   91024:99047f3a19a9
branch:      3.4
parent:      91020:3d5f6198c945
user:        Terry Jan Reedy <tjreedy at udel.edu>
date:        Thu Jun 05 03:38:34 2014 -0400
summary:
  Issue #18910: Add unittest for textView. Patch by Phil Webster.

files:
  Lib/idlelib/idle_test/mock_idle.py     |  10 +-
  Lib/idlelib/idle_test/test_textview.py |  96 ++++++++++++++
  Lib/idlelib/textView.py                |  11 +-
  Misc/NEWS                              |   2 +
  4 files changed, 115 insertions(+), 4 deletions(-)


diff --git a/Lib/idlelib/idle_test/mock_idle.py b/Lib/idlelib/idle_test/mock_idle.py
--- a/Lib/idlelib/idle_test/mock_idle.py
+++ b/Lib/idlelib/idle_test/mock_idle.py
@@ -8,14 +8,22 @@
 class Func:
     '''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
--- /dev/null
+++ b/Lib/idlelib/idle_test/test_textview.py
@@ -0,0 +1,96 @@
+'''Test the functions and main class method of textView.py.'''
+
+import unittest
+import os
+from 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 TextViewTest(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)
diff --git a/Lib/idlelib/textView.py b/Lib/idlelib/textView.py
--- a/Lib/idlelib/textView.py
+++ b/Lib/idlelib/textView.py
@@ -12,7 +12,11 @@
     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)
@@ -68,8 +72,7 @@
     try:
         with open(filename, 'r', encoding=encoding) as file:
             contents = file.read()
-    except OSError:
-        import tkinter.messagebox as tkMessageBox
+    except IOError:
         tkMessageBox.showerror(title='File Load Error',
                                message='Unable to load file %r .' % filename,
                                parent=parent)
@@ -77,5 +80,7 @@
         return view_text(parent, title, contents, modal)
 
 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)
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -66,6 +66,8 @@
 IDLE
 ----
 
+- Issue #18910: Add unittest for textView. Patch by Phil Webster.
+
 - Issue #18292: Add unittest for AutoExpand. Patch by Saihadhav Heblikar.
 
 - Issue #18409: Add unittest for AutoComplete. Patch by Phil Webster.

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list