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