1 ''' Test mock_tk.Text class against tkinter.Text class
2
3 Run same tests with both by creating a mixin class.
4 '''
5 import unittest
6 from test.support import requires
7 from _tkinter import TclError
8
9 class ESC[4;38;5;81mTextTest:
10 "Define items common to both sets of tests."
11
12 hw = 'hello\nworld' # Several tests insert this after initialization.
13 hwn = hw+'\n' # \n present at initialization, before insert
14
15 # setUpClass defines cls.Text and maybe cls.root.
16 # setUp defines self.text from Text and maybe root.
17
18 def test_init(self):
19 self.assertEqual(self.text.get('1.0'), '\n')
20 self.assertEqual(self.text.get('end'), '')
21
22 def test_index_empty(self):
23 index = self.text.index
24
25 for dex in (-1.0, 0.3, '1.-1', '1.0', '1.0 lineend', '1.end', '1.33',
26 'insert'):
27 self.assertEqual(index(dex), '1.0')
28
29 for dex in 'end', 2.0, '2.1', '33.44':
30 self.assertEqual(index(dex), '2.0')
31
32 def test_index_data(self):
33 index = self.text.index
34 self.text.insert('1.0', self.hw)
35
36 for dex in -1.0, 0.3, '1.-1', '1.0':
37 self.assertEqual(index(dex), '1.0')
38
39 for dex in '1.0 lineend', '1.end', '1.33':
40 self.assertEqual(index(dex), '1.5')
41
42 for dex in 'end', '33.44':
43 self.assertEqual(index(dex), '3.0')
44
45 def test_get(self):
46 get = self.text.get
47 Equal = self.assertEqual
48 self.text.insert('1.0', self.hw)
49
50 Equal(get('end'), '')
51 Equal(get('end', 'end'), '')
52 Equal(get('1.0'), 'h')
53 Equal(get('1.0', '1.1'), 'h')
54 Equal(get('1.0', '1.3'), 'hel')
55 Equal(get('1.1', '1.3'), 'el')
56 Equal(get('1.0', '1.0 lineend'), 'hello')
57 Equal(get('1.0', '1.10'), 'hello')
58 Equal(get('1.0 lineend'), '\n')
59 Equal(get('1.1', '2.3'), 'ello\nwor')
60 Equal(get('1.0', '2.5'), self.hw)
61 Equal(get('1.0', 'end'), self.hwn)
62 Equal(get('0.0', '5.0'), self.hwn)
63
64 def test_insert(self):
65 insert = self.text.insert
66 get = self.text.get
67 Equal = self.assertEqual
68
69 insert('1.0', self.hw)
70 Equal(get('1.0', 'end'), self.hwn)
71
72 insert('1.0', '') # nothing
73 Equal(get('1.0', 'end'), self.hwn)
74
75 insert('1.0', '*')
76 Equal(get('1.0', 'end'), '*hello\nworld\n')
77
78 insert('1.0 lineend', '*')
79 Equal(get('1.0', 'end'), '*hello*\nworld\n')
80
81 insert('2.3', '*')
82 Equal(get('1.0', 'end'), '*hello*\nwor*ld\n')
83
84 insert('end', 'x')
85 Equal(get('1.0', 'end'), '*hello*\nwor*ldx\n')
86
87 insert('1.4', 'x\n')
88 Equal(get('1.0', 'end'), '*helx\nlo*\nwor*ldx\n')
89
90 def test_no_delete(self):
91 # if index1 == 'insert' or 'end' or >= end, there is no deletion
92 delete = self.text.delete
93 get = self.text.get
94 Equal = self.assertEqual
95 self.text.insert('1.0', self.hw)
96
97 delete('insert')
98 Equal(get('1.0', 'end'), self.hwn)
99
100 delete('end')
101 Equal(get('1.0', 'end'), self.hwn)
102
103 delete('insert', 'end')
104 Equal(get('1.0', 'end'), self.hwn)
105
106 delete('insert', '5.5')
107 Equal(get('1.0', 'end'), self.hwn)
108
109 delete('1.4', '1.0')
110 Equal(get('1.0', 'end'), self.hwn)
111
112 delete('1.4', '1.4')
113 Equal(get('1.0', 'end'), self.hwn)
114
115 def test_delete_char(self):
116 delete = self.text.delete
117 get = self.text.get
118 Equal = self.assertEqual
119 self.text.insert('1.0', self.hw)
120
121 delete('1.0')
122 Equal(get('1.0', '1.end'), 'ello')
123
124 delete('1.0', '1.1')
125 Equal(get('1.0', '1.end'), 'llo')
126
127 # delete \n and combine 2 lines into 1
128 delete('1.end')
129 Equal(get('1.0', '1.end'), 'lloworld')
130
131 self.text.insert('1.3', '\n')
132 delete('1.10')
133 Equal(get('1.0', '1.end'), 'lloworld')
134
135 self.text.insert('1.3', '\n')
136 delete('1.3', '2.0')
137 Equal(get('1.0', '1.end'), 'lloworld')
138
139 def test_delete_slice(self):
140 delete = self.text.delete
141 get = self.text.get
142 Equal = self.assertEqual
143 self.text.insert('1.0', self.hw)
144
145 delete('1.0', '1.0 lineend')
146 Equal(get('1.0', 'end'), '\nworld\n')
147
148 delete('1.0', 'end')
149 Equal(get('1.0', 'end'), '\n')
150
151 self.text.insert('1.0', self.hw)
152 delete('1.0', '2.0')
153 Equal(get('1.0', 'end'), 'world\n')
154
155 delete('1.0', 'end')
156 Equal(get('1.0', 'end'), '\n')
157
158 self.text.insert('1.0', self.hw)
159 delete('1.2', '2.3')
160 Equal(get('1.0', 'end'), 'held\n')
161
162 def test_multiple_lines(self): # insert and delete
163 self.text.insert('1.0', 'hello')
164
165 self.text.insert('1.3', '1\n2\n3\n4\n5')
166 self.assertEqual(self.text.get('1.0', 'end'), 'hel1\n2\n3\n4\n5lo\n')
167
168 self.text.delete('1.3', '5.1')
169 self.assertEqual(self.text.get('1.0', 'end'), 'hello\n')
170
171 def test_compare(self):
172 compare = self.text.compare
173 Equal = self.assertEqual
174 # need data so indexes not squished to 1,0
175 self.text.insert('1.0', 'First\nSecond\nThird\n')
176
177 self.assertRaises(TclError, compare, '2.2', 'op', '2.2')
178
179 for op, less1, less0, equal, greater0, greater1 in (
180 ('<', True, True, False, False, False),
181 ('<=', True, True, True, False, False),
182 ('>', False, False, False, True, True),
183 ('>=', False, False, True, True, True),
184 ('==', False, False, True, False, False),
185 ('!=', True, True, False, True, True),
186 ):
187 Equal(compare('1.1', op, '2.2'), less1, op)
188 Equal(compare('2.1', op, '2.2'), less0, op)
189 Equal(compare('2.2', op, '2.2'), equal, op)
190 Equal(compare('2.3', op, '2.2'), greater0, op)
191 Equal(compare('3.3', op, '2.2'), greater1, op)
192
193
194 class ESC[4;38;5;81mMockTextTest(ESC[4;38;5;149mTextTest, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
195
196 @classmethod
197 def setUpClass(cls):
198 from idlelib.idle_test.mock_tk import Text
199 cls.Text = Text
200
201 def setUp(self):
202 self.text = self.Text()
203
204
205 def test_decode(self):
206 # test endflags (-1, 0) not tested by test_index (which uses +1)
207 decode = self.text._decode
208 Equal = self.assertEqual
209 self.text.insert('1.0', self.hw)
210
211 Equal(decode('end', -1), (2, 5))
212 Equal(decode('3.1', -1), (2, 5))
213 Equal(decode('end', 0), (2, 6))
214 Equal(decode('3.1', 0), (2, 6))
215
216
217 class ESC[4;38;5;81mTkTextTest(ESC[4;38;5;149mTextTest, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
218
219 @classmethod
220 def setUpClass(cls):
221 requires('gui')
222 from tkinter import Tk, Text
223 cls.Text = Text
224 cls.root = Tk()
225
226 @classmethod
227 def tearDownClass(cls):
228 cls.root.destroy()
229 del cls.root
230
231 def setUp(self):
232 self.text = self.Text(self.root)
233
234
235 if __name__ == '__main__':
236 unittest.main(verbosity=2, exit=False)