summaryrefslogtreecommitdiff
path: root/tests/test_context.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_context.py')
-rw-r--r--tests/test_context.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/tests/test_context.py b/tests/test_context.py
index ad010a37..919286c5 100644
--- a/tests/test_context.py
+++ b/tests/test_context.py
@@ -6,7 +6,9 @@
import os.path
import coverage
+from coverage import env
from coverage.data import CoverageData
+from coverage.misc import CoverageException
from tests.coveragetest import CoverageTest
@@ -102,3 +104,62 @@ class StaticContextTest(CoverageTest):
self.assertEqual(combined.arcs(fred, context='blue'), [])
self.assertEqual(combined.arcs(fblue, context='red'), [])
self.assertEqual(combined.arcs(fblue, context='blue'), self.ARCS)
+
+
+class DynamicContextTest(CoverageTest):
+ """Tests of dynamically changing contexts."""
+
+ def setUp(self):
+ super(DynamicContextTest, self).setUp()
+ self.skip_unless_data_storage_is("sql")
+ if not env.C_TRACER:
+ self.skipTest("Only the C tracer supports dynamic contexts")
+
+ def test_simple(self):
+ self.make_file("two_tests.py", """\
+ def helper(lineno):
+ x = 2
+
+ def test_one():
+ a = 5
+ helper(6)
+
+ def test_two():
+ a = 9
+ b = 10
+ if a > 11:
+ b = 12
+ assert a == (13-4)
+ assert b == (14-4)
+ helper(15)
+
+ test_one()
+ x = 18
+ helper(19)
+ test_two()
+ """)
+ cov = coverage.Coverage(source=["."])
+ cov.set_option("run:dynamic_context", "test_function")
+ self.start_import_stop(cov, "two_tests")
+ data = cov.get_data()
+
+ fname = os.path.abspath("two_tests.py")
+ self.assertCountEqual(data.measured_contexts(), ["", "test_one", "test_two"])
+ self.assertCountEqual(data.lines(fname, ""), [1, 4, 8, 17, 18, 19, 2, 20])
+ self.assertCountEqual(data.lines(fname, "test_one"), [5, 6, 2])
+ self.assertCountEqual(data.lines(fname, "test_two"), [9, 10, 11, 13, 14, 15, 2])
+
+
+class DynamicContextWithPythonTracerTest(CoverageTest):
+ """The Python tracer doesn't do dynamic contexts at all."""
+
+ run_in_temp_dir = False
+
+ def test_python_tracer_fails_properly(self):
+ if env.C_TRACER:
+ self.skipTest("This test is specifically about the Python tracer.")
+ cov = coverage.Coverage()
+ cov.set_option("run:dynamic_context", "test_function")
+ msg = r"Can't support dynamic contexts with PyTracer"
+ with self.assertRaisesRegex(CoverageException, msg):
+ cov.start()