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
12class LoggingBase(object):
13    """Basic support for logging of results."""
14
15    def __init__(self):
16        self._events = []
17        self.shouldStop = False
18        self._was_successful = True
19
20
21class Python26TestResult(LoggingBase):
22    """A precisely python 2.6 like test result, that logs."""
23
24    def addError(self, test, err):
25        self._was_successful = False
26        self._events.append(('addError', test, err))
27
28    def addFailure(self, test, err):
29        self._was_successful = False
30        self._events.append(('addFailure', test, err))
31
32    def addSuccess(self, test):
33        self._events.append(('addSuccess', test))
34
35    def startTest(self, test):
36        self._events.append(('startTest', test))
37
38    def stop(self):
39        self.shouldStop = True
40
41    def stopTest(self, test):
42        self._events.append(('stopTest', test))
43
44    def wasSuccessful(self):
45        return self._was_successful
46
47
48class Python27TestResult(Python26TestResult):
49    """A precisely python 2.7 like test result, that logs."""
50
51    def addExpectedFailure(self, test, err):
52        self._events.append(('addExpectedFailure', test, err))
53
54    def addSkip(self, test, reason):
55        self._events.append(('addSkip', test, reason))
56
57    def addUnexpectedSuccess(self, test):
58        self._events.append(('addUnexpectedSuccess', test))
59
60    def startTestRun(self):
61        self._events.append(('startTestRun',))
62
63    def stopTestRun(self):
64        self._events.append(('stopTestRun',))
65
66
67class ExtendedTestResult(Python27TestResult):
68    """A test result like the proposed extended unittest result API."""
69
70    def addError(self, test, err=None, details=None):
71        self._was_successful = False
72        self._events.append(('addError', test, err or details))
73
74    def addFailure(self, test, err=None, details=None):
75        self._was_successful = False
76        self._events.append(('addFailure', test, err or details))
77
78    def addExpectedFailure(self, test, err=None, details=None):
79        self._events.append(('addExpectedFailure', test, err or details))
80
81    def addSkip(self, test, reason=None, details=None):
82        self._events.append(('addSkip', test, reason or details))
83
84    def addSuccess(self, test, details=None):
85        if details:
86            self._events.append(('addSuccess', test, details))
87        else:
88            self._events.append(('addSuccess', test))
89
90    def addUnexpectedSuccess(self, test, details=None):
91        self._was_successful = False
92        if details is not None:
93            self._events.append(('addUnexpectedSuccess', test, details))
94        else:
95            self._events.append(('addUnexpectedSuccess', test))
96
97    def progress(self, offset, whence):
98        self._events.append(('progress', offset, whence))
99
100    def startTestRun(self):
101        super(ExtendedTestResult, self).startTestRun()
102        self._was_successful = True
103
104    def tags(self, new_tags, gone_tags):
105        self._events.append(('tags', new_tags, gone_tags))
106
107    def time(self, time):
108        self._events.append(('time', time))
109
110    def wasSuccessful(self):
111        return self._was_successful
112