1 # Copyright (c) 2009-2010 testtools developers. See LICENSE for details.
3 """Doubles of test result objects, useful for testing unittest code."""
12 from testtools.tags import TagContext
15 class LoggingBase(object):
16 """Basic support for logging of results."""
20 self.shouldStop = False
21 self._was_successful = True
25 class Python26TestResult(LoggingBase):
26 """A precisely python 2.6 like test result, that logs."""
28 def addError(self, test, err):
29 self._was_successful = False
30 self._events.append(('addError', test, err))
32 def addFailure(self, test, err):
33 self._was_successful = False
34 self._events.append(('addFailure', test, err))
36 def addSuccess(self, test):
37 self._events.append(('addSuccess', test))
39 def startTest(self, test):
40 self._events.append(('startTest', test))
44 self.shouldStop = True
46 def stopTest(self, test):
47 self._events.append(('stopTest', test))
49 def wasSuccessful(self):
50 return self._was_successful
53 class Python27TestResult(Python26TestResult):
54 """A precisely python 2.7 like test result, that logs."""
57 super(Python27TestResult, self).__init__()
60 def addError(self, test, err):
61 super(Python27TestResult, self).addError(test, err)
65 def addFailure(self, test, err):
66 super(Python27TestResult, self).addFailure(test, err)
70 def addExpectedFailure(self, test, err):
71 self._events.append(('addExpectedFailure', test, err))
73 def addSkip(self, test, reason):
74 self._events.append(('addSkip', test, reason))
76 def addUnexpectedSuccess(self, test):
77 self._events.append(('addUnexpectedSuccess', test))
81 def startTestRun(self):
82 self._events.append(('startTestRun',))
84 def stopTestRun(self):
85 self._events.append(('stopTestRun',))
88 class ExtendedTestResult(Python27TestResult):
89 """A test result like the proposed extended unittest result API."""
92 super(ExtendedTestResult, self).__init__()
93 self._tags = TagContext()
95 def addError(self, test, err=None, details=None):
96 self._was_successful = False
97 self._events.append(('addError', test, err or details))
99 def addFailure(self, test, err=None, details=None):
100 self._was_successful = False
101 self._events.append(('addFailure', test, err or details))
103 def addExpectedFailure(self, test, err=None, details=None):
104 self._events.append(('addExpectedFailure', test, err or details))
106 def addSkip(self, test, reason=None, details=None):
107 self._events.append(('addSkip', test, reason or details))
109 def addSuccess(self, test, details=None):
111 self._events.append(('addSuccess', test, details))
113 self._events.append(('addSuccess', test))
115 def addUnexpectedSuccess(self, test, details=None):
116 self._was_successful = False
117 if details is not None:
118 self._events.append(('addUnexpectedSuccess', test, details))
120 self._events.append(('addUnexpectedSuccess', test))
122 def progress(self, offset, whence):
123 self._events.append(('progress', offset, whence))
125 def startTestRun(self):
126 super(ExtendedTestResult, self).startTestRun()
127 self._was_successful = True
128 self._tags = TagContext()
130 def startTest(self, test):
131 super(ExtendedTestResult, self).startTest(test)
132 self._tags = TagContext(self._tags)
134 def stopTest(self, test):
135 self._tags = self._tags.parent
136 super(ExtendedTestResult, self).stopTest(test)
139 def current_tags(self):
140 return self._tags.get_current_tags()
142 def tags(self, new_tags, gone_tags):
143 self._tags.change_tags(new_tags, gone_tags)
144 self._events.append(('tags', new_tags, gone_tags))
146 def time(self, time):
147 self._events.append(('time', time))
149 def wasSuccessful(self):
150 return self._was_successful