@@ -8,7 +8,7 @@
88importunittest
99fromunittestimportmock
1010fromidlelib.idle_test.mock_idleimportFunc
11-fromtkinterimportTk, StringVar, IntVar, BooleanVar, DISABLED, NORMAL
11+fromtkinterimport(Tk, StringVar, IntVar, BooleanVar, DISABLED, NORMAL)
1212fromidlelibimportconfig
1313fromidlelib.configdialogimportidleConf, changes, tracers
1414@@ -30,13 +30,15 @@
3030keyspage=changes['keys']
3131extpage=changes['extensions']
323233+3334defsetUpModule():
3435globalroot, dialog
3536idleConf.userCfg=testcfg
3637root=Tk()
3738# root.withdraw() # Comment out, see issue 30870
3839dialog=configdialog.ConfigDialog(root, 'Test', _utest=True)
394041+4042deftearDownModule():
4143globalroot, dialog
4244idleConf.userCfg=usercfg
@@ -48,22 +50,56 @@ def tearDownModule():
4850root=dialog=None
4951505251-classDialogTest(unittest.TestCase):
53+classConfigDialogTest(unittest.TestCase):
54+55+deftest_deactivate_current_config(self):
56+pass
57+58+defactivate_config_changes(self):
59+pass
[email protected](__name__+'.dialog.destroy', new_callable=Func)
54-deftest_cancel(self, destroy):
62+classButtonTest(unittest.TestCase):
63+64+deftest_click_ok(self):
65+d=dialog
66+apply=d.apply=mock.Mock()
67+destroy=d.destroy=mock.Mock()
68+d.buttons['Ok'].invoke()
69+apply.assert_called_once()
70+destroy.assert_called_once()
71+deld.destroy, d.apply
72+73+deftest_click_apply(self):
74+d=dialog
75+deactivate=d.deactivate_current_config=mock.Mock()
76+save_ext=d.save_all_changed_extensions=mock.Mock()
77+activate=d.activate_config_changes=mock.Mock()
78+d.buttons['Apply'].invoke()
79+deactivate.assert_called_once()
80+save_ext.assert_called_once()
81+activate.assert_called_once()
82+deld.save_all_changed_extensions
83+deld.activate_config_changes, d.deactivate_current_config
84+85+deftest_click_cancel(self):
86+d=dialog
87+d.destroy=Func()
5588changes['main']['something'] =1
56-dialog.cancel()
89+d.buttons['Cancel'].invoke()
5790self.assertEqual(changes['main'], {})
58-self.assertEqual(destroy.called, 1)
91+self.assertEqual(d.destroy.called, 1)
92+deld.destroy
[email protected]('idlelib.configdialog.view_text', new_callable=Func)
61-deftest_help(self, view):
94+deftest_click_help(self):
6295dialog.note.select(dialog.keyspage)
63-dialog.help()
64-s=view.kwds['contents']
65-self.assertTrue(s.startswith('When you click') and
66-s.endswith('a different name.\n'))
96+withmock.patch.object(configdialog, 'view_text',
97+new_callable=Func) asview:
98+dialog.buttons['Help'].invoke()
99+title, contents=view.kwds['title'], view.kwds['contents']
100+self.assertEqual(title, 'Help for IDLE preferences')
101+self.assertTrue(contents.startswith('When you click') and
102+contents.endswith('a different name.\n'))
671036810469105classFontPageTest(unittest.TestCase):
@@ -438,6 +474,48 @@ def click_it(start):
438474eq(d.highlight_target.get(), elem[tag])
439475eq(d.set_highlight_target.called, count)
440476477+deftest_highlight_sample_double_click(self):
478+# Test double click on highlight_sample.
479+eq=self.assertEqual
480+d=self.page
481+482+hs=d.highlight_sample
483+hs.focus_force()
484+hs.see(1.0)
485+hs.update_idletasks()
486+487+# Test binding from configdialog.
488+hs.event_generate('<Enter>', x=0, y=0)
489+hs.event_generate('<Motion>', x=0, y=0)
490+# Double click is a sequence of two clicks in a row.
491+for_inrange(2):
492+hs.event_generate('<ButtonPress-1>', x=0, y=0)
493+hs.event_generate('<ButtonRelease-1>', x=0, y=0)
494+495+eq(hs.tag_ranges('sel'), ())
496+497+deftest_highlight_sample_b1_motion(self):
498+# Test button motion on highlight_sample.
499+eq=self.assertEqual
500+d=self.page
501+502+hs=d.highlight_sample
503+hs.focus_force()
504+hs.see(1.0)
505+hs.update_idletasks()
506+507+x, y, dx, dy, offset=hs.dlineinfo('1.0')
508+509+# Test binding from configdialog.
510+hs.event_generate('<Leave>')
511+hs.event_generate('<Enter>')
512+hs.event_generate('<Motion>', x=x, y=y)
513+hs.event_generate('<ButtonPress-1>', x=x, y=y)
514+hs.event_generate('<B1-Motion>', x=dx, y=dy)
515+hs.event_generate('<ButtonRelease-1>', x=dx, y=dy)
516+517+eq(hs.tag_ranges('sel'), ())
518+441519deftest_set_theme_type(self):
442520eq=self.assertEqual
443521d=self.page
@@ -666,16 +744,21 @@ def test_delete_custom(self):
666744idleConf.userCfg['highlight'].SetOption(theme_name, 'name', 'value')
667745highpage[theme_name] = {'option': 'True'}
668746747+theme_name2='other theme'
748+idleConf.userCfg['highlight'].SetOption(theme_name2, 'name', 'value')
749+highpage[theme_name2] = {'option': 'False'}
750+669751# Force custom theme.
670-d.theme_source.set(False)
752+d.custom_theme_on.state(('!disabled',))
753+d.custom_theme_on.invoke()
671754d.custom_name.set(theme_name)
672755673756# Cancel deletion.
674757yesno.result=False
675758d.button_delete_custom.invoke()
676759eq(yesno.called, 1)
677760eq(highpage[theme_name], {'option': 'True'})
678-eq(idleConf.GetSectionList('user', 'highlight'), ['spam theme'])
761+eq(idleConf.GetSectionList('user', 'highlight'), [theme_name, theme_name2])
679762eq(dialog.deactivate_current_config.called, 0)
680763eq(dialog.activate_config_changes.called, 0)
681764eq(d.set_theme_type.called, 0)
@@ -685,13 +768,26 @@ def test_delete_custom(self):
685768d.button_delete_custom.invoke()
686769eq(yesno.called, 2)
687770self.assertNotIn(theme_name, highpage)
688-eq(idleConf.GetSectionList('user', 'highlight'), [])
689-eq(d.custom_theme_on.state(), ('disabled',))
690-eq(d.custom_name.get(), '- no custom themes -')
771+eq(idleConf.GetSectionList('user', 'highlight'), [theme_name2])
772+eq(d.custom_theme_on.state(), ())
773+eq(d.custom_name.get(), theme_name2)
691774eq(dialog.deactivate_current_config.called, 1)
692775eq(dialog.activate_config_changes.called, 1)
693776eq(d.set_theme_type.called, 1)
694777778+# Confirm deletion of second theme - empties list.
779+d.custom_name.set(theme_name2)
780+yesno.result=True
781+d.button_delete_custom.invoke()
782+eq(yesno.called, 3)
783+self.assertNotIn(theme_name, highpage)
784+eq(idleConf.GetSectionList('user', 'highlight'), [])
785+eq(d.custom_theme_on.state(), ('disabled',))
786+eq(d.custom_name.get(), '- no custom themes -')
787+eq(dialog.deactivate_current_config.called, 2)
788+eq(dialog.activate_config_changes.called, 2)
789+eq(d.set_theme_type.called, 2)
790+695791deldialog.activate_config_changes, dialog.deactivate_current_config
696792deld.askyesno
697793@@ -1059,16 +1155,21 @@ def test_delete_custom_keys(self):
10591155idleConf.userCfg['keys'].SetOption(keyset_name, 'name', 'value')
10601156keyspage[keyset_name] = {'option': 'True'}
106111571158+keyset_name2='other key set'
1159+idleConf.userCfg['keys'].SetOption(keyset_name2, 'name', 'value')
1160+keyspage[keyset_name2] = {'option': 'False'}
1161+10621162# Force custom keyset.
1063-d.keyset_source.set(False)
1163+d.custom_keyset_on.state(('!disabled',))
1164+d.custom_keyset_on.invoke()
10641165d.custom_name.set(keyset_name)
1065116610661167# Cancel deletion.
10671168yesno.result=False
10681169d.button_delete_custom_keys.invoke()
10691170eq(yesno.called, 1)
10701171eq(keyspage[keyset_name], {'option': 'True'})
1071-eq(idleConf.GetSectionList('user', 'keys'), ['spam key set'])
1172+eq(idleConf.GetSectionList('user', 'keys'), [keyset_name, keyset_name2])
10721173eq(dialog.deactivate_current_config.called, 0)
10731174eq(dialog.activate_config_changes.called, 0)
10741175eq(d.set_keys_type.called, 0)
@@ -1078,13 +1179,26 @@ def test_delete_custom_keys(self):
10781179d.button_delete_custom_keys.invoke()
10791180eq(yesno.called, 2)
10801181self.assertNotIn(keyset_name, keyspage)
1081-eq(idleConf.GetSectionList('user', 'keys'), [])
1082-eq(d.custom_keyset_on.state(), ('disabled',))
1083-eq(d.custom_name.get(), '- no custom keys -')
1182+eq(idleConf.GetSectionList('user', 'keys'), [keyset_name2])
1183+eq(d.custom_keyset_on.state(), ())
1184+eq(d.custom_name.get(), keyset_name2)
10841185eq(dialog.deactivate_current_config.called, 1)
10851186eq(dialog.activate_config_changes.called, 1)
10861187eq(d.set_keys_type.called, 1)
108711881189+# Confirm deletion of second keyset - empties list.
1190+d.custom_name.set(keyset_name2)
1191+yesno.result=True
1192+d.button_delete_custom_keys.invoke()
1193+eq(yesno.called, 3)
1194+self.assertNotIn(keyset_name, keyspage)
1195+eq(idleConf.GetSectionList('user', 'keys'), [])
1196+eq(d.custom_keyset_on.state(), ('disabled',))
1197+eq(d.custom_name.get(), '- no custom keys -')
1198+eq(dialog.deactivate_current_config.called, 2)
1199+eq(dialog.activate_config_changes.called, 2)
1200+eq(d.set_keys_type.called, 2)
1201+10881202deldialog.activate_config_changes, dialog.deactivate_current_config
10891203deld.askyesno
10901204