summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2021-01-31 11:31:43 -0500
committerNed Batchelder <ned@nedbatchelder.com>2021-01-31 11:41:57 -0500
commitbf29fdcf295b32e88a7407c244a5c703f0499ca9 (patch)
tree88aae5e2e09dc2eec1103af6b2ddd3dc9f435139
parentf18dd6884665f915868d199917075682f7e2e151 (diff)
downloadpython-coveragepy-git-bf29fdcf295b32e88a7407c244a5c703f0499ca9.tar.gz
test: keep multi-assert arc diffs working
We don't have a way to do multi-assert in the pytest we're running, so cobble it together ourselves.
-rw-r--r--tests/coveragetest.py46
-rw-r--r--tests/test_arcs.py4
2 files changed, 23 insertions, 27 deletions
diff --git a/tests/coveragetest.py b/tests/coveragetest.py
index f7a5f6f8..c4a46da9 100644
--- a/tests/coveragetest.py
+++ b/tests/coveragetest.py
@@ -5,6 +5,7 @@
import contextlib
import datetime
+import difflib
import functools
import glob
import os
@@ -16,10 +17,7 @@ import sys
import types
import pytest
-from unittest_mixins import (
- EnvironmentAwareMixin, StdStreamCapturingMixin, TempDirMixin,
- DelayedAssertionMixin,
-)
+from unittest_mixins import EnvironmentAwareMixin, StdStreamCapturingMixin, TempDirMixin
import coverage
from coverage import env
@@ -67,7 +65,6 @@ class CoverageTest(
EnvironmentAwareMixin,
StdStreamCapturingMixin,
TempDirMixin,
- DelayedAssertionMixin,
CoverageTestMethodsMixin,
TestCase,
):
@@ -134,12 +131,22 @@ class CoverageTest(
self.last_module_name = 'coverage_test_' + str(random.random())[2:]
return self.last_module_name
- def _assert_equal_arcs(self, a1, a2, msg=None):
- """Assert that the arc lists `a1` and `a2` are equal."""
+ def _check_arcs(self, a1, a2, arc_type):
+ """Check that the arc lists `a1` and `a2` are equal.
+
+ If they are equal, return empty string. If they are unequal, return
+ a string explaining what is different.
+ """
# Make them into multi-line strings so we can see what's going wrong.
s1 = arcs_to_arcz_repr(a1)
s2 = arcs_to_arcz_repr(a2)
- assert s1 == s2, msg
+ if s1 != s2:
+ lines1 = s1.splitlines(keepends=True)
+ lines2 = s2.splitlines(keepends=True)
+ diff = "".join(difflib.ndiff(lines1, lines2))
+ return "\n" + arc_type + " arcs differ: minus is expected, plus is actual\n" + diff
+ else:
+ return ""
def check_coverage(
self, text, lines=None, missing="", report="",
@@ -225,21 +232,14 @@ class CoverageTest(
# print(" actual:", analysis.arc_possibilities())
# print("Executed:")
# print(" actual:", sorted(set(analysis.arcs_executed())))
- with self.delayed_assertions():
- self._assert_equal_arcs(
- arcs, analysis.arc_possibilities(),
- "Possible arcs differ: minus is expected, plus is actual"
- )
-
- self._assert_equal_arcs(
- arcs_missing, analysis.arcs_missing(),
- "Missing arcs differ: minus is expected, plus is actual"
- )
-
- self._assert_equal_arcs(
- arcs_unpredicted, analysis.arcs_unpredicted(),
- "Unpredicted arcs differ: minus is expected, plus is actual"
- )
+ # TODO: this would be nicer with pytest-check, once we can run that.
+ msg = (
+ self._check_arcs(arcs, analysis.arc_possibilities(), "Possible") +
+ self._check_arcs(arcs_missing, analysis.arcs_missing(), "Missing") +
+ self._check_arcs(arcs_unpredicted, analysis.arcs_unpredicted(), "Unpredicted")
+ )
+ if msg:
+ assert False, msg
if report:
frep = StringIO()
diff --git a/tests/test_arcs.py b/tests/test_arcs.py
index 2f49ecfb..3b63bcc2 100644
--- a/tests/test_arcs.py
+++ b/tests/test_arcs.py
@@ -270,13 +270,10 @@ class LoopArcTest(CoverageTest):
# With "while 1", the loop knows it's constant.
if env.PYBEHAVIOR.keep_constant_test:
arcz = ".1 12 23 34 45 36 62 57 7."
- arcz_missing = ""
elif env.PYBEHAVIOR.nix_while_true:
arcz = ".1 13 34 45 36 63 57 7."
- arcz_missing = ""
else:
arcz = ".1 12 23 34 45 36 63 57 7."
- arcz_missing = ""
self.check_coverage("""\
a, i = 1, 0
while 1:
@@ -287,7 +284,6 @@ class LoopArcTest(CoverageTest):
assert a == 4 and i == 3
""",
arcz=arcz,
- arcz_missing=arcz_missing,
)
def test_while_true(self):