| import sys | 
 | import warnings | 
 |  | 
 | import unittest2 | 
 |  | 
 |  | 
 | def resultFactory(*_): | 
 |     return unittest2.TestResult() | 
 |  | 
 |  | 
 | class OldTestResult(object): | 
 |     """An object honouring TestResult before startTestRun/stopTestRun.""" | 
 |  | 
 |     def __init__(self, *_): | 
 |         self.failures = [] | 
 |         self.errors = [] | 
 |         self.testsRun = 0 | 
 |         self.shouldStop = False | 
 |  | 
 |     def startTest(self, test): | 
 |         pass | 
 |  | 
 |     def stopTest(self, test): | 
 |         pass | 
 |  | 
 |     def addError(self, test, err): | 
 |         self.errors.append((test, err)) | 
 |  | 
 |     def addFailure(self, test, err): | 
 |         self.failures.append((test, err)) | 
 |  | 
 |     def addSuccess(self, test): | 
 |         pass | 
 |  | 
 |     def wasSuccessful(self): | 
 |         return True | 
 |  | 
 |     def printErrors(self): | 
 |         pass | 
 |  | 
 |  | 
 | class LoggingResult(unittest2.TestResult): | 
 |  | 
 |     def __init__(self, log): | 
 |         self._events = log | 
 |         super(LoggingResult, self).__init__() | 
 |  | 
 |     def startTest(self, test): | 
 |         self._events.append('startTest') | 
 |         super(LoggingResult, self).startTest(test) | 
 |  | 
 |     def startTestRun(self): | 
 |         self._events.append('startTestRun') | 
 |         super(LoggingResult, self).startTestRun() | 
 |  | 
 |     def stopTest(self, test): | 
 |         self._events.append('stopTest') | 
 |         super(LoggingResult, self).stopTest(test) | 
 |  | 
 |     def stopTestRun(self): | 
 |         self._events.append('stopTestRun') | 
 |         super(LoggingResult, self).stopTestRun() | 
 |  | 
 |     def addFailure(self, *args): | 
 |         self._events.append('addFailure') | 
 |         super(LoggingResult, self).addFailure(*args) | 
 |  | 
 |     def addSuccess(self, *args): | 
 |         self._events.append('addSuccess') | 
 |         super(LoggingResult, self).addSuccess(*args) | 
 |  | 
 |     def addError(self, *args): | 
 |         self._events.append('addError') | 
 |         super(LoggingResult, self).addError(*args) | 
 |  | 
 |     def addSkip(self, *args): | 
 |         self._events.append('addSkip') | 
 |         super(LoggingResult, self).addSkip(*args) | 
 |  | 
 |     def addExpectedFailure(self, *args): | 
 |         self._events.append('addExpectedFailure') | 
 |         super(LoggingResult, self).addExpectedFailure(*args) | 
 |  | 
 |     def addUnexpectedSuccess(self, *args): | 
 |         self._events.append('addUnexpectedSuccess') | 
 |         super(LoggingResult, self).addUnexpectedSuccess(*args) | 
 |  | 
 |  | 
 | class EqualityMixin(object): | 
 |     """Used as a mixin for TestCase""" | 
 |  | 
 |     # Check for a valid __eq__ implementation | 
 |     def test_eq(self): | 
 |         for obj_1, obj_2 in self.eq_pairs: | 
 |             self.assertEqual(obj_1, obj_2) | 
 |             self.assertEqual(obj_2, obj_1) | 
 |  | 
 |     # Check for a valid __ne__ implementation | 
 |     def test_ne(self): | 
 |         for obj_1, obj_2 in self.ne_pairs: | 
 |             self.assertNotEqual(obj_1, obj_2) | 
 |             self.assertNotEqual(obj_2, obj_1) | 
 |  | 
 |  | 
 | class HashingMixin(object): | 
 |     """Used as a mixin for TestCase""" | 
 |  | 
 |     # Check for a valid __hash__ implementation | 
 |     def test_hash(self): | 
 |         for obj_1, obj_2 in self.eq_pairs: | 
 |             try: | 
 |                 if not hash(obj_1) == hash(obj_2): | 
 |                     self.fail("%r and %r do not hash equal" % (obj_1, obj_2)) | 
 |             except KeyboardInterrupt: | 
 |                 raise | 
 |             except Exception as e: | 
 |                 self.fail("Problem hashing %r and %r: %s" % (obj_1, obj_2, e)) | 
 |  | 
 |         for obj_1, obj_2 in self.ne_pairs: | 
 |             try: | 
 |                 if hash(obj_1) == hash(obj_2): | 
 |                     self.fail("%s and %s hash equal, but shouldn't" % | 
 |                               (obj_1, obj_2)) | 
 |             except KeyboardInterrupt: | 
 |                 raise | 
 |             except Exception as e: | 
 |                 self.fail("Problem hashing %s and %s: %s" % (obj_1, obj_2, e)) | 
 |  | 
 |  | 
 | # copied from Python 2.6 | 
 | try: | 
 |     from warnings import catch_warnings | 
 | except ImportError: | 
 |     class catch_warnings(object): | 
 |  | 
 |         def __init__(self, record=False, module=None): | 
 |             self._record = record | 
 |             self._module = sys.modules['warnings'] | 
 |             self._entered = False | 
 |  | 
 |         def __repr__(self): | 
 |             args = [] | 
 |             if self._record: | 
 |                 args.append("record=True") | 
 |             name = type(self).__name__ | 
 |             return "%s(%s)" % (name, ", ".join(args)) | 
 |  | 
 |         def __enter__(self): | 
 |             if self._entered: | 
 |                 raise RuntimeError("Cannot enter %r twice" % self) | 
 |             self._entered = True | 
 |             self._filters = self._module.filters | 
 |             self._module.filters = self._filters[:] | 
 |             self._showwarning = self._module.showwarning | 
 |             if self._record: | 
 |                 log = [] | 
 |  | 
 |                 def showwarning(*args, **kwargs): | 
 |                     log.append(WarningMessage(*args, **kwargs)) | 
 |                 self._module.showwarning = showwarning | 
 |                 return log | 
 |             else: | 
 |                 return None | 
 |  | 
 |         def __exit__(self, *exc_info): | 
 |             if not self._entered: | 
 |                 raise RuntimeError( | 
 |                     "Cannot exit %r without entering first" % | 
 |                     self) | 
 |             self._module.filters = self._filters | 
 |             self._module.showwarning = self._showwarning | 
 |  | 
 |     class WarningMessage(object): | 
 |         _WARNING_DETAILS = ( | 
 |             "message", | 
 |             "category", | 
 |             "filename", | 
 |             "lineno", | 
 |             "file", | 
 |             "line") | 
 |  | 
 |         def __init__(self, message, category, filename, lineno, file=None, | 
 |                      line=None): | 
 |             local_values = locals() | 
 |             for attr in self._WARNING_DETAILS: | 
 |                 setattr(self, attr, local_values[attr]) | 
 |             self._category_name = None | 
 |             if category.__name__: | 
 |                 self._category_name = category.__name__ |