| """Test help_about, coverage 100%. |
| help_about.build_bits branches on sys.platform='darwin'. |
| '100% combines coverage on Mac and others. |
| """ |
| |
| from idlelib import help_about |
| import unittest |
| from test.support import requires, findfile |
| from tkinter import Tk, TclError |
| from idlelib.idle_test.mock_idle import Func |
| from idlelib.idle_test.mock_tk import Mbox_func |
| from idlelib import textview |
| import os.path |
| from platform import python_version |
| |
| About = help_about.AboutDialog |
| |
| |
| class LiveDialogTest(unittest.TestCase): |
| """Simulate user clicking buttons other than [Close]. |
| |
| Test that invoked textview has text from source. |
| """ |
| @classmethod |
| def setUpClass(cls): |
| requires('gui') |
| cls.root = Tk() |
| cls.root.withdraw() |
| cls.dialog = About(cls.root, 'About IDLE', _utest=True) |
| |
| @classmethod |
| def tearDownClass(cls): |
| del cls.dialog |
| cls.root.update_idletasks() |
| cls.root.destroy() |
| del cls.root |
| |
| def test_build_bits(self): |
| self.assertIn(help_about.build_bits(), ('32', '64')) |
| |
| def test_dialog_title(self): |
| """Test about dialog title""" |
| self.assertEqual(self.dialog.title(), 'About IDLE') |
| |
| def test_dialog_logo(self): |
| """Test about dialog logo.""" |
| path, file = os.path.split(self.dialog.icon_image['file']) |
| fn, ext = os.path.splitext(file) |
| self.assertEqual(fn, 'idle_48') |
| |
| def test_printer_buttons(self): |
| """Test buttons whose commands use printer function.""" |
| dialog = self.dialog |
| button_sources = [(dialog.py_license, license, 'license'), |
| (dialog.py_copyright, copyright, 'copyright'), |
| (dialog.py_credits, credits, 'credits')] |
| |
| for button, printer, name in button_sources: |
| with self.subTest(name=name): |
| printer._Printer__setup() |
| button.invoke() |
| get = dialog._current_textview.viewframe.textframe.text.get |
| lines = printer._Printer__lines |
| self.assertEqual(lines[0], get('1.0', '1.end')) |
| self.assertEqual(lines[1], get('2.0', '2.end')) |
| dialog._current_textview.destroy() |
| |
| def test_file_buttons(self): |
| """Test buttons that display files.""" |
| dialog = self.dialog |
| button_sources = [(self.dialog.readme, 'README.txt', 'readme'), |
| (self.dialog.idle_news, 'NEWS.txt', 'news'), |
| (self.dialog.idle_credits, 'CREDITS.txt', 'credits')] |
| |
| for button, filename, name in button_sources: |
| with self.subTest(name=name): |
| button.invoke() |
| fn = findfile(filename, subdir='idlelib') |
| get = dialog._current_textview.viewframe.textframe.text.get |
| with open(fn, encoding='utf-8') as f: |
| self.assertEqual(f.readline().strip(), get('1.0', '1.end')) |
| f.readline() |
| self.assertEqual(f.readline().strip(), get('3.0', '3.end')) |
| dialog._current_textview.destroy() |
| |
| |
| class DefaultTitleTest(unittest.TestCase): |
| "Test default title." |
| |
| @classmethod |
| def setUpClass(cls): |
| requires('gui') |
| cls.root = Tk() |
| cls.root.withdraw() |
| cls.dialog = About(cls.root, _utest=True) |
| |
| @classmethod |
| def tearDownClass(cls): |
| del cls.dialog |
| cls.root.update_idletasks() |
| cls.root.destroy() |
| del cls.root |
| |
| def test_dialog_title(self): |
| """Test about dialog title""" |
| self.assertEqual(self.dialog.title(), |
| f'About IDLE {python_version()}' |
| f' ({help_about.build_bits()} bit)') |
| |
| |
| class CloseTest(unittest.TestCase): |
| """Simulate user clicking [Close] button""" |
| |
| @classmethod |
| def setUpClass(cls): |
| requires('gui') |
| cls.root = Tk() |
| cls.root.withdraw() |
| cls.dialog = About(cls.root, 'About IDLE', _utest=True) |
| |
| @classmethod |
| def tearDownClass(cls): |
| del cls.dialog |
| cls.root.update_idletasks() |
| cls.root.destroy() |
| del cls.root |
| |
| def test_close(self): |
| self.assertEqual(self.dialog.winfo_class(), 'Toplevel') |
| self.dialog.button_ok.invoke() |
| with self.assertRaises(TclError): |
| self.dialog.winfo_class() |
| |
| |
| class Dummy_about_dialog(): |
| # Dummy class for testing file display functions. |
| idle_credits = About.show_idle_credits |
| idle_readme = About.show_readme |
| idle_news = About.show_idle_news |
| # Called by the above |
| display_file_text = About.display_file_text |
| _utest = True |
| |
| |
| class DisplayFileTest(unittest.TestCase): |
| """Test functions that display files. |
| |
| While somewhat redundant with gui-based test_file_dialog, |
| these unit tests run on all buildbots, not just a few. |
| """ |
| dialog = Dummy_about_dialog() |
| |
| @classmethod |
| def setUpClass(cls): |
| cls.orig_error = textview.showerror |
| cls.orig_view = textview.view_text |
| cls.error = Mbox_func() |
| cls.view = Func() |
| textview.showerror = cls.error |
| textview.view_text = cls.view |
| |
| @classmethod |
| def tearDownClass(cls): |
| textview.showerror = cls.orig_error |
| textview.view_text = cls.orig_view |
| |
| def test_file_display(self): |
| for handler in (self.dialog.idle_credits, |
| self.dialog.idle_readme, |
| self.dialog.idle_news): |
| self.error.message = '' |
| self.view.called = False |
| with self.subTest(handler=handler): |
| handler() |
| self.assertEqual(self.error.message, '') |
| self.assertEqual(self.view.called, True) |
| |
| |
| if __name__ == '__main__': |
| unittest.main(verbosity=2) |