summaryrefslogtreecommitdiff
path: root/test/test_cmdline.py
blob: abe8653d9ae33200ae6a3b522c38254514ce662d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
"""Test cmdline.py for coverage."""

import re, shlex, textwrap, unittest
import coverage
from coveragetest import CoverageTest


class CmdLineParserTest(CoverageTest):
    """Tests of command-line processing for Coverage."""

    def help_fn(self, error=None):
        """A mock help_fn to capture the error messages for tests."""
        raise Exception(error or "__doc__")

    def command_line(self, argv):
        """Run a Coverage command line, with `argv` as arguments."""
        return coverage.CoverageScript().command_line(argv, self.help_fn)

    def testHelp(self):
        self.assertRaisesMsg(Exception, "__doc__", self.command_line, ['-h'])
        self.assertRaisesMsg(Exception, "__doc__", self.command_line,
            ['--help'])

    def testUnknownOption(self):
        self.assertRaisesMsg(Exception, "option -z not recognized",
            self.command_line, ['-z'])

    def testBadActionCombinations(self):
        self.assertRaisesMsg(Exception,
            "You can't specify the 'erase' and 'annotate' "
            "options at the same time.", self.command_line, ['-e', '-a'])
        self.assertRaisesMsg(Exception,
            "You can't specify the 'erase' and 'report' "
            "options at the same time.", self.command_line, ['-e', '-r'])
        self.assertRaisesMsg(Exception,
            "You can't specify the 'erase' and 'html' "
            "options at the same time.", self.command_line, ['-e', '-b'])
        self.assertRaisesMsg(Exception,
            "You can't specify the 'erase' and 'combine' "
            "options at the same time.", self.command_line, ['-e', '-c'])
        self.assertRaisesMsg(Exception,
            "You can't specify the 'execute' and 'annotate' "
            "options at the same time.", self.command_line, ['-x', '-a'])
        self.assertRaisesMsg(Exception,
            "You can't specify the 'execute' and 'report' "
            "options at the same time.", self.command_line, ['-x', '-r'])
        self.assertRaisesMsg(Exception,
            "You can't specify the 'execute' and 'html' "
            "options at the same time.", self.command_line, ['-x', '-b'])
        self.assertRaisesMsg(Exception,
            "You can't specify the 'execute' and 'combine' "
            "options at the same time.", self.command_line, ['-x', '-c'])

    def testNeedAction(self):
        self.assertRaisesMsg(Exception,
            "You must specify at least one of -e, -x, -c, -r, -a, or -b.",
            self.command_line, ['-p'])

    def testArglessActions(self):
        self.assertRaisesMsg(Exception, "Unexpected arguments: foo bar",
            self.command_line, ['-e', 'foo', 'bar'])
        self.assertRaisesMsg(Exception, "Unexpected arguments: baz quux",
            self.command_line, ['-c', 'baz', 'quux'])


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 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)

        code = textwrap.dedent(code)
        code = re.sub(r"(?m)^\.", "m2.", code)
        m2 = self.model_object()
        code_obj = compile(code, "<code>", "exec")
        eval(code_obj, globals(), { 'm2': m2 })
        self.assertEqual(m1.method_calls, m2.method_calls)
        
    def testExecution(self):
        self.cmd_executes("-x foo.py", """\
            .coverage(cover_pylib=None, data_suffix=False, timid=None)
            .load()
            .start()
            .run_python_file('foo.py', ['foo.py'])
            .stop()
            .save()
            """)
        self.cmd_executes("-e -x foo.py", """\
            .coverage(cover_pylib=None, data_suffix=False, timid=None)
            .erase()
            .start()
            .run_python_file('foo.py', ['foo.py'])
            .stop()
            .save()
            """)


if __name__ == '__main__':
    unittest.main()