1import unittest 2 3 4class TestEquality(object): 5 """Used as a mixin for TestCase""" 6 7 # Check for a valid __eq__ implementation 8 def test_eq(self): 9 for obj_1, obj_2 in self.eq_pairs: 10 self.assertEqual(obj_1, obj_2) 11 self.assertEqual(obj_2, obj_1) 12 13 # Check for a valid __ne__ implementation 14 def test_ne(self): 15 for obj_1, obj_2 in self.ne_pairs: 16 self.assertNotEqual(obj_1, obj_2) 17 self.assertNotEqual(obj_2, obj_1) 18 19class TestHashing(object): 20 """Used as a mixin for TestCase""" 21 22 # Check for a valid __hash__ implementation 23 def test_hash(self): 24 for obj_1, obj_2 in self.eq_pairs: 25 try: 26 if not hash(obj_1) == hash(obj_2): 27 self.fail("%r and %r do not hash equal" % (obj_1, obj_2)) 28 except Exception as e: 29 self.fail("Problem hashing %r and %r: %s" % (obj_1, obj_2, e)) 30 31 for obj_1, obj_2 in self.ne_pairs: 32 try: 33 if hash(obj_1) == hash(obj_2): 34 self.fail("%s and %s hash equal, but shouldn't" % 35 (obj_1, obj_2)) 36 except Exception as e: 37 self.fail("Problem hashing %s and %s: %s" % (obj_1, obj_2, e)) 38 39 40class _BaseLoggingResult(unittest.TestResult): 41 def __init__(self, log): 42 self._events = log 43 super().__init__() 44 45 def startTest(self, test): 46 self._events.append('startTest') 47 super().startTest(test) 48 49 def startTestRun(self): 50 self._events.append('startTestRun') 51 super().startTestRun() 52 53 def stopTest(self, test): 54 self._events.append('stopTest') 55 super().stopTest(test) 56 57 def stopTestRun(self): 58 self._events.append('stopTestRun') 59 super().stopTestRun() 60 61 def addFailure(self, *args): 62 self._events.append('addFailure') 63 super().addFailure(*args) 64 65 def addSuccess(self, *args): 66 self._events.append('addSuccess') 67 super().addSuccess(*args) 68 69 def addError(self, *args): 70 self._events.append('addError') 71 super().addError(*args) 72 73 def addSkip(self, *args): 74 self._events.append('addSkip') 75 super().addSkip(*args) 76 77 def addExpectedFailure(self, *args): 78 self._events.append('addExpectedFailure') 79 super().addExpectedFailure(*args) 80 81 def addUnexpectedSuccess(self, *args): 82 self._events.append('addUnexpectedSuccess') 83 super().addUnexpectedSuccess(*args) 84 85 86class LegacyLoggingResult(_BaseLoggingResult): 87 """ 88 A legacy TestResult implementation, without an addSubTest method, 89 which records its method calls. 90 """ 91 92 @property 93 def addSubTest(self): 94 raise AttributeError 95 96 97class LoggingResult(_BaseLoggingResult): 98 """ 99 A TestResult implementation which records its method calls. 100 """ 101 102 def addSubTest(self, test, subtest, err): 103 if err is None: 104 self._events.append('addSubTestSuccess') 105 else: 106 self._events.append('addSubTestFailure') 107 super().addSubTest(test, subtest, err) 108 109 110class ResultWithNoStartTestRunStopTestRun(object): 111 """An object honouring TestResult before startTestRun/stopTestRun.""" 112 113 def __init__(self): 114 self.failures = [] 115 self.errors = [] 116 self.testsRun = 0 117 self.skipped = [] 118 self.expectedFailures = [] 119 self.unexpectedSuccesses = [] 120 self.shouldStop = False 121 122 def startTest(self, test): 123 pass 124 125 def stopTest(self, test): 126 pass 127 128 def addError(self, test): 129 pass 130 131 def addFailure(self, test): 132 pass 133 134 def addSuccess(self, test): 135 pass 136 137 def wasSuccessful(self): 138 return True 139