diff options
Diffstat (limited to 'tests/test_files.py')
-rw-r--r-- | tests/test_files.py | 102 |
1 files changed, 63 insertions, 39 deletions
diff --git a/tests/test_files.py b/tests/test_files.py index ae56e728..b658853a 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -1,19 +1,24 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Tests for files.py""" import os import os.path +from coverage import files from coverage.files import ( - FileLocator, TreeMatcher, FnmatchMatcher, ModuleMatcher, PathAliases, - find_python_files, abs_file + TreeMatcher, FnmatchMatcher, ModuleMatcher, PathAliases, + find_python_files, abs_file, actual_path ) from coverage.misc import CoverageException +from coverage import env from tests.coveragetest import CoverageTest -class FileLocatorTest(CoverageTest): - """Tests of `FileLocator`.""" +class FilesTest(CoverageTest): + """Tests of coverage.files.""" def abs_path(self, p): """Return the absolute path for `p`.""" @@ -21,11 +26,11 @@ class FileLocatorTest(CoverageTest): def test_simple(self): self.make_file("hello.py") - fl = FileLocator() - self.assertEqual(fl.relative_filename("hello.py"), "hello.py") + files.set_relative_directory() + self.assertEqual(files.relative_filename("hello.py"), "hello.py") a = self.abs_path("hello.py") self.assertNotEqual(a, "hello.py") - self.assertEqual(fl.relative_filename(a), "hello.py") + self.assertEqual(files.relative_filename(a), "hello.py") def test_peer_directories(self): self.make_file("sub/proj1/file1.py") @@ -34,20 +39,20 @@ class FileLocatorTest(CoverageTest): a2 = self.abs_path("sub/proj2/file2.py") d = os.path.normpath("sub/proj1") os.chdir(d) - fl = FileLocator() - self.assertEqual(fl.relative_filename(a1), "file1.py") - self.assertEqual(fl.relative_filename(a2), a2) + files.set_relative_directory() + self.assertEqual(files.relative_filename(a1), "file1.py") + self.assertEqual(files.relative_filename(a2), a2) def test_filepath_contains_absolute_prefix_twice(self): # https://bitbucket.org/ned/coveragepy/issue/194 # Build a path that has two pieces matching the absolute path prefix. # Technically, this test doesn't do that on Windows, but drive # letters make that impractical to achieve. - fl = FileLocator() + files.set_relative_directory() d = abs_file(os.curdir) trick = os.path.splitdrive(d)[1].lstrip(os.path.sep) rel = os.path.join('sub', trick, 'file1.py') - self.assertEqual(fl.relative_filename(abs_file(rel)), rel) + self.assertEqual(files.relative_filename(abs_file(rel)), rel) class MatcherTest(CoverageTest): @@ -55,11 +60,11 @@ class MatcherTest(CoverageTest): def setUp(self): super(MatcherTest, self).setUp() - self.fl = FileLocator() + files.set_relative_directory() def assertMatches(self, matcher, filepath, matches): """The `matcher` should agree with `matches` about `filepath`.""" - canonical = self.fl.canonical_filename(filepath) + canonical = files.canonical_filename(filepath) self.assertEqual( matcher.match(canonical), matches, "File %s should have matched as %s" % (filepath, matches) @@ -73,10 +78,9 @@ class MatcherTest(CoverageTest): (self.make_file("sub3/file4.py"), True), (self.make_file("sub3/file5.c"), False), ] - fl = FileLocator() trees = [ - fl.canonical_filename("sub"), - fl.canonical_filename("sub3/file4.py"), + files.canonical_filename("sub"), + files.canonical_filename("sub3/file4.py"), ] tm = TreeMatcher(trees) self.assertEqual(tm.info(), trees) @@ -146,34 +150,48 @@ class PathAliasesTest(CoverageTest): run_in_temp_dir = False + def assert_mapped(self, aliases, inp, out): + """Assert that `inp` mapped through `aliases` produces `out`. + + `out` is canonicalized first, since aliases always produce + canonicalized paths. + + """ + self.assertEqual(aliases.map(inp), files.canonical_filename(out)) + + def assert_not_mapped(self, aliases, inp): + """Assert that `inp` mapped through `aliases` is unchanged.""" + self.assertEqual(aliases.map(inp), inp) + def test_noop(self): aliases = PathAliases() - self.assertEqual(aliases.map('/ned/home/a.py'), '/ned/home/a.py') + self.assert_not_mapped(aliases, '/ned/home/a.py') def test_nomatch(self): aliases = PathAliases() aliases.add('/home/*/src', './mysrc') - self.assertEqual(aliases.map('/home/foo/a.py'), '/home/foo/a.py') + self.assert_not_mapped(aliases, '/home/foo/a.py') def test_wildcard(self): aliases = PathAliases() aliases.add('/ned/home/*/src', './mysrc') - self.assertEqual(aliases.map('/ned/home/foo/src/a.py'), './mysrc/a.py') + self.assert_mapped(aliases, '/ned/home/foo/src/a.py', './mysrc/a.py') + aliases = PathAliases() aliases.add('/ned/home/*/src/', './mysrc') - self.assertEqual(aliases.map('/ned/home/foo/src/a.py'), './mysrc/a.py') + self.assert_mapped(aliases, '/ned/home/foo/src/a.py', './mysrc/a.py') def test_no_accidental_match(self): aliases = PathAliases() aliases.add('/home/*/src', './mysrc') - self.assertEqual(aliases.map('/home/foo/srcetc'), '/home/foo/srcetc') + self.assert_not_mapped(aliases, '/home/foo/srcetc') def test_multiple_patterns(self): aliases = PathAliases() aliases.add('/home/*/src', './mysrc') aliases.add('/lib/*/libsrc', './mylib') - self.assertEqual(aliases.map('/home/foo/src/a.py'), './mysrc/a.py') - self.assertEqual(aliases.map('/lib/foo/libsrc/a.py'), './mylib/a.py') + self.assert_mapped(aliases, '/home/foo/src/a.py', './mysrc/a.py') + self.assert_mapped(aliases, '/lib/foo/libsrc/a.py', './mylib/a.py') def test_cant_have_wildcard_at_end(self): aliases = PathAliases() @@ -189,34 +207,26 @@ class PathAliasesTest(CoverageTest): aliases = PathAliases() aliases.add(r'c:\Zoo\boo', 'src/') aliases.add('/home/ned$', 'src/') - self.assertEqual(aliases.map(r'c:\Zoo\boo\foo.py'), 'src/foo.py') - self.assertEqual(aliases.map(r'/home/ned$/foo.py'), 'src/foo.py') + self.assert_mapped(aliases, r'c:\Zoo\boo\foo.py', 'src/foo.py') + self.assert_mapped(aliases, r'/home/ned$/foo.py', 'src/foo.py') def test_paths_are_os_corrected(self): aliases = PathAliases() aliases.add('/home/ned/*/src', './mysrc') aliases.add(r'c:\ned\src', './mysrc') - mapped = aliases.map(r'C:\Ned\src\sub\a.py') - self.assertEqual(mapped, './mysrc/sub/a.py') + self.assert_mapped(aliases, r'C:\Ned\src\sub\a.py', './mysrc/sub/a.py') aliases = PathAliases() aliases.add('/home/ned/*/src', r'.\mysrc') aliases.add(r'c:\ned\src', r'.\mysrc') - mapped = aliases.map(r'/home/ned/foo/src/sub/a.py') - self.assertEqual(mapped, r'.\mysrc\sub\a.py') + self.assert_mapped(aliases, r'/home/ned/foo/src/sub/a.py', r'.\mysrc\sub\a.py') def test_leading_wildcard(self): aliases = PathAliases() aliases.add('*/d1', './mysrc1') aliases.add('*/d2', './mysrc2') - self.assertEqual(aliases.map('/foo/bar/d1/x.py'), './mysrc1/x.py') - self.assertEqual(aliases.map('/foo/bar/d2/y.py'), './mysrc2/y.py') - - -class RelativePathAliasesTest(CoverageTest): - """Tests for coverage/files.py:PathAliases, with relative files.""" - - run_in_temp_dir = False + self.assert_mapped(aliases, '/foo/bar/d1/x.py', './mysrc1/x.py') + self.assert_mapped(aliases, '/foo/bar/d2/y.py', './mysrc2/y.py') def test_dot(self): for d in ('.', '..', '../other', '~'): @@ -227,7 +237,7 @@ class RelativePathAliasesTest(CoverageTest): the_file = os.path.abspath(os.path.realpath(the_file)) assert '~' not in the_file # to be sure the test is pure. - self.assertEqual(aliases.map(the_file), '/the/source/a.py') + self.assert_mapped(aliases, the_file, '/the/source/a.py') class FindPythonFilesTest(CoverageTest): @@ -248,3 +258,17 @@ class FindPythonFilesTest(CoverageTest): "sub/ssub/__init__.py", "sub/ssub/s.py", "sub/windows.pyw", ]) + + +class WindowsFileTest(CoverageTest): + """Windows-specific tests of file name handling.""" + + run_in_temp_dir = False + + def setUp(self): + if not env.WINDOWS: + self.skip("Only need to run Windows tests on Windows.") + super(WindowsFileTest, self).setUp() + + def test_actual_path(self): + self.assertEquals(actual_path(r'c:\Windows'), actual_path(r'C:\wINDOWS')) |