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