|
|
|
@ -1,17 +1,25 @@ |
|
|
|
"Test config_key, coverage 82%" |
|
|
|
"""Test config_key, coverage 98%. |
|
|
|
|
|
|
|
Coverage is effectively 100%. Tkinter dialog is mocked, Mac-only line |
|
|
|
may be skipped, and dummy function in bind test should not be called. |
|
|
|
Not tested: exit with 'self.advanced or self.keys_ok(keys)) ...' False. |
|
|
|
""" |
|
|
|
|
|
|
|
from idlelib import config_key |
|
|
|
from test.support import requires |
|
|
|
import unittest |
|
|
|
from tkinter import Tk |
|
|
|
from unittest import mock |
|
|
|
from tkinter import Tk, TclError |
|
|
|
from idlelib.idle_test.mock_idle import Func |
|
|
|
from idlelib.idle_test.mock_tk import Mbox_func |
|
|
|
|
|
|
|
gkd = config_key.GetKeysDialog |
|
|
|
|
|
|
|
|
|
|
|
class ValidationTest(unittest.TestCase): |
|
|
|
"Test validation methods: ok, keys_ok, bind_ok." |
|
|
|
|
|
|
|
class Validator(config_key.GetKeysDialog): |
|
|
|
class Validator(gkd): |
|
|
|
def __init__(self, *args, **kwargs): |
|
|
|
config_key.GetKeysDialog.__init__(self, *args, **kwargs) |
|
|
|
class list_keys_final: |
|
|
|
@ -95,5 +103,186 @@ class ValidationTest(unittest.TestCase): |
|
|
|
self.assertIn('not accepted', self.dialog.showerror.message) |
|
|
|
|
|
|
|
|
|
|
|
class ToggleLevelTest(unittest.TestCase): |
|
|
|
"Test toggle between Basic and Advanced frames." |
|
|
|
|
|
|
|
@classmethod |
|
|
|
def setUpClass(cls): |
|
|
|
requires('gui') |
|
|
|
cls.root = Tk() |
|
|
|
cls.root.withdraw() |
|
|
|
cls.dialog = gkd(cls.root, 'Title', '<<Test>>', [], _utest=True) |
|
|
|
|
|
|
|
@classmethod |
|
|
|
def tearDownClass(cls): |
|
|
|
cls.dialog.cancel() |
|
|
|
cls.root.update_idletasks() |
|
|
|
cls.root.destroy() |
|
|
|
del cls.dialog, cls.root |
|
|
|
|
|
|
|
def test_toggle_level(self): |
|
|
|
dialog = self.dialog |
|
|
|
|
|
|
|
def stackorder(): |
|
|
|
"""Get the stack order of the children of the frame. |
|
|
|
|
|
|
|
winfo_children() stores the children in stack order, so |
|
|
|
this can be used to check whether a frame is above or |
|
|
|
below another one. |
|
|
|
""" |
|
|
|
for index, child in enumerate(dialog.frame.winfo_children()): |
|
|
|
if child._name == 'keyseq_basic': |
|
|
|
basic = index |
|
|
|
if child._name == 'keyseq_advanced': |
|
|
|
advanced = index |
|
|
|
return basic, advanced |
|
|
|
|
|
|
|
# New window starts at basic level. |
|
|
|
self.assertFalse(dialog.advanced) |
|
|
|
self.assertIn('Advanced', dialog.button_level['text']) |
|
|
|
basic, advanced = stackorder() |
|
|
|
self.assertGreater(basic, advanced) |
|
|
|
|
|
|
|
# Toggle to advanced. |
|
|
|
dialog.toggle_level() |
|
|
|
self.assertTrue(dialog.advanced) |
|
|
|
self.assertIn('Basic', dialog.button_level['text']) |
|
|
|
basic, advanced = stackorder() |
|
|
|
self.assertGreater(advanced, basic) |
|
|
|
|
|
|
|
# Toggle to basic. |
|
|
|
dialog.button_level.invoke() |
|
|
|
self.assertFalse(dialog.advanced) |
|
|
|
self.assertIn('Advanced', dialog.button_level['text']) |
|
|
|
basic, advanced = stackorder() |
|
|
|
self.assertGreater(basic, advanced) |
|
|
|
|
|
|
|
|
|
|
|
class KeySelectionTest(unittest.TestCase): |
|
|
|
"Test selecting key on Basic frames." |
|
|
|
|
|
|
|
class Basic(gkd): |
|
|
|
def __init__(self, *args, **kwargs): |
|
|
|
super().__init__(*args, **kwargs) |
|
|
|
class list_keys_final: |
|
|
|
get = Func() |
|
|
|
select_clear = Func() |
|
|
|
yview = Func() |
|
|
|
self.list_keys_final = list_keys_final |
|
|
|
def set_modifiers_for_platform(self): |
|
|
|
self.modifiers = ['foo', 'bar', 'BAZ'] |
|
|
|
self.modifier_label = {'BAZ': 'ZZZ'} |
|
|
|
showerror = Mbox_func() |
|
|
|
|
|
|
|
@classmethod |
|
|
|
def setUpClass(cls): |
|
|
|
requires('gui') |
|
|
|
cls.root = Tk() |
|
|
|
cls.root.withdraw() |
|
|
|
cls.dialog = cls.Basic(cls.root, 'Title', '<<Test>>', [], _utest=True) |
|
|
|
|
|
|
|
@classmethod |
|
|
|
def tearDownClass(cls): |
|
|
|
cls.dialog.cancel() |
|
|
|
cls.root.update_idletasks() |
|
|
|
cls.root.destroy() |
|
|
|
del cls.dialog, cls.root |
|
|
|
|
|
|
|
def setUp(self): |
|
|
|
self.dialog.clear_key_seq() |
|
|
|
|
|
|
|
def test_get_modifiers(self): |
|
|
|
dialog = self.dialog |
|
|
|
gm = dialog.get_modifiers |
|
|
|
eq = self.assertEqual |
|
|
|
|
|
|
|
# Modifiers are set by selecting/deselecting the checkbutton. |
|
|
|
dialog.modifier_checkbuttons['foo'].select() |
|
|
|
eq(gm(), ['foo']) |
|
|
|
|
|
|
|
dialog.modifier_checkbuttons['BAZ'].select() |
|
|
|
eq(gm(), ['foo', 'BAZ']) |
|
|
|
|
|
|
|
dialog.modifier_checkbuttons['foo'].deselect() |
|
|
|
eq(gm(), ['BAZ']) |
|
|
|
|
|
|
|
def test_translate_key(self): |
|
|
|
dialog = self.dialog |
|
|
|
tr = dialog.translate_key |
|
|
|
eq = self.assertEqual |
|
|
|
|
|
|
|
# Letters return unchanged with no 'Shift'. |
|
|
|
eq(tr('q', []), 'Key-q') |
|
|
|
eq(tr('q', ['Control', 'Alt']), 'Key-q') |
|
|
|
|
|
|
|
# 'Shift' uppercases single lowercase letters. |
|
|
|
eq(tr('q', ['Shift']), 'Key-Q') |
|
|
|
eq(tr('q', ['Control', 'Shift']), 'Key-Q') |
|
|
|
eq(tr('q', ['Control', 'Alt', 'Shift']), 'Key-Q') |
|
|
|
|
|
|
|
# Convert key name to keysym. |
|
|
|
eq(tr('Page Up', []), 'Key-Prior') |
|
|
|
# 'Shift' doesn't change case. |
|
|
|
eq(tr('Page Down', ['Shift']), 'Key-Next') |
|
|
|
|
|
|
|
@mock.patch.object(gkd, 'get_modifiers') |
|
|
|
def test_build_key_string(self, mock_modifiers): |
|
|
|
dialog = self.dialog |
|
|
|
key = dialog.list_keys_final |
|
|
|
string = dialog.key_string.get |
|
|
|
eq = self.assertEqual |
|
|
|
|
|
|
|
key.get.result = 'a' |
|
|
|
mock_modifiers.return_value = [] |
|
|
|
dialog.build_key_string() |
|
|
|
eq(string(), '<Key-a>') |
|
|
|
|
|
|
|
mock_modifiers.return_value = ['mymod'] |
|
|
|
dialog.build_key_string() |
|
|
|
eq(string(), '<mymod-Key-a>') |
|
|
|
|
|
|
|
key.get.result = '' |
|
|
|
mock_modifiers.return_value = ['mymod', 'test'] |
|
|
|
dialog.build_key_string() |
|
|
|
eq(string(), '<mymod-test>') |
|
|
|
|
|
|
|
@mock.patch.object(gkd, 'get_modifiers') |
|
|
|
def test_final_key_selected(self, mock_modifiers): |
|
|
|
dialog = self.dialog |
|
|
|
key = dialog.list_keys_final |
|
|
|
string = dialog.key_string.get |
|
|
|
eq = self.assertEqual |
|
|
|
|
|
|
|
mock_modifiers.return_value = ['Shift'] |
|
|
|
key.get.result = '{' |
|
|
|
dialog.final_key_selected() |
|
|
|
eq(string(), '<Shift-Key-braceleft>') |
|
|
|
|
|
|
|
|
|
|
|
class CancelTest(unittest.TestCase): |
|
|
|
"Simulate user clicking [Cancel] button." |
|
|
|
|
|
|
|
@classmethod |
|
|
|
def setUpClass(cls): |
|
|
|
requires('gui') |
|
|
|
cls.root = Tk() |
|
|
|
cls.root.withdraw() |
|
|
|
cls.dialog = gkd(cls.root, 'Title', '<<Test>>', [], _utest=True) |
|
|
|
|
|
|
|
@classmethod |
|
|
|
def tearDownClass(cls): |
|
|
|
cls.dialog.cancel() |
|
|
|
cls.root.update_idletasks() |
|
|
|
cls.root.destroy() |
|
|
|
del cls.dialog, cls.root |
|
|
|
|
|
|
|
def test_cancel(self): |
|
|
|
self.assertEqual(self.dialog.winfo_class(), 'Toplevel') |
|
|
|
self.dialog.button_cancel.invoke() |
|
|
|
with self.assertRaises(TclError): |
|
|
|
self.dialog.winfo_class() |
|
|
|
self.assertEqual(self.dialog.result, '') |
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
unittest.main(verbosity=2) |