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

Terry Jan Reedy webhook-mailer at python.org
Sat Jul 22 00:56:21 EDT 2017


https://github.com/python/cpython/commit/04864b491e3ce0f022e918ad344fb53a99ce2a1b
commit: 04864b491e3ce0f022e918ad344fb53a99ce2a1b
branch: 3.6
author: Terry Jan Reedy <tjreedy at udel.edu>
committer: GitHub <noreply at github.com>
date: 2017-07-22T00:56:18-04:00
summary:

[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.

files:
A Misc/NEWS.d/next/IDLE/2017-07-21-01-55-14.bpo-30981.ZFvQPt.rst
M Lib/idlelib/configdialog.py
M Lib/idlelib/idle_test/test_configdialog.py

diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py
index e1c3923caed..c1db76817c1 100644
--- a/Lib/idlelib/configdialog.py
+++ b/Lib/idlelib/configdialog.py
@@ -153,22 +153,29 @@ def create_action_buttons(self):
     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 @@ 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
@@ -190,9 +197,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'))
 
@@ -218,10 +225,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)
+        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 @@ 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)
+        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 @@ 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
@@ -342,11 +349,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=(
@@ -416,7 +423,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(
@@ -1142,7 +1149,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)
@@ -1210,41 +1217,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.
-
-        Attributes accessed:
-            font_name
-            font_bold
-            font_size
+        self.set_samples()
 
-        Attributes updated:
-            font_sample: Set to selected font name, size, and weight.
-            text_highlight_sample: Set to selected font name, size, and weight.
+    def set_samples(self, event=None):
+        """Update update both screen samples with the font settings.
 
-        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 @@ def set_color_sample(self):
             theme_elements
             highlight_target
             fg_bg_toggle
-            text_highlight_sample
+            highlight_sample
 
         Attributes updated:
             frame_color_set
@@ -1297,7 +1288,7 @@ def set_color_sample(self):
         # 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 @@ 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
@@ -1337,7 +1328,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):
@@ -1424,7 +1415,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))
@@ -1452,7 +1443,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.
diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py
index 4f1f9af180a..171fa3d309c 100644
--- a/Lib/idlelib/idle_test/test_configdialog.py
+++ b/Lib/idlelib/idle_test/test_configdialog.py
@@ -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
@@ -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 @@ 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_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 @@ 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.
 
@@ -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 @@ 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()
@@ -135,7 +154,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.
@@ -157,7 +176,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):
diff --git a/Misc/NEWS.d/next/IDLE/2017-07-21-01-55-14.bpo-30981.ZFvQPt.rst b/Misc/NEWS.d/next/IDLE/2017-07-21-01-55-14.bpo-30981.ZFvQPt.rst
new file mode 100644
index 00000000000..48d477ed2e1
--- /dev/null
+++ b/Misc/NEWS.d/next/IDLE/2017-07-21-01-55-14.bpo-30981.ZFvQPt.rst
@@ -0,0 +1 @@
+IDLE -- Add more configdialog font page tests.



More information about the Python-checkins mailing list