-
-
Notifications
You must be signed in to change notification settings - Fork 32.3k
bpo-30870: IDLE: Add configdialog fontlist unittest #2666
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
terryjreedy
merged 12 commits into
python:master
from
mlouielu:bpo-30870-fontlist-unittest
Jul 14, 2017
Merged
Changes from 5 commits
Commits
Show all changes
12 commits
Select commit
Hold shift + click to select a range
ff8ab19
bpo-30870: IDLE: Add configdialog fontlist unittest
mlouielu bd1c784
Add focus_force to fontlist to prevent unittest failed
mlouielu 5f8df49
revise tests
terryjreedy 255fd75
Update test_configdialog.py
terryjreedy e676416
Update test_configdialog.py
terryjreedy 65b9c25
Fix nit coding style
mlouielu 4ed55c9
Fix misused of self in classmethod
mlouielu 331354d
Fix comment
mlouielu 961cc3d
Change comment to docstring in two test cases
mlouielu f43d396
Update test_configdialog.py
terryjreedy 6f58026
Change x and y represent
mlouielu ec67c26
Revert changes for test cases' docstring
mlouielu File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,14 +1,15 @@ | ||
"""Test idlelib.configdialog. | ||
|
||
Half the class creates dialog, half works with user customizations. | ||
Coverage: 46% just by creating dialog, 56% with current tests. | ||
Coverage: 46% just by creating dialog, 60% with current tests. | ||
""" | ||
from idlelib.configdialog import ConfigDialog, idleConf, changes | ||
from test.support import requires | ||
requires('gui') | ||
from tkinter import Tk | ||
import unittest | ||
import idlelib.config as config | ||
from idlelib.idle_test.mock_idle import Func | ||
|
||
# Tests should not depend on fortuitous user configurations. | ||
# They must not affect actual user .cfg files. | ||
|
@@ -22,7 +23,7 @@ | |
} | ||
|
||
root = None | ||
configure = None | ||
dialog = None | ||
mainpage = changes['main'] | ||
highpage = changes['highlight'] | ||
keyspage = changes['keys'] | ||
|
@@ -31,18 +32,18 @@ class TestDialog(ConfigDialog): pass # Delete? | |
|
||
|
||
def setUpModule(): | ||
global root, configure | ||
global root, dialog | ||
idleConf.userCfg = testcfg | ||
root = Tk() | ||
root.withdraw() | ||
configure = TestDialog(root, 'Test', _utest=True) | ||
# root.withdraw() # Comment out, see issue 30870 | ||
dialog = TestDialog(root, 'Test', _utest=True) | ||
|
||
|
||
def tearDownModule(): | ||
global root, configure | ||
global root, dialog | ||
idleConf.userCfg = usercfg | ||
configure.remove_var_callbacks() | ||
del configure | ||
dialog.remove_var_callbacks() | ||
del dialog | ||
root.update_idletasks() | ||
root.destroy() | ||
del root | ||
|
@@ -58,31 +59,103 @@ def test_font(self): | |
default_font = idleConf.GetFont(root, 'main', 'EditorWindow') | ||
default_size = str(default_font[1]) | ||
default_bold = default_font[2] == 'bold' | ||
configure.font_name.set('Test Font') | ||
dialog.font_name.set('Test Font') | ||
expected = {'EditorWindow': {'font': 'Test Font', | ||
'font-size': default_size, | ||
'font-bold': str(default_bold)}} | ||
self.assertEqual(mainpage, expected) | ||
changes.clear() | ||
configure.font_size.set(20) | ||
dialog.font_size.set(20) | ||
expected = {'EditorWindow': {'font': 'Test Font', | ||
'font-size': '20', | ||
'font-bold': str(default_bold)}} | ||
self.assertEqual(mainpage, expected) | ||
changes.clear() | ||
configure.font_bold.set(not default_bold) | ||
dialog.font_bold.set(not default_bold) | ||
expected = {'EditorWindow': {'font': 'Test Font', | ||
'font-size': '20', | ||
'font-bold': str(not default_bold)}} | ||
self.assertEqual(mainpage, expected) | ||
|
||
#def test_sample(self): pass # TODO | ||
def test_set_sample(self): | ||
# Set_font_sample also sets highlight_sample. | ||
pass | ||
|
||
def test_tabspace(self): | ||
configure.space_num.set(6) | ||
dialog.space_num.set(6) | ||
self.assertEqual(mainpage, {'Indent': {'num-spaces': '6'}}) | ||
|
||
|
||
class FontSelectTest(unittest.TestCase): | ||
# These two functions test that selecting a new font in the | ||
# list of fonts changes font_name and calls set_font_sample. | ||
# The fontlist widget and on_fontlist_select event handler | ||
# are tested here together. | ||
|
||
@classmethod | ||
def setUpClass(cls): | ||
if dialog.fontlist.size() < 2: | ||
self.skipTest('need at least 2 fonts') | ||
dialog.set_font_sample = Func() # mask instance method | ||
|
||
@classmethod | ||
def tearDownClass(cls): | ||
del dialog.set_font_sample # unmask instance method | ||
|
||
def setUp(self): | ||
dialog.set_font_sample.called = 0 | ||
changes.clear() | ||
|
||
def test_select_font_key(self): | ||
# Up and Down keys should select a new font. | ||
|
||
fontlist = dialog.fontlist | ||
fontlist.activate(0) | ||
font = dialog.fontlist.get('active') | ||
|
||
# Test Down key. | ||
fontlist.focus_force() | ||
fontlist.update() | ||
fontlist.event_generate('<Key-Down>') | ||
fontlist.event_generate('<KeyRelease-Down>') | ||
|
||
down_font = fontlist.get('active') | ||
self.assertNotEqual(down_font, font) | ||
self.assertIn(dialog.font_name.get(), down_font.lower()) | ||
self.assertEqual(dialog.set_font_sample.called, 1) | ||
|
||
# Test Up key. | ||
fontlist.focus_force() | ||
fontlist.update() | ||
fontlist.event_generate('<Key-Up>') | ||
fontlist.event_generate('<KeyRelease-Up>') | ||
|
||
up_font = fontlist.get('active') | ||
self.assertEqual(up_font, font) | ||
self.assertIn(dialog.font_name.get(), up_font.lower()) | ||
self.assertEqual(dialog.set_font_sample.called, 2) | ||
|
||
def test_select_font_mouse(self): | ||
# Click on item should select that item. | ||
|
||
fontlist = dialog.fontlist | ||
fontlist.activate(0) | ||
|
||
# Select next item in listbox | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Need two more space for the comment. I'll fixed this. |
||
fontlist.focus_force() | ||
fontlist.see(1) | ||
fontlist.update() | ||
x, y, dx, dy = fontlist.bbox(1) | ||
fontlist.event_generate('<Button-1>', x=x+dx//2, y=y+dy//2) | ||
fontlist.event_generate('<ButtonRelease-1>', x=x+dx//2, y=y+dy//2) | ||
|
||
font1 = fontlist.get(1) | ||
select_font = fontlist.get('anchor') | ||
self.assertEqual(select_font, font1) | ||
self.assertIn(dialog.font_name.get(), font1.lower()) | ||
self.assertEqual(dialog.set_font_sample.called, 1) | ||
|
||
|
||
class HighlightTest(unittest.TestCase): | ||
|
||
def setUp(self): | ||
|
@@ -103,19 +176,19 @@ def setUp(self): | |
changes.clear() | ||
|
||
def test_startup(self): | ||
configure.radio_startup_edit.invoke() | ||
dialog.radio_startup_edit.invoke() | ||
self.assertEqual(mainpage, | ||
{'General': {'editor-on-startup': '1'}}) | ||
|
||
def test_autosave(self): | ||
configure.radio_save_auto.invoke() | ||
dialog.radio_save_auto.invoke() | ||
self.assertEqual(mainpage, {'General': {'autosave': '1'}}) | ||
|
||
def test_editor_size(self): | ||
configure.entry_win_height.insert(0, '1') | ||
dialog.entry_win_height.insert(0, '1') | ||
self.assertEqual(mainpage, {'EditorWindow': {'height': '140'}}) | ||
changes.clear() | ||
configure.entry_win_width.insert(0, '1') | ||
dialog.entry_win_width.insert(0, '1') | ||
self.assertEqual(mainpage, {'EditorWindow': {'width': '180'}}) | ||
|
||
#def test_help_sources(self): pass # TODO | ||
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe at least some other dialogs have grab_set here already. Is this move also needed for event_generate?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I only saw it at
textview
that control withmodel
argument.grab_set
somehow will affectevent_generate
, too.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
test_textview
mock out thegrab_set
, hmm. Should we mock out, too?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since it will not be called, no need. I just read the UNM Shipman doc "Widget w grabs all events for w's application. If there was another grab in force, it goes away. See Section 54, “Events” for a discussion of grabs." Seems to be related to dialog being modal. Did not see anything in Sect.54 though. I need to make sure I know about all the calls in various inits.