summaryrefslogtreecommitdiff
path: root/python/subunit
diff options
context:
space:
mode:
Diffstat (limited to 'python/subunit')
-rw-r--r--python/subunit/test_results.py14
-rw-r--r--python/subunit/tests/test_test_results.py26
2 files changed, 34 insertions, 6 deletions
diff --git a/python/subunit/test_results.py b/python/subunit/test_results.py
index b3228c6..cf051ba 100644
--- a/python/subunit/test_results.py
+++ b/python/subunit/test_results.py
@@ -252,18 +252,22 @@ class TimeCollapsingDecorator(HookedTestResultDecorator):
def __init__(self, decorated):
HookedTestResultDecorator.__init__(self, decorated)
- self._last_time = None
+ self._last_received_time = None
+ self._last_sent_time = None
def _before_event(self):
- self.decorated.time(self._last_time)
- self._last_time = None
+ if self._last_received_time != self._last_sent_time:
+ self.decorated.time(self._last_received_time)
+ self._last_sent_time = self._last_received_time
+ self._last_received_time = None
def time(self, a_time):
# Don't upcall, because we don't want to call _before_event, it's only
# for non-time events.
- if self._last_time is None:
+ if self._last_received_time is None:
self.decorated.time(a_time)
- self._last_time = a_time
+ self._last_sent_time = a_time
+ self._last_received_time = a_time
def all_true(bools):
diff --git a/python/subunit/tests/test_test_results.py b/python/subunit/tests/test_test_results.py
index 8535d56..8633b44 100644
--- a/python/subunit/tests/test_test_results.py
+++ b/python/subunit/tests/test_test_results.py
@@ -223,13 +223,16 @@ class TestTimeCollapsingDecorator(TestCase):
2000, 1, self.getUniqueInteger(), tzinfo=iso8601.UTC)
def test_initial_time_forwarded(self):
+ # We always forward the first time event we see.
result = ExtendedTestResult()
tag_collapser = subunit.test_results.TimeCollapsingDecorator(result)
a_time = self.make_time()
tag_collapser.time(a_time)
self.assertEquals([('time', a_time)], result._events)
- def test_time_collapsed(self):
+ def test_time_collapsed_to_first_and_last(self):
+ # If there are many consecutive time events, only the first and last
+ # are sent through.
result = ExtendedTestResult()
tag_collapser = subunit.test_results.TimeCollapsingDecorator(result)
times = [self.make_time() for i in range(5)]
@@ -239,6 +242,27 @@ class TestTimeCollapsingDecorator(TestCase):
self.assertEquals(
[('time', times[0]), ('time', times[-1])], result._events[:-1])
+ def test_only_one_time_sent(self):
+ # If we receive a single time event followed by a non-time event, we
+ # send exactly one time event.
+ result = ExtendedTestResult()
+ tag_collapser = subunit.test_results.TimeCollapsingDecorator(result)
+ a_time = self.make_time()
+ tag_collapser.time(a_time)
+ tag_collapser.startTest(subunit.RemotedTestCase('foo'))
+ self.assertEquals([('time', a_time)], result._events[:-1])
+
+ def test_duplicate_times_not_sent(self):
+ # Many time events with the exact same time are collapsed into one
+ # time event.
+ result = ExtendedTestResult()
+ tag_collapser = subunit.test_results.TimeCollapsingDecorator(result)
+ a_time = self.make_time()
+ for i in range(5):
+ tag_collapser.time(a_time)
+ tag_collapser.startTest(subunit.RemotedTestCase('foo'))
+ self.assertEquals([('time', a_time)], result._events[:-1])
+
def test_suite():
loader = subunit.tests.TestUtil.TestLoader()