Skip to content

bpo-30981: IDLE -- Add more configdialog font page tests. #2794

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
merged 14 commits into from
Jul 21, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 28 additions & 45 deletions Lib/idlelib/configdialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,9 +154,9 @@ def create_page_font_tab(self):
"""Return frame of widgets for Font/Tabs tab.

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.

Expand All @@ -167,8 +167,7 @@ def create_page_font_tab(self):
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
Expand All @@ -181,7 +180,7 @@ def create_page_font_tab(self):
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
Expand All @@ -190,9 +189,9 @@ def create_page_font_tab(self):
(*)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'))

Expand All @@ -218,10 +217,10 @@ def create_page_font_tab(self):
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)
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,
Expand All @@ -247,7 +246,7 @@ def create_page_font_tab(self):
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)
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
Expand Down Expand Up @@ -292,7 +291,7 @@ def create_page_highlight(self):
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
Expand Down Expand Up @@ -342,11 +341,11 @@ def create_page_highlight(self):
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=(
Expand Down Expand Up @@ -416,7 +415,7 @@ def tem(event, elem=element):
#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(
Expand Down Expand Up @@ -1142,7 +1141,7 @@ def on_new_color_set(self):
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)
Expand Down Expand Up @@ -1210,41 +1209,25 @@ def on_fontlist_select(self, event):
"""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()

def set_font_sample(self, event=None):
"""Update the screen samples with the font settings from the dialog.
self.set_samples()

Attributes accessed:
font_name
font_bold
font_size
def set_samples(self, event=None):
"""Update update both screen samples with the font settings.

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.
Expand Down Expand Up @@ -1289,15 +1272,15 @@ def set_color_sample(self):
theme_elements
highlight_target
fg_bg_toggle
text_highlight_sample
highlight_sample

Attributes updated:
frame_color_set
"""
# 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):
Expand All @@ -1310,7 +1293,7 @@ def paint_theme_sample(self):
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
Expand All @@ -1337,7 +1320,7 @@ def paint_theme_sample(self):
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):
Expand Down Expand Up @@ -1424,7 +1407,7 @@ def load_font_cfg(self):
font_bold: Set to current font weight.

Methods:
set_font_sample
set_samples
"""
# Set base editor font selection list.
fonts = list(tkFont.families(self))
Expand Down Expand Up @@ -1452,7 +1435,7 @@ def load_font_cfg(self):
# 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.
Expand Down
43 changes: 25 additions & 18 deletions Lib/idlelib/idle_test/test_configdialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,12 @@
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
Expand All @@ -56,7 +50,7 @@ class FontTabTest(unittest.TestCase):
def setUp(self):
changes.clear()

def test_font(self):
def test_font_set(self):
# Set values guaranteed not to be defaults.
default_font = idleConf.GetFont(root, 'main', 'EditorWindow')
default_size = str(default_font[1])
Expand All @@ -79,9 +73,22 @@ def test_font(self):
'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_bold_toggle(self):
d = dialog
d.set_samples = Func()
d.bold_toggle.toggle()
self.assertEqual(d.set_samples.called, 1)

def test_set_samples(self):
d = dialog
d.font_sample, d.highlight_sample = {}, {}
d.font_name.set('test')
d.font_size.set('5')
d.font_bold.set(1)
d.set_samples()
expected = {'font': ('test', '5', 'bold')}
self.assertTrue(d.font_sample == d.highlight_sample == expected)
del d.font_sample, d.highlight_sample

def test_tabspace(self):
dialog.space_num.set(6)
Expand All @@ -90,22 +97,22 @@ def test_tabspace(self):

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.

@classmethod
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):
Expand All @@ -124,7 +131,7 @@ def test_select_font_key(self):
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()
Expand All @@ -135,7 +142,7 @@ def test_select_font_key(self):
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.
Expand All @@ -157,7 +164,7 @@ def test_select_font_mouse(self):
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):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
IDLE -- Add more configdialog font page tests.