1 # Test mock_tk.Text class against tkinter.Text class by running same tests with both. 2 import unittest 3 from test.test_support import requires 4 5 from _tkinter import TclError 6 7 class 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 192 class 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 211 class 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 226 if __name__ == '__main__': 227 unittest.main(verbosity=2, exit=False) 228