Home | History | Annotate | Download | only in idle_test
      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