Coverage for idle_test/test_help_about.py: 54%

121 statements  

« prev     ^ index     » next       coverage.py v7.2.5, created at 2023-05-11 13:22 -0700

1"""Test help_about, coverage 100%. 

2help_about.build_bits branches on sys.platform='darwin'. 

3'100% combines coverage on Mac and others. 

4""" 

5 

6from idlelib import help_about 

7import unittest 

8from test.support import requires, findfile 

9from tkinter import Tk, TclError 

10from idlelib.idle_test.mock_idle import Func 

11from idlelib.idle_test.mock_tk import Mbox_func 

12from idlelib import textview 

13import os.path 

14from platform import python_version 

15 

16About = help_about.AboutDialog 

17 

18 

19class LiveDialogTest(unittest.TestCase): 

20 """Simulate user clicking buttons other than [Close]. 

21 

22 Test that invoked textview has text from source. 

23 """ 

24 @classmethod 

25 def setUpClass(cls): 

26 requires('gui') 

27 cls.root = Tk() 

28 cls.root.withdraw() 

29 cls.dialog = About(cls.root, 'About IDLE', _utest=True) 

30 

31 @classmethod 

32 def tearDownClass(cls): 

33 del cls.dialog 

34 cls.root.update_idletasks() 

35 cls.root.destroy() 

36 del cls.root 

37 

38 def test_build_bits(self): 

39 self.assertIn(help_about.build_bits(), ('32', '64')) 

40 

41 def test_dialog_title(self): 

42 """Test about dialog title""" 

43 self.assertEqual(self.dialog.title(), 'About IDLE') 

44 

45 def test_dialog_logo(self): 

46 """Test about dialog logo.""" 

47 path, file = os.path.split(self.dialog.icon_image['file']) 

48 fn, ext = os.path.splitext(file) 

49 self.assertEqual(fn, 'idle_48') 

50 

51 def test_printer_buttons(self): 

52 """Test buttons whose commands use printer function.""" 

53 dialog = self.dialog 

54 button_sources = [(dialog.py_license, license, 'license'), 

55 (dialog.py_copyright, copyright, 'copyright'), 

56 (dialog.py_credits, credits, 'credits')] 

57 

58 for button, printer, name in button_sources: 

59 with self.subTest(name=name): 

60 printer._Printer__setup() 

61 button.invoke() 

62 get = dialog._current_textview.viewframe.textframe.text.get 

63 lines = printer._Printer__lines 

64 if len(lines) < 2: 

65 self.fail(name + ' full text was not found') 

66 self.assertEqual(lines[0], get('1.0', '1.end')) 

67 self.assertEqual(lines[1], get('2.0', '2.end')) 

68 dialog._current_textview.destroy() 

69 

70 def test_file_buttons(self): 

71 """Test buttons that display files.""" 

72 dialog = self.dialog 

73 button_sources = [(self.dialog.readme, 'README.txt', 'readme'), 

74 (self.dialog.idle_news, 'NEWS.txt', 'news'), 

75 (self.dialog.idle_credits, 'CREDITS.txt', 'credits')] 

76 

77 for button, filename, name in button_sources: 

78 with self.subTest(name=name): 

79 button.invoke() 

80 fn = findfile(filename, subdir='idlelib') 

81 get = dialog._current_textview.viewframe.textframe.text.get 

82 with open(fn, encoding='utf-8') as f: 

83 self.assertEqual(f.readline().strip(), get('1.0', '1.end')) 

84 f.readline() 

85 self.assertEqual(f.readline().strip(), get('3.0', '3.end')) 

86 dialog._current_textview.destroy() 

87 

88 

89class DefaultTitleTest(unittest.TestCase): 

90 "Test default title." 

91 

92 @classmethod 

93 def setUpClass(cls): 

94 requires('gui') 

95 cls.root = Tk() 

96 cls.root.withdraw() 

97 cls.dialog = About(cls.root, _utest=True) 

98 

99 @classmethod 

100 def tearDownClass(cls): 

101 del cls.dialog 

102 cls.root.update_idletasks() 

103 cls.root.destroy() 

104 del cls.root 

105 

106 def test_dialog_title(self): 

107 """Test about dialog title""" 

108 self.assertEqual(self.dialog.title(), 

109 f'About IDLE {python_version()}' 

110 f' ({help_about.build_bits()} bit)') 

111 

112 

113class CloseTest(unittest.TestCase): 

114 """Simulate user clicking [Close] button""" 

115 

116 @classmethod 

117 def setUpClass(cls): 

118 requires('gui') 

119 cls.root = Tk() 

120 cls.root.withdraw() 

121 cls.dialog = About(cls.root, 'About IDLE', _utest=True) 

122 

123 @classmethod 

124 def tearDownClass(cls): 

125 del cls.dialog 

126 cls.root.update_idletasks() 

127 cls.root.destroy() 

128 del cls.root 

129 

130 def test_close(self): 

131 self.assertEqual(self.dialog.winfo_class(), 'Toplevel') 

132 self.dialog.button_ok.invoke() 

133 with self.assertRaises(TclError): 

134 self.dialog.winfo_class() 

135 

136 

137class Dummy_about_dialog: 

138 # Dummy class for testing file display functions. 

139 idle_credits = About.show_idle_credits 

140 idle_readme = About.show_readme 

141 idle_news = About.show_idle_news 

142 # Called by the above 

143 display_file_text = About.display_file_text 

144 _utest = True 

145 

146 

147class DisplayFileTest(unittest.TestCase): 

148 """Test functions that display files. 

149 

150 While somewhat redundant with gui-based test_file_dialog, 

151 these unit tests run on all buildbots, not just a few. 

152 """ 

153 dialog = Dummy_about_dialog() 

154 

155 @classmethod 

156 def setUpClass(cls): 

157 cls.orig_error = textview.showerror 

158 cls.orig_view = textview.view_text 

159 cls.error = Mbox_func() 

160 cls.view = Func() 

161 textview.showerror = cls.error 

162 textview.view_text = cls.view 

163 

164 @classmethod 

165 def tearDownClass(cls): 

166 textview.showerror = cls.orig_error 

167 textview.view_text = cls.orig_view 

168 

169 def test_file_display(self): 

170 for handler in (self.dialog.idle_credits, 1b

171 self.dialog.idle_readme, 

172 self.dialog.idle_news): 

173 self.error.message = '' 1b

174 self.view.called = False 1b

175 with self.subTest(handler=handler): 1b

176 handler() 1b

177 self.assertEqual(self.error.message, '') 1b

178 self.assertEqual(self.view.called, True) 1b

179 

180 

181if __name__ == '__main__': 181 ↛ 182line 181 didn't jump to line 182, because the condition on line 181 was never true

182 unittest.main(verbosity=2)