| 
									
										
										
										
											2013-06-22 18:26:51 -04:00
										 |  |  | """ !Changing this line will break Test_findfile.test_found!
 | 
					
						
							| 
									
										
										
										
											2016-05-28 13:22:31 -04:00
										 |  |  | Non-gui unit tests for grep.GrepDialog methods. | 
					
						
							| 
									
										
										
										
											2013-06-22 18:26:51 -04:00
										 |  |  | dummy_command calls grep_it calls findfiles. | 
					
						
							|  |  |  | An exception raised in one method will fail callers. | 
					
						
							|  |  |  | Otherwise, tests are mostly independent. | 
					
						
							| 
									
										
										
										
											2018-06-15 18:20:55 -04:00
										 |  |  | Currently only test grep_it, coverage 51%. | 
					
						
							| 
									
										
										
										
											2013-06-22 18:26:51 -04:00
										 |  |  | """
 | 
					
						
							| 
									
										
										
										
											2019-03-23 07:33:42 -04:00
										 |  |  | from idlelib import grep | 
					
						
							| 
									
										
										
										
											2013-06-22 18:26:51 -04:00
										 |  |  | import unittest | 
					
						
							|  |  |  | from test.support import captured_stdout | 
					
						
							|  |  |  | from idlelib.idle_test.mock_tk import Var | 
					
						
							| 
									
										
										
										
											2019-03-23 07:33:42 -04:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2013-06-22 18:26:51 -04:00
										 |  |  | import re | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-15 18:20:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-22 18:26:51 -04:00
										 |  |  | 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() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-15 18:20:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-22 18:26:51 -04:00
										 |  |  | class Dummy_grep: | 
					
						
							|  |  |  |     # Methods tested | 
					
						
							|  |  |  |     #default_command = GrepDialog.default_command | 
					
						
							| 
									
										
										
										
											2019-03-23 07:33:42 -04:00
										 |  |  |     grep_it = grep.GrepDialog.grep_it | 
					
						
							| 
									
										
										
										
											2013-06-22 18:26:51 -04:00
										 |  |  |     # Other stuff needed | 
					
						
							|  |  |  |     recvar = Var(False) | 
					
						
							|  |  |  |     engine = searchengine | 
					
						
							|  |  |  |     def close(self):  # gui method | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-23 07:33:42 -04:00
										 |  |  | _grep = Dummy_grep() | 
					
						
							| 
									
										
										
										
											2013-06-22 18:26:51 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-15 18:20:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-22 18:26:51 -04:00
										 |  |  | class FindfilesTest(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2019-03-23 07:33:42 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @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) | 
					
						
							| 
									
										
										
										
											2013-06-22 18:26:51 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-15 18:20:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-22 18:26:51 -04:00
										 |  |  | 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): | 
					
						
							| 
									
										
										
										
											2019-03-23 07:33:42 -04:00
										 |  |  |         _grep.engine._pat = pat | 
					
						
							| 
									
										
										
										
											2013-06-22 18:26:51 -04:00
										 |  |  |         with captured_stdout() as s: | 
					
						
							| 
									
										
										
										
											2019-03-23 07:33:42 -04:00
										 |  |  |             _grep.grep_it(re.compile(pat), __file__) | 
					
						
							| 
									
										
										
										
											2013-06-22 18:26:51 -04:00
										 |  |  |         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 | 
					
						
							| 
									
										
										
										
											2025-01-23 13:25:14 -05:00
										 |  |  |         self.assertStartsWith(lines[4], '(Hint:') | 
					
						
							| 
									
										
										
										
											2013-06-22 18:26:51 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-15 18:20:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-22 18:26:51 -04:00
										 |  |  | class Default_commandTest(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2016-05-28 13:22:31 -04:00
										 |  |  |     # To write this, move outwin import to top of GrepDialog | 
					
						
							| 
									
										
										
										
											2013-06-22 18:26:51 -04:00
										 |  |  |     # so it can be replaced by captured_stdout in class setup/teardown. | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-15 18:20:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-22 18:26:51 -04:00
										 |  |  | if __name__ == '__main__': | 
					
						
							| 
									
										
										
										
											2018-06-15 18:20:55 -04:00
										 |  |  |     unittest.main(verbosity=2) |