14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""Test case implementation""" 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport collections 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport sys 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport functools 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport difflib 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport pprint 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport re 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport warnings 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom . import result 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom .util import ( 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm strclass, safe_repr, unorderable_list_difference, 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _count_diff_all_purpose, _count_diff_hashable 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm) 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm__unittest = True 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmDIFF_OMITTED = ('\nDiff is %s characters long. ' 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'Set self.maxDiff to None to see it.') 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass SkipTest(Exception): 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Raise this exception in a test to skip it. 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Usually you can use TestResult.skip() or one of the skipping decorators 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm instead of raising this directly. 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass _ExpectedFailure(Exception): 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Raise this when a test is expected to fail. 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm This is an implementation detail. 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, exc_info): 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm super(_ExpectedFailure, self).__init__() 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.exc_info = exc_info 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass _UnexpectedSuccess(Exception): 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm The test was supposed to fail, but it didn't! 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef _id(obj): 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return obj 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef skip(reason): 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Unconditionally skip a test. 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def decorator(test_item): 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not (isinstance(test_item, type) and issubclass(test_item, TestCase)): 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @functools.wraps(test_item) 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def skip_wrapper(*args, **kwargs): 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SkipTest(reason) 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test_item = skip_wrapper 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test_item.__unittest_skip__ = True 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test_item.__unittest_skip_why__ = reason 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return test_item 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return decorator 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef skipIf(condition, reason): 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Skip a test if the condition is true. 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if condition: 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return skip(reason) 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return _id 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef skipUnless(condition, reason): 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Skip a test unless the condition is true. 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not condition: 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return skip(reason) 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return _id 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef expectedFailure(func): 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @functools.wraps(func) 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def wrapper(*args, **kwargs): 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm func(*args, **kwargs) 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except Exception: 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise _ExpectedFailure(sys.exc_info()) 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise _UnexpectedSuccess 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return wrapper 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass _AssertRaisesContext(object): 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """A context manager used to implement TestCase.assertRaises* methods.""" 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, expected, test_case, expected_regexp=None): 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.expected = expected 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.failureException = test_case.failureException 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.expected_regexp = expected_regexp 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __enter__(self): 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __exit__(self, exc_type, exc_value, tb): 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if exc_type is None: 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exc_name = self.expected.__name__ 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except AttributeError: 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exc_name = str(self.expected) 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise self.failureException( 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "{0} not raised".format(exc_name)) 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not issubclass(exc_type, self.expected): 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # let unexpected exceptions pass through 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return False 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.exception = exc_value # store for later retrieval 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if self.expected_regexp is None: 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return True 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expected_regexp = self.expected_regexp 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if isinstance(expected_regexp, basestring): 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expected_regexp = re.compile(expected_regexp) 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not expected_regexp.search(str(exc_value)): 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise self.failureException('"%s" does not match "%s"' % 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (expected_regexp.pattern, str(exc_value))) 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return True 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestCase(object): 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """A class whose instances are single test cases. 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm By default, the test code itself should be placed in a method named 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'runTest'. 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm If the fixture may be used for many test cases, create as 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm many test methods as are needed. When instantiating such a TestCase 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm subclass, specify in the constructor arguments the name of the test method 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm that the instance is to execute. 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Test authors should subclass TestCase for their own tests. Construction 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm and deconstruction of the test's environment ('fixture') can be 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm implemented by overriding the 'setUp' and 'tearDown' methods respectively. 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm If it is necessary to override the __init__ method, the base class 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __init__ method must always be called. It is important that subclasses 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm should not change the signature of their __init__ method, since instances 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm of the classes are instantiated automatically by parts of the framework 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm in order to be run. 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # This attribute determines which exception will be raised when 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # the instance's assertion methods fail; test methods raising this 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # exception will be deemed to have 'failed' rather than 'errored' 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm failureException = AssertionError 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # This attribute determines whether long messages (including repr of 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # objects used in assert methods) will be printed on failure in *addition* 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # to any explicit message passed. 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm longMessage = False 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # This attribute sets the maximum length of a diff in failure messages 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # by assert methods using difflib. It is looked up as an instance attribute 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # so can be configured by individual tests if required. 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm maxDiff = 80*8 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # If a string is longer than _diffThreshold, use normal comparison instead 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # of difflib. See #11763. 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _diffThreshold = 2**16 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Attribute used by TestSuite for classSetUp 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _classSetupFailed = False 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, methodName='runTest'): 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Create an instance of the class that will use the named test 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm method when executed. Raises a ValueError if the instance does 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm not have a method with the specified name. 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._testMethodName = methodName 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._resultForDoCleanups = None 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm testMethod = getattr(self, methodName) 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except AttributeError: 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise ValueError("no such test method in %s: %s" % 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (self.__class__, methodName)) 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._testMethodDoc = testMethod.__doc__ 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._cleanups = [] 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Map types to custom assertEqual functions that will compare 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # instances of said type in more detail to generate a more useful 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # error message. 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._type_equality_funcs = {} 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.addTypeEqualityFunc(dict, self.assertDictEqual) 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.addTypeEqualityFunc(list, self.assertListEqual) 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.addTypeEqualityFunc(tuple, self.assertTupleEqual) 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.addTypeEqualityFunc(set, self.assertSetEqual) 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.addTypeEqualityFunc(frozenset, self.assertSetEqual) 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.addTypeEqualityFunc(unicode, self.assertMultiLineEqual) 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def addTypeEqualityFunc(self, typeobj, function): 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Add a type specific assertEqual style function to compare a type. 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm This method is for use by TestCase subclasses that need to register 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm their own type equality functions to provide nicer error messages. 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Args: 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm typeobj: The data type to call this function on when both values 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm are of the same type in assertEqual(). 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm function: The callable taking two arguments and an optional 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg= argument that raises self.failureException with a 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm useful error message when the two arguments are not equal. 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._type_equality_funcs[typeobj] = function 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def addCleanup(self, function, *args, **kwargs): 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Add a function, with arguments, to be called when the test is 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm completed. Functions added are called on a LIFO basis and are 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm called after tearDown on test failure or success. 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Cleanup items are called even if setUp fails (unlike tearDown).""" 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._cleanups.append((function, args, kwargs)) 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def setUp(self): 2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Hook method for setting up the test fixture before exercising it." 2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def tearDown(self): 2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Hook method for deconstructing the test fixture after testing it." 2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @classmethod 2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def setUpClass(cls): 2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Hook method for setting up class fixture before running tests in the class." 2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @classmethod 2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def tearDownClass(cls): 2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Hook method for deconstructing the class fixture after running all tests in the class." 2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def countTestCases(self): 2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 1 2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def defaultTestResult(self): 2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result.TestResult() 2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def shortDescription(self): 2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Returns a one-line description of the test, or None if no 2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm description has been provided. 2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm The default implementation of this method returns the first line of 2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm the specified test method's docstring. 2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm doc = self._testMethodDoc 2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return doc and doc.split("\n")[0].strip() or None 2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def id(self): 2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return "%s.%s" % (strclass(self.__class__), self._testMethodName) 2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __eq__(self, other): 2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if type(self) is not type(other): 2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NotImplemented 2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self._testMethodName == other._testMethodName 2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __ne__(self, other): 2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return not self == other 2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __hash__(self): 2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return hash((type(self), self._testMethodName)) 2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __str__(self): 2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return "%s (%s)" % (self._testMethodName, strclass(self.__class__)) 2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __repr__(self): 2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return "<%s testMethod=%s>" % \ 2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (strclass(self.__class__), self._testMethodName) 2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def _addSkip(self, result, reason): 2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm addSkip = getattr(result, 'addSkip', None) 2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if addSkip is not None: 2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm addSkip(self, reason) 2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm warnings.warn("TestResult has no addSkip method, skips not reported", 2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm RuntimeWarning, 2) 2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result.addSuccess(self) 2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def run(self, result=None): 2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm orig_result = result 2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if result is None: 2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = self.defaultTestResult() 2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm startTestRun = getattr(result, 'startTestRun', None) 2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if startTestRun is not None: 2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm startTestRun() 3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._resultForDoCleanups = result 3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result.startTest(self) 3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm testMethod = getattr(self, self._testMethodName) 3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (getattr(self.__class__, "__unittest_skip__", False) or 3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm getattr(testMethod, "__unittest_skip__", False)): 3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # If the class or method was skipped. 3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm skip_why = (getattr(self.__class__, '__unittest_skip_why__', '') 3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm or getattr(testMethod, '__unittest_skip_why__', '')) 3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._addSkip(result, skip_why) 3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result.stopTest(self) 3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm success = False 3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.setUp() 3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except SkipTest as e: 3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._addSkip(result, str(e)) 3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except KeyboardInterrupt: 3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise 3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except: 3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result.addError(self, sys.exc_info()) 3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm testMethod() 3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except KeyboardInterrupt: 3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise 3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except self.failureException: 3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result.addFailure(self, sys.exc_info()) 3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except _ExpectedFailure as e: 3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm addExpectedFailure = getattr(result, 'addExpectedFailure', None) 3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if addExpectedFailure is not None: 3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm addExpectedFailure(self, e.exc_info) 3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm warnings.warn("TestResult has no addExpectedFailure method, reporting as passes", 3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm RuntimeWarning) 3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result.addSuccess(self) 3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except _UnexpectedSuccess: 3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm addUnexpectedSuccess = getattr(result, 'addUnexpectedSuccess', None) 3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if addUnexpectedSuccess is not None: 3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm addUnexpectedSuccess(self) 3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm warnings.warn("TestResult has no addUnexpectedSuccess method, reporting as failures", 3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm RuntimeWarning) 3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result.addFailure(self, sys.exc_info()) 3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except SkipTest as e: 3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._addSkip(result, str(e)) 3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except: 3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result.addError(self, sys.exc_info()) 3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm success = True 3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.tearDown() 3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except KeyboardInterrupt: 3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise 3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except: 3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result.addError(self, sys.exc_info()) 3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm success = False 3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cleanUpSuccess = self.doCleanups() 3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm success = success and cleanUpSuccess 3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if success: 3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result.addSuccess(self) 3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result.stopTest(self) 3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if orig_result is None: 3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm stopTestRun = getattr(result, 'stopTestRun', None) 3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if stopTestRun is not None: 3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm stopTestRun() 3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def doCleanups(self): 3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Execute all cleanup functions. Normally called for you after 3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tearDown.""" 3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = self._resultForDoCleanups 3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ok = True 3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while self._cleanups: 3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm function, args, kwargs = self._cleanups.pop(-1) 3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm function(*args, **kwargs) 3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except KeyboardInterrupt: 3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise 3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except: 3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ok = False 3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result.addError(self, sys.exc_info()) 3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return ok 3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __call__(self, *args, **kwds): 3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.run(*args, **kwds) 3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def debug(self): 3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Run the test without collecting errors in a TestResult""" 3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.setUp() 3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm getattr(self, self._testMethodName)() 3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.tearDown() 3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while self._cleanups: 3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm function, args, kwargs = self._cleanups.pop(-1) 4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm function(*args, **kwargs) 4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def skipTest(self, reason): 4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Skip this test.""" 4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SkipTest(reason) 4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def fail(self, msg=None): 4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Fail immediately, with the given message.""" 4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise self.failureException(msg) 4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertFalse(self, expr, msg=None): 4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Check that the expression is false.""" 4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if expr: 4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = self._formatMessage(msg, "%s is not false" % safe_repr(expr)) 4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise self.failureException(msg) 4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertTrue(self, expr, msg=None): 4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Check that the expression is true.""" 4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not expr: 4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = self._formatMessage(msg, "%s is not true" % safe_repr(expr)) 4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise self.failureException(msg) 4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def _formatMessage(self, msg, standardMsg): 4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Honour the longMessage attribute when generating failure messages. 4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm If longMessage is False this means: 4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Use only an explicit message if it is provided 4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Otherwise use the standard message for the assert 4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm If longMessage is True: 4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Use the standard message 4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * If an explicit message is provided, plus ' : ' and the explicit message 4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not self.longMessage: 4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return msg or standardMsg 4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if msg is None: 4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return standardMsg 4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # don't switch to '{}' formatting in Python 2.X 4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # it changes the way unicode input is handled 4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return '%s : %s' % (standardMsg, msg) 4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except UnicodeDecodeError: 4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return '%s : %s' % (safe_repr(standardMsg), safe_repr(msg)) 4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertRaises(self, excClass, callableObj=None, *args, **kwargs): 4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Fail unless an exception of class excClass is thrown 4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm by callableObj when invoked with arguments args and keyword 4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm arguments kwargs. If a different type of exception is 4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm thrown, it will not be caught, and the test case will be 4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm deemed to have suffered an error, exactly as for an 4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unexpected exception. 4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm If called with callableObj omitted or None, will return a 4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm context object used like this:: 4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with self.assertRaises(SomeException): 4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm do_something() 4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm The context manager keeps a reference to the exception as 4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm the 'exception' attribute. This allows you to inspect the 4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exception after the assertion:: 4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with self.assertRaises(SomeException) as cm: 4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm do_something() 4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm the_exception = cm.exception 4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(the_exception.error_code, 3) 4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm context = _AssertRaisesContext(excClass, self) 4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if callableObj is None: 4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return context 4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with context: 4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm callableObj(*args, **kwargs) 4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def _getAssertEqualityFunc(self, first, second): 4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Get a detailed comparison function for the types of the two args. 4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Returns: A callable accepting (first, second, msg=None) that will 4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise a failure exception if first != second with a useful human 4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm readable error message for those types. 4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # NOTE(gregory.p.smith): I considered isinstance(first, type(second)) 4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # and vice versa. I opted for the conservative approach in case 4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # subclasses are not intended to be compared in detail to their super 4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # class instances using a type equality func. This means testing 4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # subtypes won't automagically use the detailed comparison. Callers 4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # should use their type specific assertSpamEqual method to compare 4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # subclasses if the detailed comparison is desired and appropriate. 4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # See the discussion in http://bugs.python.org/issue2578. 4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if type(first) is type(second): 4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm asserter = self._type_equality_funcs.get(type(first)) 4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if asserter is not None: 4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return asserter 4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self._baseAssertEqual 4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def _baseAssertEqual(self, first, second, msg=None): 4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """The default assertEqual implementation, not type specific.""" 4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not first == second: 5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '%s != %s' % (safe_repr(first), safe_repr(second)) 5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = self._formatMessage(msg, standardMsg) 5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise self.failureException(msg) 5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertEqual(self, first, second, msg=None): 5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Fail if the two objects are unequal as determined by the '==' 5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm operator. 5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assertion_func = self._getAssertEqualityFunc(first, second) 5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assertion_func(first, second, msg=msg) 5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertNotEqual(self, first, second, msg=None): 5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Fail if the two objects are equal as determined by the '==' 5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm operator. 5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not first != second: 5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = self._formatMessage(msg, '%s == %s' % (safe_repr(first), 5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm safe_repr(second))) 5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise self.failureException(msg) 5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertAlmostEqual(self, first, second, places=None, msg=None, delta=None): 5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Fail if the two objects are unequal as determined by their 5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm difference rounded to the given number of decimal places 5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (default 7) and comparing to zero, or by comparing that the 5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm between the two objects is more than the given delta. 5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Note that decimal places (from zero) are usually not the same 5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm as significant digits (measured from the most signficant digit). 5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm If the two objects compare equal then they will automatically 5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm compare almost equal. 5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if first == second: 5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # shortcut 5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if delta is not None and places is not None: 5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise TypeError("specify delta or places not both") 5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if delta is not None: 5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if abs(first - second) <= delta: 5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '%s != %s within %s delta' % (safe_repr(first), 5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm safe_repr(second), 5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm safe_repr(delta)) 5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if places is None: 5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm places = 7 5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if round(abs(second-first), places) == 0: 5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '%s != %s within %r places' % (safe_repr(first), 5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm safe_repr(second), 5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm places) 5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = self._formatMessage(msg, standardMsg) 5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise self.failureException(msg) 5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertNotAlmostEqual(self, first, second, places=None, msg=None, delta=None): 5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Fail if the two objects are equal as determined by their 5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm difference rounded to the given number of decimal places 5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (default 7) and comparing to zero, or by comparing that the 5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm between the two objects is less than the given delta. 5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Note that decimal places (from zero) are usually not the same 5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm as significant digits (measured from the most signficant digit). 5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Objects that are equal automatically fail. 5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if delta is not None and places is not None: 5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise TypeError("specify delta or places not both") 5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if delta is not None: 5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not (first == second) and abs(first - second) > delta: 5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '%s == %s within %s delta' % (safe_repr(first), 5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm safe_repr(second), 5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm safe_repr(delta)) 5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if places is None: 5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm places = 7 5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not (first == second) and round(abs(second-first), places) != 0: 5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '%s == %s within %r places' % (safe_repr(first), 5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm safe_repr(second), 5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm places) 5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = self._formatMessage(msg, standardMsg) 5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise self.failureException(msg) 5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Synonyms for assertion methods 5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # The plurals are undocumented. Keep them that way to discourage use. 5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Do not add more. Do not remove. 5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Going through a deprecation cycle on these would annoy many people. 5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assertEquals = assertEqual 5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assertNotEquals = assertNotEqual 5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assertAlmostEquals = assertAlmostEqual 5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assertNotAlmostEquals = assertNotAlmostEqual 5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert_ = assertTrue 6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # These fail* assertion method names are pending deprecation and will 6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # be a DeprecationWarning in 3.2; http://bugs.python.org/issue2578 6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def _deprecate(original_func): 6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def deprecated_func(*args, **kwargs): 6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm warnings.warn( 6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'Please use {0} instead.'.format(original_func.__name__), 6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PendingDeprecationWarning, 2) 6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return original_func(*args, **kwargs) 6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return deprecated_func 6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm failUnlessEqual = _deprecate(assertEqual) 6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm failIfEqual = _deprecate(assertNotEqual) 6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm failUnlessAlmostEqual = _deprecate(assertAlmostEqual) 6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm failIfAlmostEqual = _deprecate(assertNotAlmostEqual) 6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm failUnless = _deprecate(assertTrue) 6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm failUnlessRaises = _deprecate(assertRaises) 6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm failIf = _deprecate(assertFalse) 6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None): 6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """An equality assertion for ordered sequences (like lists and tuples). 6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm For the purposes of this function, a valid ordered sequence type is one 6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm which can be indexed, has a length, and has an equality operator. 6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Args: 6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm seq1: The first sequence to compare. 6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm seq2: The second sequence to compare. 6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm seq_type: The expected datatype of the sequences, or None if no 6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm datatype should be enforced. 6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg: Optional message to use on failure instead of a list of 6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differences. 6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if seq_type is not None: 6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm seq_type_name = seq_type.__name__ 6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not isinstance(seq1, seq_type): 6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise self.failureException('First sequence is not a %s: %s' 6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm % (seq_type_name, safe_repr(seq1))) 6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not isinstance(seq2, seq_type): 6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise self.failureException('Second sequence is not a %s: %s' 6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm % (seq_type_name, safe_repr(seq2))) 6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm seq_type_name = "sequence" 6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differing = None 6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len1 = len(seq1) 6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except (TypeError, NotImplementedError): 6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differing = 'First %s has no length. Non-sequence?' % ( 6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm seq_type_name) 6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if differing is None: 6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len2 = len(seq2) 6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except (TypeError, NotImplementedError): 6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differing = 'Second %s has no length. Non-sequence?' % ( 6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm seq_type_name) 6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if differing is None: 6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if seq1 == seq2: 6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm seq1_repr = safe_repr(seq1) 6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm seq2_repr = safe_repr(seq2) 6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(seq1_repr) > 30: 6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm seq1_repr = seq1_repr[:30] + '...' 6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(seq2_repr) > 30: 6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm seq2_repr = seq2_repr[:30] + '...' 6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elements = (seq_type_name.capitalize(), seq1_repr, seq2_repr) 6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differing = '%ss differ: %s != %s\n' % elements 6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in xrange(min(len1, len2)): 6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm item1 = seq1[i] 6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except (TypeError, IndexError, NotImplementedError): 6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differing += ('\nUnable to index element %d of first %s\n' % 6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (i, seq_type_name)) 6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break 6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm item2 = seq2[i] 6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except (TypeError, IndexError, NotImplementedError): 6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differing += ('\nUnable to index element %d of second %s\n' % 6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (i, seq_type_name)) 6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break 6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if item1 != item2: 6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differing += ('\nFirst differing element %d:\n%s\n%s\n' % 6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (i, item1, item2)) 6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break 6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len1 == len2 and seq_type is None and 6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type(seq1) != type(seq2)): 6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # The sequences are the same, but have differing types. 6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len1 > len2: 6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differing += ('\nFirst %s contains %d additional ' 6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'elements.\n' % (seq_type_name, len1 - len2)) 6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differing += ('First extra element %d:\n%s\n' % 7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (len2, seq1[len2])) 7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except (TypeError, IndexError, NotImplementedError): 7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differing += ('Unable to index element %d ' 7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'of first %s\n' % (len2, seq_type_name)) 7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif len1 < len2: 7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differing += ('\nSecond %s contains %d additional ' 7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'elements.\n' % (seq_type_name, len2 - len1)) 7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differing += ('First extra element %d:\n%s\n' % 7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (len1, seq2[len1])) 7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except (TypeError, IndexError, NotImplementedError): 7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differing += ('Unable to index element %d ' 7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'of second %s\n' % (len1, seq_type_name)) 7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = differing 7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm diffMsg = '\n' + '\n'.join( 7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm difflib.ndiff(pprint.pformat(seq1).splitlines(), 7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pprint.pformat(seq2).splitlines())) 7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = self._truncateMessage(standardMsg, diffMsg) 7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = self._formatMessage(msg, standardMsg) 7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail(msg) 7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def _truncateMessage(self, message, diff): 7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm max_diff = self.maxDiff 7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if max_diff is None or len(diff) <= max_diff: 7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return message + diff 7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return message + (DIFF_OMITTED % len(diff)) 7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertListEqual(self, list1, list2, msg=None): 7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """A list-specific equality assertion. 7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Args: 7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm list1: The first list to compare. 7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm list2: The second list to compare. 7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg: Optional message to use on failure instead of a list of 7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differences. 7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertSequenceEqual(list1, list2, msg, seq_type=list) 7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertTupleEqual(self, tuple1, tuple2, msg=None): 7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """A tuple-specific equality assertion. 7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Args: 7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tuple1: The first tuple to compare. 7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tuple2: The second tuple to compare. 7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg: Optional message to use on failure instead of a list of 7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differences. 7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertSequenceEqual(tuple1, tuple2, msg, seq_type=tuple) 7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertSetEqual(self, set1, set2, msg=None): 7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """A set-specific equality assertion. 7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Args: 7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm set1: The first set to compare. 7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm set2: The second set to compare. 7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg: Optional message to use on failure instead of a list of 7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differences. 7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assertSetEqual uses ducktyping to support different types of sets, and 7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm is optimized for sets specifically (parameters must support a 7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm difference method). 7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm difference1 = set1.difference(set2) 7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except TypeError, e: 7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail('invalid type when attempting set difference: %s' % e) 7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except AttributeError, e: 7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail('first argument does not support set difference: %s' % e) 7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm difference2 = set2.difference(set1) 7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except TypeError, e: 7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail('invalid type when attempting set difference: %s' % e) 7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except AttributeError, e: 7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail('second argument does not support set difference: %s' % e) 7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not (difference1 or difference2): 7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lines = [] 7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if difference1: 7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lines.append('Items in the first set but not the second:') 7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for item in difference1: 7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lines.append(repr(item)) 7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if difference2: 7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lines.append('Items in the second set but not the first:') 7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for item in difference2: 7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lines.append(repr(item)) 7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '\n'.join(lines) 7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail(self._formatMessage(msg, standardMsg)) 7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertIn(self, member, container, msg=None): 7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Just like self.assertTrue(a in b), but with a nicer default message.""" 7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if member not in container: 7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '%s not found in %s' % (safe_repr(member), 7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm safe_repr(container)) 7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail(self._formatMessage(msg, standardMsg)) 8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertNotIn(self, member, container, msg=None): 8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Just like self.assertTrue(a not in b), but with a nicer default message.""" 8034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if member in container: 8044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '%s unexpectedly found in %s' % (safe_repr(member), 8054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm safe_repr(container)) 8064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail(self._formatMessage(msg, standardMsg)) 8074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertIs(self, expr1, expr2, msg=None): 8094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Just like self.assertTrue(a is b), but with a nicer default message.""" 8104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if expr1 is not expr2: 8114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '%s is not %s' % (safe_repr(expr1), 8124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm safe_repr(expr2)) 8134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail(self._formatMessage(msg, standardMsg)) 8144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertIsNot(self, expr1, expr2, msg=None): 8164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Just like self.assertTrue(a is not b), but with a nicer default message.""" 8174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if expr1 is expr2: 8184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = 'unexpectedly identical: %s' % (safe_repr(expr1),) 8194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail(self._formatMessage(msg, standardMsg)) 8204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertDictEqual(self, d1, d2, msg=None): 8224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(d1, dict, 'First argument is not a dictionary') 8234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(d2, dict, 'Second argument is not a dictionary') 8244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if d1 != d2: 8264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '%s != %s' % (safe_repr(d1, True), safe_repr(d2, True)) 8274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm diff = ('\n' + '\n'.join(difflib.ndiff( 8284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pprint.pformat(d1).splitlines(), 8294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pprint.pformat(d2).splitlines()))) 8304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = self._truncateMessage(standardMsg, diff) 8314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail(self._formatMessage(msg, standardMsg)) 8324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertDictContainsSubset(self, expected, actual, msg=None): 8344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Checks whether actual is a superset of expected.""" 8354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm missing = [] 8364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mismatched = [] 8374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for key, value in expected.iteritems(): 8384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if key not in actual: 8394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm missing.append(key) 8404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif value != actual[key]: 8414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mismatched.append('%s, expected: %s, actual: %s' % 8424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (safe_repr(key), safe_repr(value), 8434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm safe_repr(actual[key]))) 8444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not (missing or mismatched): 8464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 8474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '' 8494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if missing: 8504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = 'Missing: %s' % ','.join(safe_repr(m) for m in 8514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm missing) 8524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if mismatched: 8534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if standardMsg: 8544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg += '; ' 8554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg += 'Mismatched values: %s' % ','.join(mismatched) 8564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail(self._formatMessage(msg, standardMsg)) 8584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertItemsEqual(self, expected_seq, actual_seq, msg=None): 8604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """An unordered sequence specific comparison. It asserts that 8614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm actual_seq and expected_seq have the same element counts. 8624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Equivalent to:: 8634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Counter(iter(actual_seq)), 8654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Counter(iter(expected_seq))) 8664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Asserts that each element has the same count in both sequences. 8684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Example: 8694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm - [0, 1, 1] and [1, 0, 1] compare equal. 8704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm - [0, 0, 1] and [0, 1] compare unequal. 8714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 8724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm first_seq, second_seq = list(actual_seq), list(expected_seq) 8734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with warnings.catch_warnings(): 8744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if sys.py3kwarning: 8754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Silence Py3k warning raised during the sorting 8764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for _msg in ["(code|dict|type) inequality comparisons", 8774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "builtin_function_or_method order comparisons", 8784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "comparing unequal types"]: 8794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm warnings.filterwarnings("ignore", _msg, DeprecationWarning) 8804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 8814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm first = collections.Counter(first_seq) 8824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm second = collections.Counter(second_seq) 8834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except TypeError: 8844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Handle case with unhashable elements 8854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differences = _count_diff_all_purpose(first_seq, second_seq) 8864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 8874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if first == second: 8884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 8894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differences = _count_diff_hashable(first_seq, second_seq) 8904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if differences: 8924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = 'Element counts were not equal:\n' 8934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lines = ['First has %d, Second has %d: %r' % diff for diff in differences] 8944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm diffMsg = '\n'.join(lines) 8954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = self._truncateMessage(standardMsg, diffMsg) 8964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = self._formatMessage(msg, standardMsg) 8974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail(msg) 8984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertMultiLineEqual(self, first, second, msg=None): 9004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Assert that two multi-line strings are equal.""" 9014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(first, basestring, 9024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'First argument is not a string') 9034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(second, basestring, 9044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'Second argument is not a string') 9054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if first != second: 9074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # don't use difflib if the strings are too long 9084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len(first) > self._diffThreshold or 9094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len(second) > self._diffThreshold): 9104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._baseAssertEqual(first, second, msg) 9114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm firstlines = first.splitlines(True) 9124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm secondlines = second.splitlines(True) 9134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(firstlines) == 1 and first.strip('\r\n') == first: 9144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm firstlines = [first + '\n'] 9154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm secondlines = [second + '\n'] 9164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '%s != %s' % (safe_repr(first, True), 9174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm safe_repr(second, True)) 9184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm diff = '\n' + ''.join(difflib.ndiff(firstlines, secondlines)) 9194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = self._truncateMessage(standardMsg, diff) 9204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail(self._formatMessage(msg, standardMsg)) 9214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertLess(self, a, b, msg=None): 9234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Just like self.assertTrue(a < b), but with a nicer default message.""" 9244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not a < b: 9254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '%s not less than %s' % (safe_repr(a), safe_repr(b)) 9264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail(self._formatMessage(msg, standardMsg)) 9274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertLessEqual(self, a, b, msg=None): 9294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Just like self.assertTrue(a <= b), but with a nicer default message.""" 9304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not a <= b: 9314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '%s not less than or equal to %s' % (safe_repr(a), safe_repr(b)) 9324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail(self._formatMessage(msg, standardMsg)) 9334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertGreater(self, a, b, msg=None): 9354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Just like self.assertTrue(a > b), but with a nicer default message.""" 9364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not a > b: 9374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '%s not greater than %s' % (safe_repr(a), safe_repr(b)) 9384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail(self._formatMessage(msg, standardMsg)) 9394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertGreaterEqual(self, a, b, msg=None): 9414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Just like self.assertTrue(a >= b), but with a nicer default message.""" 9424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not a >= b: 9434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '%s not greater than or equal to %s' % (safe_repr(a), safe_repr(b)) 9444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail(self._formatMessage(msg, standardMsg)) 9454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertIsNone(self, obj, msg=None): 9474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Same as self.assertTrue(obj is None), with a nicer default message.""" 9484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if obj is not None: 9494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '%s is not None' % (safe_repr(obj),) 9504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail(self._formatMessage(msg, standardMsg)) 9514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertIsNotNone(self, obj, msg=None): 9534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Included for symmetry with assertIsNone.""" 9544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if obj is None: 9554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = 'unexpectedly None' 9564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail(self._formatMessage(msg, standardMsg)) 9574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertIsInstance(self, obj, cls, msg=None): 9594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Same as self.assertTrue(isinstance(obj, cls)), with a nicer 9604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm default message.""" 9614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not isinstance(obj, cls): 9624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '%s is not an instance of %r' % (safe_repr(obj), cls) 9634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail(self._formatMessage(msg, standardMsg)) 9644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertNotIsInstance(self, obj, cls, msg=None): 9664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Included for symmetry with assertIsInstance.""" 9674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if isinstance(obj, cls): 9684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm standardMsg = '%s is an instance of %r' % (safe_repr(obj), cls) 9694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail(self._formatMessage(msg, standardMsg)) 9704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertRaisesRegexp(self, expected_exception, expected_regexp, 9724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm callable_obj=None, *args, **kwargs): 9734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Asserts that the message in a raised exception matches a regexp. 9744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Args: 9764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expected_exception: Exception class expected to be raised. 9774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expected_regexp: Regexp (re pattern object or string) expected 9784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm to be found in error message. 9794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm callable_obj: Function to be called. 9804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm args: Extra args. 9814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm kwargs: Extra kwargs. 9824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 9834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm context = _AssertRaisesContext(expected_exception, self, expected_regexp) 9844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if callable_obj is None: 9854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return context 9864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with context: 9874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm callable_obj(*args, **kwargs) 9884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertRegexpMatches(self, text, expected_regexp, msg=None): 9904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Fail the test unless the text matches the regular expression.""" 9914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if isinstance(expected_regexp, basestring): 9924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expected_regexp = re.compile(expected_regexp) 9934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not expected_regexp.search(text): 9944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = msg or "Regexp didn't match" 9954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = '%s: %r not found in %r' % (msg, expected_regexp.pattern, text) 9964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise self.failureException(msg) 9974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assertNotRegexpMatches(self, text, unexpected_regexp, msg=None): 9994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Fail the test if the text matches the regular expression.""" 10004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if isinstance(unexpected_regexp, basestring): 10014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unexpected_regexp = re.compile(unexpected_regexp) 10024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm match = unexpected_regexp.search(text) 10034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if match: 10044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = msg or "Regexp matched" 10054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = '%s: %r matches %r in %r' % (msg, 10064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm text[match.start():match.end()], 10074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unexpected_regexp.pattern, 10084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm text) 10094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise self.failureException(msg) 10104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass FunctionTestCase(TestCase): 10134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """A test case that wraps a test function. 10144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm This is useful for slipping pre-existing test functions into the 10164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unittest framework. Optionally, set-up and tidy-up functions can be 10174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm supplied. As with TestCase, the tidy-up ('tearDown') function will 10184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm always be called if the set-up ('setUp') function ran successfully. 10194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 10204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, testFunc, setUp=None, tearDown=None, description=None): 10224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm super(FunctionTestCase, self).__init__() 10234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._setUpFunc = setUp 10244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._tearDownFunc = tearDown 10254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._testFunc = testFunc 10264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._description = description 10274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def setUp(self): 10294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if self._setUpFunc is not None: 10304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._setUpFunc() 10314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def tearDown(self): 10334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if self._tearDownFunc is not None: 10344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._tearDownFunc() 10354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def runTest(self): 10374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._testFunc() 10384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def id(self): 10404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self._testFunc.__name__ 10414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __eq__(self, other): 10434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not isinstance(other, self.__class__): 10444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NotImplemented 10454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self._setUpFunc == other._setUpFunc and \ 10474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._tearDownFunc == other._tearDownFunc and \ 10484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._testFunc == other._testFunc and \ 10494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._description == other._description 10504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __ne__(self, other): 10524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return not self == other 10534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __hash__(self): 10554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return hash((type(self), self._setUpFunc, self._tearDownFunc, 10564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._testFunc, self._description)) 10574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __str__(self): 10594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return "%s (%s)" % (strclass(self.__class__), 10604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._testFunc.__name__) 10614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __repr__(self): 10634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return "<%s tec=%s>" % (strclass(self.__class__), 10644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._testFunc) 10654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def shortDescription(self): 10674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if self._description is not None: 10684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self._description 10694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm doc = self._testFunc.__doc__ 10704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return doc and doc.split("\n")[0].strip() or None 1071