changing this line will break testfindfile testfound nongui unit tests for grep grepdialog methods dummycommand calls grepit calls findfiles an exception raised in one method will fail callers otherwise tests are mostly independent currently only test grepit coverage 51 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 methods tested defaultcommand grepdialog defaultcommand other stuff needed test os curdir check for python files in path where this file lives this directory has many python files look for txt files in path where this file lives look for nonmatching pattern get python files only in parent directory lots of python files in idlelib without subdirectories this file isn t returned include subdirectories more files found now this file exists in list now check another level up the tree test captured reports with 0 and some hits should test file names but windows reports have mixed and separators from incomplete replacement so later to write this move outwin import to top of grepdialog so it can be replaced by capturedstdout in class setupteardown 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 methods tested default_command grepdialog default_command other stuff needed gui method test os curdir check for python files in path where this file lives this directory has many python files look for txt files in path where this file lives look for non matching pattern get python files only in parent directory lots of python files in idlelib without subdirectories this file isn t returned include subdirectories more files found now this file exists in list now check another level up the tree test captured reports with 0 and some hits should test file names but windows reports have mixed and separators from incomplete replacement so later remove bogus after last n line number 1 hits found 2 to write this move outwin import to top of grepdialog so it can be replaced by captured_stdout in class setup teardown
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:
    
    def getpat(self):
        return self._pat

searchengine = Dummy_searchengine()


class Dummy_grep:
    
    
    grep_it = grep.GrepDialog.grep_it
    
    recvar = Var(False)
    engine = searchengine
    def close(self):  
        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):
        
        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')

        
        filelist = list(ff(self.path, '*.py', False))
        
        self.assertGreater(len(filelist), 10)
        self.assertIn(self.realpath, filelist)
        self.assertNotIn(readme, filelist)

        
        filelist = list(ff(self.path, '*.txt', False))
        self.assertNotEqual(len(filelist), 0)
        self.assertNotIn(self.realpath, filelist)
        self.assertIn(readme, filelist)

        
        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'

        
        filelist = list(ff(parent, pat, False))
        parent_size = len(filelist)
        
        self.assertGreater(parent_size, 20)
        self.assertIn(grepfile, filelist)
        
        self.assertNotIn(self.realpath, filelist)

        
        filelist = list(ff(parent, pat, True))
        
        self.assertGreater(len(filelist), parent_size)
        self.assertIn(grepfile, filelist)
        
        self.assertIn(self.realpath, filelist)

        
        parent = os.path.dirname(parent)
        filelist = list(ff(parent, '*.py', True))
        self.assertIn(self.realpath, filelist)


class Grep_itTest(unittest.TestCase):
    
    
    

    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()  
        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])  
        self.assertIn('2', lines[3])  
        self.assertTrue(lines[4].startswith('(Hint:'))


class Default_commandTest(unittest.TestCase):
    
    
    pass


if __name__ == '__main__':
    unittest.main(verbosity=2)