diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/backtest.py | 4 | ||||
-rw-r--r-- | tests/plugin1.py | 5 | ||||
-rw-r--r-- | tests/plugin2.py | 24 | ||||
-rw-r--r-- | tests/test_api.py | 6 | ||||
-rw-r--r-- | tests/test_cmdline.py | 9 | ||||
-rw-r--r-- | tests/test_codeunit.py | 2 | ||||
-rw-r--r-- | tests/test_concurrency.py | 6 | ||||
-rw-r--r-- | tests/test_config.py | 16 | ||||
-rw-r--r-- | tests/test_farm.py | 3 | ||||
-rw-r--r-- | tests/test_misc.py | 52 | ||||
-rw-r--r-- | tests/test_plugins.py | 75 | ||||
-rw-r--r-- | tests/test_process.py | 2 | ||||
-rw-r--r-- | tests/test_summary.py | 101 | ||||
-rw-r--r-- | tests/test_templite.py | 4 | ||||
-rw-r--r-- | tests/test_xml.py | 2 |
15 files changed, 238 insertions, 73 deletions
diff --git a/tests/backtest.py b/tests/backtest.py index 439493d1..574e6ac4 100644 --- a/tests/backtest.py +++ b/tests/backtest.py @@ -1,6 +1,6 @@ """Add things to old Pythons so I can pretend they are newer, for tests.""" -# pylint: disable=W0622 +# pylint: disable=redefined-builtin # (Redefining built-in blah) # The whole point of this file is to redefine built-ins, so shut up about it. @@ -20,7 +20,7 @@ def run_command(cmd): stderr=subprocess.STDOUT ) output, _ = proc.communicate() - status = proc.returncode # pylint: disable=E1101 + status = proc.returncode # Get the output, and canonicalize it to strings with newlines. if not isinstance(output, str): diff --git a/tests/plugin1.py b/tests/plugin1.py index 9401e327..21e64aeb 100644 --- a/tests/plugin1.py +++ b/tests/plugin1.py @@ -1,4 +1,4 @@ -"""Plugins for test_plugins.py to import.""" +"""A plugin for test_plugins.py to import.""" import os.path @@ -12,8 +12,7 @@ class Plugin(coverage.CoveragePlugin): def file_tracer(self, filename): """Trace only files named xyz.py""" if "xyz.py" in filename: - file_tracer = FileTracer(filename) - return file_tracer + return FileTracer(filename) def file_reporter(self, filename): return FileReporter(filename) diff --git a/tests/plugin2.py b/tests/plugin2.py new file mode 100644 index 00000000..1fa66cb2 --- /dev/null +++ b/tests/plugin2.py @@ -0,0 +1,24 @@ +"""A plugin for test_plugins.py to import.""" + +import coverage + +class Plugin(coverage.CoveragePlugin): + def file_tracer(self, filename): + if "render.py" in filename: + return RenderFileTracer(filename) + + +class RenderFileTracer(coverage.plugin.FileTracer): + def __init__(self, filename): + pass + + def has_dynamic_source_filename(self): + return True + + def dynamic_source_filename(self, filename, frame): + filename = "fake%d.html" % frame.f_lineno + print("dynamic filename: %r" % filename) + return filename + + def line_number_range(self, frame): + return 17,19 diff --git a/tests/test_api.py b/tests/test_api.py index 31bfc57f..ca65d6de 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -448,7 +448,7 @@ class SourceOmitIncludeTest(OmitIncludeTestsMixin, CoverageTest): """ cov = coverage.coverage(**kwargs) cov.start() - import usepkgs # pragma: nested # pylint: disable=F0401,W0612 + import usepkgs # pragma: nested # pylint: disable=import-error,unused-variable cov.stop() # pragma: nested cov._harvest_data() # private! sshhh... summary = cov.data.summary() @@ -487,7 +487,7 @@ class ReportIncludeOmitTest(OmitIncludeTestsMixin, CoverageTest): """Try coverage.report().""" cov = coverage.coverage() cov.start() - import usepkgs # pragma: nested # pylint: disable=F0401,W0612 + import usepkgs # pragma: nested # pylint: disable=import-error,unused-variable cov.stop() # pragma: nested report = StringIO() cov.report(file=report, **kwargs) @@ -506,7 +506,7 @@ class XmlIncludeOmitTest(OmitIncludeTestsMixin, CoverageTest): """Try coverage.xml_report().""" cov = coverage.coverage() cov.start() - import usepkgs # pragma: nested # pylint: disable=F0401,W0612 + import usepkgs # pragma: nested # pylint: disable=import-error,unused-variable cov.stop() # pragma: nested cov.xml_report(outfile="-", **kwargs) return self.stdout() diff --git a/tests/test_cmdline.py b/tests/test_cmdline.py index 695c3bec..e0d10867 100644 --- a/tests/test_cmdline.py +++ b/tests/test_cmdline.py @@ -31,7 +31,7 @@ class BaseCmdLineTest(CoverageTest): ) defaults.report( ignore_errors=None, include=None, omit=None, morfs=[], - show_missing=None, + show_missing=None, skip_covered=None ) defaults.xml_report( ignore_errors=None, include=None, omit=None, morfs=[], outfile=None, @@ -153,7 +153,7 @@ class FakeCoverageForDebugData(object): """Fake coverage().data.has_arcs()""" return False - def summary(self, fullpath): # pylint: disable=W0613 + def summary(self, fullpath): # pylint: disable=unused-argument """Fake coverage().data.summary()""" return self._summary @@ -347,6 +347,11 @@ class CmdLineTest(BaseCmdLineTest): .load() .report(morfs=["mod1", "mod2", "mod3"]) """) + self.cmd_executes("report --skip-covered", """\ + .coverage() + .load() + .report(skip_covered=True) + """) def test_run(self): # coverage run [-p] [-L] [--timid] MODULE.py [ARG1 ARG2 ...] diff --git a/tests/test_codeunit.py b/tests/test_codeunit.py index fe82ea1c..49981264 100644 --- a/tests/test_codeunit.py +++ b/tests/test_codeunit.py @@ -7,7 +7,7 @@ from coverage.files import FileLocator from tests.coveragetest import CoverageTest -# pylint: disable=F0401 +# pylint: disable=import-error # Unable to import 'aa' (No module named aa) class CodeUnitTest(CoverageTest): diff --git a/tests/test_concurrency.py b/tests/test_concurrency.py index 6fbac4a6..02163d2f 100644 --- a/tests/test_concurrency.py +++ b/tests/test_concurrency.py @@ -10,17 +10,17 @@ from tests.coveragetest import CoverageTest # These libraries aren't always available, we'll skip tests if they aren't. try: - import eventlet # pylint: disable=import-error + import eventlet except ImportError: eventlet = None try: - import gevent # pylint: disable=import-error + import gevent except ImportError: gevent = None try: - import greenlet # pylint: disable=import-error + import greenlet except ImportError: greenlet = None diff --git a/tests/test_config.py b/tests/test_config.py index 232d2289..26a22222 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -209,6 +209,7 @@ class ConfigFileTest(CoverageTest): while True: show_missing= TruE + skip_covered = TruE [{section}html] @@ -272,6 +273,7 @@ class ConfigFileTest(CoverageTest): ["plugins.a_plugin", "plugins.another"] ) self.assertTrue(cov.config.show_missing) + self.assertTrue(cov.config.skip_covered) self.assertEqual(cov.config.html_dir, r"c:\tricky\dir.somewhere") self.assertEqual(cov.config.extra_css, "something/extra.css") self.assertEqual(cov.config.html_title, "Title & nums # nums!") @@ -295,6 +297,8 @@ class ConfigFileTest(CoverageTest): self.assert_config_settings_are_correct(cov) def test_config_file_settings_in_setupcfg(self): + # Configuration will be read from setup.cfg from sections prefixed with + # "coverage:" nested = self.LOTSA_SETTINGS.format(section="coverage:") self.make_file("setup.cfg", nested + "\n" + self.SETUP_CFG) cov = coverage.coverage() @@ -306,7 +310,7 @@ class ConfigFileTest(CoverageTest): include = foo """) self.make_file("setup.cfg", """\ - [run] + [coverage:run] omit = bar branch = true """) @@ -315,6 +319,16 @@ class ConfigFileTest(CoverageTest): self.assertEqual(cov.config.omit, None) self.assertEqual(cov.config.branch, False) + def test_setupcfg_only_if_prefixed(self): + self.make_file("setup.cfg", """\ + [run] + omit = bar + branch = true + """) + cov = coverage.coverage() + self.assertEqual(cov.config.omit, None) + self.assertEqual(cov.config.branch, False) + def test_non_ascii(self): self.make_file(".coveragerc", """\ [html] diff --git a/tests/test_farm.py b/tests/test_farm.py index 9e369cf3..661c67b7 100644 --- a/tests/test_farm.py +++ b/tests/test_farm.py @@ -3,7 +3,8 @@ import difflib, filecmp, fnmatch, glob, os, re, shutil, sys from nose.plugins.skip import SkipTest -from tests.backtest import run_command, execfile # pylint: disable=W0622 +from tests.backtest import run_command +from tests.backtest import execfile # pylint: disable=redefined-builtin from coverage.control import _TEST_NAME_FILE diff --git a/tests/test_misc.py b/tests/test_misc.py index 37191f67..977378d5 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -2,10 +2,11 @@ import sys -from coverage.misc import Hasher, file_be_gone +from coverage.misc import Hasher, file_be_gone, overrides from coverage import __version__, __url__ from tests.coveragetest import CoverageTest + class HasherTest(CoverageTest): """Test our wrapper of md5 hashing.""" @@ -79,3 +80,52 @@ class SetupPyTest(CoverageTest): self.assertGreater(len(long_description), 7) self.assertNotEqual(long_description[0].strip(), "") self.assertNotEqual(long_description[-1].strip(), "") + + +class OverridesTest(CoverageTest): + """Test plugins.py:overrides.""" + + run_in_temp_dir = False + + def test_overrides(self): + # pylint: disable=missing-docstring + class SomeBase(object): + def method1(self): + pass + + def method2(self): + pass + + class Derived1(SomeBase): + def method1(self): + pass + + self.assertTrue(overrides(Derived1(), "method1", SomeBase)) + self.assertFalse(overrides(Derived1(), "method2", SomeBase)) + + class FurtherDerived1(Derived1): + """Derive again from Derived1, inherit its method1.""" + pass + + self.assertTrue(overrides(FurtherDerived1(), "method1", SomeBase)) + self.assertFalse(overrides(FurtherDerived1(), "method2", SomeBase)) + + class FurtherDerived2(Derived1): + """Override the overridden method.""" + def method1(self): + pass + + self.assertTrue(overrides(FurtherDerived2(), "method1", SomeBase)) + self.assertFalse(overrides(FurtherDerived2(), "method2", SomeBase)) + + class Mixin(object): + """A mixin that overrides method1.""" + def method1(self): + pass + + class Derived2(Mixin, SomeBase): + """A class that gets the method from the mixin.""" + pass + + self.assertTrue(overrides(Derived2(), "method1", SomeBase)) + self.assertFalse(overrides(Derived2(), "method2", SomeBase)) diff --git a/tests/test_plugins.py b/tests/test_plugins.py index 83840ea3..f2658998 100644 --- a/tests/test_plugins.py +++ b/tests/test_plugins.py @@ -5,7 +5,7 @@ import sys from nose.plugins.skip import SkipTest import coverage -from coverage.plugin import Plugins, overrides +from coverage.plugin import Plugins import coverage.plugin @@ -137,7 +137,11 @@ class PluginTest(CoverageTest): cov.start() cov.stop() - def test_importing_myself(self): + +class FileTracerTest(CoverageTest): + """Tests of plugins that implement file_tracer.""" + + def test_plugin1(self): if sys.platform == 'win32': raise SkipTest("Plugin stuff is jank on windows.. fixing soon...") @@ -163,52 +167,33 @@ class PluginTest(CoverageTest): _, statements, _, _ = cov.analysis("/src/try_ABC.zz") self.assertEqual(statements, [105, 106, 107, 205, 206, 207]) + def test_plugin2(self): + self.make_file("render.py", """\ + def render(filename, linenum): + fiddle_around = 1 # vamp until ready + return "[{0} @ {1}]".format(filename, linenum) + """) + self.make_file("caller.py", """\ + from render import render -class OverridesTest(CoverageTest): - """Test plugins.py:overrides.""" - - run_in_temp_dir = False - - def test_overrides(self): - class SomeBase(object): - """Base class, two base methods.""" - def method1(self): - pass - - def method2(self): - pass - - class Derived1(SomeBase): - """Simple single inheritance.""" - def method1(self): - pass - - self.assertTrue(overrides(Derived1(), "method1", SomeBase)) - self.assertFalse(overrides(Derived1(), "method2", SomeBase)) - - class FurtherDerived1(Derived1): - """Derive again from Derived1, inherit its method1.""" - pass - - self.assertTrue(overrides(FurtherDerived1(), "method1", SomeBase)) - self.assertFalse(overrides(FurtherDerived1(), "method2", SomeBase)) + assert render("foo.html", 17) == "[foo.html @ 17]" + assert render("bar.html", 23) == "[bar.html @ 23]" + """) - class FurtherDerived2(Derived1): - """Override the overridden method.""" - def method1(self): - pass + cov = coverage.Coverage() + cov.config["run:plugins"] = ["tests.plugin2"] + cov.config["run:debug"] = ["trace"] - self.assertTrue(overrides(FurtherDerived2(), "method1", SomeBase)) - self.assertFalse(overrides(FurtherDerived2(), "method2", SomeBase)) + self.start_import_stop(cov, "caller") - class Mixin(object): - """A mixin that overrides method1.""" - def method1(self): - pass + print(self.stderr()) + cov._harvest_data() + print(cov.data.line_data()) - class Derived2(Mixin, SomeBase): - """A class that gets the method from the mixin.""" - pass + return # TODO: finish this test - self.assertTrue(overrides(Derived2(), "method1", SomeBase)) - self.assertFalse(overrides(Derived2(), "method2", SomeBase)) + _, statements, missing, _ = cov.analysis("simple.py") + self.assertEqual(statements, [1,2,3]) + self.assertEqual(missing, []) + _, statements, _, _ = cov.analysis("/src/try_ABC.zz") + self.assertEqual(statements, [105, 106, 107, 205, 206, 207]) diff --git a/tests/test_process.py b/tests/test_process.py index df26aaf5..09d4c207 100644 --- a/tests/test_process.py +++ b/tests/test_process.py @@ -713,7 +713,7 @@ class ProcessStartupTest(ProcessCoverageMixin, CoverageTest): data_file = .mycovdata """) self.set_environ("COVERAGE_PROCESS_START", "coverage.ini") - import main # pylint: disable=F0401,W0612 + import main # pylint: disable=import-error,unused-variable with open("out.txt") as f: self.assertEqual(f.read(), "Hello, world!\n") diff --git a/tests/test_summary.py b/tests/test_summary.py index ce668f76..21817a52 100644 --- a/tests/test_summary.py +++ b/tests/test_summary.py @@ -201,7 +201,6 @@ class SummaryTest(CoverageTest): self.assertEqual(out, 'x\ny\n') report = self.report_from_command("coverage report --show-missing") - # pylint: disable=C0301 # Name Stmts Miss Branch BrPart Cover Missing # ------------------------------------------------------- # main 1 0 0 0 100% @@ -224,6 +223,96 @@ class SummaryTest(CoverageTest): "TOTAL 11 2 8 3 63%" ) + def test_report_skip_covered_no_branches(self): + self.make_file("main.py", """ + import not_covered + + def normal(): + print("z") + normal() + """) + self.make_file("not_covered.py", """ + def not_covered(): + print("n") + """) + out = self.run_command("coverage run main.py") + self.assertEqual(out, "z\n") + report = self.report_from_command("coverage report --skip-covered") + + # Name Stmts Miss Cover + # --------------------------------- + # not_covered 2 1 50% + + self.assertEqual(self.line_count(report), 3, report) + squeezed = self.squeezed_lines(report) + self.assertEqual(squeezed[2], "not_covered 2 1 50%") + + def test_report_skip_covered_branches(self): + self.make_file("main.py", """ + import not_covered + + def normal(z): + if z: + print("z") + normal(True) + normal(False) + """) + self.make_file("not_covered.py", """ + def not_covered(n): + if n: + print("n") + not_covered(True) + """) + out = self.run_command("coverage run --branch main.py") + self.assertEqual(out, "n\nz\n") + report = self.report_from_command("coverage report --skip-covered") + + # Name Stmts Miss Branch BrPart Cover + # ----------------------------------------------- + # not_covered 4 0 2 1 83% + + self.assertEqual(self.line_count(report), 3, report) + squeezed = self.squeezed_lines(report) + self.assertEqual(squeezed[2], "not_covered 4 0 2 1 83%") + + def test_report_skip_covered_branches_with_totals(self): + self.make_file("main.py", """ + import not_covered + import also_not_run + + def normal(z): + if z: + print("z") + normal(True) + normal(False) + """) + self.make_file("not_covered.py", """ + def not_covered(n): + if n: + print("n") + not_covered(True) + """) + self.make_file("also_not_run.py", """ + def does_not_appear_in_this_film(ni): + print("Ni!") + """) + out = self.run_command("coverage run --branch main.py") + self.assertEqual(out, "n\nz\n") + report = self.report_from_command("coverage report --skip-covered") + + # Name Stmts Miss Branch BrPart Cover + # ----------------------------------------------- + # also_not_run 2 1 0 0 50% + # not_covered 4 0 2 1 83% + # ----------------------------------------------- + # TOTAL 6 1 2 1 75% + + self.assertEqual(self.line_count(report), 6, report) + squeezed = self.squeezed_lines(report) + self.assertEqual(squeezed[2], "also_not_run 2 1 0 0 50%") + self.assertEqual(squeezed[3], "not_covered 4 0 2 1 83%") + self.assertEqual(squeezed[5], "TOTAL 6 1 2 1 75%") + def test_dotpy_not_python(self): # We run a .py file, and when reporting, we can't parse it as Python. # We should get an error message in the report. @@ -232,7 +321,7 @@ class SummaryTest(CoverageTest): self.make_file("mycode.py", "This isn't python at all!") report = self.report_from_command("coverage report mycode.py") - # pylint: disable=C0301 + # pylint: disable=line-too-long # Name Stmts Miss Cover # ---------------------------- # mycode NotPython: Couldn't parse '/tmp/test_cover/63354509363/mycode.py' as Python source: 'invalid syntax' at line 1 @@ -298,7 +387,7 @@ class SummaryTest(CoverageTest): """) cov = coverage.coverage(branch=True, source=["."]) cov.start() - import main # pragma: nested # pylint: disable=F0401,W0612 + import main # pragma: nested # pylint: disable=import-error,unused-variable cov.stop() # pragma: nested report = self.get_report(cov).splitlines() self.assertIn("mybranch 5 5 2 0 0%", report) @@ -307,7 +396,7 @@ class SummaryTest(CoverageTest): """A helper for the next few tests.""" cov = coverage.coverage() cov.start() - import TheCode # pragma: nested # pylint: disable=F0401,W0612 + import TheCode # pragma: nested # pylint: disable=import-error,unused-variable cov.stop() # pragma: nested return self.get_report(cov) @@ -340,7 +429,7 @@ class SummaryTest(CoverageTest): """) cov = coverage.coverage() cov.start() - import start # pragma: nested # pylint: disable=F0401,W0612 + import start # pragma: nested # pylint: disable=import-error,unused-variable cov.stop() # pragma: nested report = self.get_report(cov) @@ -370,7 +459,7 @@ class SummaryTest2(CoverageTest): # statements, not one statement. cov = coverage.coverage() cov.start() - import usepkgs # pragma: nested # pylint: disable=F0401,W0612 + import usepkgs # pragma: nested # pylint: disable=import-error,unused-variable cov.stop() # pragma: nested repout = StringIO() diff --git a/tests/test_templite.py b/tests/test_templite.py index aa697b78..b3e21e70 100644 --- a/tests/test_templite.py +++ b/tests/test_templite.py @@ -4,9 +4,7 @@ import re from coverage.templite import Templite, TempliteSyntaxError from tests.coveragetest import CoverageTest -# pylint: disable=W0612,E1101 -# Disable W0612 (Unused variable) and -# E1101 (Instance of 'foo' has no 'bar' member) +# pylint: disable=unused-variable class AnyOldObject(object): """Simple testing object. diff --git a/tests/test_xml.py b/tests/test_xml.py index 37ada3cb..3c7d2361 100644 --- a/tests/test_xml.py +++ b/tests/test_xml.py @@ -80,7 +80,7 @@ class XmlReportTest(CoverageTest): def test_filename_format_including_module(self): cov = self.run_doit() - import sub.doit # pylint: disable=F0401 + import sub.doit # pylint: disable=import-error cov.xml_report([sub.doit], outfile="-") xml = self.stdout() doit_line = re_line(xml, "class.*doit") |