summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO.txt4
-rw-r--r--test/test_cmdline.py212
2 files changed, 205 insertions, 11 deletions
diff --git a/TODO.txt b/TODO.txt
index 65ea5828..d18129a9 100644
--- a/TODO.txt
+++ b/TODO.txt
@@ -156,12 +156,12 @@ x Tricky swapping of collector like figleaf, pycov, et al. (Don't need to do
+ Switch to a real test runner, like nose.
+ Test both the C trace function and the Python trace function.
- Tests about the .coverage file.
-- Tests about the --long-form of arguments.
++ Tests about the --long-form of arguments.
+ Tests about overriding the .coverage filename.
- Tests about parallel mode.
+ Tests about assigning a multi-line string.
- Tests about tricky docstrings.
-- Coverage test Coverage!
++ Coverage test Coverage!
- Tests that tracing stops after calling stop()
- More intensive thread testing.
x Tests about the "import __main__" in cmdline.py
diff --git a/test/test_cmdline.py b/test/test_cmdline.py
index b8a12ba8..37aac338 100644
--- a/test/test_cmdline.py
+++ b/test/test_cmdline.py
@@ -1,6 +1,7 @@
"""Test cmdline.py for coverage."""
import re, shlex, textwrap, unittest
+import mock
import coverage
from coveragetest import CoverageTest
@@ -82,25 +83,32 @@ class CmdLineParserTest(CoverageTest):
help_out="Unexpected arguments: baz quux"
)
+ def testNothingToDo(self):
+ self.command_line('-x', ret=1,
+ help_out="Nothing to do."
+ )
+
class CmdLineActionTest(CoverageTest):
"""Tests of execution paths through the command line interpreter."""
def model_object(self):
"""Return a Mock suitable for use in CoverageScript."""
- import mock
mk = mock.Mock()
mk.coverage.return_value = mk
return mk
-
+
+ def run_command_line(self, args):
+ """Run `args` through command_line, returning the Mock it used."""
+ m = self.model_object()
+ coverage.CoverageScript(
+ _covpkg=m, _run_python_file=m.run_python_file
+ ).command_line(shlex.split(args))
+ return m
+
def cmd_executes(self, args, code):
"""Assert that the `args` end up executing the sequence in `code`."""
- argv = shlex.split(args)
- m1 = self.model_object()
-
- coverage.CoverageScript(
- _covpkg=m1, _run_python_file=m1.run_python_file
- ).command_line(argv)
+ m1 = self.run_command_line(args)
code = textwrap.dedent(code)
code = re.sub(r"(?m)^\.", "m2.", code)
@@ -109,7 +117,24 @@ class CmdLineActionTest(CoverageTest):
eval(code_obj, globals(), { 'm2': m2 })
self.assertEqual(m1.method_calls, m2.method_calls)
- def testExecution(self):
+ def cmd_executes_same(self, args1, args2):
+ """Assert that the `args1` executes the same as `args2`."""
+ m1 = self.run_command_line(args1)
+ m2 = self.run_command_line(args2)
+ self.assertEqual(m1.method_calls, m2.method_calls)
+
+ def testErase(self):
+ # coverage -e
+ self.cmd_executes("-e", """\
+ .coverage(cover_pylib=None, data_suffix=False, timid=None)
+ .erase()
+ """)
+ self.cmd_executes_same("-e", "--erase")
+
+ def testExecute(self):
+ # coverage -x [-p] [-L] [--timid] MODULE.py [ARG1 ARG2 ...]
+
+ # -x calls coverage.load first.
self.cmd_executes("-x foo.py", """\
.coverage(cover_pylib=None, data_suffix=False, timid=None)
.load()
@@ -118,6 +143,7 @@ class CmdLineActionTest(CoverageTest):
.stop()
.save()
""")
+ # -e -x calls coverage.erase first.
self.cmd_executes("-e -x foo.py", """\
.coverage(cover_pylib=None, data_suffix=False, timid=None)
.erase()
@@ -126,6 +152,174 @@ class CmdLineActionTest(CoverageTest):
.stop()
.save()
""")
+ # --timid sets a flag, and program arguments get passed through.
+ self.cmd_executes("-x --timid foo.py abc 123", """\
+ .coverage(cover_pylib=None, data_suffix=False, timid=True)
+ .load()
+ .start()
+ .run_python_file('foo.py', ['foo.py', 'abc', '123'])
+ .stop()
+ .save()
+ """)
+ # -L sets a flag, and flags for the program don't confuse us.
+ self.cmd_executes("-x -p -L foo.py -a -b", """\
+ .coverage(cover_pylib=True, data_suffix=True, timid=None)
+ .load()
+ .start()
+ .run_python_file('foo.py', ['foo.py', '-a', '-b'])
+ .stop()
+ .save()
+ """)
+
+ # Check that long forms of flags do the same thing as short forms.
+ self.cmd_executes_same("-x f.py", "--execute f.py")
+ self.cmd_executes_same("-e -x f.py", "--erase --execute f.py")
+ self.cmd_executes_same("-x -p f.py", "-x --parallel-mode f.py")
+ self.cmd_executes_same("-x -L f.py", "-x --pylib f.py")
+
+ def testCombine(self):
+ # coverage -c
+ self.cmd_executes("-c", """\
+ .coverage(cover_pylib=None, data_suffix=False, timid=None)
+ .load()
+ .combine()
+ .save()
+ """)
+ self.cmd_executes_same("-c", "--combine")
+
+ def testReport(self):
+ # coverage -r [-m] [-i] [-o DIR,...] [FILE1 FILE2 ...]
+
+ init_load = """\
+ .coverage(cover_pylib=None, data_suffix=False, timid=None)
+ .load()\n"""
+
+ self.cmd_executes("-r", init_load + """\
+ .report(ignore_errors=None, omit_prefixes=None, morfs=[],
+ show_missing=None)
+ """)
+ self.cmd_executes("-r -i", init_load + """\
+ .report(ignore_errors=True, omit_prefixes=None, morfs=[],
+ show_missing=None)
+ """)
+ self.cmd_executes("-r -m", init_load + """\
+ .report(ignore_errors=None, omit_prefixes=None, morfs=[],
+ show_missing=True)
+ """)
+ self.cmd_executes("-r -o fooey", init_load + """\
+ .report(ignore_errors=None, omit_prefixes=["fooey"],
+ morfs=[], show_missing=None)
+ """)
+ self.cmd_executes("-r -o fooey,booey", init_load + """\
+ .report(ignore_errors=None, omit_prefixes=["fooey", "booey"],
+ morfs=[], show_missing=None)
+ """)
+ self.cmd_executes("-r mod1", init_load + """\
+ .report(ignore_errors=None, omit_prefixes=None,
+ morfs=["mod1"], show_missing=None)
+ """)
+ self.cmd_executes("-r mod1 mod2 mod3", init_load + """\
+ .report(ignore_errors=None, omit_prefixes=None,
+ morfs=["mod1", "mod2", "mod3"], show_missing=None)
+ """)
+
+ self.cmd_executes_same("-r", "--report")
+ self.cmd_executes_same("-r -i", "-r --ignore-errors")
+ self.cmd_executes_same("-r -m", "-r --show-missing")
+ self.cmd_executes_same("-r -o f", "-r --omit=f")
+ self.cmd_executes_same("-r -o f", "-r --omit f")
+ self.cmd_executes_same("-r -o f,b", "-r --omit=f,b")
+ self.cmd_executes_same("-r -o f,b", "-r --omit f,b")
+ self.cmd_executes_same("-r -of", "-r --omit=f")
+ self.cmd_executes_same("-r -of,b", "-r --omit=f,b")
+
+ def testAnnotate(self):
+ # coverage -a [-d DIR] [-i] [-o DIR,...] [FILE1 FILE2 ...]
+ init_load = """\
+ .coverage(cover_pylib=None, data_suffix=False, timid=None)
+ .load()\n"""
+
+ self.cmd_executes("-a", init_load + """\
+ .annotate(directory=None, ignore_errors=None,
+ omit_prefixes=None, morfs=[])
+ """)
+ self.cmd_executes("-a -d dir1", init_load + """\
+ .annotate(directory="dir1", ignore_errors=None,
+ omit_prefixes=None, morfs=[])
+ """)
+ self.cmd_executes("-a -i", init_load + """\
+ .annotate(directory=None, ignore_errors=True,
+ omit_prefixes=None, morfs=[])
+ """)
+ self.cmd_executes("-a -o fooey", init_load + """\
+ .annotate(directory=None, ignore_errors=None,
+ omit_prefixes=["fooey"], morfs=[])
+ """)
+ self.cmd_executes("-a -o fooey,booey", init_load + """\
+ .annotate(directory=None, ignore_errors=None,
+ omit_prefixes=["fooey", "booey"], morfs=[])
+ """)
+ self.cmd_executes("-a mod1", init_load + """\
+ .annotate(directory=None, ignore_errors=None,
+ omit_prefixes=None, morfs=["mod1"])
+ """)
+ self.cmd_executes("-a mod1 mod2 mod3", init_load + """\
+ .annotate(directory=None, ignore_errors=None,
+ omit_prefixes=None, morfs=["mod1", "mod2", "mod3"])
+ """)
+
+ self.cmd_executes_same("-a", "--annotate")
+ self.cmd_executes_same("-a -d d1", "-a --directory=d1")
+ self.cmd_executes_same("-a -i", "-a --ignore-errors")
+ self.cmd_executes_same("-a -o f", "-a --omit=f")
+ self.cmd_executes_same("-a -o f", "-a --omit f")
+ self.cmd_executes_same("-a -o f,b", "-a --omit=f,b")
+ self.cmd_executes_same("-a -o f,b", "-a --omit f,b")
+ self.cmd_executes_same("-a -of", "-a --omit=f")
+ self.cmd_executes_same("-a -of,b", "-a --omit=f,b")
+
+ def testHtmlReport(self):
+ # coverage -b -d DIR [-i] [-o DIR,...] [FILE1 FILE2 ...]
+ init_load = """\
+ .coverage(cover_pylib=None, data_suffix=False, timid=None)
+ .load()\n"""
+
+ self.cmd_executes("-b", init_load + """\
+ .html_report(directory=None, ignore_errors=None,
+ omit_prefixes=None, morfs=[])
+ """)
+ self.cmd_executes("-b -d dir1", init_load + """\
+ .html_report(directory="dir1", ignore_errors=None,
+ omit_prefixes=None, morfs=[])
+ """)
+ self.cmd_executes("-b -i", init_load + """\
+ .html_report(directory=None, ignore_errors=True,
+ omit_prefixes=None, morfs=[])
+ """)
+ self.cmd_executes("-b -o fooey", init_load + """\
+ .html_report(directory=None, ignore_errors=None,
+ omit_prefixes=["fooey"], morfs=[])
+ """)
+ self.cmd_executes("-b -o fooey,booey", init_load + """\
+ .html_report(directory=None, ignore_errors=None,
+ omit_prefixes=["fooey", "booey"], morfs=[])
+ """)
+ self.cmd_executes("-b mod1", init_load + """\
+ .html_report(directory=None, ignore_errors=None,
+ omit_prefixes=None, morfs=["mod1"])
+ """)
+ self.cmd_executes("-b mod1 mod2 mod3", init_load + """\
+ .html_report(directory=None, ignore_errors=None,
+ omit_prefixes=None, morfs=["mod1", "mod2", "mod3"])
+ """)
+
+ self.cmd_executes_same("-b", "--html")
+ self.cmd_executes_same("-b -d d1", "-b --directory=d1")
+ self.cmd_executes_same("-b -i", "-b --ignore-errors")
+ self.cmd_executes_same("-b -o f", "-b --omit=f")
+ self.cmd_executes_same("-b -o f,b", "-b --omit=f,b")
+ self.cmd_executes_same("-b -of", "-b --omit=f")
+ self.cmd_executes_same("-b -of,b", "-b --omit=f,b")
if __name__ == '__main__':