(root)/
Python-3.12.0/
Lib/
idlelib/
idle_test/
test_grep.py
       1  """ !Changing this line will break Test_findfile.test_found!
       2  Non-gui unit tests for grep.GrepDialog methods.
       3  dummy_command calls grep_it calls findfiles.
       4  An exception raised in one method will fail callers.
       5  Otherwise, tests are mostly independent.
       6  Currently only test grep_it, coverage 51%.
       7  """
       8  from idlelib import grep
       9  import unittest
      10  from test.support import captured_stdout
      11  from idlelib.idle_test.mock_tk import Var
      12  import os
      13  import re
      14  
      15  
      16  class ESC[4;38;5;81mDummy_searchengine:
      17      '''GrepDialog.__init__ calls parent SearchDiabolBase which attaches the
      18      passed in SearchEngine instance as attribute 'engine'. Only a few of the
      19      many possible self.engine.x attributes are needed here.
      20      '''
      21      def getpat(self):
      22          return self._pat
      23  
      24  searchengine = Dummy_searchengine()
      25  
      26  
      27  class ESC[4;38;5;81mDummy_grep:
      28      # Methods tested
      29      #default_command = GrepDialog.default_command
      30      grep_it = grep.GrepDialog.grep_it
      31      # Other stuff needed
      32      recvar = Var(False)
      33      engine = searchengine
      34      def close(self):  # gui method
      35          pass
      36  
      37  _grep = Dummy_grep()
      38  
      39  
      40  class ESC[4;38;5;81mFindfilesTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
      41  
      42      @classmethod
      43      def setUpClass(cls):
      44          cls.realpath = os.path.realpath(__file__)
      45          cls.path = os.path.dirname(cls.realpath)
      46  
      47      @classmethod
      48      def tearDownClass(cls):
      49          del cls.realpath, cls.path
      50  
      51      def test_invaliddir(self):
      52          with captured_stdout() as s:
      53              filelist = list(grep.findfiles('invaliddir', '*.*', False))
      54          self.assertEqual(filelist, [])
      55          self.assertIn('invalid', s.getvalue())
      56  
      57      def test_curdir(self):
      58          # Test os.curdir.
      59          ff = grep.findfiles
      60          save_cwd = os.getcwd()
      61          os.chdir(self.path)
      62          filename = 'test_grep.py'
      63          filelist = list(ff(os.curdir, filename, False))
      64          self.assertIn(os.path.join(os.curdir, filename), filelist)
      65          os.chdir(save_cwd)
      66  
      67      def test_base(self):
      68          ff = grep.findfiles
      69          readme = os.path.join(self.path, 'README.txt')
      70  
      71          # Check for Python files in path where this file lives.
      72          filelist = list(ff(self.path, '*.py', False))
      73          # This directory has many Python files.
      74          self.assertGreater(len(filelist), 10)
      75          self.assertIn(self.realpath, filelist)
      76          self.assertNotIn(readme, filelist)
      77  
      78          # Look for .txt files in path where this file lives.
      79          filelist = list(ff(self.path, '*.txt', False))
      80          self.assertNotEqual(len(filelist), 0)
      81          self.assertNotIn(self.realpath, filelist)
      82          self.assertIn(readme, filelist)
      83  
      84          # Look for non-matching pattern.
      85          filelist = list(ff(self.path, 'grep.*', False))
      86          self.assertEqual(len(filelist), 0)
      87          self.assertNotIn(self.realpath, filelist)
      88  
      89      def test_recurse(self):
      90          ff = grep.findfiles
      91          parent = os.path.dirname(self.path)
      92          grepfile = os.path.join(parent, 'grep.py')
      93          pat = '*.py'
      94  
      95          # Get Python files only in parent directory.
      96          filelist = list(ff(parent, pat, False))
      97          parent_size = len(filelist)
      98          # Lots of Python files in idlelib.
      99          self.assertGreater(parent_size, 20)
     100          self.assertIn(grepfile, filelist)
     101          # Without subdirectories, this file isn't returned.
     102          self.assertNotIn(self.realpath, filelist)
     103  
     104          # Include subdirectories.
     105          filelist = list(ff(parent, pat, True))
     106          # More files found now.
     107          self.assertGreater(len(filelist), parent_size)
     108          self.assertIn(grepfile, filelist)
     109          # This file exists in list now.
     110          self.assertIn(self.realpath, filelist)
     111  
     112          # Check another level up the tree.
     113          parent = os.path.dirname(parent)
     114          filelist = list(ff(parent, '*.py', True))
     115          self.assertIn(self.realpath, filelist)
     116  
     117  
     118  class ESC[4;38;5;81mGrep_itTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     119      # Test captured reports with 0 and some hits.
     120      # Should test file names, but Windows reports have mixed / and \ separators
     121      # from incomplete replacement, so 'later'.
     122  
     123      def report(self, pat):
     124          _grep.engine._pat = pat
     125          with captured_stdout() as s:
     126              _grep.grep_it(re.compile(pat), __file__)
     127          lines = s.getvalue().split('\n')
     128          lines.pop()  # remove bogus '' after last \n
     129          return lines
     130  
     131      def test_unfound(self):
     132          pat = 'xyz*'*7
     133          lines = self.report(pat)
     134          self.assertEqual(len(lines), 2)
     135          self.assertIn(pat, lines[0])
     136          self.assertEqual(lines[1], 'No hits.')
     137  
     138      def test_found(self):
     139  
     140          pat = '""" !Changing this line will break Test_findfile.test_found!'
     141          lines = self.report(pat)
     142          self.assertEqual(len(lines), 5)
     143          self.assertIn(pat, lines[0])
     144          self.assertIn('py: 1:', lines[1])  # line number 1
     145          self.assertIn('2', lines[3])  # hits found 2
     146          self.assertTrue(lines[4].startswith('(Hint:'))
     147  
     148  
     149  class ESC[4;38;5;81mDefault_commandTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     150      # To write this, move outwin import to top of GrepDialog
     151      # so it can be replaced by captured_stdout in class setup/teardown.
     152      pass
     153  
     154  
     155  if __name__ == '__main__':
     156      unittest.main(verbosity=2)