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