| 
									
										
										
										
											2009-07-19 20:18:21 +00:00
										 |  |  | """Test case implementation""" | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-19 20:18:21 +00:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | import functools | 
					
						
							| 
									
										
										
										
											2009-07-19 20:18:21 +00:00
										 |  |  | import difflib | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | import pprint | 
					
						
							|  |  |  | import re | 
					
						
							| 
									
										
										
										
											2009-03-31 19:59:14 +00:00
										 |  |  | import warnings | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  | from . import result | 
					
						
							| 
									
										
										
										
											2010-03-20 03:00:34 +00:00
										 |  |  | from .util import ( | 
					
						
							|  |  |  |     strclass, safe_repr, sorted_list_difference, unorderable_list_difference | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2009-03-23 21:50:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-22 00:06:30 +00:00
										 |  |  | __unittest = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-23 21:50:21 +00:00
										 |  |  | class SkipTest(Exception): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Raise this exception in a test to skip it. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Usually you can use TestResult.skip() or one of the skipping decorators | 
					
						
							|  |  |  |     instead of raising this directly. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class _ExpectedFailure(Exception): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Raise this when a test is expected to fail. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This is an implementation detail. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, exc_info): | 
					
						
							|  |  |  |         super(_ExpectedFailure, self).__init__() | 
					
						
							|  |  |  |         self.exc_info = exc_info | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class _UnexpectedSuccess(Exception): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     The test was supposed to fail, but it didn't! | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def _id(obj): | 
					
						
							|  |  |  |     return obj | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def skip(reason): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Unconditionally skip a test. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     def decorator(test_item): | 
					
						
							| 
									
										
										
										
											2010-03-07 20:22:12 +00:00
										 |  |  |         if not (isinstance(test_item, type) and issubclass(test_item, TestCase)): | 
					
						
							|  |  |  |             @functools.wraps(test_item) | 
					
						
							|  |  |  |             def skip_wrapper(*args, **kwargs): | 
					
						
							|  |  |  |                 raise SkipTest(reason) | 
					
						
							|  |  |  |             test_item = skip_wrapper | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         test_item.__unittest_skip__ = True | 
					
						
							|  |  |  |         test_item.__unittest_skip_why__ = reason | 
					
						
							|  |  |  |         return test_item | 
					
						
							| 
									
										
										
										
											2009-03-23 21:50:21 +00:00
										 |  |  |     return decorator | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def skipIf(condition, reason): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Skip a test if the condition is true. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if condition: | 
					
						
							|  |  |  |         return skip(reason) | 
					
						
							|  |  |  |     return _id | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def skipUnless(condition, reason): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Skip a test unless the condition is true. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if not condition: | 
					
						
							|  |  |  |         return skip(reason) | 
					
						
							|  |  |  |     return _id | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def expectedFailure(func): | 
					
						
							|  |  |  |     @functools.wraps(func) | 
					
						
							|  |  |  |     def wrapper(*args, **kwargs): | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             func(*args, **kwargs) | 
					
						
							|  |  |  |         except Exception: | 
					
						
							|  |  |  |             raise _ExpectedFailure(sys.exc_info()) | 
					
						
							|  |  |  |         raise _UnexpectedSuccess | 
					
						
							|  |  |  |     return wrapper | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-24 00:35:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | class _AssertRaisesContext(object): | 
					
						
							|  |  |  |     """A context manager used to implement TestCase.assertRaises* methods.""" | 
					
						
							| 
									
										
										
										
											2009-03-24 00:35:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |     def __init__(self, expected, test_case, expected_regexp=None): | 
					
						
							| 
									
										
										
										
											2008-12-28 14:09:36 +00:00
										 |  |  |         self.expected = expected | 
					
						
							|  |  |  |         self.failureException = test_case.failureException | 
					
						
							| 
									
										
										
										
											2010-02-07 11:34:15 +00:00
										 |  |  |         self.expected_regexp = expected_regexp | 
					
						
							| 
									
										
										
										
											2009-03-24 00:35:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-28 14:09:36 +00:00
										 |  |  |     def __enter__(self): | 
					
						
							| 
									
										
										
										
											2010-02-07 18:44:12 +00:00
										 |  |  |         return self | 
					
						
							| 
									
										
										
										
											2009-03-24 00:35:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-18 19:26:19 +00:00
										 |  |  |     def __exit__(self, exc_type, exc_value, tb): | 
					
						
							| 
									
										
										
										
											2008-12-28 14:09:36 +00:00
										 |  |  |         if exc_type is None: | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 exc_name = self.expected.__name__ | 
					
						
							|  |  |  |             except AttributeError: | 
					
						
							|  |  |  |                 exc_name = str(self.expected) | 
					
						
							|  |  |  |             raise self.failureException( | 
					
						
							|  |  |  |                 "{0} not raised".format(exc_name)) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |         if not issubclass(exc_type, self.expected): | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |             # let unexpected exceptions pass through | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |             return False | 
					
						
							| 
									
										
										
										
											2010-02-07 17:02:22 +00:00
										 |  |  |         self.exception = exc_value # store for later retrieval | 
					
						
							| 
									
										
										
										
											2010-02-07 11:34:15 +00:00
										 |  |  |         if self.expected_regexp is None: | 
					
						
							| 
									
										
										
										
											2008-12-28 14:09:36 +00:00
										 |  |  |             return True | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 11:34:15 +00:00
										 |  |  |         expected_regexp = self.expected_regexp | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |         if isinstance(expected_regexp, basestring): | 
					
						
							|  |  |  |             expected_regexp = re.compile(expected_regexp) | 
					
						
							|  |  |  |         if not expected_regexp.search(str(exc_value)): | 
					
						
							|  |  |  |             raise self.failureException('"%s" does not match "%s"' % | 
					
						
							|  |  |  |                      (expected_regexp.pattern, str(exc_value))) | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-28 14:09:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-28 16:01:11 +00:00
										 |  |  | class TestCase(object): | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |     """A class whose instances are single test cases.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     By default, the test code itself should be placed in a method named | 
					
						
							|  |  |  |     'runTest'. | 
					
						
							| 
									
										
										
										
											2001-03-22 08:45:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-03-29 04:36:09 +00:00
										 |  |  |     If the fixture may be used for many test cases, create as | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |     many test methods as are needed. When instantiating such a TestCase | 
					
						
							|  |  |  |     subclass, specify in the constructor arguments the name of the test method | 
					
						
							|  |  |  |     that the instance is to execute. | 
					
						
							| 
									
										
										
										
											2001-03-22 08:45:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-03-29 04:36:09 +00:00
										 |  |  |     Test authors should subclass TestCase for their own tests. Construction | 
					
						
							| 
									
										
										
										
											2001-03-22 08:45:36 +00:00
										 |  |  |     and deconstruction of the test's environment ('fixture') can be | 
					
						
							|  |  |  |     implemented by overriding the 'setUp' and 'tearDown' methods respectively. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     If it is necessary to override the __init__ method, the base class | 
					
						
							|  |  |  |     __init__ method must always be called. It is important that subclasses | 
					
						
							|  |  |  |     should not change the signature of their __init__ method, since instances | 
					
						
							|  |  |  |     of the classes are instantiated automatically by parts of the framework | 
					
						
							|  |  |  |     in order to be run. | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2001-04-12 09:05:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # This attribute determines which exception will be raised when | 
					
						
							|  |  |  |     # the instance's assertion methods fail; test methods raising this | 
					
						
							|  |  |  |     # exception will be deemed to have 'failed' rather than 'errored' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     failureException = AssertionError | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |     # This attribute determines whether long messages (including repr of | 
					
						
							|  |  |  |     # objects used in assert methods) will be printed on failure in *addition* | 
					
						
							|  |  |  |     # to any explicit message passed. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     longMessage = False | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-07 22:04:55 +00:00
										 |  |  |     # Attribute used by TestSuite for classSetUp | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     _classSetupFailed = False | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |     def __init__(self, methodName='runTest'): | 
					
						
							|  |  |  |         """Create an instance of the class that will use the named test
 | 
					
						
							|  |  |  |            method when executed. Raises a ValueError if the instance does | 
					
						
							|  |  |  |            not have a method with the specified name. | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2009-03-24 00:35:20 +00:00
										 |  |  |         self._testMethodName = methodName | 
					
						
							| 
									
										
										
										
											2009-05-21 22:57:02 +00:00
										 |  |  |         self._resultForDoCleanups = None | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2001-03-22 08:45:36 +00:00
										 |  |  |             testMethod = getattr(self, methodName) | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |         except AttributeError: | 
					
						
							| 
									
										
										
										
											2010-02-18 21:37:07 +00:00
										 |  |  |             raise ValueError("no such test method in %s: %s" % | 
					
						
							| 
									
										
										
										
											2008-12-28 16:01:11 +00:00
										 |  |  |                   (self.__class__, methodName)) | 
					
						
							| 
									
										
										
										
											2009-03-24 00:35:20 +00:00
										 |  |  |         self._testMethodDoc = testMethod.__doc__ | 
					
						
							| 
									
										
										
										
											2009-05-02 20:15:05 +00:00
										 |  |  |         self._cleanups = [] | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |         # Map types to custom assertEqual functions that will compare | 
					
						
							|  |  |  |         # instances of said type in more detail to generate a more useful | 
					
						
							|  |  |  |         # error message. | 
					
						
							| 
									
										
										
										
											2009-04-01 23:15:49 +00:00
										 |  |  |         self._type_equality_funcs = {} | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |         self.addTypeEqualityFunc(dict, self.assertDictEqual) | 
					
						
							|  |  |  |         self.addTypeEqualityFunc(list, self.assertListEqual) | 
					
						
							|  |  |  |         self.addTypeEqualityFunc(tuple, self.assertTupleEqual) | 
					
						
							|  |  |  |         self.addTypeEqualityFunc(set, self.assertSetEqual) | 
					
						
							|  |  |  |         self.addTypeEqualityFunc(frozenset, self.assertSetEqual) | 
					
						
							| 
									
										
										
										
											2010-02-08 22:41:16 +00:00
										 |  |  |         self.addTypeEqualityFunc(unicode, self.assertMultiLineEqual) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def addTypeEqualityFunc(self, typeobj, function): | 
					
						
							|  |  |  |         """Add a type specific assertEqual style function to compare a type.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         This method is for use by TestCase subclasses that need to register | 
					
						
							|  |  |  |         their own type equality functions to provide nicer error messages. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Args: | 
					
						
							|  |  |  |             typeobj: The data type to call this function on when both values | 
					
						
							|  |  |  |                     are of the same type in assertEqual(). | 
					
						
							|  |  |  |             function: The callable taking two arguments and an optional | 
					
						
							|  |  |  |                     msg= argument that raises self.failureException with a | 
					
						
							|  |  |  |                     useful error message when the two arguments are not equal. | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2009-11-29 22:26:26 +00:00
										 |  |  |         self._type_equality_funcs[typeobj] = function | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-02 20:15:05 +00:00
										 |  |  |     def addCleanup(self, function, *args, **kwargs): | 
					
						
							|  |  |  |         """Add a function, with arguments, to be called when the test is
 | 
					
						
							|  |  |  |         completed. Functions added are called on a LIFO basis and are | 
					
						
							|  |  |  |         called after tearDown on test failure or success. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Cleanup items are called even if setUp fails (unlike tearDown)."""
 | 
					
						
							|  |  |  |         self._cleanups.append((function, args, kwargs)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |     def setUp(self): | 
					
						
							|  |  |  |         "Hook method for setting up the test fixture before exercising it." | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         "Hook method for deconstructing the test fixture after testing it." | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-07 22:04:55 +00:00
										 |  |  |     @classmethod | 
					
						
							|  |  |  |     def setUpClass(cls): | 
					
						
							|  |  |  |         "Hook method for setting up class fixture before running tests in the class." | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def tearDownClass(cls): | 
					
						
							|  |  |  |         "Hook method for deconstructing the class fixture after running all tests in the class." | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |     def countTestCases(self): | 
					
						
							|  |  |  |         return 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def defaultTestResult(self): | 
					
						
							| 
									
										
										
										
											2009-07-19 20:18:21 +00:00
										 |  |  |         return result.TestResult() | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def shortDescription(self): | 
					
						
							| 
									
										
										
										
											2010-02-10 14:25:12 +00:00
										 |  |  |         """Returns a one-line description of the test, or None if no
 | 
					
						
							|  |  |  |         description has been provided. | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-10 14:25:12 +00:00
										 |  |  |         The default implementation of this method returns the first line of | 
					
						
							|  |  |  |         the specified test method's docstring. | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2010-02-10 14:25:12 +00:00
										 |  |  |         doc = self._testMethodDoc | 
					
						
							|  |  |  |         return doc and doc.split("\n")[0].strip() or None | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def id(self): | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |         return "%s.%s" % (strclass(self.__class__), self._testMethodName) | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-07 09:09:40 +00:00
										 |  |  |     def __eq__(self, other): | 
					
						
							|  |  |  |         if type(self) is not type(other): | 
					
						
							| 
									
										
										
										
											2009-03-24 00:35:20 +00:00
										 |  |  |             return NotImplemented | 
					
						
							| 
									
										
										
										
											2007-03-07 09:09:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return self._testMethodName == other._testMethodName | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __ne__(self, other): | 
					
						
							|  |  |  |         return not self == other | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __hash__(self): | 
					
						
							| 
									
										
										
										
											2007-03-09 23:30:39 +00:00
										 |  |  |         return hash((type(self), self._testMethodName)) | 
					
						
							| 
									
										
										
										
											2007-03-07 09:09:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |     def __str__(self): | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |         return "%s (%s)" % (self._testMethodName, strclass(self.__class__)) | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def __repr__(self): | 
					
						
							|  |  |  |         return "<%s testMethod=%s>" % \ | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |                (strclass(self.__class__), self._testMethodName) | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-22 23:28:32 +00:00
										 |  |  |     def _addSkip(self, result, reason): | 
					
						
							|  |  |  |         addSkip = getattr(result, 'addSkip', None) | 
					
						
							|  |  |  |         if addSkip is not None: | 
					
						
							|  |  |  |             addSkip(self, reason) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             warnings.warn("TestResult has no addSkip method, skips not reported", | 
					
						
							|  |  |  |                           RuntimeWarning, 2) | 
					
						
							|  |  |  |             result.addSuccess(self) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |     def run(self, result=None): | 
					
						
							| 
									
										
										
										
											2009-05-02 22:43:34 +00:00
										 |  |  |         orig_result = result | 
					
						
							| 
									
										
										
										
											2009-03-24 00:35:20 +00:00
										 |  |  |         if result is None: | 
					
						
							|  |  |  |             result = self.defaultTestResult() | 
					
						
							| 
									
										
										
										
											2009-05-02 22:43:34 +00:00
										 |  |  |             startTestRun = getattr(result, 'startTestRun', None) | 
					
						
							|  |  |  |             if startTestRun is not None: | 
					
						
							|  |  |  |                 startTestRun() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-21 22:57:02 +00:00
										 |  |  |         self._resultForDoCleanups = result | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |         result.startTest(self) | 
					
						
							| 
									
										
										
										
											2010-03-07 20:22:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         testMethod = getattr(self, self._testMethodName) | 
					
						
							|  |  |  |         if (getattr(self.__class__, "__unittest_skip__", False) or | 
					
						
							|  |  |  |             getattr(testMethod, "__unittest_skip__", False)): | 
					
						
							|  |  |  |             # If the class or method was skipped. | 
					
						
							| 
									
										
										
										
											2009-05-25 00:48:58 +00:00
										 |  |  |             try: | 
					
						
							| 
									
										
										
										
											2010-03-07 20:22:12 +00:00
										 |  |  |                 skip_why = (getattr(self.__class__, '__unittest_skip_why__', '') | 
					
						
							|  |  |  |                             or getattr(testMethod, '__unittest_skip_why__', '')) | 
					
						
							|  |  |  |                 self._addSkip(result, skip_why) | 
					
						
							| 
									
										
										
										
											2009-05-25 00:48:58 +00:00
										 |  |  |             finally: | 
					
						
							|  |  |  |                 result.stopTest(self) | 
					
						
							|  |  |  |             return | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2009-03-23 21:50:21 +00:00
										 |  |  |             success = False | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |             try: | 
					
						
							| 
									
										
										
										
											2009-05-02 20:15:05 +00:00
										 |  |  |                 self.setUp() | 
					
						
							| 
									
										
										
										
											2009-03-23 21:50:21 +00:00
										 |  |  |             except SkipTest as e: | 
					
						
							| 
									
										
										
										
											2010-02-22 23:28:32 +00:00
										 |  |  |                 self._addSkip(result, str(e)) | 
					
						
							| 
									
										
										
										
											2008-12-28 16:01:11 +00:00
										 |  |  |             except Exception: | 
					
						
							| 
									
										
										
										
											2009-03-26 16:32:23 +00:00
										 |  |  |                 result.addError(self, sys.exc_info()) | 
					
						
							| 
									
										
										
										
											2009-03-23 21:50:21 +00:00
										 |  |  |             else: | 
					
						
							| 
									
										
										
										
											2009-05-02 20:15:05 +00:00
										 |  |  |                 try: | 
					
						
							|  |  |  |                     testMethod() | 
					
						
							|  |  |  |                 except self.failureException: | 
					
						
							|  |  |  |                     result.addFailure(self, sys.exc_info()) | 
					
						
							|  |  |  |                 except _ExpectedFailure as e: | 
					
						
							| 
									
										
										
										
											2010-02-22 23:28:32 +00:00
										 |  |  |                     addExpectedFailure = getattr(result, 'addExpectedFailure', None) | 
					
						
							|  |  |  |                     if addExpectedFailure is not None: | 
					
						
							|  |  |  |                         addExpectedFailure(self, e.exc_info) | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         warnings.warn("TestResult has no addExpectedFailure method, reporting as passes", | 
					
						
							|  |  |  |                                       RuntimeWarning) | 
					
						
							|  |  |  |                         result.addSuccess(self) | 
					
						
							| 
									
										
										
										
											2009-05-02 20:15:05 +00:00
										 |  |  |                 except _UnexpectedSuccess: | 
					
						
							| 
									
										
										
										
											2010-02-22 23:28:32 +00:00
										 |  |  |                     addUnexpectedSuccess = getattr(result, 'addUnexpectedSuccess', None) | 
					
						
							|  |  |  |                     if addUnexpectedSuccess is not None: | 
					
						
							|  |  |  |                         addUnexpectedSuccess(self) | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         warnings.warn("TestResult has no addUnexpectedSuccess method, reporting as failures", | 
					
						
							|  |  |  |                                       RuntimeWarning) | 
					
						
							|  |  |  |                         result.addFailure(self, sys.exc_info()) | 
					
						
							| 
									
										
										
										
											2009-05-02 20:15:05 +00:00
										 |  |  |                 except SkipTest as e: | 
					
						
							| 
									
										
										
										
											2010-02-22 23:28:32 +00:00
										 |  |  |                     self._addSkip(result, str(e)) | 
					
						
							| 
									
										
										
										
											2009-05-02 20:15:05 +00:00
										 |  |  |                 except Exception: | 
					
						
							|  |  |  |                     result.addError(self, sys.exc_info()) | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     success = True | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-02 20:15:05 +00:00
										 |  |  |                 try: | 
					
						
							|  |  |  |                     self.tearDown() | 
					
						
							|  |  |  |                 except Exception: | 
					
						
							|  |  |  |                     result.addError(self, sys.exc_info()) | 
					
						
							|  |  |  |                     success = False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             cleanUpSuccess = self.doCleanups() | 
					
						
							|  |  |  |             success = success and cleanUpSuccess | 
					
						
							| 
									
										
										
										
											2009-03-23 21:50:21 +00:00
										 |  |  |             if success: | 
					
						
							|  |  |  |                 result.addSuccess(self) | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |         finally: | 
					
						
							|  |  |  |             result.stopTest(self) | 
					
						
							| 
									
										
										
										
											2009-05-02 22:43:34 +00:00
										 |  |  |             if orig_result is None: | 
					
						
							|  |  |  |                 stopTestRun = getattr(result, 'stopTestRun', None) | 
					
						
							|  |  |  |                 if stopTestRun is not None: | 
					
						
							|  |  |  |                     stopTestRun() | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-02 20:15:05 +00:00
										 |  |  |     def doCleanups(self): | 
					
						
							|  |  |  |         """Execute all cleanup functions. Normally called for you after
 | 
					
						
							|  |  |  |         tearDown."""
 | 
					
						
							| 
									
										
										
										
											2009-05-21 22:57:02 +00:00
										 |  |  |         result = self._resultForDoCleanups | 
					
						
							| 
									
										
										
										
											2009-05-02 20:15:05 +00:00
										 |  |  |         ok = True | 
					
						
							|  |  |  |         while self._cleanups: | 
					
						
							|  |  |  |             function, args, kwargs = self._cleanups.pop(-1) | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 function(*args, **kwargs) | 
					
						
							|  |  |  |             except Exception: | 
					
						
							|  |  |  |                 ok = False | 
					
						
							|  |  |  |                 result.addError(self, sys.exc_info()) | 
					
						
							|  |  |  |         return ok | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-12-04 21:21:53 +00:00
										 |  |  |     def __call__(self, *args, **kwds): | 
					
						
							|  |  |  |         return self.run(*args, **kwds) | 
					
						
							| 
									
										
										
										
											2003-09-22 11:08:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |     def debug(self): | 
					
						
							| 
									
										
										
										
											2001-03-22 08:45:36 +00:00
										 |  |  |         """Run the test without collecting errors in a TestResult""" | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |         self.setUp() | 
					
						
							| 
									
										
										
										
											2006-01-20 17:55:00 +00:00
										 |  |  |         getattr(self, self._testMethodName)() | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |         self.tearDown() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-26 20:05:50 +00:00
										 |  |  |     def skipTest(self, reason): | 
					
						
							| 
									
										
										
										
											2009-03-23 21:50:21 +00:00
										 |  |  |         """Skip this test.""" | 
					
						
							|  |  |  |         raise SkipTest(reason) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-12 09:05:01 +00:00
										 |  |  |     def fail(self, msg=None): | 
					
						
							|  |  |  |         """Fail immediately, with the given message.""" | 
					
						
							| 
									
										
										
										
											2008-12-28 16:01:11 +00:00
										 |  |  |         raise self.failureException(msg) | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 19:03:28 +00:00
										 |  |  |     def assertFalse(self, expr, msg=None): | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |         "Fail the test if the expression is true." | 
					
						
							| 
									
										
										
										
											2009-03-24 00:35:20 +00:00
										 |  |  |         if expr: | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             msg = self._formatMessage(msg, "%s is not False" % safe_repr(expr)) | 
					
						
							| 
									
										
										
										
											2009-03-24 00:35:20 +00:00
										 |  |  |             raise self.failureException(msg) | 
					
						
							| 
									
										
										
										
											2001-04-12 09:05:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 19:03:28 +00:00
										 |  |  |     def assertTrue(self, expr, msg=None): | 
					
						
							| 
									
										
										
										
											2001-04-12 09:05:01 +00:00
										 |  |  |         """Fail the test unless the expression is true.""" | 
					
						
							| 
									
										
										
										
											2009-03-24 00:35:20 +00:00
										 |  |  |         if not expr: | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             msg = self._formatMessage(msg, "%s is not True" % safe_repr(expr)) | 
					
						
							| 
									
										
										
										
											2009-03-24 00:35:20 +00:00
										 |  |  |             raise self.failureException(msg) | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |     def _formatMessage(self, msg, standardMsg): | 
					
						
							|  |  |  |         """Honour the longMessage attribute when generating failure messages.
 | 
					
						
							|  |  |  |         If longMessage is False this means: | 
					
						
							|  |  |  |         * Use only an explicit message if it is provided | 
					
						
							|  |  |  |         * Otherwise use the standard message for the assert | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         If longMessage is True: | 
					
						
							|  |  |  |         * Use the standard message | 
					
						
							|  |  |  |         * If an explicit message is provided, plus ' : ' and the explicit message | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         if not self.longMessage: | 
					
						
							|  |  |  |             return msg or standardMsg | 
					
						
							|  |  |  |         if msg is None: | 
					
						
							|  |  |  |             return standardMsg | 
					
						
							| 
									
										
										
										
											2010-03-07 20:22:12 +00:00
										 |  |  |         try: | 
					
						
							|  |  |  |             # don't switch to '{}' formatting in Python 2.X | 
					
						
							|  |  |  |             # it changes the way unicode input is handled | 
					
						
							|  |  |  |             return '%s : %s' % (standardMsg, msg) | 
					
						
							|  |  |  |         except UnicodeDecodeError: | 
					
						
							|  |  |  |             return  '%s : %s' % (safe_repr(standardMsg), safe_repr(msg)) | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 19:03:28 +00:00
										 |  |  |     def assertRaises(self, excClass, callableObj=None, *args, **kwargs): | 
					
						
							| 
									
										
										
										
											2001-04-12 09:05:01 +00:00
										 |  |  |         """Fail unless an exception of class excClass is thrown
 | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |            by callableObj when invoked with arguments args and keyword | 
					
						
							|  |  |  |            arguments kwargs. If a different type of exception is | 
					
						
							|  |  |  |            thrown, it will not be caught, and the test case will be | 
					
						
							|  |  |  |            deemed to have suffered an error, exactly as for an | 
					
						
							|  |  |  |            unexpected exception. | 
					
						
							| 
									
										
										
										
											2008-12-28 14:09:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |            If called with callableObj omitted or None, will return a | 
					
						
							|  |  |  |            context object used like this:: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-05 22:55:09 +00:00
										 |  |  |                 with self.assertRaises(SomeException): | 
					
						
							| 
									
										
										
										
											2008-12-28 14:09:36 +00:00
										 |  |  |                     do_something() | 
					
						
							| 
									
										
										
										
											2010-02-05 22:55:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |            The context manager keeps a reference to the exception as | 
					
						
							| 
									
										
										
										
											2010-02-08 21:52:08 +00:00
										 |  |  |            the 'exception' attribute. This allows you to inspect the | 
					
						
							| 
									
										
										
										
											2010-02-05 22:55:09 +00:00
										 |  |  |            exception after the assertion:: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                with self.assertRaises(SomeException) as cm: | 
					
						
							|  |  |  |                    do_something() | 
					
						
							| 
									
										
										
										
											2010-02-07 17:02:22 +00:00
										 |  |  |                the_exception = cm.exception | 
					
						
							| 
									
										
										
										
											2010-02-05 23:22:37 +00:00
										 |  |  |                self.assertEqual(the_exception.error_code, 3) | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |         context = _AssertRaisesContext(excClass, self) | 
					
						
							| 
									
										
										
										
											2008-12-28 14:09:36 +00:00
										 |  |  |         if callableObj is None: | 
					
						
							|  |  |  |             return context | 
					
						
							|  |  |  |         with context: | 
					
						
							| 
									
										
										
										
											2003-02-27 20:14:51 +00:00
										 |  |  |             callableObj(*args, **kwargs) | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |     def _getAssertEqualityFunc(self, first, second): | 
					
						
							|  |  |  |         """Get a detailed comparison function for the types of the two args.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Returns: A callable accepting (first, second, msg=None) that will | 
					
						
							|  |  |  |         raise a failure exception if first != second with a useful human | 
					
						
							|  |  |  |         readable error message for those types. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         # | 
					
						
							|  |  |  |         # NOTE(gregory.p.smith): I considered isinstance(first, type(second)) | 
					
						
							|  |  |  |         # and vice versa.  I opted for the conservative approach in case | 
					
						
							|  |  |  |         # subclasses are not intended to be compared in detail to their super | 
					
						
							|  |  |  |         # class instances using a type equality func.  This means testing | 
					
						
							|  |  |  |         # subtypes won't automagically use the detailed comparison.  Callers | 
					
						
							|  |  |  |         # should use their type specific assertSpamEqual method to compare | 
					
						
							|  |  |  |         # subclasses if the detailed comparison is desired and appropriate. | 
					
						
							|  |  |  |         # See the discussion in http://bugs.python.org/issue2578. | 
					
						
							|  |  |  |         # | 
					
						
							|  |  |  |         if type(first) is type(second): | 
					
						
							| 
									
										
										
										
											2009-04-02 05:51:54 +00:00
										 |  |  |             asserter = self._type_equality_funcs.get(type(first)) | 
					
						
							|  |  |  |             if asserter is not None: | 
					
						
							| 
									
										
										
										
											2009-11-29 22:26:26 +00:00
										 |  |  |                 return asserter | 
					
						
							| 
									
										
										
										
											2009-04-02 05:51:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |         return self._baseAssertEqual | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _baseAssertEqual(self, first, second, msg=None): | 
					
						
							|  |  |  |         """The default assertEqual implementation, not type specific.""" | 
					
						
							|  |  |  |         if not first == second: | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             standardMsg = '%s != %s' % (safe_repr(first), safe_repr(second)) | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |             msg = self._formatMessage(msg, standardMsg) | 
					
						
							|  |  |  |             raise self.failureException(msg) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 19:03:28 +00:00
										 |  |  |     def assertEqual(self, first, second, msg=None): | 
					
						
							| 
									
										
										
										
											2003-04-04 22:56:42 +00:00
										 |  |  |         """Fail if the two objects are unequal as determined by the '=='
 | 
					
						
							| 
									
										
										
										
											2001-03-22 08:45:36 +00:00
										 |  |  |            operator. | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |         assertion_func = self._getAssertEqualityFunc(first, second) | 
					
						
							|  |  |  |         assertion_func(first, second, msg=msg) | 
					
						
							| 
									
										
										
										
											2001-03-22 08:45:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 19:03:28 +00:00
										 |  |  |     def assertNotEqual(self, first, second, msg=None): | 
					
						
							| 
									
										
										
										
											2001-04-12 09:05:01 +00:00
										 |  |  |         """Fail if the two objects are equal as determined by the '=='
 | 
					
						
							| 
									
										
										
										
											2001-03-22 08:45:36 +00:00
										 |  |  |            operator. | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |         if not first != second: | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             msg = self._formatMessage(msg, '%s == %s' % (safe_repr(first), | 
					
						
							|  |  |  |                                                           safe_repr(second))) | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |             raise self.failureException(msg) | 
					
						
							| 
									
										
										
										
											2001-03-22 08:45:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-27 19:10:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def assertAlmostEqual(self, first, second, places=None, msg=None, delta=None): | 
					
						
							| 
									
										
										
										
											2002-12-29 17:59:24 +00:00
										 |  |  |         """Fail if the two objects are unequal as determined by their
 | 
					
						
							|  |  |  |            difference rounded to the given number of decimal places | 
					
						
							| 
									
										
										
										
											2010-03-27 19:10:11 +00:00
										 |  |  |            (default 7) and comparing to zero, or by comparing that the | 
					
						
							|  |  |  |            between the two objects is more than the given delta. | 
					
						
							| 
									
										
										
										
											2002-12-29 17:59:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-26 10:41:03 +00:00
										 |  |  |            Note that decimal places (from zero) are usually not the same | 
					
						
							| 
									
										
										
										
											2002-12-29 17:59:24 +00:00
										 |  |  |            as significant digits (measured from the most signficant digit). | 
					
						
							| 
									
										
										
										
											2009-09-13 16:40:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |            If the two objects compare equal then they will automatically | 
					
						
							|  |  |  |            compare almost equal. | 
					
						
							| 
									
										
										
										
											2002-12-29 17:59:24 +00:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2009-09-13 16:40:02 +00:00
										 |  |  |         if first == second: | 
					
						
							| 
									
										
										
										
											2010-03-27 19:10:11 +00:00
										 |  |  |             # shortcut | 
					
						
							| 
									
										
										
										
											2009-09-13 16:40:02 +00:00
										 |  |  |             return | 
					
						
							| 
									
										
										
										
											2010-03-27 19:10:11 +00:00
										 |  |  |         if delta is not None and places is not None: | 
					
						
							|  |  |  |             raise TypeError("specify delta or places not both") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if delta is not None: | 
					
						
							|  |  |  |             if abs(first - second) <= delta: | 
					
						
							|  |  |  |                 return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             standardMsg = '%s != %s within %s delta' % (safe_repr(first), | 
					
						
							|  |  |  |                                                         safe_repr(second), | 
					
						
							|  |  |  |                                                         safe_repr(delta)) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             if places is None: | 
					
						
							|  |  |  |                 places = 7 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if round(abs(second-first), places) == 0: | 
					
						
							|  |  |  |                 return | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             standardMsg = '%s != %s within %r places' % (safe_repr(first), | 
					
						
							|  |  |  |                                                           safe_repr(second), | 
					
						
							|  |  |  |                                                           places) | 
					
						
							| 
									
										
										
										
											2010-03-27 19:10:11 +00:00
										 |  |  |         msg = self._formatMessage(msg, standardMsg) | 
					
						
							|  |  |  |         raise self.failureException(msg) | 
					
						
							| 
									
										
										
										
											2002-12-29 17:59:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-27 19:10:11 +00:00
										 |  |  |     def assertNotAlmostEqual(self, first, second, places=None, msg=None, delta=None): | 
					
						
							| 
									
										
										
										
											2002-12-29 17:59:24 +00:00
										 |  |  |         """Fail if the two objects are equal as determined by their
 | 
					
						
							|  |  |  |            difference rounded to the given number of decimal places | 
					
						
							| 
									
										
										
										
											2010-03-27 19:10:11 +00:00
										 |  |  |            (default 7) and comparing to zero, or by comparing that the | 
					
						
							|  |  |  |            between the two objects is less than the given delta. | 
					
						
							| 
									
										
										
										
											2002-12-29 17:59:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-26 16:38:16 +00:00
										 |  |  |            Note that decimal places (from zero) are usually not the same | 
					
						
							| 
									
										
										
										
											2002-12-29 17:59:24 +00:00
										 |  |  |            as significant digits (measured from the most signficant digit). | 
					
						
							| 
									
										
										
										
											2009-09-13 16:40:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |            Objects that are equal automatically fail. | 
					
						
							| 
									
										
										
										
											2002-12-29 17:59:24 +00:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2010-03-27 19:10:11 +00:00
										 |  |  |         if delta is not None and places is not None: | 
					
						
							|  |  |  |             raise TypeError("specify delta or places not both") | 
					
						
							|  |  |  |         if delta is not None: | 
					
						
							|  |  |  |             if not (first == second) and abs(first - second) > delta: | 
					
						
							|  |  |  |                 return | 
					
						
							|  |  |  |             standardMsg = '%s == %s within %s delta' % (safe_repr(first), | 
					
						
							|  |  |  |                                                         safe_repr(second), | 
					
						
							|  |  |  |                                                         safe_repr(delta)) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             if places is None: | 
					
						
							|  |  |  |                 places = 7 | 
					
						
							|  |  |  |             if not (first == second) and round(abs(second-first), places) != 0: | 
					
						
							|  |  |  |                 return | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             standardMsg = '%s == %s within %r places' % (safe_repr(first), | 
					
						
							| 
									
										
										
										
											2010-03-27 19:10:11 +00:00
										 |  |  |                                                          safe_repr(second), | 
					
						
							|  |  |  |                                                          places) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         msg = self._formatMessage(msg, standardMsg) | 
					
						
							|  |  |  |         raise self.failureException(msg) | 
					
						
							| 
									
										
										
										
											2002-12-29 17:59:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-09-22 11:08:12 +00:00
										 |  |  |     # Synonyms for assertion methods | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 19:03:28 +00:00
										 |  |  |     # The plurals are undocumented.  Keep them that way to discourage use. | 
					
						
							|  |  |  |     # Do not add more.  Do not remove. | 
					
						
							|  |  |  |     # Going through a deprecation cycle on these would annoy many people. | 
					
						
							|  |  |  |     assertEquals = assertEqual | 
					
						
							|  |  |  |     assertNotEquals = assertNotEqual | 
					
						
							|  |  |  |     assertAlmostEquals = assertAlmostEqual | 
					
						
							|  |  |  |     assertNotAlmostEquals = assertNotAlmostEqual | 
					
						
							| 
									
										
										
										
											2010-02-10 14:31:30 +00:00
										 |  |  |     assert_ = assertTrue | 
					
						
							| 
									
										
										
										
											2009-03-31 19:03:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # These fail* assertion method names are pending deprecation and will | 
					
						
							| 
									
										
										
										
											2009-03-31 19:59:14 +00:00
										 |  |  |     # be a DeprecationWarning in 3.2; http://bugs.python.org/issue2578 | 
					
						
							| 
									
										
										
										
											2009-04-01 23:15:49 +00:00
										 |  |  |     def _deprecate(original_func): | 
					
						
							| 
									
										
										
										
											2009-03-31 19:59:14 +00:00
										 |  |  |         def deprecated_func(*args, **kwargs): | 
					
						
							|  |  |  |             warnings.warn( | 
					
						
							|  |  |  |                 'Please use {0} instead.'.format(original_func.__name__), | 
					
						
							|  |  |  |                 PendingDeprecationWarning, 2) | 
					
						
							|  |  |  |             return original_func(*args, **kwargs) | 
					
						
							|  |  |  |         return deprecated_func | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-01 23:15:49 +00:00
										 |  |  |     failUnlessEqual = _deprecate(assertEqual) | 
					
						
							|  |  |  |     failIfEqual = _deprecate(assertNotEqual) | 
					
						
							|  |  |  |     failUnlessAlmostEqual = _deprecate(assertAlmostEqual) | 
					
						
							|  |  |  |     failIfAlmostEqual = _deprecate(assertNotAlmostEqual) | 
					
						
							|  |  |  |     failUnless = _deprecate(assertTrue) | 
					
						
							|  |  |  |     failUnlessRaises = _deprecate(assertRaises) | 
					
						
							|  |  |  |     failIf = _deprecate(assertFalse) | 
					
						
							| 
									
										
										
										
											2001-03-22 08:45:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |     def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None): | 
					
						
							|  |  |  |         """An equality assertion for ordered sequences (like lists and tuples).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-29 19:35:39 +00:00
										 |  |  |         For the purposes of this function, a valid ordered sequence type is one | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |         which can be indexed, has a length, and has an equality operator. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Args: | 
					
						
							|  |  |  |             seq1: The first sequence to compare. | 
					
						
							|  |  |  |             seq2: The second sequence to compare. | 
					
						
							|  |  |  |             seq_type: The expected datatype of the sequences, or None if no | 
					
						
							|  |  |  |                     datatype should be enforced. | 
					
						
							|  |  |  |             msg: Optional message to use on failure instead of a list of | 
					
						
							|  |  |  |                     differences. | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2010-03-21 10:50:44 +00:00
										 |  |  |         if seq_type is not None: | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |             seq_type_name = seq_type.__name__ | 
					
						
							|  |  |  |             if not isinstance(seq1, seq_type): | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |                 raise self.failureException('First sequence is not a %s: %s' | 
					
						
							|  |  |  |                                         % (seq_type_name, safe_repr(seq1))) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |             if not isinstance(seq2, seq_type): | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |                 raise self.failureException('Second sequence is not a %s: %s' | 
					
						
							|  |  |  |                                         % (seq_type_name, safe_repr(seq2))) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |         else: | 
					
						
							|  |  |  |             seq_type_name = "sequence" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         differing = None | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             len1 = len(seq1) | 
					
						
							|  |  |  |         except (TypeError, NotImplementedError): | 
					
						
							|  |  |  |             differing = 'First %s has no length.    Non-sequence?' % ( | 
					
						
							|  |  |  |                     seq_type_name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if differing is None: | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 len2 = len(seq2) | 
					
						
							|  |  |  |             except (TypeError, NotImplementedError): | 
					
						
							|  |  |  |                 differing = 'Second %s has no length.    Non-sequence?' % ( | 
					
						
							|  |  |  |                         seq_type_name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if differing is None: | 
					
						
							|  |  |  |             if seq1 == seq2: | 
					
						
							|  |  |  |                 return | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             seq1_repr = safe_repr(seq1) | 
					
						
							|  |  |  |             seq2_repr = safe_repr(seq2) | 
					
						
							| 
									
										
										
										
											2009-05-25 20:36:56 +00:00
										 |  |  |             if len(seq1_repr) > 30: | 
					
						
							|  |  |  |                 seq1_repr = seq1_repr[:30] + '...' | 
					
						
							|  |  |  |             if len(seq2_repr) > 30: | 
					
						
							|  |  |  |                 seq2_repr = seq2_repr[:30] + '...' | 
					
						
							|  |  |  |             elements = (seq_type_name.capitalize(), seq1_repr, seq2_repr) | 
					
						
							|  |  |  |             differing = '%ss differ: %s != %s\n' % elements | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |             for i in xrange(min(len1, len2)): | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     item1 = seq1[i] | 
					
						
							|  |  |  |                 except (TypeError, IndexError, NotImplementedError): | 
					
						
							| 
									
										
										
										
											2009-05-25 20:36:56 +00:00
										 |  |  |                     differing += ('\nUnable to index element %d of first %s\n' % | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |                                  (i, seq_type_name)) | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     item2 = seq2[i] | 
					
						
							|  |  |  |                 except (TypeError, IndexError, NotImplementedError): | 
					
						
							| 
									
										
										
										
											2009-05-25 20:36:56 +00:00
										 |  |  |                     differing += ('\nUnable to index element %d of second %s\n' % | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |                                  (i, seq_type_name)) | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if item1 != item2: | 
					
						
							| 
									
										
										
										
											2009-05-25 20:36:56 +00:00
										 |  |  |                     differing += ('\nFirst differing element %d:\n%s\n%s\n' % | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |                                  (i, item1, item2)) | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 if (len1 == len2 and seq_type is None and | 
					
						
							|  |  |  |                     type(seq1) != type(seq2)): | 
					
						
							|  |  |  |                     # The sequences are the same, but have differing types. | 
					
						
							|  |  |  |                     return | 
					
						
							| 
									
										
										
										
											2009-05-25 20:36:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if len1 > len2: | 
					
						
							|  |  |  |                 differing += ('\nFirst %s contains %d additional ' | 
					
						
							|  |  |  |                              'elements.\n' % (seq_type_name, len1 - len2)) | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     differing += ('First extra element %d:\n%s\n' % | 
					
						
							|  |  |  |                                   (len2, seq1[len2])) | 
					
						
							|  |  |  |                 except (TypeError, IndexError, NotImplementedError): | 
					
						
							|  |  |  |                     differing += ('Unable to index element %d ' | 
					
						
							|  |  |  |                                   'of first %s\n' % (len2, seq_type_name)) | 
					
						
							|  |  |  |             elif len1 < len2: | 
					
						
							|  |  |  |                 differing += ('\nSecond %s contains %d additional ' | 
					
						
							|  |  |  |                              'elements.\n' % (seq_type_name, len2 - len1)) | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     differing += ('First extra element %d:\n%s\n' % | 
					
						
							|  |  |  |                                   (len1, seq2[len1])) | 
					
						
							|  |  |  |                 except (TypeError, IndexError, NotImplementedError): | 
					
						
							|  |  |  |                     differing += ('Unable to index element %d ' | 
					
						
							|  |  |  |                                   'of second %s\n' % (len1, seq_type_name)) | 
					
						
							| 
									
										
										
										
											2009-10-01 20:11:14 +00:00
										 |  |  |         standardMsg = differing + '\n' + '\n'.join( | 
					
						
							|  |  |  |             difflib.ndiff(pprint.pformat(seq1).splitlines(), | 
					
						
							|  |  |  |                           pprint.pformat(seq2).splitlines())) | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |         msg = self._formatMessage(msg, standardMsg) | 
					
						
							|  |  |  |         self.fail(msg) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def assertListEqual(self, list1, list2, msg=None): | 
					
						
							|  |  |  |         """A list-specific equality assertion.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Args: | 
					
						
							|  |  |  |             list1: The first list to compare. | 
					
						
							|  |  |  |             list2: The second list to compare. | 
					
						
							|  |  |  |             msg: Optional message to use on failure instead of a list of | 
					
						
							|  |  |  |                     differences. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         self.assertSequenceEqual(list1, list2, msg, seq_type=list) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def assertTupleEqual(self, tuple1, tuple2, msg=None): | 
					
						
							|  |  |  |         """A tuple-specific equality assertion.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Args: | 
					
						
							|  |  |  |             tuple1: The first tuple to compare. | 
					
						
							|  |  |  |             tuple2: The second tuple to compare. | 
					
						
							|  |  |  |             msg: Optional message to use on failure instead of a list of | 
					
						
							|  |  |  |                     differences. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         self.assertSequenceEqual(tuple1, tuple2, msg, seq_type=tuple) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def assertSetEqual(self, set1, set2, msg=None): | 
					
						
							|  |  |  |         """A set-specific equality assertion.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Args: | 
					
						
							|  |  |  |             set1: The first set to compare. | 
					
						
							|  |  |  |             set2: The second set to compare. | 
					
						
							|  |  |  |             msg: Optional message to use on failure instead of a list of | 
					
						
							|  |  |  |                     differences. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-20 03:00:34 +00:00
										 |  |  |         assertSetEqual uses ducktyping to support different types of sets, and | 
					
						
							|  |  |  |         is optimized for sets specifically (parameters must support a | 
					
						
							|  |  |  |         difference method). | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |         """
 | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             difference1 = set1.difference(set2) | 
					
						
							|  |  |  |         except TypeError, e: | 
					
						
							|  |  |  |             self.fail('invalid type when attempting set difference: %s' % e) | 
					
						
							|  |  |  |         except AttributeError, e: | 
					
						
							|  |  |  |             self.fail('first argument does not support set difference: %s' % e) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             difference2 = set2.difference(set1) | 
					
						
							|  |  |  |         except TypeError, e: | 
					
						
							|  |  |  |             self.fail('invalid type when attempting set difference: %s' % e) | 
					
						
							|  |  |  |         except AttributeError, e: | 
					
						
							|  |  |  |             self.fail('second argument does not support set difference: %s' % e) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if not (difference1 or difference2): | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         lines = [] | 
					
						
							|  |  |  |         if difference1: | 
					
						
							|  |  |  |             lines.append('Items in the first set but not the second:') | 
					
						
							|  |  |  |             for item in difference1: | 
					
						
							|  |  |  |                 lines.append(repr(item)) | 
					
						
							|  |  |  |         if difference2: | 
					
						
							|  |  |  |             lines.append('Items in the second set but not the first:') | 
					
						
							|  |  |  |             for item in difference2: | 
					
						
							|  |  |  |                 lines.append(repr(item)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |         standardMsg = '\n'.join(lines) | 
					
						
							|  |  |  |         self.fail(self._formatMessage(msg, standardMsg)) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |     def assertIn(self, member, container, msg=None): | 
					
						
							|  |  |  |         """Just like self.assertTrue(a in b), but with a nicer default message.""" | 
					
						
							|  |  |  |         if member not in container: | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             standardMsg = '%s not found in %s' % (safe_repr(member), | 
					
						
							|  |  |  |                                                   safe_repr(container)) | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |             self.fail(self._formatMessage(msg, standardMsg)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def assertNotIn(self, member, container, msg=None): | 
					
						
							|  |  |  |         """Just like self.assertTrue(a not in b), but with a nicer default message.""" | 
					
						
							|  |  |  |         if member in container: | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             standardMsg = '%s unexpectedly found in %s' % (safe_repr(member), | 
					
						
							|  |  |  |                                                         safe_repr(container)) | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |             self.fail(self._formatMessage(msg, standardMsg)) | 
					
						
							| 
									
										
										
										
											2009-04-05 19:19:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def assertIs(self, expr1, expr2, msg=None): | 
					
						
							|  |  |  |         """Just like self.assertTrue(a is b), but with a nicer default message.""" | 
					
						
							|  |  |  |         if expr1 is not expr2: | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             standardMsg = '%s is not %s' % (safe_repr(expr1), | 
					
						
							| 
									
										
										
										
											2010-02-18 21:37:07 +00:00
										 |  |  |                                              safe_repr(expr2)) | 
					
						
							| 
									
										
										
										
											2009-04-05 19:19:28 +00:00
										 |  |  |             self.fail(self._formatMessage(msg, standardMsg)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def assertIsNot(self, expr1, expr2, msg=None): | 
					
						
							|  |  |  |         """Just like self.assertTrue(a is not b), but with a nicer default message.""" | 
					
						
							|  |  |  |         if expr1 is expr2: | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             standardMsg = 'unexpectedly identical: %s' % (safe_repr(expr1),) | 
					
						
							| 
									
										
										
										
											2009-04-05 19:19:28 +00:00
										 |  |  |             self.fail(self._formatMessage(msg, standardMsg)) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def assertDictEqual(self, d1, d2, msg=None): | 
					
						
							|  |  |  |         self.assert_(isinstance(d1, dict), 'First argument is not a dictionary') | 
					
						
							|  |  |  |         self.assert_(isinstance(d2, dict), 'Second argument is not a dictionary') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if d1 != d2: | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |             standardMsg = ('\n' + '\n'.join(difflib.ndiff( | 
					
						
							|  |  |  |                            pprint.pformat(d1).splitlines(), | 
					
						
							|  |  |  |                            pprint.pformat(d2).splitlines()))) | 
					
						
							|  |  |  |             self.fail(self._formatMessage(msg, standardMsg)) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def assertDictContainsSubset(self, expected, actual, msg=None): | 
					
						
							|  |  |  |         """Checks whether actual is a superset of expected.""" | 
					
						
							|  |  |  |         missing = [] | 
					
						
							|  |  |  |         mismatched = [] | 
					
						
							|  |  |  |         for key, value in expected.iteritems(): | 
					
						
							|  |  |  |             if key not in actual: | 
					
						
							|  |  |  |                 missing.append(key) | 
					
						
							|  |  |  |             elif value != actual[key]: | 
					
						
							| 
									
										
										
										
											2009-10-01 20:11:14 +00:00
										 |  |  |                 mismatched.append('%s, expected: %s, actual: %s' % | 
					
						
							| 
									
										
										
										
											2010-02-18 21:37:07 +00:00
										 |  |  |                                   (safe_repr(key), safe_repr(value), | 
					
						
							|  |  |  |                                    safe_repr(actual[key]))) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if not (missing or mismatched): | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |         standardMsg = '' | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |         if missing: | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             standardMsg = 'Missing: %s' % ','.join(safe_repr(m) for m in | 
					
						
							|  |  |  |                                                     missing) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |         if mismatched: | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |             if standardMsg: | 
					
						
							|  |  |  |                 standardMsg += '; ' | 
					
						
							|  |  |  |             standardMsg += 'Mismatched values: %s' % ','.join(mismatched) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |         self.fail(self._formatMessage(msg, standardMsg)) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-20 03:00:34 +00:00
										 |  |  |     def assertItemsEqual(self, expected_seq, actual_seq, msg=None): | 
					
						
							|  |  |  |         """An unordered sequence / set specific comparison. It asserts that
 | 
					
						
							|  |  |  |         expected_seq and actual_seq contain the same elements. It is | 
					
						
							|  |  |  |         the equivalent of:: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self.assertEqual(sorted(expected_seq), sorted(actual_seq)) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         Raises with an error message listing which elements of expected_seq | 
					
						
							|  |  |  |         are missing from actual_seq and vice versa if any. | 
					
						
							| 
									
										
										
										
											2010-02-05 22:55:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-20 03:00:34 +00:00
										 |  |  |         Asserts that each element has the same count in both sequences. | 
					
						
							|  |  |  |         Example: | 
					
						
							|  |  |  |             - [0, 1, 1] and [1, 0, 1] compare equal. | 
					
						
							|  |  |  |             - [0, 0, 1] and [0, 1] compare unequal. | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2010-03-07 12:14:25 +00:00
										 |  |  |         with warnings.catch_warnings(): | 
					
						
							|  |  |  |             if sys.py3kwarning: | 
					
						
							|  |  |  |                 # Silence Py3k warning raised during the sorting | 
					
						
							| 
									
										
										
										
											2010-03-21 10:50:44 +00:00
										 |  |  |                 for _msg in ["(code|dict|type) inequality comparisons", | 
					
						
							| 
									
										
										
										
											2010-03-20 03:00:34 +00:00
										 |  |  |                              "builtin_function_or_method order comparisons", | 
					
						
							|  |  |  |                              "comparing unequal types"]: | 
					
						
							| 
									
										
										
										
											2010-03-07 23:10:36 +00:00
										 |  |  |                     warnings.filterwarnings("ignore", _msg, DeprecationWarning) | 
					
						
							| 
									
										
										
										
											2010-03-07 12:14:25 +00:00
										 |  |  |             try: | 
					
						
							|  |  |  |                 expected = sorted(expected_seq) | 
					
						
							|  |  |  |                 actual = sorted(actual_seq) | 
					
						
							| 
									
										
										
										
											2010-03-20 03:00:34 +00:00
										 |  |  |             except TypeError: | 
					
						
							|  |  |  |                 # Unsortable items (example: set(), complex(), ...) | 
					
						
							|  |  |  |                 expected = list(expected_seq) | 
					
						
							|  |  |  |                 actual = list(actual_seq) | 
					
						
							|  |  |  |                 missing, unexpected = unorderable_list_difference( | 
					
						
							|  |  |  |                     expected, actual, ignore_duplicate=False | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 return self.assertSequenceEqual(expected, actual, msg=msg) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |         errors = [] | 
					
						
							|  |  |  |         if missing: | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             errors.append('Expected, but missing:\n    %s' % | 
					
						
							| 
									
										
										
										
											2010-03-20 03:00:34 +00:00
										 |  |  |                            safe_repr(missing)) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |         if unexpected: | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             errors.append('Unexpected, but present:\n    %s' % | 
					
						
							| 
									
										
										
										
											2010-03-20 03:00:34 +00:00
										 |  |  |                            safe_repr(unexpected)) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |         if errors: | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |             standardMsg = '\n'.join(errors) | 
					
						
							|  |  |  |             self.fail(self._formatMessage(msg, standardMsg)) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def assertMultiLineEqual(self, first, second, msg=None): | 
					
						
							|  |  |  |         """Assert that two multi-line strings are equal.""" | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |         self.assert_(isinstance(first, basestring), ( | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |                 'First argument is not a string')) | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |         self.assert_(isinstance(second, basestring), ( | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |                 'Second argument is not a string')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if first != second: | 
					
						
							| 
									
										
										
										
											2009-10-01 20:11:14 +00:00
										 |  |  |             standardMsg = '\n' + ''.join(difflib.ndiff(first.splitlines(True), | 
					
						
							|  |  |  |                                                        second.splitlines(True))) | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |             self.fail(self._formatMessage(msg, standardMsg)) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def assertLess(self, a, b, msg=None): | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |         """Just like self.assertTrue(a < b), but with a nicer default message.""" | 
					
						
							|  |  |  |         if not a < b: | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             standardMsg = '%s not less than %s' % (safe_repr(a), safe_repr(b)) | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |             self.fail(self._formatMessage(msg, standardMsg)) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def assertLessEqual(self, a, b, msg=None): | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |         """Just like self.assertTrue(a <= b), but with a nicer default message.""" | 
					
						
							|  |  |  |         if not a <= b: | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             standardMsg = '%s not less than or equal to %s' % (safe_repr(a), safe_repr(b)) | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |             self.fail(self._formatMessage(msg, standardMsg)) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def assertGreater(self, a, b, msg=None): | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |         """Just like self.assertTrue(a > b), but with a nicer default message.""" | 
					
						
							|  |  |  |         if not a > b: | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             standardMsg = '%s not greater than %s' % (safe_repr(a), safe_repr(b)) | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |             self.fail(self._formatMessage(msg, standardMsg)) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def assertGreaterEqual(self, a, b, msg=None): | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |         """Just like self.assertTrue(a >= b), but with a nicer default message.""" | 
					
						
							|  |  |  |         if not a >= b: | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             standardMsg = '%s not greater than or equal to %s' % (safe_repr(a), safe_repr(b)) | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |             self.fail(self._formatMessage(msg, standardMsg)) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def assertIsNone(self, obj, msg=None): | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |         """Same as self.assertTrue(obj is None), with a nicer default message.""" | 
					
						
							|  |  |  |         if obj is not None: | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             standardMsg = '%s is not None' % (safe_repr(obj),) | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |             self.fail(self._formatMessage(msg, standardMsg)) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |     def assertIsNotNone(self, obj, msg=None): | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |         """Included for symmetry with assertIsNone.""" | 
					
						
							| 
									
										
										
										
											2009-04-02 03:20:38 +00:00
										 |  |  |         if obj is None: | 
					
						
							|  |  |  |             standardMsg = 'unexpectedly None' | 
					
						
							|  |  |  |             self.fail(self._formatMessage(msg, standardMsg)) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-01 20:59:31 +00:00
										 |  |  |     def assertIsInstance(self, obj, cls, msg=None): | 
					
						
							|  |  |  |         """Same as self.assertTrue(isinstance(obj, cls)), with a nicer
 | 
					
						
							|  |  |  |         default message."""
 | 
					
						
							|  |  |  |         if not isinstance(obj, cls): | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             standardMsg = '%s is not an instance of %r' % (safe_repr(obj), cls) | 
					
						
							| 
									
										
										
										
											2009-10-01 20:59:31 +00:00
										 |  |  |             self.fail(self._formatMessage(msg, standardMsg)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def assertNotIsInstance(self, obj, cls, msg=None): | 
					
						
							|  |  |  |         """Included for symmetry with assertIsInstance.""" | 
					
						
							|  |  |  |         if isinstance(obj, cls): | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |             standardMsg = '%s is an instance of %r' % (safe_repr(obj), cls) | 
					
						
							| 
									
										
										
										
											2009-10-01 20:59:31 +00:00
										 |  |  |             self.fail(self._formatMessage(msg, standardMsg)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |     def assertRaisesRegexp(self, expected_exception, expected_regexp, | 
					
						
							|  |  |  |                            callable_obj=None, *args, **kwargs): | 
					
						
							|  |  |  |         """Asserts that the message in a raised exception matches a regexp.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Args: | 
					
						
							|  |  |  |             expected_exception: Exception class expected to be raised. | 
					
						
							|  |  |  |             expected_regexp: Regexp (re pattern object or string) expected | 
					
						
							|  |  |  |                     to be found in error message. | 
					
						
							|  |  |  |             callable_obj: Function to be called. | 
					
						
							|  |  |  |             args: Extra args. | 
					
						
							|  |  |  |             kwargs: Extra kwargs. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         context = _AssertRaisesContext(expected_exception, self, expected_regexp) | 
					
						
							|  |  |  |         if callable_obj is None: | 
					
						
							|  |  |  |             return context | 
					
						
							|  |  |  |         with context: | 
					
						
							|  |  |  |             callable_obj(*args, **kwargs) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 11:34:15 +00:00
										 |  |  |     def assertRegexpMatches(self, text, expected_regexp, msg=None): | 
					
						
							|  |  |  |         if isinstance(expected_regexp, basestring): | 
					
						
							|  |  |  |             expected_regexp = re.compile(expected_regexp) | 
					
						
							|  |  |  |         if not expected_regexp.search(text): | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |             msg = msg or "Regexp didn't match" | 
					
						
							| 
									
										
										
										
											2010-02-07 11:34:15 +00:00
										 |  |  |             msg = '%s: %r not found in %r' % (msg, expected_regexp.pattern, text) | 
					
						
							| 
									
										
										
										
											2009-03-31 16:54:10 +00:00
										 |  |  |             raise self.failureException(msg) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | class FunctionTestCase(TestCase): | 
					
						
							|  |  |  |     """A test case that wraps a test function.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This is useful for slipping pre-existing test functions into the | 
					
						
							| 
									
										
										
										
											2007-03-07 09:09:40 +00:00
										 |  |  |     unittest framework. Optionally, set-up and tidy-up functions can be | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |     supplied. As with TestCase, the tidy-up ('tearDown') function will | 
					
						
							|  |  |  |     always be called if the set-up ('setUp') function ran successfully. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-24 00:35:20 +00:00
										 |  |  |     def __init__(self, testFunc, setUp=None, tearDown=None, description=None): | 
					
						
							|  |  |  |         super(FunctionTestCase, self).__init__() | 
					
						
							| 
									
										
										
										
											2009-04-01 23:15:49 +00:00
										 |  |  |         self._setUpFunc = setUp | 
					
						
							|  |  |  |         self._tearDownFunc = tearDown | 
					
						
							|  |  |  |         self._testFunc = testFunc | 
					
						
							|  |  |  |         self._description = description | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							| 
									
										
										
										
											2009-04-01 23:15:49 +00:00
										 |  |  |         if self._setUpFunc is not None: | 
					
						
							|  |  |  |             self._setUpFunc() | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							| 
									
										
										
										
											2009-04-01 23:15:49 +00:00
										 |  |  |         if self._tearDownFunc is not None: | 
					
						
							|  |  |  |             self._tearDownFunc() | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def runTest(self): | 
					
						
							| 
									
										
										
										
											2009-04-01 23:15:49 +00:00
										 |  |  |         self._testFunc() | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def id(self): | 
					
						
							| 
									
										
										
										
											2009-04-01 23:15:49 +00:00
										 |  |  |         return self._testFunc.__name__ | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-07 09:09:40 +00:00
										 |  |  |     def __eq__(self, other): | 
					
						
							| 
									
										
										
										
											2009-03-24 00:35:20 +00:00
										 |  |  |         if not isinstance(other, self.__class__): | 
					
						
							|  |  |  |             return NotImplemented | 
					
						
							| 
									
										
										
										
											2007-03-07 09:09:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-01 23:15:49 +00:00
										 |  |  |         return self._setUpFunc == other._setUpFunc and \ | 
					
						
							|  |  |  |                self._tearDownFunc == other._tearDownFunc and \ | 
					
						
							|  |  |  |                self._testFunc == other._testFunc and \ | 
					
						
							|  |  |  |                self._description == other._description | 
					
						
							| 
									
										
										
										
											2007-03-07 09:09:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def __ne__(self, other): | 
					
						
							|  |  |  |         return not self == other | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __hash__(self): | 
					
						
							| 
									
										
										
										
											2009-04-01 23:15:49 +00:00
										 |  |  |         return hash((type(self), self._setUpFunc, self._tearDownFunc, | 
					
						
							|  |  |  |                      self._testFunc, self._description)) | 
					
						
							| 
									
										
										
										
											2007-03-07 09:09:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  |     def __str__(self): | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |         return "%s (%s)" % (strclass(self.__class__), | 
					
						
							| 
									
										
										
										
											2009-07-19 20:18:21 +00:00
										 |  |  |                             self._testFunc.__name__) | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def __repr__(self): | 
					
						
							| 
									
										
										
										
											2010-02-18 20:30:09 +00:00
										 |  |  |         return "<%s tec=%s>" % (strclass(self.__class__), | 
					
						
							| 
									
										
										
										
											2009-07-19 20:18:21 +00:00
										 |  |  |                                      self._testFunc) | 
					
						
							| 
									
										
										
										
											2001-03-21 18:09:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def shortDescription(self): | 
					
						
							| 
									
										
										
										
											2009-04-01 23:15:49 +00:00
										 |  |  |         if self._description is not None: | 
					
						
							|  |  |  |             return self._description | 
					
						
							|  |  |  |         doc = self._testFunc.__doc__ | 
					
						
							| 
									
										
										
										
											2003-09-22 11:08:12 +00:00
										 |  |  |         return doc and doc.split("\n")[0].strip() or None |