| import os.path |
| import unittest |
| |
| from .. import tool_imports_for_tests |
| with tool_imports_for_tests(): |
| from c_analyzer.common.files import ( |
| iter_files, _walk_tree, glob_tree, |
| ) |
| |
| |
| def fixpath(filename): |
| return filename.replace('/', os.path.sep) |
| |
| |
| class IterFilesTests(unittest.TestCase): |
| |
| maxDiff = None |
| |
| _return_walk = None |
| |
| @property |
| def calls(self): |
| try: |
| return self._calls |
| except AttributeError: |
| self._calls = [] |
| return self._calls |
| |
| def set_files(self, *filesperroot): |
| roots = [] |
| result = [] |
| for root, files in filesperroot: |
| root = fixpath(root) |
| roots.append(root) |
| result.append([os.path.join(root, fixpath(f)) |
| for f in files]) |
| self._return_walk = result |
| return roots |
| |
| def _walk(self, root, *, suffix=None, walk=None): |
| self.calls.append(('_walk', (root, suffix, walk))) |
| return iter(self._return_walk.pop(0)) |
| |
| def _glob(self, root, *, suffix=None): |
| self.calls.append(('_glob', (root, suffix))) |
| return iter(self._return_walk.pop(0)) |
| |
| def test_typical(self): |
| dirnames = self.set_files( |
| ('spam', ['file1.c', 'file2.c']), |
| ('eggs', ['ham/file3.h']), |
| ) |
| suffixes = ('.c', '.h') |
| |
| files = list(iter_files(dirnames, suffixes, |
| _glob=self._glob, |
| _walk=self._walk)) |
| |
| self.assertEqual(files, [ |
| fixpath('spam/file1.c'), |
| fixpath('spam/file2.c'), |
| fixpath('eggs/ham/file3.h'), |
| ]) |
| self.assertEqual(self.calls, [ |
| ('_walk', ('spam', None, _walk_tree)), |
| ('_walk', ('eggs', None, _walk_tree)), |
| ]) |
| |
| def test_single_root(self): |
| self._return_walk = [ |
| [fixpath('spam/file1.c'), fixpath('spam/file2.c')], |
| ] |
| |
| files = list(iter_files('spam', '.c', |
| _glob=self._glob, |
| _walk=self._walk)) |
| |
| self.assertEqual(files, [ |
| fixpath('spam/file1.c'), |
| fixpath('spam/file2.c'), |
| ]) |
| self.assertEqual(self.calls, [ |
| ('_walk', ('spam', '.c', _walk_tree)), |
| ]) |
| |
| def test_one_root(self): |
| self._return_walk = [ |
| [fixpath('spam/file1.c'), fixpath('spam/file2.c')], |
| ] |
| |
| files = list(iter_files(['spam'], '.c', |
| _glob=self._glob, |
| _walk=self._walk)) |
| |
| self.assertEqual(files, [ |
| fixpath('spam/file1.c'), |
| fixpath('spam/file2.c'), |
| ]) |
| self.assertEqual(self.calls, [ |
| ('_walk', ('spam', '.c', _walk_tree)), |
| ]) |
| |
| def test_multiple_roots(self): |
| dirnames = self.set_files( |
| ('spam', ['file1.c', 'file2.c']), |
| ('eggs', ['ham/file3.c']), |
| ) |
| |
| files = list(iter_files(dirnames, '.c', |
| _glob=self._glob, |
| _walk=self._walk)) |
| |
| self.assertEqual(files, [ |
| fixpath('spam/file1.c'), |
| fixpath('spam/file2.c'), |
| fixpath('eggs/ham/file3.c'), |
| ]) |
| self.assertEqual(self.calls, [ |
| ('_walk', ('spam', '.c', _walk_tree)), |
| ('_walk', ('eggs', '.c', _walk_tree)), |
| ]) |
| |
| def test_no_roots(self): |
| files = list(iter_files([], '.c', |
| _glob=self._glob, |
| _walk=self._walk)) |
| |
| self.assertEqual(files, []) |
| self.assertEqual(self.calls, []) |
| |
| def test_single_suffix(self): |
| self._return_walk = [ |
| [fixpath('spam/file1.c'), |
| fixpath('spam/eggs/file3.c'), |
| ], |
| ] |
| |
| files = list(iter_files('spam', '.c', |
| _glob=self._glob, |
| _walk=self._walk)) |
| |
| self.assertEqual(files, [ |
| fixpath('spam/file1.c'), |
| fixpath('spam/eggs/file3.c'), |
| ]) |
| self.assertEqual(self.calls, [ |
| ('_walk', ('spam', '.c', _walk_tree)), |
| ]) |
| |
| def test_one_suffix(self): |
| self._return_walk = [ |
| [fixpath('spam/file1.c'), |
| fixpath('spam/file1.h'), |
| fixpath('spam/file1.o'), |
| fixpath('spam/eggs/file3.c'), |
| ], |
| ] |
| |
| files = list(iter_files('spam', ['.c'], |
| _glob=self._glob, |
| _walk=self._walk)) |
| |
| self.assertEqual(files, [ |
| fixpath('spam/file1.c'), |
| fixpath('spam/eggs/file3.c'), |
| ]) |
| self.assertEqual(self.calls, [ |
| ('_walk', ('spam', None, _walk_tree)), |
| ]) |
| |
| def test_multiple_suffixes(self): |
| self._return_walk = [ |
| [fixpath('spam/file1.c'), |
| fixpath('spam/file1.h'), |
| fixpath('spam/file1.o'), |
| fixpath('spam/eggs/file3.c'), |
| ], |
| ] |
| |
| files = list(iter_files('spam', ('.c', '.h'), |
| _glob=self._glob, |
| _walk=self._walk)) |
| |
| self.assertEqual(files, [ |
| fixpath('spam/file1.c'), |
| fixpath('spam/file1.h'), |
| fixpath('spam/eggs/file3.c'), |
| ]) |
| self.assertEqual(self.calls, [ |
| ('_walk', ('spam', None, _walk_tree)), |
| ]) |
| |
| def test_no_suffix(self): |
| expected = [fixpath('spam/file1.c'), |
| fixpath('spam/file1.h'), |
| fixpath('spam/file1.o'), |
| fixpath('spam/eggs/file3.c'), |
| ] |
| for suffix in (None, '', ()): |
| with self.subTest(suffix): |
| self.calls.clear() |
| self._return_walk = [list(expected)] |
| |
| files = list(iter_files('spam', suffix, |
| _glob=self._glob, |
| _walk=self._walk)) |
| |
| self.assertEqual(files, expected) |
| self.assertEqual(self.calls, [ |
| ('_walk', ('spam', suffix, _walk_tree)), |
| ]) |
| |
| def test_relparent(self): |
| dirnames = self.set_files( |
| ('/x/y/z/spam', ['file1.c', 'file2.c']), |
| ('/x/y/z/eggs', ['ham/file3.c']), |
| ) |
| |
| files = list(iter_files(dirnames, '.c', fixpath('/x/y'), |
| _glob=self._glob, |
| _walk=self._walk)) |
| |
| self.assertEqual(files, [ |
| fixpath('z/spam/file1.c'), |
| fixpath('z/spam/file2.c'), |
| fixpath('z/eggs/ham/file3.c'), |
| ]) |
| self.assertEqual(self.calls, [ |
| ('_walk', (fixpath('/x/y/z/spam'), '.c', _walk_tree)), |
| ('_walk', (fixpath('/x/y/z/eggs'), '.c', _walk_tree)), |
| ]) |
| |
| def test_glob(self): |
| dirnames = self.set_files( |
| ('spam', ['file1.c', 'file2.c']), |
| ('eggs', ['ham/file3.c']), |
| ) |
| |
| files = list(iter_files(dirnames, '.c', |
| get_files=glob_tree, |
| _walk=self._walk, |
| _glob=self._glob)) |
| |
| self.assertEqual(files, [ |
| fixpath('spam/file1.c'), |
| fixpath('spam/file2.c'), |
| fixpath('eggs/ham/file3.c'), |
| ]) |
| self.assertEqual(self.calls, [ |
| ('_glob', ('spam', '.c')), |
| ('_glob', ('eggs', '.c')), |
| ]) |
| |
| |
| def test_alt_walk_func(self): |
| dirnames = self.set_files( |
| ('spam', ['file1.c', 'file2.c']), |
| ('eggs', ['ham/file3.c']), |
| ) |
| def get_files(root): |
| return None |
| |
| files = list(iter_files(dirnames, '.c', |
| get_files=get_files, |
| _walk=self._walk, |
| _glob=self._glob)) |
| |
| self.assertEqual(files, [ |
| fixpath('spam/file1.c'), |
| fixpath('spam/file2.c'), |
| fixpath('eggs/ham/file3.c'), |
| ]) |
| self.assertEqual(self.calls, [ |
| ('_walk', ('spam', '.c', get_files)), |
| ('_walk', ('eggs', '.c', get_files)), |
| ]) |
| |
| |
| |
| |
| |
| |
| # def test_no_dirnames(self): |
| # dirnames = [] |
| # filter_by_name = None |
| # |
| # files = list(iter_files(dirnames, filter_by_name, |
| # _walk=self._walk)) |
| # |
| # self.assertEqual(files, []) |
| # self.assertEqual(self.calls, []) |
| # |
| # def test_no_filter(self): |
| # self._return_walk = [ |
| # [('spam', (), ('file1', 'file2.c', 'file3.h', 'file4.o')), |
| # ], |
| # ] |
| # dirnames = [ |
| # 'spam', |
| # ] |
| # filter_by_name = None |
| # |
| # files = list(iter_files(dirnames, filter_by_name, |
| # _walk=self._walk)) |
| # |
| # self.assertEqual(files, [ |
| # fixpath('spam/file1'), |
| # fixpath('spam/file2.c'), |
| # fixpath('spam/file3.h'), |
| # fixpath('spam/file4.o'), |
| # ]) |
| # self.assertEqual(self.calls, [ |
| # ('_walk', ('spam',)), |
| # ]) |
| # |
| # def test_no_files(self): |
| # self._return_walk = [ |
| # [('spam', (), ()), |
| # ], |
| # [(fixpath('eggs/ham'), (), ()), |
| # ], |
| # ] |
| # dirnames = [ |
| # 'spam', |
| # fixpath('eggs/ham'), |
| # ] |
| # filter_by_name = None |
| # |
| # files = list(iter_files(dirnames, filter_by_name, |
| # _walk=self._walk)) |
| # |
| # self.assertEqual(files, []) |
| # self.assertEqual(self.calls, [ |
| # ('_walk', ('spam',)), |
| # ('_walk', (fixpath('eggs/ham'),)), |
| # ]) |
| # |
| # def test_tree(self): |
| # self._return_walk = [ |
| # [('spam', ('sub1', 'sub2', 'sub3'), ('file1',)), |
| # (fixpath('spam/sub1'), ('sub1sub1',), ('file2', 'file3')), |
| # (fixpath('spam/sub1/sub1sub1'), (), ('file4',)), |
| # (fixpath('spam/sub2'), (), ()), |
| # (fixpath('spam/sub3'), (), ('file5',)), |
| # ], |
| # [(fixpath('eggs/ham'), (), ('file6',)), |
| # ], |
| # ] |
| # dirnames = [ |
| # 'spam', |
| # fixpath('eggs/ham'), |
| # ] |
| # filter_by_name = None |
| # |
| # files = list(iter_files(dirnames, filter_by_name, |
| # _walk=self._walk)) |
| # |
| # self.assertEqual(files, [ |
| # fixpath('spam/file1'), |
| # fixpath('spam/sub1/file2'), |
| # fixpath('spam/sub1/file3'), |
| # fixpath('spam/sub1/sub1sub1/file4'), |
| # fixpath('spam/sub3/file5'), |
| # fixpath('eggs/ham/file6'), |
| # ]) |
| # self.assertEqual(self.calls, [ |
| # ('_walk', ('spam',)), |
| # ('_walk', (fixpath('eggs/ham'),)), |
| # ]) |
| # |
| # def test_filter_suffixes(self): |
| # self._return_walk = [ |
| # [('spam', (), ('file1', 'file2.c', 'file3.h', 'file4.o')), |
| # ], |
| # ] |
| # dirnames = [ |
| # 'spam', |
| # ] |
| # filter_by_name = ('.c', '.h') |
| # |
| # files = list(iter_files(dirnames, filter_by_name, |
| # _walk=self._walk)) |
| # |
| # self.assertEqual(files, [ |
| # fixpath('spam/file2.c'), |
| # fixpath('spam/file3.h'), |
| # ]) |
| # self.assertEqual(self.calls, [ |
| # ('_walk', ('spam',)), |
| # ]) |
| # |
| # def test_some_filtered(self): |
| # self._return_walk = [ |
| # [('spam', (), ('file1', 'file2', 'file3', 'file4')), |
| # ], |
| # ] |
| # dirnames = [ |
| # 'spam', |
| # ] |
| # def filter_by_name(filename, results=[False, True, False, True]): |
| # self.calls.append(('filter_by_name', (filename,))) |
| # return results.pop(0) |
| # |
| # files = list(iter_files(dirnames, filter_by_name, |
| # _walk=self._walk)) |
| # |
| # self.assertEqual(files, [ |
| # fixpath('spam/file2'), |
| # fixpath('spam/file4'), |
| # ]) |
| # self.assertEqual(self.calls, [ |
| # ('_walk', ('spam',)), |
| # ('filter_by_name', ('file1',)), |
| # ('filter_by_name', ('file2',)), |
| # ('filter_by_name', ('file3',)), |
| # ('filter_by_name', ('file4',)), |
| # ]) |
| # |
| # def test_none_filtered(self): |
| # self._return_walk = [ |
| # [('spam', (), ('file1', 'file2', 'file3', 'file4')), |
| # ], |
| # ] |
| # dirnames = [ |
| # 'spam', |
| # ] |
| # def filter_by_name(filename, results=[True, True, True, True]): |
| # self.calls.append(('filter_by_name', (filename,))) |
| # return results.pop(0) |
| # |
| # files = list(iter_files(dirnames, filter_by_name, |
| # _walk=self._walk)) |
| # |
| # self.assertEqual(files, [ |
| # fixpath('spam/file1'), |
| # fixpath('spam/file2'), |
| # fixpath('spam/file3'), |
| # fixpath('spam/file4'), |
| # ]) |
| # self.assertEqual(self.calls, [ |
| # ('_walk', ('spam',)), |
| # ('filter_by_name', ('file1',)), |
| # ('filter_by_name', ('file2',)), |
| # ('filter_by_name', ('file3',)), |
| # ('filter_by_name', ('file4',)), |
| # ]) |
| # |
| # def test_all_filtered(self): |
| # self._return_walk = [ |
| # [('spam', (), ('file1', 'file2', 'file3', 'file4')), |
| # ], |
| # ] |
| # dirnames = [ |
| # 'spam', |
| # ] |
| # def filter_by_name(filename, results=[False, False, False, False]): |
| # self.calls.append(('filter_by_name', (filename,))) |
| # return results.pop(0) |
| # |
| # files = list(iter_files(dirnames, filter_by_name, |
| # _walk=self._walk)) |
| # |
| # self.assertEqual(files, []) |
| # self.assertEqual(self.calls, [ |
| # ('_walk', ('spam',)), |
| # ('filter_by_name', ('file1',)), |
| # ('filter_by_name', ('file2',)), |
| # ('filter_by_name', ('file3',)), |
| # ('filter_by_name', ('file4',)), |
| # ]) |