1 "Test pyshell, coverage 12%."
2 # Plus coverage of test_warning. Was 20% with test_openshell.
3
4 from idlelib import pyshell
5 import unittest
6 from test.support import requires
7 from tkinter import Tk
8
9
10 class ESC[4;38;5;81mFunctionTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
11 # Test stand-alone module level non-gui functions.
12
13 def test_restart_line_wide(self):
14 eq = self.assertEqual
15 for file, mul, extra in (('', 22, ''), ('finame', 21, '=')):
16 width = 60
17 bar = mul * '='
18 with self.subTest(file=file, bar=bar):
19 file = file or 'Shell'
20 line = pyshell.restart_line(width, file)
21 eq(len(line), width)
22 eq(line, f"{bar+extra} RESTART: {file} {bar}")
23
24 def test_restart_line_narrow(self):
25 expect, taglen = "= RESTART: Shell", 16
26 for width in (taglen-1, taglen, taglen+1):
27 with self.subTest(width=width):
28 self.assertEqual(pyshell.restart_line(width, ''), expect)
29 self.assertEqual(pyshell.restart_line(taglen+2, ''), expect+' =')
30
31
32 class ESC[4;38;5;81mPyShellFileListTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
33
34 @classmethod
35 def setUpClass(cls):
36 requires('gui')
37 cls.root = Tk()
38 cls.root.withdraw()
39
40 @classmethod
41 def tearDownClass(cls):
42 #cls.root.update_idletasks()
43 ## for id in cls.root.tk.call('after', 'info'):
44 ## cls.root.after_cancel(id) # Need for EditorWindow.
45 cls.root.destroy()
46 del cls.root
47
48 def test_init(self):
49 psfl = pyshell.PyShellFileList(self.root)
50 self.assertEqual(psfl.EditorWindow, pyshell.PyShellEditorWindow)
51 self.assertIsNone(psfl.pyshell)
52
53 # The following sometimes causes 'invalid command name "109734456recolorize"'.
54 # Uncommenting after_cancel above prevents this, but results in
55 # TclError: bad window path name ".!listedtoplevel.!frame.text"
56 # which is normally prevented by after_cancel.
57 ## def test_openshell(self):
58 ## pyshell.use_subprocess = False
59 ## ps = pyshell.PyShellFileList(self.root).open_shell()
60 ## self.assertIsInstance(ps, pyshell.PyShell)
61
62
63 class ESC[4;38;5;81mPyShellRemoveLastNewlineAndSurroundingWhitespaceTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
64 regexp = pyshell.PyShell._last_newline_re
65
66 def all_removed(self, text):
67 self.assertEqual('', self.regexp.sub('', text))
68
69 def none_removed(self, text):
70 self.assertEqual(text, self.regexp.sub('', text))
71
72 def check_result(self, text, expected):
73 self.assertEqual(expected, self.regexp.sub('', text))
74
75 def test_empty(self):
76 self.all_removed('')
77
78 def test_newline(self):
79 self.all_removed('\n')
80
81 def test_whitespace_no_newline(self):
82 self.all_removed(' ')
83 self.all_removed(' ')
84 self.all_removed(' ')
85 self.all_removed(' ' * 20)
86 self.all_removed('\t')
87 self.all_removed('\t\t')
88 self.all_removed('\t\t\t')
89 self.all_removed('\t' * 20)
90 self.all_removed('\t ')
91 self.all_removed(' \t')
92 self.all_removed(' \t \t ')
93 self.all_removed('\t \t \t')
94
95 def test_newline_with_whitespace(self):
96 self.all_removed(' \n')
97 self.all_removed('\t\n')
98 self.all_removed(' \t\n')
99 self.all_removed('\t \n')
100 self.all_removed('\n ')
101 self.all_removed('\n\t')
102 self.all_removed('\n \t')
103 self.all_removed('\n\t ')
104 self.all_removed(' \n ')
105 self.all_removed('\t\n ')
106 self.all_removed(' \n\t')
107 self.all_removed('\t\n\t')
108 self.all_removed('\t \t \t\n')
109 self.all_removed(' \t \t \n')
110 self.all_removed('\n\t \t \t')
111 self.all_removed('\n \t \t ')
112
113 def test_multiple_newlines(self):
114 self.check_result('\n\n', '\n')
115 self.check_result('\n' * 5, '\n' * 4)
116 self.check_result('\n' * 5 + '\t', '\n' * 4)
117 self.check_result('\n' * 20, '\n' * 19)
118 self.check_result('\n' * 20 + ' ', '\n' * 19)
119 self.check_result(' \n \n ', ' \n')
120 self.check_result(' \n\n ', ' \n')
121 self.check_result(' \n\n', ' \n')
122 self.check_result('\t\n\n', '\t\n')
123 self.check_result('\n\n ', '\n')
124 self.check_result('\n\n\t', '\n')
125 self.check_result(' \n \n ', ' \n')
126 self.check_result('\t\n\t\n\t', '\t\n')
127
128 def test_non_whitespace(self):
129 self.none_removed('a')
130 self.check_result('a\n', 'a')
131 self.check_result('a\n ', 'a')
132 self.check_result('a \n ', 'a')
133 self.check_result('a \n\t', 'a')
134 self.none_removed('-')
135 self.check_result('-\n', '-')
136 self.none_removed('.')
137 self.check_result('.\n', '.')
138
139 def test_unsupported_whitespace(self):
140 self.none_removed('\v')
141 self.none_removed('\n\v')
142 self.check_result('\v\n', '\v')
143 self.none_removed(' \n\v')
144 self.check_result('\v\n ', '\v')
145
146
147 if __name__ == '__main__':
148 unittest.main(verbosity=2)