]> granicus.if.org Git - python/commitdiff
Issue #18910: Add unittest for textView. Patch by Phil Webster.
authorTerry Jan Reedy <tjreedy@udel.edu>
Thu, 5 Jun 2014 07:38:34 +0000 (03:38 -0400)
committerTerry Jan Reedy <tjreedy@udel.edu>
Thu, 5 Jun 2014 07:38:34 +0000 (03:38 -0400)
Lib/idlelib/idle_test/mock_idle.py
Lib/idlelib/idle_test/test_textview.py [new file with mode: 0644]
Lib/idlelib/textView.py
Misc/NEWS

index cfb6e23d4de8ea4aeb29dde7e9bc0301f91fc3aa..9c7e5675706329b60a68b83404a0e4499fa9be3d 100644 (file)
@@ -8,14 +8,22 @@ from idlelib.idle_test.mock_tk import Text
 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 (file)
index 0000000..c84c874
--- /dev/null
@@ -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)
index 2ae9a9d4001b41d6ffb7bda3bee398656e48a581..4257eeabaee72a15ed45598a89cf7e97ca6ca7a8 100644 (file)
@@ -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)
@@ -68,8 +72,7 @@ def view_file(parent, title, filename, encoding=None, modal=True):
     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 @@ def view_file(parent, title, filename, encoding=None, modal=True):
         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)
index ce381954cab3e5763c7c70a698487b3c6b5fdcae..912bf3d69004476efec781fa3335a10f38a99966 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -66,6 +66,8 @@ Build
 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.