Coverage for idle_test/test_zzdummy.py: 30%

105 statements  

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

1"Test zzdummy, coverage 100%." 

2 

3from idlelib import zzdummy 

4import unittest 

5from test.support import requires 

6from tkinter import Tk, Text 

7from unittest import mock 

8from idlelib import config 

9from idlelib import editor 

10from idlelib import format 

11 

12 

13usercfg = zzdummy.idleConf.userCfg 

14testcfg = { 

15 'main': config.IdleUserConfParser(''), 

16 'highlight': config.IdleUserConfParser(''), 

17 'keys': config.IdleUserConfParser(''), 

18 'extensions': config.IdleUserConfParser(''), 

19} 

20code_sample = """\ 

21 

22class C1: 

23 # Class comment. 

24 def __init__(self, a, b): 

25 self.a = a 

26 self.b = b 

27""" 

28 

29 

30class DummyEditwin: 

31 get_selection_indices = editor.EditorWindow.get_selection_indices 

32 def __init__(self, root, text): 

33 self.root = root 

34 self.top = root 

35 self.text = text 

36 self.fregion = format.FormatRegion(self) 

37 self.text.undo_block_start = mock.Mock() 

38 self.text.undo_block_stop = mock.Mock() 

39 

40 

41class ZZDummyTest(unittest.TestCase): 

42 

43 @classmethod 

44 def setUpClass(cls): 

45 requires('gui') 

46 root = cls.root = Tk() 

47 root.withdraw() 

48 text = cls.text = Text(cls.root) 

49 cls.editor = DummyEditwin(root, text) 

50 zzdummy.idleConf.userCfg = testcfg 

51 

52 @classmethod 

53 def tearDownClass(cls): 

54 zzdummy.idleConf.userCfg = usercfg 

55 del cls.editor, cls.text 

56 cls.root.update_idletasks() 

57 for id in cls.root.tk.call('after', 'info'): 

58 cls.root.after_cancel(id) # Need for EditorWindow. 

59 cls.root.destroy() 

60 del cls.root 

61 

62 def setUp(self): 

63 text = self.text 

64 text.insert('1.0', code_sample) 

65 text.undo_block_start.reset_mock() 

66 text.undo_block_stop.reset_mock() 

67 zz = self.zz = zzdummy.ZzDummy(self.editor) 

68 zzdummy.ZzDummy.ztext = '# ignore #' 

69 

70 def tearDown(self): 

71 self.text.delete('1.0', 'end') 

72 del self.zz 

73 

74 def checklines(self, text, value): 

75 # Verify that there are lines being checked. 

76 end_line = int(float(text.index('end'))) 

77 

78 # Check each line for the starting text. 

79 actual = [] 

80 for line in range(1, end_line): 

81 txt = text.get(f'{line}.0', f'{line}.end') 

82 actual.append(txt.startswith(value)) 

83 return actual 

84 

85 def test_init(self): 

86 zz = self.zz 

87 self.assertEqual(zz.editwin, self.editor) 

88 self.assertEqual(zz.text, self.editor.text) 

89 

90 def test_reload(self): 

91 self.assertEqual(self.zz.ztext, '# ignore #') 

92 testcfg['extensions'].SetOption('ZzDummy', 'z-text', 'spam') 

93 zzdummy.ZzDummy.reload() 

94 self.assertEqual(self.zz.ztext, 'spam') 

95 

96 def test_z_in_event(self): 

97 eq = self.assertEqual 

98 zz = self.zz 

99 text = zz.text 

100 eq(self.zz.ztext, '# ignore #') 

101 

102 # No lines have the leading text. 

103 expected = [False, False, False, False, False, False, False] 

104 actual = self.checklines(text, zz.ztext) 

105 eq(expected, actual) 

106 

107 text.tag_add('sel', '2.0', '4.end') 

108 eq(zz.z_in_event(), 'break') 

109 expected = [False, True, True, True, False, False, False] 

110 actual = self.checklines(text, zz.ztext) 

111 eq(expected, actual) 

112 

113 text.undo_block_start.assert_called_once() 

114 text.undo_block_stop.assert_called_once() 

115 

116 def test_z_out_event(self): 

117 eq = self.assertEqual 

118 zz = self.zz 

119 text = zz.text 

120 eq(self.zz.ztext, '# ignore #') 

121 

122 # Prepend text. 

123 text.tag_add('sel', '2.0', '5.end') 

124 zz.z_in_event() 

125 text.undo_block_start.reset_mock() 

126 text.undo_block_stop.reset_mock() 

127 

128 # Select a few lines to remove text. 

129 text.tag_remove('sel', '1.0', 'end') 

130 text.tag_add('sel', '3.0', '4.end') 

131 eq(zz.z_out_event(), 'break') 

132 expected = [False, True, False, False, True, False, False] 

133 actual = self.checklines(text, zz.ztext) 

134 eq(expected, actual) 

135 

136 text.undo_block_start.assert_called_once() 

137 text.undo_block_stop.assert_called_once() 

138 

139 def test_roundtrip(self): 

140 # Insert and remove to all code should give back original text. 

141 zz = self.zz 

142 text = zz.text 

143 

144 text.tag_add('sel', '1.0', 'end-1c') 

145 zz.z_in_event() 

146 zz.z_out_event() 

147 

148 self.assertEqual(text.get('1.0', 'end-1c'), code_sample) 

149 

150 

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

152 unittest.main(verbosity=2)