(root)/
Python-3.12.0/
Lib/
idlelib/
idle_test/
test_zzdummy.py
       1  "Test zzdummy, coverage 100%."
       2  
       3  from idlelib import zzdummy
       4  import unittest
       5  from test.support import requires
       6  from tkinter import Tk, Text
       7  from unittest import mock
       8  from idlelib import config
       9  from idlelib import editor
      10  from idlelib import format
      11  
      12  
      13  usercfg = zzdummy.idleConf.userCfg
      14  testcfg = {
      15      'main': config.IdleUserConfParser(''),
      16      'highlight': config.IdleUserConfParser(''),
      17      'keys': config.IdleUserConfParser(''),
      18      'extensions': config.IdleUserConfParser(''),
      19  }
      20  code_sample = """\
      21  
      22  class C1:
      23      # Class comment.
      24      def __init__(self, a, b):
      25          self.a = a
      26          self.b = b
      27  """
      28  
      29  
      30  class ESC[4;38;5;81mDummyEditwin:
      31      get_selection_indices = editor.EditorWindow.get_selection_indices
      32      def __init__(self, root, text):
      33          self.root = root
      34          self.top = root
      35          self.text = text
      36          self.fregion = format.FormatRegion(self)
      37          self.text.undo_block_start = mock.Mock()
      38          self.text.undo_block_stop = mock.Mock()
      39  
      40  
      41  class ESC[4;38;5;81mZZDummyTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
      42  
      43      @classmethod
      44      def setUpClass(cls):
      45          requires('gui')
      46          root = cls.root = Tk()
      47          root.withdraw()
      48          text = cls.text = Text(cls.root)
      49          cls.editor = DummyEditwin(root, text)
      50          zzdummy.idleConf.userCfg = testcfg
      51  
      52      @classmethod
      53      def tearDownClass(cls):
      54          zzdummy.idleConf.userCfg = usercfg
      55          del cls.editor, cls.text
      56          cls.root.update_idletasks()
      57          for id in cls.root.tk.call('after', 'info'):
      58              cls.root.after_cancel(id)  # Need for EditorWindow.
      59          cls.root.destroy()
      60          del cls.root
      61  
      62      def setUp(self):
      63          text = self.text
      64          text.insert('1.0', code_sample)
      65          text.undo_block_start.reset_mock()
      66          text.undo_block_stop.reset_mock()
      67          zz = self.zz = zzdummy.ZzDummy(self.editor)
      68          zzdummy.ZzDummy.ztext = '# ignore #'
      69  
      70      def tearDown(self):
      71          self.text.delete('1.0', 'end')
      72          del self.zz
      73  
      74      def checklines(self, text, value):
      75          # Verify that there are lines being checked.
      76          end_line = int(float(text.index('end')))
      77  
      78          # Check each line for the starting text.
      79          actual = []
      80          for line in range(1, end_line):
      81              txt = text.get(f'{line}.0', f'{line}.end')
      82              actual.append(txt.startswith(value))
      83          return actual
      84  
      85      def test_init(self):
      86          zz = self.zz
      87          self.assertEqual(zz.editwin, self.editor)
      88          self.assertEqual(zz.text, self.editor.text)
      89  
      90      def test_reload(self):
      91          self.assertEqual(self.zz.ztext, '# ignore #')
      92          testcfg['extensions'].SetOption('ZzDummy', 'z-text', 'spam')
      93          zzdummy.ZzDummy.reload()
      94          self.assertEqual(self.zz.ztext, 'spam')
      95  
      96      def test_z_in_event(self):
      97          eq = self.assertEqual
      98          zz = self.zz
      99          text = zz.text
     100          eq(self.zz.ztext, '# ignore #')
     101  
     102          # No lines have the leading text.
     103          expected = [False, False, False, False, False, False, False]
     104          actual = self.checklines(text, zz.ztext)
     105          eq(expected, actual)
     106  
     107          text.tag_add('sel', '2.0', '4.end')
     108          eq(zz.z_in_event(), 'break')
     109          expected = [False, True, True, True, False, False, False]
     110          actual = self.checklines(text, zz.ztext)
     111          eq(expected, actual)
     112  
     113          text.undo_block_start.assert_called_once()
     114          text.undo_block_stop.assert_called_once()
     115  
     116      def test_z_out_event(self):
     117          eq = self.assertEqual
     118          zz = self.zz
     119          text = zz.text
     120          eq(self.zz.ztext, '# ignore #')
     121  
     122          # Prepend text.
     123          text.tag_add('sel', '2.0', '5.end')
     124          zz.z_in_event()
     125          text.undo_block_start.reset_mock()
     126          text.undo_block_stop.reset_mock()
     127  
     128          # Select a few lines to remove text.
     129          text.tag_remove('sel', '1.0', 'end')
     130          text.tag_add('sel', '3.0', '4.end')
     131          eq(zz.z_out_event(), 'break')
     132          expected = [False, True, False, False, True, False, False]
     133          actual = self.checklines(text, zz.ztext)
     134          eq(expected, actual)
     135  
     136          text.undo_block_start.assert_called_once()
     137          text.undo_block_stop.assert_called_once()
     138  
     139      def test_roundtrip(self):
     140          # Insert and remove to all code should give back original text.
     141          zz = self.zz
     142          text = zz.text
     143  
     144          text.tag_add('sel', '1.0', 'end-1c')
     145          zz.z_in_event()
     146          zz.z_out_event()
     147  
     148          self.assertEqual(text.get('1.0', 'end-1c'), code_sample)
     149  
     150  
     151  if __name__ == '__main__':
     152      unittest.main(verbosity=2)