mirror of
https://github.com/python/cpython.git
synced 2025-08-01 23:53:15 +00:00

Part 3 of 3, continuing PR #7689. This covers 14 idlelib modules and their tests, rpc to zoomheight except for run (already done) and tooltip (being done separately).
178 lines
5.4 KiB
Python
178 lines
5.4 KiB
Python
"""Test textview, coverage 100%.
|
|
|
|
Since all methods and functions create (or destroy) a ViewWindow, which
|
|
is a widget containing a widget, etcetera, all tests must be gui tests.
|
|
Using mock Text would not change this. Other mocks are used to retrieve
|
|
information about calls.
|
|
"""
|
|
from idlelib import textview as tv
|
|
import unittest
|
|
from test.support import requires
|
|
requires('gui')
|
|
|
|
import os
|
|
from tkinter import Tk
|
|
from tkinter.ttk import Button
|
|
from idlelib.idle_test.mock_idle import Func
|
|
from idlelib.idle_test.mock_tk import Mbox_func
|
|
|
|
def setUpModule():
|
|
global root
|
|
root = Tk()
|
|
root.withdraw()
|
|
|
|
def tearDownModule():
|
|
global root
|
|
root.update_idletasks()
|
|
root.destroy()
|
|
del root
|
|
|
|
# If we call ViewWindow or wrapper functions with defaults
|
|
# modal=True, _utest=False, test hangs on call to wait_window.
|
|
# Have also gotten tk error 'can't invoke "event" command'.
|
|
|
|
|
|
class VW(tv.ViewWindow): # Used in ViewWindowTest.
|
|
transient = Func()
|
|
grab_set = Func()
|
|
wait_window = Func()
|
|
|
|
|
|
# Call wrapper class VW with mock wait_window.
|
|
class ViewWindowTest(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
VW.transient.__init__()
|
|
VW.grab_set.__init__()
|
|
VW.wait_window.__init__()
|
|
|
|
def test_init_modal(self):
|
|
view = VW(root, 'Title', 'test text')
|
|
self.assertTrue(VW.transient.called)
|
|
self.assertTrue(VW.grab_set.called)
|
|
self.assertTrue(VW.wait_window.called)
|
|
view.ok()
|
|
|
|
def test_init_nonmodal(self):
|
|
view = VW(root, 'Title', 'test text', modal=False)
|
|
self.assertFalse(VW.transient.called)
|
|
self.assertFalse(VW.grab_set.called)
|
|
self.assertFalse(VW.wait_window.called)
|
|
view.ok()
|
|
|
|
def test_ok(self):
|
|
view = VW(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 TextFrameTest(unittest.TestCase):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
"By itself, this tests that file parsed without exception."
|
|
cls.root = root = Tk()
|
|
root.withdraw()
|
|
cls.frame = tv.TextFrame(root, 'test text')
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
del cls.frame
|
|
cls.root.update_idletasks()
|
|
cls.root.destroy()
|
|
del cls.root
|
|
|
|
def test_line1(self):
|
|
get = self.frame.text.get
|
|
self.assertEqual(get('1.0', '1.end'), 'test text')
|
|
|
|
|
|
# Call ViewWindow with modal=False.
|
|
class ViewFunctionTest(unittest.TestCase):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
cls.orig_error = tv.showerror
|
|
tv.showerror = Mbox_func()
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
tv.showerror = cls.orig_error
|
|
del cls.orig_error
|
|
|
|
def test_view_text(self):
|
|
view = tv.view_text(root, 'Title', 'test text', modal=False)
|
|
self.assertIsInstance(view, tv.ViewWindow)
|
|
self.assertIsInstance(view.viewframe, tv.ViewFrame)
|
|
view.viewframe.ok()
|
|
|
|
def test_view_file(self):
|
|
view = tv.view_file(root, 'Title', __file__, 'ascii', modal=False)
|
|
self.assertIsInstance(view, tv.ViewWindow)
|
|
self.assertIsInstance(view.viewframe, tv.ViewFrame)
|
|
get = view.viewframe.textframe.text.get
|
|
self.assertIn('Test', get('1.0', '1.end'))
|
|
view.ok()
|
|
|
|
def test_bad_file(self):
|
|
# Mock showerror will be used; view_file will return None.
|
|
view = tv.view_file(root, 'Title', 'abc.xyz', 'ascii', modal=False)
|
|
self.assertIsNone(view)
|
|
self.assertEqual(tv.showerror.title, 'File Load Error')
|
|
|
|
def test_bad_encoding(self):
|
|
p = os.path
|
|
fn = p.abspath(p.join(p.dirname(__file__), '..', 'CREDITS.txt'))
|
|
tv.showerror.title = None
|
|
view = tv.view_file(root, 'Title', fn, 'ascii', modal=False)
|
|
self.assertIsNone(view)
|
|
self.assertEqual(tv.showerror.title, 'Unicode Decode Error')
|
|
|
|
|
|
# Call ViewWindow with _utest=True.
|
|
class ButtonClickTest(unittest.TestCase):
|
|
|
|
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(root, 'TITLE_TEXT', 'COMMAND', _utest=True)
|
|
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')
|
|
self.assertEqual(self.view.viewframe.textframe.text.get('1.0', '1.end'),
|
|
'COMMAND')
|
|
|
|
def test_view_file_bind_with_button(self):
|
|
def _command():
|
|
self.called = True
|
|
self.view = tv.view_file(root, 'TITLE_FILE', __file__,
|
|
encoding='ascii', _utest=True)
|
|
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')
|
|
get = self.view.viewframe.textframe.text.get
|
|
with open(__file__) as f:
|
|
self.assertEqual(get('1.0', '1.end'), f.readline().strip())
|
|
f.readline()
|
|
self.assertEqual(get('3.0', '3.end'), f.readline().strip())
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main(verbosity=2)
|