[3.6] bpo-30981: IDLE -- Add more configdialog font page tests. (GH-… (#2796)

Verify that clicking the bold checkbutton and calling its command, set_samples, changes the bold setting of both samples. Simplify some names in configdialog.
(cherry picked from commit d0969d6)
(Incorporates changes and fixes from PRs 2798,  7c5798e, and 2810, 616ecf1)

* Fix broken test with PR2798 and PR2810 changes.
This commit is contained in:
Terry Jan Reedy 2017-07-22 00:56:18 -04:00 committed by GitHub
parent 64b9a15886
commit 04864b491e
3 changed files with 76 additions and 65 deletions

View file

@ -153,22 +153,29 @@ class ConfigDialog(Toplevel):
def create_page_font_tab(self):
"""Return frame of widgets for Font/Tabs tab.
Enable users to provisionally change font face, size, or
boldness and to see the consequence of proposed choices. Each
action set 3 options in changes structuree and changes the
corresponding aspect of the font sample on this page and
highlight sample on highlight page.
Enable users to change spaces entered for indent tabs.
Tk Variables:
font_name: Font face.
font_size: Font size.
font_bold: Select font bold or not.
font_name: Font face.
Note: these 3 share var_changed_font callback.
space_num: Indentation width.
Data Attribute:
edit_font: Font widget with default font name, size, and weight.
edit_font: Font with default font name, size, and weight.
Methods:
load_font_cfg: Set vars and fontlist.
on_fontlist_select: Bound to fontlist button release
or key release.
set_font_sample: Command for opt_menu_font_size and
check_font_bold.
set_samples: Notify both samples of any font change.
load_tab_cfg: Get current.
Widget Structure: (*) widgets bound to self
@ -181,7 +188,7 @@ class ConfigDialog(Toplevel):
frame_font_param: Frame
font_size_title: Label
(*)opt_menu_font_size: DynOptionMenu - font_size
check_font_bold: Checkbutton - font_bold
(*)bold_toggle: Checkbutton - font_bold
frame_font_sample: Frame
(*)font_sample: Label
frame_indent: LabelFrame
@ -190,9 +197,9 @@ class ConfigDialog(Toplevel):
(*)scale_indent_size: Scale - space_num
"""
parent = self.parent
self.font_name = StringVar(parent)
self.font_size = StringVar(parent)
self.font_bold = BooleanVar(parent)
self.font_name = StringVar(parent)
self.space_num = IntVar(parent)
self.edit_font = tkFont.Font(parent, ('courier', 10, 'normal'))
@ -218,10 +225,10 @@ class ConfigDialog(Toplevel):
self.fontlist.config(yscrollcommand=scroll_font.set)
font_size_title = Label(frame_font_param, text='Size :')
self.opt_menu_font_size = DynOptionMenu(
frame_font_param, self.font_size, None, command=self.set_font_sample)
check_font_bold = Checkbutton(
frame_font_param, self.font_size, None, command=self.set_samples)
self.bold_toggle = Checkbutton(
frame_font_param, variable=self.font_bold, onvalue=1,
offvalue=0, text='Bold', command=self.set_font_sample)
offvalue=0, text='Bold', command=self.set_samples)
frame_font_sample = Frame(frame_font, relief=SOLID, borderwidth=1)
self.font_sample = Label(
frame_font_sample, justify=LEFT, font=self.edit_font,
@ -247,7 +254,7 @@ class ConfigDialog(Toplevel):
scroll_font.pack(side=LEFT, fill=Y)
font_size_title.pack(side=LEFT, anchor=W)
self.opt_menu_font_size.pack(side=LEFT, anchor=W)
check_font_bold.pack(side=LEFT, anchor=W, padx=20)
self.bold_toggle.pack(side=LEFT, anchor=W, padx=20)
frame_font_sample.pack(side=TOP, padx=5, pady=5, expand=TRUE, fill=BOTH)
self.font_sample.pack(expand=TRUE, fill=BOTH)
# frame_indent
@ -292,7 +299,7 @@ class ConfigDialog(Toplevel):
Widget Structure: (*) widgets bound to self
frame
frame_custom: LabelFrame
(*)text_highlight_sample: Text
(*)highlight_sample: Text
(*)frame_color_set: Frame
button_set_color: Button
(*)opt_menu_highlight_target: DynOptionMenu - highlight_target
@ -342,11 +349,11 @@ class ConfigDialog(Toplevel):
frame_theme = LabelFrame(frame, borderwidth=2, relief=GROOVE,
text=' Highlighting Theme ')
#frame_custom
self.text_highlight_sample=Text(
self.highlight_sample=Text(
frame_custom, relief=SOLID, borderwidth=1,
font=('courier', 12, ''), cursor='hand2', width=21, height=11,
takefocus=FALSE, highlightthickness=0, wrap=NONE)
text=self.text_highlight_sample
text=self.highlight_sample
text.bind('<Double-Button-1>', lambda e: 'break')
text.bind('<B1-Motion>', lambda e: 'break')
text_and_tags=(
@ -416,7 +423,7 @@ class ConfigDialog(Toplevel):
#frame_custom
self.frame_color_set.pack(side=TOP, padx=5, pady=5, expand=TRUE, fill=X)
frame_fg_bg_toggle.pack(side=TOP, padx=5, pady=0)
self.text_highlight_sample.pack(
self.highlight_sample.pack(
side=TOP, padx=5, pady=5, expand=TRUE, fill=BOTH)
button_set_color.pack(side=TOP, expand=TRUE, fill=X, padx=8, pady=4)
self.opt_menu_highlight_target.pack(
@ -1142,7 +1149,7 @@ class ConfigDialog(Toplevel):
self.frame_color_set.config(bg=new_color) # Set sample.
plane ='foreground' if self.fg_bg_toggle.get() else 'background'
sample_element = self.theme_elements[self.highlight_target.get()][0]
self.text_highlight_sample.tag_config(sample_element, **{plane:new_color})
self.highlight_sample.tag_config(sample_element, **{plane:new_color})
theme = self.custom_theme.get()
theme_element = sample_element + '-' + plane
changes.add_option('highlight', theme, theme_element, new_color)
@ -1210,41 +1217,25 @@ class ConfigDialog(Toplevel):
"""Handle selecting a font from the list.
Event can result from either mouse click or Up or Down key.
Set font_name and example display to selection.
Attributes updated:
font_name: Set to name selected from fontlist.
Methods:
set_font_sample
Set font_name and example displays to selection.
"""
font = self.fontlist.get(
ACTIVE if event.type.name == 'KeyRelease' else ANCHOR)
self.font_name.set(font.lower())
self.set_font_sample()
self.set_samples()
def set_font_sample(self, event=None):
"""Update the screen samples with the font settings from the dialog.
def set_samples(self, event=None):
"""Update update both screen samples with the font settings.
Attributes accessed:
font_name
font_bold
font_size
Attributes updated:
font_sample: Set to selected font name, size, and weight.
text_highlight_sample: Set to selected font name, size, and weight.
Called from:
handler for opt_menu_font_size and check_font_bold
on_fontlist_select
load_font_cfg
Called on font initialization and change events.
Accesses font_name, font_size, and font_bold Variables.
Updates font_sample and hightlight page highlight_sample.
"""
font_name = self.font_name.get()
font_weight = tkFont.BOLD if self.font_bold.get() else tkFont.NORMAL
new_font = (font_name, self.font_size.get(), font_weight)
self.font_sample.config(font=new_font)
self.text_highlight_sample.configure(font=new_font)
self.font_sample['font'] = new_font
self.highlight_sample['font'] = new_font
def set_highlight_target(self):
"""Set fg/bg toggle and color based on highlight tag target.
@ -1289,7 +1280,7 @@ class ConfigDialog(Toplevel):
theme_elements
highlight_target
fg_bg_toggle
text_highlight_sample
highlight_sample
Attributes updated:
frame_color_set
@ -1297,7 +1288,7 @@ class ConfigDialog(Toplevel):
# Set the color sample area.
tag = self.theme_elements[self.highlight_target.get()][0]
plane = 'foreground' if self.fg_bg_toggle.get() else 'background'
color = self.text_highlight_sample.tag_cget(tag, plane)
color = self.highlight_sample.tag_cget(tag, plane)
self.frame_color_set.config(bg=color)
def paint_theme_sample(self):
@ -1310,7 +1301,7 @@ class ConfigDialog(Toplevel):
custom_theme
Attributes updated:
text_highlight_sample: Set the tag elements to the theme.
highlight_sample: Set the tag elements to the theme.
Methods:
set_color_sample
@ -1337,7 +1328,7 @@ class ConfigDialog(Toplevel):
colors['foreground'] = theme_dict[element + '-foreground']
if element + '-background' in theme_dict:
colors['background'] = theme_dict[element + '-background']
self.text_highlight_sample.tag_config(element, **colors)
self.highlight_sample.tag_config(element, **colors)
self.set_color_sample()
def help_source_selected(self, event):
@ -1424,7 +1415,7 @@ class ConfigDialog(Toplevel):
font_bold: Set to current font weight.
Methods:
set_font_sample
set_samples
"""
# Set base editor font selection list.
fonts = list(tkFont.families(self))
@ -1452,7 +1443,7 @@ class ConfigDialog(Toplevel):
# Set font weight.
self.font_bold.set(font_bold)
# Set font sample.
self.set_font_sample()
self.set_samples()
def load_tab_cfg(self):
"""Load current configuration settings for the tab options.

View file

@ -28,18 +28,12 @@ mainpage = changes['main']
highpage = changes['highlight']
keyspage = changes['keys']
class TestDialog(ConfigDialog):
pass # Delete?
def setUpModule():
global root, dialog
idleConf.userCfg = testcfg
root = Tk()
# root.withdraw() # Comment out, see issue 30870
dialog = TestDialog(root, 'Test', _utest=True)
dialog = ConfigDialog(root, 'Test', _utest=True)
def tearDownModule():
global root, dialog
@ -52,12 +46,16 @@ def tearDownModule():
class FontTabTest(unittest.TestCase):
"Test that font widget enable users to make font changes."
def setUp(self):
changes.clear()
def test_font(self):
# Set values guaranteed not to be defaults.
def test_font_set(self):
# Test that setting a font Variable results in 3 provisional
# change entries. Use values sure to not be defaults.
# Other font tests verify that user actions set Variables.
default_font = idleConf.GetFont(root, 'main', 'EditorWindow')
default_size = str(default_font[1])
default_bold = default_font[2] == 'bold'
@ -79,9 +77,30 @@ class FontTabTest(unittest.TestCase):
'font-bold': str(not default_bold)}}
self.assertEqual(mainpage, expected)
def test_set_sample(self):
# Set_font_sample also sets highlight_sample.
pass
def test_set_samples_bold_toggle(self):
# Set up.
d = dialog
d.font_sample, d.highlight_sample = {}, {} # Must undo this.
d.font_name.set('test')
d.font_size.set('5')
d.font_bold.set(1)
expected0 = {'font': ('test', '5', 'normal')}
expected1 = {'font': ('test', '5', 'bold')}
# Test set_samples.
d.set_samples()
self.assertTrue(d.font_sample == d.highlight_sample == expected1)
# Test bold_toggle.
d.bold_toggle.invoke()
self.assertFalse(d.font_bold.get())
self.assertTrue(d.font_sample == d.highlight_sample == expected0)
d.bold_toggle.invoke()
self.assertTrue(d.font_bold.get())
self.assertTrue(d.font_sample == d.highlight_sample == expected1)
# Clean up.
del d.font_sample, d.highlight_sample
def test_tabspace(self):
dialog.space_num.set(6)
@ -90,7 +109,7 @@ class FontTabTest(unittest.TestCase):
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.
# list of fonts changes font_name and calls set_samples.
# The fontlist widget and on_fontlist_select event handler
# are tested here together.
@ -98,14 +117,14 @@ class FontSelectTest(unittest.TestCase):
def setUpClass(cls):
if dialog.fontlist.size() < 2:
cls.skipTest('need at least 2 fonts')
dialog.set_font_sample = Func() # Mask instance method.
dialog.set_samples = Func() # Mask instance method.
@classmethod
def tearDownClass(cls):
del dialog.set_font_sample # Unmask instance method.
del dialog.set_samples # Unmask instance method.
def setUp(self):
dialog.set_font_sample.called = 0
dialog.set_samples.called = 0
changes.clear()
def test_select_font_key(self):
@ -124,7 +143,7 @@ class FontSelectTest(unittest.TestCase):
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)
self.assertEqual(dialog.set_samples.called, 1)
# Test Up key.
fontlist.focus_force()
@ -135,7 +154,7 @@ class FontSelectTest(unittest.TestCase):
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)
self.assertEqual(dialog.set_samples.called, 2)
def test_select_font_mouse(self):
# Click on item should select that item.
@ -157,7 +176,7 @@ class FontSelectTest(unittest.TestCase):
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)
self.assertEqual(dialog.set_samples.called, 1)
class HighlightTest(unittest.TestCase):

View file

@ -0,0 +1 @@
IDLE -- Add more configdialog font page tests.