(root)/
Python-3.12.0/
Lib/
idlelib/
idle_test/
test_replace.py
       1  "Test replace, coverage 78%."
       2  
       3  from idlelib.replace import ReplaceDialog
       4  import unittest
       5  from test.support import requires
       6  requires('gui')
       7  from tkinter import Tk, Text
       8  
       9  from unittest.mock import Mock
      10  from idlelib.idle_test.mock_tk import Mbox
      11  import idlelib.searchengine as se
      12  
      13  orig_mbox = se.messagebox
      14  showerror = Mbox.showerror
      15  
      16  
      17  class ESC[4;38;5;81mReplaceDialogTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
      18  
      19      @classmethod
      20      def setUpClass(cls):
      21          cls.root = Tk()
      22          cls.root.withdraw()
      23          se.messagebox = Mbox
      24          cls.engine = se.SearchEngine(cls.root)
      25          cls.dialog = ReplaceDialog(cls.root, cls.engine)
      26          cls.dialog.bell = lambda: None
      27          cls.dialog.ok = Mock()
      28          cls.text = Text(cls.root)
      29          cls.text.undo_block_start = Mock()
      30          cls.text.undo_block_stop = Mock()
      31          cls.dialog.text = cls.text
      32  
      33      @classmethod
      34      def tearDownClass(cls):
      35          se.messagebox = orig_mbox
      36          del cls.text, cls.dialog, cls.engine
      37          cls.root.destroy()
      38          del cls.root
      39  
      40      def setUp(self):
      41          self.text.insert('insert', 'This is a sample sTring')
      42  
      43      def tearDown(self):
      44          self.engine.patvar.set('')
      45          self.dialog.replvar.set('')
      46          self.engine.wordvar.set(False)
      47          self.engine.casevar.set(False)
      48          self.engine.revar.set(False)
      49          self.engine.wrapvar.set(True)
      50          self.engine.backvar.set(False)
      51          showerror.title = ''
      52          showerror.message = ''
      53          self.text.delete('1.0', 'end')
      54  
      55      def test_replace_simple(self):
      56          # Test replace function with all options at default setting.
      57          # Wrap around - True
      58          # Regular Expression - False
      59          # Match case - False
      60          # Match word - False
      61          # Direction - Forwards
      62          text = self.text
      63          equal = self.assertEqual
      64          pv = self.engine.patvar
      65          rv = self.dialog.replvar
      66          replace = self.dialog.replace_it
      67  
      68          # test accessor method
      69          self.engine.setpat('asdf')
      70          equal(self.engine.getpat(), pv.get())
      71  
      72          # text found and replaced
      73          pv.set('a')
      74          rv.set('asdf')
      75          replace()
      76          equal(text.get('1.8', '1.12'), 'asdf')
      77  
      78          # don't "match word" case
      79          text.mark_set('insert', '1.0')
      80          pv.set('is')
      81          rv.set('hello')
      82          replace()
      83          equal(text.get('1.2', '1.7'), 'hello')
      84  
      85          # don't "match case" case
      86          pv.set('string')
      87          rv.set('world')
      88          replace()
      89          equal(text.get('1.23', '1.28'), 'world')
      90  
      91          # without "regular expression" case
      92          text.mark_set('insert', 'end')
      93          text.insert('insert', '\nline42:')
      94          before_text = text.get('1.0', 'end')
      95          pv.set(r'[a-z][\d]+')
      96          replace()
      97          after_text = text.get('1.0', 'end')
      98          equal(before_text, after_text)
      99  
     100          # test with wrap around selected and complete a cycle
     101          text.mark_set('insert', '1.9')
     102          pv.set('i')
     103          rv.set('j')
     104          replace()
     105          equal(text.get('1.8'), 'i')
     106          equal(text.get('2.1'), 'j')
     107          replace()
     108          equal(text.get('2.1'), 'j')
     109          equal(text.get('1.8'), 'j')
     110          before_text = text.get('1.0', 'end')
     111          replace()
     112          after_text = text.get('1.0', 'end')
     113          equal(before_text, after_text)
     114  
     115          # text not found
     116          before_text = text.get('1.0', 'end')
     117          pv.set('foobar')
     118          replace()
     119          after_text = text.get('1.0', 'end')
     120          equal(before_text, after_text)
     121  
     122          # test access method
     123          self.dialog.find_it(0)
     124  
     125      def test_replace_wrap_around(self):
     126          text = self.text
     127          equal = self.assertEqual
     128          pv = self.engine.patvar
     129          rv = self.dialog.replvar
     130          replace = self.dialog.replace_it
     131          self.engine.wrapvar.set(False)
     132  
     133          # replace candidate found both after and before 'insert'
     134          text.mark_set('insert', '1.4')
     135          pv.set('i')
     136          rv.set('j')
     137          replace()
     138          equal(text.get('1.2'), 'i')
     139          equal(text.get('1.5'), 'j')
     140          replace()
     141          equal(text.get('1.2'), 'i')
     142          equal(text.get('1.20'), 'j')
     143          replace()
     144          equal(text.get('1.2'), 'i')
     145  
     146          # replace candidate found only before 'insert'
     147          text.mark_set('insert', '1.8')
     148          pv.set('is')
     149          before_text = text.get('1.0', 'end')
     150          replace()
     151          after_text = text.get('1.0', 'end')
     152          equal(before_text, after_text)
     153  
     154      def test_replace_whole_word(self):
     155          text = self.text
     156          equal = self.assertEqual
     157          pv = self.engine.patvar
     158          rv = self.dialog.replvar
     159          replace = self.dialog.replace_it
     160          self.engine.wordvar.set(True)
     161  
     162          pv.set('is')
     163          rv.set('hello')
     164          replace()
     165          equal(text.get('1.0', '1.4'), 'This')
     166          equal(text.get('1.5', '1.10'), 'hello')
     167  
     168      def test_replace_match_case(self):
     169          equal = self.assertEqual
     170          text = self.text
     171          pv = self.engine.patvar
     172          rv = self.dialog.replvar
     173          replace = self.dialog.replace_it
     174          self.engine.casevar.set(True)
     175  
     176          before_text = self.text.get('1.0', 'end')
     177          pv.set('this')
     178          rv.set('that')
     179          replace()
     180          after_text = self.text.get('1.0', 'end')
     181          equal(before_text, after_text)
     182  
     183          pv.set('This')
     184          replace()
     185          equal(text.get('1.0', '1.4'), 'that')
     186  
     187      def test_replace_regex(self):
     188          equal = self.assertEqual
     189          text = self.text
     190          pv = self.engine.patvar
     191          rv = self.dialog.replvar
     192          replace = self.dialog.replace_it
     193          self.engine.revar.set(True)
     194  
     195          before_text = text.get('1.0', 'end')
     196          pv.set(r'[a-z][\d]+')
     197          rv.set('hello')
     198          replace()
     199          after_text = text.get('1.0', 'end')
     200          equal(before_text, after_text)
     201  
     202          text.insert('insert', '\nline42')
     203          replace()
     204          equal(text.get('2.0', '2.8'), 'linhello')
     205  
     206          pv.set('')
     207          replace()
     208          self.assertIn('error', showerror.title)
     209          self.assertIn('Empty', showerror.message)
     210  
     211          pv.set(r'[\d')
     212          replace()
     213          self.assertIn('error', showerror.title)
     214          self.assertIn('Pattern', showerror.message)
     215  
     216          showerror.title = ''
     217          showerror.message = ''
     218          pv.set('[a]')
     219          rv.set('test\\')
     220          replace()
     221          self.assertIn('error', showerror.title)
     222          self.assertIn('Invalid Replace Expression', showerror.message)
     223  
     224          # test access method
     225          self.engine.setcookedpat("?")
     226          equal(pv.get(), "\\?")
     227  
     228      def test_replace_backwards(self):
     229          equal = self.assertEqual
     230          text = self.text
     231          pv = self.engine.patvar
     232          rv = self.dialog.replvar
     233          replace = self.dialog.replace_it
     234          self.engine.backvar.set(True)
     235  
     236          text.insert('insert', '\nis as ')
     237  
     238          pv.set('is')
     239          rv.set('was')
     240          replace()
     241          equal(text.get('1.2', '1.4'), 'is')
     242          equal(text.get('2.0', '2.3'), 'was')
     243          replace()
     244          equal(text.get('1.5', '1.8'), 'was')
     245          replace()
     246          equal(text.get('1.2', '1.5'), 'was')
     247  
     248      def test_replace_all(self):
     249          text = self.text
     250          pv = self.engine.patvar
     251          rv = self.dialog.replvar
     252          replace_all = self.dialog.replace_all
     253  
     254          text.insert('insert', '\n')
     255          text.insert('insert', text.get('1.0', 'end')*100)
     256          pv.set('is')
     257          rv.set('was')
     258          replace_all()
     259          self.assertNotIn('is', text.get('1.0', 'end'))
     260  
     261          self.engine.revar.set(True)
     262          pv.set('')
     263          replace_all()
     264          self.assertIn('error', showerror.title)
     265          self.assertIn('Empty', showerror.message)
     266  
     267          pv.set('[s][T]')
     268          rv.set('\\')
     269          replace_all()
     270  
     271          self.engine.revar.set(False)
     272          pv.set('text which is not present')
     273          rv.set('foobar')
     274          replace_all()
     275  
     276      def test_default_command(self):
     277          text = self.text
     278          pv = self.engine.patvar
     279          rv = self.dialog.replvar
     280          replace_find = self.dialog.default_command
     281          equal = self.assertEqual
     282  
     283          pv.set('This')
     284          rv.set('was')
     285          replace_find()
     286          equal(text.get('sel.first', 'sel.last'), 'was')
     287  
     288          self.engine.revar.set(True)
     289          pv.set('')
     290          replace_find()
     291  
     292  
     293  if __name__ == '__main__':
     294      unittest.main(verbosity=2)