summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/backtest.py4
-rw-r--r--tests/plugin1.py5
-rw-r--r--tests/plugin2.py24
-rw-r--r--tests/test_api.py6
-rw-r--r--tests/test_cmdline.py9
-rw-r--r--tests/test_codeunit.py2
-rw-r--r--tests/test_concurrency.py6
-rw-r--r--tests/test_config.py16
-rw-r--r--tests/test_farm.py3
-rw-r--r--tests/test_misc.py52
-rw-r--r--tests/test_plugins.py75
-rw-r--r--tests/test_process.py2
-rw-r--r--tests/test_summary.py101
-rw-r--r--tests/test_templite.py4
-rw-r--r--tests/test_xml.py2
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")