1865e931eec3712e1dfe81ed4ba9aa5288ecfa9d
[obnox/samba/samba-obnox.git] / lib / testtools / testtools / testresult / doubles.py
1 # Copyright (c) 2009-2010 testtools developers. See LICENSE for details.
2
3 """Doubles of test result objects, useful for testing unittest code."""
4
5 __all__ = [
6     'Python26TestResult',
7     'Python27TestResult',
8     'ExtendedTestResult',
9     ]
10
11
12 from testtools.tags import TagContext
13
14
15 class LoggingBase(object):
16     """Basic support for logging of results."""
17
18     def __init__(self):
19         self._events = []
20         self.shouldStop = False
21         self._was_successful = True
22         self.testsRun = 0
23
24
25 class Python26TestResult(LoggingBase):
26     """A precisely python 2.6 like test result, that logs."""
27
28     def addError(self, test, err):
29         self._was_successful = False
30         self._events.append(('addError', test, err))
31
32     def addFailure(self, test, err):
33         self._was_successful = False
34         self._events.append(('addFailure', test, err))
35
36     def addSuccess(self, test):
37         self._events.append(('addSuccess', test))
38
39     def startTest(self, test):
40         self._events.append(('startTest', test))
41         self.testsRun += 1
42
43     def stop(self):
44         self.shouldStop = True
45
46     def stopTest(self, test):
47         self._events.append(('stopTest', test))
48
49     def wasSuccessful(self):
50         return self._was_successful
51
52
53 class Python27TestResult(Python26TestResult):
54     """A precisely python 2.7 like test result, that logs."""
55
56     def __init__(self):
57         super(Python27TestResult, self).__init__()
58         self.failfast = False
59
60     def addError(self, test, err):
61         super(Python27TestResult, self).addError(test, err)
62         if self.failfast:
63             self.stop()
64
65     def addFailure(self, test, err):
66         super(Python27TestResult, self).addFailure(test, err)
67         if self.failfast:
68             self.stop()
69
70     def addExpectedFailure(self, test, err):
71         self._events.append(('addExpectedFailure', test, err))
72
73     def addSkip(self, test, reason):
74         self._events.append(('addSkip', test, reason))
75
76     def addUnexpectedSuccess(self, test):
77         self._events.append(('addUnexpectedSuccess', test))
78         if self.failfast:
79             self.stop()
80
81     def startTestRun(self):
82         self._events.append(('startTestRun',))
83
84     def stopTestRun(self):
85         self._events.append(('stopTestRun',))
86
87
88 class ExtendedTestResult(Python27TestResult):
89     """A test result like the proposed extended unittest result API."""
90
91     def __init__(self):
92         super(ExtendedTestResult, self).__init__()
93         self._tags = TagContext()
94
95     def addError(self, test, err=None, details=None):
96         self._was_successful = False
97         self._events.append(('addError', test, err or details))
98
99     def addFailure(self, test, err=None, details=None):
100         self._was_successful = False
101         self._events.append(('addFailure', test, err or details))
102
103     def addExpectedFailure(self, test, err=None, details=None):
104         self._events.append(('addExpectedFailure', test, err or details))
105
106     def addSkip(self, test, reason=None, details=None):
107         self._events.append(('addSkip', test, reason or details))
108
109     def addSuccess(self, test, details=None):
110         if details:
111             self._events.append(('addSuccess', test, details))
112         else:
113             self._events.append(('addSuccess', test))
114
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))
119         else:
120             self._events.append(('addUnexpectedSuccess', test))
121
122     def progress(self, offset, whence):
123         self._events.append(('progress', offset, whence))
124
125     def startTestRun(self):
126         super(ExtendedTestResult, self).startTestRun()
127         self._was_successful = True
128         self._tags = TagContext()
129
130     def startTest(self, test):
131         super(ExtendedTestResult, self).startTest(test)
132         self._tags = TagContext(self._tags)
133
134     def stopTest(self, test):
135         self._tags = self._tags.parent
136         super(ExtendedTestResult, self).stopTest(test)
137
138     @property
139     def current_tags(self):
140         return self._tags.get_current_tags()
141
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))
145
146     def time(self, time):
147         self._events.append(('time', time))
148
149     def wasSuccessful(self):
150         return self._was_successful