test_help_about.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. """Test help_about, coverage 100%.
  2. help_about.build_bits branches on sys.platform='darwin'.
  3. '100% combines coverage on Mac and others.
  4. """
  5. from idlelib import help_about
  6. import unittest
  7. from test.support import requires, findfile
  8. from tkinter import Tk, TclError
  9. from idlelib.idle_test.mock_idle import Func
  10. from idlelib.idle_test.mock_tk import Mbox_func
  11. from idlelib import textview
  12. import os.path
  13. from platform import python_version
  14. About = help_about.AboutDialog
  15. class LiveDialogTest(unittest.TestCase):
  16. """Simulate user clicking buttons other than [Close].
  17. Test that invoked textview has text from source.
  18. """
  19. @classmethod
  20. def setUpClass(cls):
  21. requires('gui')
  22. cls.root = Tk()
  23. cls.root.withdraw()
  24. cls.dialog = About(cls.root, 'About IDLE', _utest=True)
  25. @classmethod
  26. def tearDownClass(cls):
  27. del cls.dialog
  28. cls.root.update_idletasks()
  29. cls.root.destroy()
  30. del cls.root
  31. def test_build_bits(self):
  32. self.assertIn(help_about.build_bits(), ('32', '64'))
  33. def test_dialog_title(self):
  34. """Test about dialog title"""
  35. self.assertEqual(self.dialog.title(), 'About IDLE')
  36. def test_dialog_logo(self):
  37. """Test about dialog logo."""
  38. path, file = os.path.split(self.dialog.icon_image['file'])
  39. fn, ext = os.path.splitext(file)
  40. self.assertEqual(fn, 'idle_48')
  41. def test_printer_buttons(self):
  42. """Test buttons whose commands use printer function."""
  43. dialog = self.dialog
  44. button_sources = [(dialog.py_license, license, 'license'),
  45. (dialog.py_copyright, copyright, 'copyright'),
  46. (dialog.py_credits, credits, 'credits')]
  47. for button, printer, name in button_sources:
  48. with self.subTest(name=name):
  49. printer._Printer__setup()
  50. button.invoke()
  51. get = dialog._current_textview.viewframe.textframe.text.get
  52. lines = printer._Printer__lines
  53. if len(lines) < 2:
  54. self.fail(name + ' full text was not found')
  55. self.assertEqual(lines[0], get('1.0', '1.end'))
  56. self.assertEqual(lines[1], get('2.0', '2.end'))
  57. dialog._current_textview.destroy()
  58. def test_file_buttons(self):
  59. """Test buttons that display files."""
  60. dialog = self.dialog
  61. button_sources = [(self.dialog.readme, 'README.txt', 'readme'),
  62. (self.dialog.idle_news, 'NEWS.txt', 'news'),
  63. (self.dialog.idle_credits, 'CREDITS.txt', 'credits')]
  64. for button, filename, name in button_sources:
  65. with self.subTest(name=name):
  66. button.invoke()
  67. fn = findfile(filename, subdir='idlelib')
  68. get = dialog._current_textview.viewframe.textframe.text.get
  69. with open(fn, encoding='utf-8') as f:
  70. self.assertEqual(f.readline().strip(), get('1.0', '1.end'))
  71. f.readline()
  72. self.assertEqual(f.readline().strip(), get('3.0', '3.end'))
  73. dialog._current_textview.destroy()
  74. class DefaultTitleTest(unittest.TestCase):
  75. "Test default title."
  76. @classmethod
  77. def setUpClass(cls):
  78. requires('gui')
  79. cls.root = Tk()
  80. cls.root.withdraw()
  81. cls.dialog = About(cls.root, _utest=True)
  82. @classmethod
  83. def tearDownClass(cls):
  84. del cls.dialog
  85. cls.root.update_idletasks()
  86. cls.root.destroy()
  87. del cls.root
  88. def test_dialog_title(self):
  89. """Test about dialog title"""
  90. self.assertEqual(self.dialog.title(),
  91. f'About IDLE {python_version()}'
  92. f' ({help_about.build_bits()} bit)')
  93. class CloseTest(unittest.TestCase):
  94. """Simulate user clicking [Close] button"""
  95. @classmethod
  96. def setUpClass(cls):
  97. requires('gui')
  98. cls.root = Tk()
  99. cls.root.withdraw()
  100. cls.dialog = About(cls.root, 'About IDLE', _utest=True)
  101. @classmethod
  102. def tearDownClass(cls):
  103. del cls.dialog
  104. cls.root.update_idletasks()
  105. cls.root.destroy()
  106. del cls.root
  107. def test_close(self):
  108. self.assertEqual(self.dialog.winfo_class(), 'Toplevel')
  109. self.dialog.button_ok.invoke()
  110. with self.assertRaises(TclError):
  111. self.dialog.winfo_class()
  112. class Dummy_about_dialog():
  113. # Dummy class for testing file display functions.
  114. idle_credits = About.show_idle_credits
  115. idle_readme = About.show_readme
  116. idle_news = About.show_idle_news
  117. # Called by the above
  118. display_file_text = About.display_file_text
  119. _utest = True
  120. class DisplayFileTest(unittest.TestCase):
  121. """Test functions that display files.
  122. While somewhat redundant with gui-based test_file_dialog,
  123. these unit tests run on all buildbots, not just a few.
  124. """
  125. dialog = Dummy_about_dialog()
  126. @classmethod
  127. def setUpClass(cls):
  128. cls.orig_error = textview.showerror
  129. cls.orig_view = textview.view_text
  130. cls.error = Mbox_func()
  131. cls.view = Func()
  132. textview.showerror = cls.error
  133. textview.view_text = cls.view
  134. @classmethod
  135. def tearDownClass(cls):
  136. textview.showerror = cls.orig_error
  137. textview.view_text = cls.orig_view
  138. def test_file_display(self):
  139. for handler in (self.dialog.idle_credits,
  140. self.dialog.idle_readme,
  141. self.dialog.idle_news):
  142. self.error.message = ''
  143. self.view.called = False
  144. with self.subTest(handler=handler):
  145. handler()
  146. self.assertEqual(self.error.message, '')
  147. self.assertEqual(self.view.called, True)
  148. if __name__ == '__main__':
  149. unittest.main(verbosity=2)