(root)/
Python-3.12.0/
Lib/
idlelib/
idle_test/
test_text.py
       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)