mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	* Add tests for grep findfiles. * Move findfiles to module function. * Change findfiles to use os.walk. Based on a patch by Al Sweigart.
		
			
				
	
	
		
			156 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
""" !Changing this line will break Test_findfile.test_found!
 | 
						|
Non-gui unit tests for grep.GrepDialog methods.
 | 
						|
dummy_command calls grep_it calls findfiles.
 | 
						|
An exception raised in one method will fail callers.
 | 
						|
Otherwise, tests are mostly independent.
 | 
						|
Currently only test grep_it, coverage 51%.
 | 
						|
"""
 | 
						|
from idlelib import grep
 | 
						|
import unittest
 | 
						|
from test.support import captured_stdout
 | 
						|
from idlelib.idle_test.mock_tk import Var
 | 
						|
import os
 | 
						|
import re
 | 
						|
 | 
						|
 | 
						|
class Dummy_searchengine:
 | 
						|
    '''GrepDialog.__init__ calls parent SearchDiabolBase which attaches the
 | 
						|
    passed in SearchEngine instance as attribute 'engine'. Only a few of the
 | 
						|
    many possible self.engine.x attributes are needed here.
 | 
						|
    '''
 | 
						|
    def getpat(self):
 | 
						|
        return self._pat
 | 
						|
 | 
						|
searchengine = Dummy_searchengine()
 | 
						|
 | 
						|
 | 
						|
class Dummy_grep:
 | 
						|
    # Methods tested
 | 
						|
    #default_command = GrepDialog.default_command
 | 
						|
    grep_it = grep.GrepDialog.grep_it
 | 
						|
    # Other stuff needed
 | 
						|
    recvar = Var(False)
 | 
						|
    engine = searchengine
 | 
						|
    def close(self):  # gui method
 | 
						|
        pass
 | 
						|
 | 
						|
_grep = Dummy_grep()
 | 
						|
 | 
						|
 | 
						|
class FindfilesTest(unittest.TestCase):
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def setUpClass(cls):
 | 
						|
        cls.realpath = os.path.realpath(__file__)
 | 
						|
        cls.path = os.path.dirname(cls.realpath)
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def tearDownClass(cls):
 | 
						|
        del cls.realpath, cls.path
 | 
						|
 | 
						|
    def test_invaliddir(self):
 | 
						|
        with captured_stdout() as s:
 | 
						|
            filelist = list(grep.findfiles('invaliddir', '*.*', False))
 | 
						|
        self.assertEqual(filelist, [])
 | 
						|
        self.assertIn('invalid', s.getvalue())
 | 
						|
 | 
						|
    def test_curdir(self):
 | 
						|
        # Test os.curdir.
 | 
						|
        ff = grep.findfiles
 | 
						|
        save_cwd = os.getcwd()
 | 
						|
        os.chdir(self.path)
 | 
						|
        filename = 'test_grep.py'
 | 
						|
        filelist = list(ff(os.curdir, filename, False))
 | 
						|
        self.assertIn(os.path.join(os.curdir, filename), filelist)
 | 
						|
        os.chdir(save_cwd)
 | 
						|
 | 
						|
    def test_base(self):
 | 
						|
        ff = grep.findfiles
 | 
						|
        readme = os.path.join(self.path, 'README.txt')
 | 
						|
 | 
						|
        # Check for Python files in path where this file lives.
 | 
						|
        filelist = list(ff(self.path, '*.py', False))
 | 
						|
        # This directory has many Python files.
 | 
						|
        self.assertGreater(len(filelist), 10)
 | 
						|
        self.assertIn(self.realpath, filelist)
 | 
						|
        self.assertNotIn(readme, filelist)
 | 
						|
 | 
						|
        # Look for .txt files in path where this file lives.
 | 
						|
        filelist = list(ff(self.path, '*.txt', False))
 | 
						|
        self.assertNotEqual(len(filelist), 0)
 | 
						|
        self.assertNotIn(self.realpath, filelist)
 | 
						|
        self.assertIn(readme, filelist)
 | 
						|
 | 
						|
        # Look for non-matching pattern.
 | 
						|
        filelist = list(ff(self.path, 'grep.*', False))
 | 
						|
        self.assertEqual(len(filelist), 0)
 | 
						|
        self.assertNotIn(self.realpath, filelist)
 | 
						|
 | 
						|
    def test_recurse(self):
 | 
						|
        ff = grep.findfiles
 | 
						|
        parent = os.path.dirname(self.path)
 | 
						|
        grepfile = os.path.join(parent, 'grep.py')
 | 
						|
        pat = '*.py'
 | 
						|
 | 
						|
        # Get Python files only in parent directory.
 | 
						|
        filelist = list(ff(parent, pat, False))
 | 
						|
        parent_size = len(filelist)
 | 
						|
        # Lots of Python files in idlelib.
 | 
						|
        self.assertGreater(parent_size, 20)
 | 
						|
        self.assertIn(grepfile, filelist)
 | 
						|
        # Without subdirectories, this file isn't returned.
 | 
						|
        self.assertNotIn(self.realpath, filelist)
 | 
						|
 | 
						|
        # Include subdirectories.
 | 
						|
        filelist = list(ff(parent, pat, True))
 | 
						|
        # More files found now.
 | 
						|
        self.assertGreater(len(filelist), parent_size)
 | 
						|
        self.assertIn(grepfile, filelist)
 | 
						|
        # This file exists in list now.
 | 
						|
        self.assertIn(self.realpath, filelist)
 | 
						|
 | 
						|
        # Check another level up the tree.
 | 
						|
        parent = os.path.dirname(parent)
 | 
						|
        filelist = list(ff(parent, '*.py', True))
 | 
						|
        self.assertIn(self.realpath, filelist)
 | 
						|
 | 
						|
 | 
						|
class Grep_itTest(unittest.TestCase):
 | 
						|
    # Test captured reports with 0 and some hits.
 | 
						|
    # Should test file names, but Windows reports have mixed / and \ separators
 | 
						|
    # from incomplete replacement, so 'later'.
 | 
						|
 | 
						|
    def report(self, pat):
 | 
						|
        _grep.engine._pat = pat
 | 
						|
        with captured_stdout() as s:
 | 
						|
            _grep.grep_it(re.compile(pat), __file__)
 | 
						|
        lines = s.getvalue().split('\n')
 | 
						|
        lines.pop()  # remove bogus '' after last \n
 | 
						|
        return lines
 | 
						|
 | 
						|
    def test_unfound(self):
 | 
						|
        pat = 'xyz*'*7
 | 
						|
        lines = self.report(pat)
 | 
						|
        self.assertEqual(len(lines), 2)
 | 
						|
        self.assertIn(pat, lines[0])
 | 
						|
        self.assertEqual(lines[1], 'No hits.')
 | 
						|
 | 
						|
    def test_found(self):
 | 
						|
 | 
						|
        pat = '""" !Changing this line will break Test_findfile.test_found!'
 | 
						|
        lines = self.report(pat)
 | 
						|
        self.assertEqual(len(lines), 5)
 | 
						|
        self.assertIn(pat, lines[0])
 | 
						|
        self.assertIn('py: 1:', lines[1])  # line number 1
 | 
						|
        self.assertIn('2', lines[3])  # hits found 2
 | 
						|
        self.assertTrue(lines[4].startswith('(Hint:'))
 | 
						|
 | 
						|
 | 
						|
class Default_commandTest(unittest.TestCase):
 | 
						|
    # To write this, move outwin import to top of GrepDialog
 | 
						|
    # so it can be replaced by captured_stdout in class setup/teardown.
 | 
						|
    pass
 | 
						|
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    unittest.main(verbosity=2)
 |