Issue #18910: Add unittest for textView. Patch by Phil Webster.

This commit is contained in:
Terry Jan Reedy 2014-06-05 03:38:34 -04:00
parent 0d3e4b4e1a
commit 537e2c8632
4 changed files with 115 additions and 4 deletions

View 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

View File

@ -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)

View 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)

View File

@ -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.