From 6eb046c5937b9c78dab3451fae9348c4c721d6f9 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 2 Jan 2016 10:18:04 -0500 Subject: Handle yield-from and await. All tests pass --HG-- branch : ast-branch --- coverage/test_helpers.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'coverage/test_helpers.py') diff --git a/coverage/test_helpers.py b/coverage/test_helpers.py index 50cc3298..092daa07 100644 --- a/coverage/test_helpers.py +++ b/coverage/test_helpers.py @@ -162,20 +162,20 @@ class StdStreamCapturingMixin(TestCase): # nose keeps stdout from littering the screen, so we can safely Tee it, # but it doesn't capture stderr, so we don't want to Tee stderr to the # real stderr, since it will interfere with our nice field of dots. - self.old_stdout = sys.stdout + old_stdout = sys.stdout self.captured_stdout = StringIO() sys.stdout = Tee(sys.stdout, self.captured_stdout) - self.old_stderr = sys.stderr + old_stderr = sys.stderr self.captured_stderr = StringIO() sys.stderr = self.captured_stderr - self.addCleanup(self.cleanup_std_streams) + self.addCleanup(self.cleanup_std_streams, old_stdout, old_stderr) - def cleanup_std_streams(self): + def cleanup_std_streams(self, old_stdout, old_stderr): """Restore stdout and stderr.""" - sys.stdout = self.old_stdout - sys.stderr = self.old_stderr + sys.stdout = old_stdout + sys.stderr = old_stderr def stdout(self): """Return the data written to stdout during the test.""" -- cgit v1.2.1 From 78177f0bcdba89b74292405220463e9cb65d4f7a Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 4 Jan 2016 07:18:08 -0500 Subject: Add a delayed_assertions context manager --HG-- branch : ast-branch --- coverage/test_helpers.py | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'coverage/test_helpers.py') diff --git a/coverage/test_helpers.py b/coverage/test_helpers.py index 092daa07..84e2f1cf 100644 --- a/coverage/test_helpers.py +++ b/coverage/test_helpers.py @@ -186,6 +186,55 @@ class StdStreamCapturingMixin(TestCase): return self.captured_stderr.getvalue() +class DelayedAssertionMixin(TestCase): + """A test case mixin that provides a `delayed_assertions` context manager. + + Use it like this:: + + with self.delayed_assertions(): + self.assertEqual(x, y) + self.assertEqual(z, w) + + All of the assertions will run. The failures will be displayed at the end + of the with-statement. + + NOTE: only works with some assert methods, I'm not sure which! + + """ + def __init__(self, *args, **kwargs): + super(DelayedAssertionMixin, self).__init__(*args, **kwargs) + # This mixin only works with assert methods that call `self.fail`. In + # Python 2.7, `assertEqual` didn't, but we can do what Python 3 does, + # and use `assertMultiLineEqual` for comparing strings. + self.addTypeEqualityFunc(str, 'assertMultiLineEqual') + self._delayed_assertions = None + + @contextlib.contextmanager + def delayed_assertions(self): + """The context manager: assert that we didn't collect any assertions.""" + self._delayed_assertions = [] + old_fail = self.fail + self.fail = self._delayed_fail + try: + yield + finally: + self.fail = old_fail + if self._delayed_assertions: + if len(self._delayed_assertions) == 1: + self.fail(self._delayed_assertions[0]) + else: + self.fail( + "{} failed assertions:\n{}".format( + len(self._delayed_assertions), + "\n".join(self._delayed_assertions), + ) + ) + + def _delayed_fail(self, msg=None): + """The stand-in for TestCase.fail during delayed_assertions.""" + self._delayed_assertions.append(msg) + + class TempDirMixin(SysPathAwareMixin, ModuleAwareMixin, TestCase): """A test case mixin that creates a temp directory and files in it. -- cgit v1.2.1 From 3cf8dd01dcef141902604567b537224d6918ba67 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 4 Jan 2016 07:21:03 -0500 Subject: Fix 2.6, as usual --HG-- branch : ast-branch --- coverage/test_helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'coverage/test_helpers.py') diff --git a/coverage/test_helpers.py b/coverage/test_helpers.py index 84e2f1cf..1d606aae 100644 --- a/coverage/test_helpers.py +++ b/coverage/test_helpers.py @@ -224,7 +224,7 @@ class DelayedAssertionMixin(TestCase): self.fail(self._delayed_assertions[0]) else: self.fail( - "{} failed assertions:\n{}".format( + "{0} failed assertions:\n{1}".format( len(self._delayed_assertions), "\n".join(self._delayed_assertions), ) -- cgit v1.2.1 From 6e50c427ea3be052cb976cfadda31f25bd06181c Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 4 Jan 2016 09:31:55 -0500 Subject: Clarify when delayed_assertions is known to work. --HG-- branch : ast-branch --- coverage/test_helpers.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'coverage/test_helpers.py') diff --git a/coverage/test_helpers.py b/coverage/test_helpers.py index 1d606aae..a76bed35 100644 --- a/coverage/test_helpers.py +++ b/coverage/test_helpers.py @@ -198,7 +198,11 @@ class DelayedAssertionMixin(TestCase): All of the assertions will run. The failures will be displayed at the end of the with-statement. - NOTE: only works with some assert methods, I'm not sure which! + NOTE: this only works with some assertions. These are known to work: + + - `assertEqual(str, str)` + + - `assertMultilineEqual(str, str)` """ def __init__(self, *args, **kwargs): -- cgit v1.2.1