1
"""Test case implementation"""
13
strclass, safe_repr, unorderable_list_difference,
14
_count_diff_all_purpose, _count_diff_hashable
21
DIFF_OMITTED = ('\nDiff is %s characters long. '
22
'Set self.maxDiff to None to see it.')
24
class SkipTest(Exception):
26
Raise this exception in a test to skip it.
28
Usually you can use TestResult.skip() or one of the skipping decorators
29
instead of raising this directly.
33
class _ExpectedFailure(Exception):
35
Raise this when a test is expected to fail.
37
This is an implementation detail.
40
def __init__(self, exc_info):
41
super(_ExpectedFailure, self).__init__()
42
self.exc_info = exc_info
44
class _UnexpectedSuccess(Exception):
46
The test was supposed to fail, but it didn't!
55
Unconditionally skip a test.
57
def decorator(test_item):
58
if not (isinstance(test_item, type) and issubclass(test_item, TestCase)):
59
@functools.wraps(test_item)
60
def skip_wrapper(*args, **kwargs):
61
raise SkipTest(reason)
62
test_item = skip_wrapper
64
test_item.__unittest_skip__ = True
65
test_item.__unittest_skip_why__ = reason
69
def skipIf(condition, reason):
71
Skip a test if the condition is true.
77
def skipUnless(condition, reason):
79
Skip a test unless the condition is true.
86
def expectedFailure(func):
87
@functools.wraps(func)
88
def wrapper(*args, **kwargs):
92
raise _ExpectedFailure(sys.exc_info())
93
raise _UnexpectedSuccess
97
class _AssertRaisesContext(object):
98
"""A context manager used to implement TestCase.assertRaises* methods."""
100
def __init__(self, expected, test_case, expected_regexp=None):
101
self.expected = expected
102
self.failureException = test_case.failureException
103
self.expected_regexp = expected_regexp
108
def __exit__(self, exc_type, exc_value, tb):
111
exc_name = self.expected.__name__
112
except AttributeError:
113
exc_name = str(self.expected)
114
raise self.failureException(
115
"{0} not raised".format(exc_name))
116
if not issubclass(exc_type, self.expected):
117
# let unexpected exceptions pass through
119
self.exception = exc_value # store for later retrieval
120
if self.expected_regexp is None:
123
expected_regexp = self.expected_regexp
124
if isinstance(expected_regexp, basestring):
125
expected_regexp = re.compile(expected_regexp)
126
if not expected_regexp.search(str(exc_value)):
127
raise self.failureException('"%s" does not match "%s"' %
128
(expected_regexp.pattern, str(exc_value)))
132
class TestCase(object):
133
"""A class whose instances are single test cases.
135
By default, the test code itself should be placed in a method named
138
If the fixture may be used for many test cases, create as
139
many test methods as are needed. When instantiating such a TestCase
140
subclass, specify in the constructor arguments the name of the test method
141
that the instance is to execute.
143
Test authors should subclass TestCase for their own tests. Construction
144
and deconstruction of the test's environment ('fixture') can be
145
implemented by overriding the 'setUp' and 'tearDown' methods respectively.
147
If it is necessary to override the __init__ method, the base class
148
__init__ method must always be called. It is important that subclasses
149
should not change the signature of their __init__ method, since instances
150
of the classes are instantiated automatically by parts of the framework
154
# This attribute determines which exception will be raised when
155
# the instance's assertion methods fail; test methods raising this
156
# exception will be deemed to have 'failed' rather than 'errored'
158
failureException = AssertionError
160
# This attribute determines whether long messages (including repr of
161
# objects used in assert methods) will be printed on failure in *addition*
162
# to any explicit message passed.
166
# This attribute sets the maximum length of a diff in failure messages
167
# by assert methods using difflib. It is looked up as an instance attribute
168
# so can be configured by individual tests if required.
172
# If a string is longer than _diffThreshold, use normal comparison instead
173
# of difflib. See #11763.
174
_diffThreshold = 2**16
176
# Attribute used by TestSuite for classSetUp
178
_classSetupFailed = False
180
def __init__(self, methodName='runTest'):
181
"""Create an instance of the class that will use the named test
182
method when executed. Raises a ValueError if the instance does
183
not have a method with the specified name.
185
self._testMethodName = methodName
186
self._resultForDoCleanups = None
188
testMethod = getattr(self, methodName)
189
except AttributeError:
190
raise ValueError("no such test method in %s: %s" %
191
(self.__class__, methodName))
192
self._testMethodDoc = testMethod.__doc__
195
# Map types to custom assertEqual functions that will compare
196
# instances of said type in more detail to generate a more useful
198
self._type_equality_funcs = {}
199
self.addTypeEqualityFunc(dict, 'assertDictEqual')
200
self.addTypeEqualityFunc(list, 'assertListEqual')
201
self.addTypeEqualityFunc(tuple, 'assertTupleEqual')
202
self.addTypeEqualityFunc(set, 'assertSetEqual')
203
self.addTypeEqualityFunc(frozenset, 'assertSetEqual')
204
self.addTypeEqualityFunc(unicode, 'assertMultiLineEqual')
206
def addTypeEqualityFunc(self, typeobj, function):
207
"""Add a type specific assertEqual style function to compare a type.
209
This method is for use by TestCase subclasses that need to register
210
their own type equality functions to provide nicer error messages.
213
typeobj: The data type to call this function on when both values
214
are of the same type in assertEqual().
215
function: The callable taking two arguments and an optional
216
msg= argument that raises self.failureException with a
217
useful error message when the two arguments are not equal.
219
self._type_equality_funcs[typeobj] = function
221
def addCleanup(self, function, *args, **kwargs):
222
"""Add a function, with arguments, to be called when the test is
223
completed. Functions added are called on a LIFO basis and are
224
called after tearDown on test failure or success.
226
Cleanup items are called even if setUp fails (unlike tearDown)."""
227
self._cleanups.append((function, args, kwargs))
230
"Hook method for setting up the test fixture before exercising it."
234
"Hook method for deconstructing the test fixture after testing it."
239
"Hook method for setting up class fixture before running tests in the class."
242
def tearDownClass(cls):
243
"Hook method for deconstructing the class fixture after running all tests in the class."
245
def countTestCases(self):
248
def defaultTestResult(self):
249
return result.TestResult()
251
def shortDescription(self):
252
"""Returns a one-line description of the test, or None if no
253
description has been provided.
255
The default implementation of this method returns the first line of
256
the specified test method's docstring.
258
doc = self._testMethodDoc
259
return doc and doc.split("\n")[0].strip() or None
263
return "%s.%s" % (strclass(self.__class__), self._testMethodName)
265
def __eq__(self, other):
266
if type(self) is not type(other):
267
return NotImplemented
269
return self._testMethodName == other._testMethodName
271
def __ne__(self, other):
272
return not self == other
275
return hash((type(self), self._testMethodName))
278
return "%s (%s)" % (self._testMethodName, strclass(self.__class__))
281
return "<%s testMethod=%s>" % \
282
(strclass(self.__class__), self._testMethodName)
284
def _addSkip(self, result, reason):
285
addSkip = getattr(result, 'addSkip', None)
286
if addSkip is not None:
287
addSkip(self, reason)
289
warnings.warn("TestResult has no addSkip method, skips not reported",
291
result.addSuccess(self)
293
def run(self, result=None):
296
result = self.defaultTestResult()
297
startTestRun = getattr(result, 'startTestRun', None)
298
if startTestRun is not None:
301
self._resultForDoCleanups = result
302
result.startTest(self)
304
testMethod = getattr(self, self._testMethodName)
305
if (getattr(self.__class__, "__unittest_skip__", False) or
306
getattr(testMethod, "__unittest_skip__", False)):
307
# If the class or method was skipped.
309
skip_why = (getattr(self.__class__, '__unittest_skip_why__', '')
310
or getattr(testMethod, '__unittest_skip_why__', ''))
311
self._addSkip(result, skip_why)
313
result.stopTest(self)
319
except SkipTest as e:
320
self._addSkip(result, str(e))
321
except KeyboardInterrupt:
324
result.addError(self, sys.exc_info())
328
except KeyboardInterrupt:
330
except self.failureException:
331
result.addFailure(self, sys.exc_info())
332
except _ExpectedFailure as e:
333
addExpectedFailure = getattr(result, 'addExpectedFailure', None)
334
if addExpectedFailure is not None:
335
addExpectedFailure(self, e.exc_info)
337
warnings.warn("TestResult has no addExpectedFailure method, reporting as passes",
339
result.addSuccess(self)
340
except _UnexpectedSuccess:
341
addUnexpectedSuccess = getattr(result, 'addUnexpectedSuccess', None)
342
if addUnexpectedSuccess is not None:
343
addUnexpectedSuccess(self)
345
warnings.warn("TestResult has no addUnexpectedSuccess method, reporting as failures",
347
result.addFailure(self, sys.exc_info())
348
except SkipTest as e:
349
self._addSkip(result, str(e))
351
result.addError(self, sys.exc_info())
357
except KeyboardInterrupt:
360
result.addError(self, sys.exc_info())
363
cleanUpSuccess = self.doCleanups()
364
success = success and cleanUpSuccess
366
result.addSuccess(self)
368
result.stopTest(self)
369
if orig_result is None:
370
stopTestRun = getattr(result, 'stopTestRun', None)
371
if stopTestRun is not None:
374
def doCleanups(self):
375
"""Execute all cleanup functions. Normally called for you after
377
result = self._resultForDoCleanups
379
while self._cleanups:
380
function, args, kwargs = self._cleanups.pop(-1)
382
function(*args, **kwargs)
383
except KeyboardInterrupt:
387
result.addError(self, sys.exc_info())
390
def __call__(self, *args, **kwds):
391
return self.run(*args, **kwds)
394
"""Run the test without collecting errors in a TestResult"""
396
getattr(self, self._testMethodName)()
398
while self._cleanups:
399
function, args, kwargs = self._cleanups.pop(-1)
400
function(*args, **kwargs)
402
def skipTest(self, reason):
403
"""Skip this test."""
404
raise SkipTest(reason)
406
def fail(self, msg=None):
407
"""Fail immediately, with the given message."""
408
raise self.failureException(msg)
410
def assertFalse(self, expr, msg=None):
411
"""Check that the expression is false."""
413
msg = self._formatMessage(msg, "%s is not false" % safe_repr(expr))
414
raise self.failureException(msg)
416
def assertTrue(self, expr, msg=None):
417
"""Check that the expression is true."""
419
msg = self._formatMessage(msg, "%s is not true" % safe_repr(expr))
420
raise self.failureException(msg)
422
def _formatMessage(self, msg, standardMsg):
423
"""Honour the longMessage attribute when generating failure messages.
424
If longMessage is False this means:
425
* Use only an explicit message if it is provided
426
* Otherwise use the standard message for the assert
428
If longMessage is True:
429
* Use the standard message
430
* If an explicit message is provided, plus ' : ' and the explicit message
432
if not self.longMessage:
433
return msg or standardMsg
437
# don't switch to '{}' formatting in Python 2.X
438
# it changes the way unicode input is handled
439
return '%s : %s' % (standardMsg, msg)
440
except UnicodeDecodeError:
441
return '%s : %s' % (safe_repr(standardMsg), safe_repr(msg))
444
def assertRaises(self, excClass, callableObj=None, *args, **kwargs):
445
"""Fail unless an exception of class excClass is thrown
446
by callableObj when invoked with arguments args and keyword
447
arguments kwargs. If a different type of exception is
448
thrown, it will not be caught, and the test case will be
449
deemed to have suffered an error, exactly as for an
450
unexpected exception.
452
If called with callableObj omitted or None, will return a
453
context object used like this::
455
with self.assertRaises(SomeException):
458
The context manager keeps a reference to the exception as
459
the 'exception' attribute. This allows you to inspect the
460
exception after the assertion::
462
with self.assertRaises(SomeException) as cm:
464
the_exception = cm.exception
465
self.assertEqual(the_exception.error_code, 3)
467
context = _AssertRaisesContext(excClass, self)
468
if callableObj is None:
471
callableObj(*args, **kwargs)
473
def _getAssertEqualityFunc(self, first, second):
474
"""Get a detailed comparison function for the types of the two args.
476
Returns: A callable accepting (first, second, msg=None) that will
477
raise a failure exception if first != second with a useful human
478
readable error message for those types.
481
# NOTE(gregory.p.smith): I considered isinstance(first, type(second))
482
# and vice versa. I opted for the conservative approach in case
483
# subclasses are not intended to be compared in detail to their super
484
# class instances using a type equality func. This means testing
485
# subtypes won't automagically use the detailed comparison. Callers
486
# should use their type specific assertSpamEqual method to compare
487
# subclasses if the detailed comparison is desired and appropriate.
488
# See the discussion in http://bugs.python.org/issue2578.
490
if type(first) is type(second):
491
asserter = self._type_equality_funcs.get(type(first))
492
if asserter is not None:
493
if isinstance(asserter, basestring):
494
asserter = getattr(self, asserter)
497
return self._baseAssertEqual
499
def _baseAssertEqual(self, first, second, msg=None):
500
"""The default assertEqual implementation, not type specific."""
501
if not first == second:
502
standardMsg = '%s != %s' % (safe_repr(first), safe_repr(second))
503
msg = self._formatMessage(msg, standardMsg)
504
raise self.failureException(msg)
506
def assertEqual(self, first, second, msg=None):
507
"""Fail if the two objects are unequal as determined by the '=='
510
assertion_func = self._getAssertEqualityFunc(first, second)
511
assertion_func(first, second, msg=msg)
513
def assertNotEqual(self, first, second, msg=None):
514
"""Fail if the two objects are equal as determined by the '=='
517
if not first != second:
518
msg = self._formatMessage(msg, '%s == %s' % (safe_repr(first),
520
raise self.failureException(msg)
523
def assertAlmostEqual(self, first, second, places=None, msg=None, delta=None):
524
"""Fail if the two objects are unequal as determined by their
525
difference rounded to the given number of decimal places
526
(default 7) and comparing to zero, or by comparing that the
527
between the two objects is more than the given delta.
529
Note that decimal places (from zero) are usually not the same
530
as significant digits (measured from the most signficant digit).
532
If the two objects compare equal then they will automatically
533
compare almost equal.
538
if delta is not None and places is not None:
539
raise TypeError("specify delta or places not both")
541
if delta is not None:
542
if abs(first - second) <= delta:
545
standardMsg = '%s != %s within %s delta' % (safe_repr(first),
552
if round(abs(second-first), places) == 0:
555
standardMsg = '%s != %s within %r places' % (safe_repr(first),
558
msg = self._formatMessage(msg, standardMsg)
559
raise self.failureException(msg)
561
def assertNotAlmostEqual(self, first, second, places=None, msg=None, delta=None):
562
"""Fail if the two objects are equal as determined by their
563
difference rounded to the given number of decimal places
564
(default 7) and comparing to zero, or by comparing that the
565
between the two objects is less than the given delta.
567
Note that decimal places (from zero) are usually not the same
568
as significant digits (measured from the most signficant digit).
570
Objects that are equal automatically fail.
572
if delta is not None and places is not None:
573
raise TypeError("specify delta or places not both")
574
if delta is not None:
575
if not (first == second) and abs(first - second) > delta:
577
standardMsg = '%s == %s within %s delta' % (safe_repr(first),
583
if not (first == second) and round(abs(second-first), places) != 0:
585
standardMsg = '%s == %s within %r places' % (safe_repr(first),
589
msg = self._formatMessage(msg, standardMsg)
590
raise self.failureException(msg)
592
# Synonyms for assertion methods
594
# The plurals are undocumented. Keep them that way to discourage use.
595
# Do not add more. Do not remove.
596
# Going through a deprecation cycle on these would annoy many people.
597
assertEquals = assertEqual
598
assertNotEquals = assertNotEqual
599
assertAlmostEquals = assertAlmostEqual
600
assertNotAlmostEquals = assertNotAlmostEqual
603
# These fail* assertion method names are pending deprecation and will
604
# be a DeprecationWarning in 3.2; http://bugs.python.org/issue2578
605
def _deprecate(original_func):
606
def deprecated_func(*args, **kwargs):
608
'Please use {0} instead.'.format(original_func.__name__),
609
PendingDeprecationWarning, 2)
610
return original_func(*args, **kwargs)
611
return deprecated_func
613
failUnlessEqual = _deprecate(assertEqual)
614
failIfEqual = _deprecate(assertNotEqual)
615
failUnlessAlmostEqual = _deprecate(assertAlmostEqual)
616
failIfAlmostEqual = _deprecate(assertNotAlmostEqual)
617
failUnless = _deprecate(assertTrue)
618
failUnlessRaises = _deprecate(assertRaises)
619
failIf = _deprecate(assertFalse)
621
def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None):
622
"""An equality assertion for ordered sequences (like lists and tuples).
624
For the purposes of this function, a valid ordered sequence type is one
625
which can be indexed, has a length, and has an equality operator.
628
seq1: The first sequence to compare.
629
seq2: The second sequence to compare.
630
seq_type: The expected datatype of the sequences, or None if no
631
datatype should be enforced.
632
msg: Optional message to use on failure instead of a list of
635
if seq_type is not None:
636
seq_type_name = seq_type.__name__
637
if not isinstance(seq1, seq_type):
638
raise self.failureException('First sequence is not a %s: %s'
639
% (seq_type_name, safe_repr(seq1)))
640
if not isinstance(seq2, seq_type):
641
raise self.failureException('Second sequence is not a %s: %s'
642
% (seq_type_name, safe_repr(seq2)))
644
seq_type_name = "sequence"
649
except (TypeError, NotImplementedError):
650
differing = 'First %s has no length. Non-sequence?' % (
653
if differing is None:
656
except (TypeError, NotImplementedError):
657
differing = 'Second %s has no length. Non-sequence?' % (
660
if differing is None:
664
seq1_repr = safe_repr(seq1)
665
seq2_repr = safe_repr(seq2)
666
if len(seq1_repr) > 30:
667
seq1_repr = seq1_repr[:30] + '...'
668
if len(seq2_repr) > 30:
669
seq2_repr = seq2_repr[:30] + '...'
670
elements = (seq_type_name.capitalize(), seq1_repr, seq2_repr)
671
differing = '%ss differ: %s != %s\n' % elements
673
for i in xrange(min(len1, len2)):
676
except (TypeError, IndexError, NotImplementedError):
677
differing += ('\nUnable to index element %d of first %s\n' %
683
except (TypeError, IndexError, NotImplementedError):
684
differing += ('\nUnable to index element %d of second %s\n' %
689
differing += ('\nFirst differing element %d:\n%s\n%s\n' %
693
if (len1 == len2 and seq_type is None and
694
type(seq1) != type(seq2)):
695
# The sequences are the same, but have differing types.
699
differing += ('\nFirst %s contains %d additional '
700
'elements.\n' % (seq_type_name, len1 - len2))
702
differing += ('First extra element %d:\n%s\n' %
704
except (TypeError, IndexError, NotImplementedError):
705
differing += ('Unable to index element %d '
706
'of first %s\n' % (len2, seq_type_name))
708
differing += ('\nSecond %s contains %d additional '
709
'elements.\n' % (seq_type_name, len2 - len1))
711
differing += ('First extra element %d:\n%s\n' %
713
except (TypeError, IndexError, NotImplementedError):
714
differing += ('Unable to index element %d '
715
'of second %s\n' % (len1, seq_type_name))
716
standardMsg = differing
717
diffMsg = '\n' + '\n'.join(
718
difflib.ndiff(pprint.pformat(seq1).splitlines(),
719
pprint.pformat(seq2).splitlines()))
720
standardMsg = self._truncateMessage(standardMsg, diffMsg)
721
msg = self._formatMessage(msg, standardMsg)
724
def _truncateMessage(self, message, diff):
725
max_diff = self.maxDiff
726
if max_diff is None or len(diff) <= max_diff:
727
return message + diff
728
return message + (DIFF_OMITTED % len(diff))
730
def assertListEqual(self, list1, list2, msg=None):
731
"""A list-specific equality assertion.
734
list1: The first list to compare.
735
list2: The second list to compare.
736
msg: Optional message to use on failure instead of a list of
740
self.assertSequenceEqual(list1, list2, msg, seq_type=list)
742
def assertTupleEqual(self, tuple1, tuple2, msg=None):
743
"""A tuple-specific equality assertion.
746
tuple1: The first tuple to compare.
747
tuple2: The second tuple to compare.
748
msg: Optional message to use on failure instead of a list of
751
self.assertSequenceEqual(tuple1, tuple2, msg, seq_type=tuple)
753
def assertSetEqual(self, set1, set2, msg=None):
754
"""A set-specific equality assertion.
757
set1: The first set to compare.
758
set2: The second set to compare.
759
msg: Optional message to use on failure instead of a list of
762
assertSetEqual uses ducktyping to support different types of sets, and
763
is optimized for sets specifically (parameters must support a
767
difference1 = set1.difference(set2)
769
self.fail('invalid type when attempting set difference: %s' % e)
770
except AttributeError, e:
771
self.fail('first argument does not support set difference: %s' % e)
774
difference2 = set2.difference(set1)
776
self.fail('invalid type when attempting set difference: %s' % e)
777
except AttributeError, e:
778
self.fail('second argument does not support set difference: %s' % e)
780
if not (difference1 or difference2):
785
lines.append('Items in the first set but not the second:')
786
for item in difference1:
787
lines.append(repr(item))
789
lines.append('Items in the second set but not the first:')
790
for item in difference2:
791
lines.append(repr(item))
793
standardMsg = '\n'.join(lines)
794
self.fail(self._formatMessage(msg, standardMsg))
796
def assertIn(self, member, container, msg=None):
797
"""Just like self.assertTrue(a in b), but with a nicer default message."""
798
if member not in container:
799
standardMsg = '%s not found in %s' % (safe_repr(member),
800
safe_repr(container))
801
self.fail(self._formatMessage(msg, standardMsg))
803
def assertNotIn(self, member, container, msg=None):
804
"""Just like self.assertTrue(a not in b), but with a nicer default message."""
805
if member in container:
806
standardMsg = '%s unexpectedly found in %s' % (safe_repr(member),
807
safe_repr(container))
808
self.fail(self._formatMessage(msg, standardMsg))
810
def assertIs(self, expr1, expr2, msg=None):
811
"""Just like self.assertTrue(a is b), but with a nicer default message."""
812
if expr1 is not expr2:
813
standardMsg = '%s is not %s' % (safe_repr(expr1),
815
self.fail(self._formatMessage(msg, standardMsg))
817
def assertIsNot(self, expr1, expr2, msg=None):
818
"""Just like self.assertTrue(a is not b), but with a nicer default message."""
820
standardMsg = 'unexpectedly identical: %s' % (safe_repr(expr1),)
821
self.fail(self._formatMessage(msg, standardMsg))
823
def assertDictEqual(self, d1, d2, msg=None):
824
self.assertIsInstance(d1, dict, 'First argument is not a dictionary')
825
self.assertIsInstance(d2, dict, 'Second argument is not a dictionary')
828
standardMsg = '%s != %s' % (safe_repr(d1, True), safe_repr(d2, True))
829
diff = ('\n' + '\n'.join(difflib.ndiff(
830
pprint.pformat(d1).splitlines(),
831
pprint.pformat(d2).splitlines())))
832
standardMsg = self._truncateMessage(standardMsg, diff)
833
self.fail(self._formatMessage(msg, standardMsg))
835
def assertDictContainsSubset(self, expected, actual, msg=None):
836
"""Checks whether actual is a superset of expected."""
839
for key, value in expected.iteritems():
840
if key not in actual:
842
elif value != actual[key]:
843
mismatched.append('%s, expected: %s, actual: %s' %
844
(safe_repr(key), safe_repr(value),
845
safe_repr(actual[key])))
847
if not (missing or mismatched):
852
standardMsg = 'Missing: %s' % ','.join(safe_repr(m) for m in
857
standardMsg += 'Mismatched values: %s' % ','.join(mismatched)
859
self.fail(self._formatMessage(msg, standardMsg))
861
def assertItemsEqual(self, expected_seq, actual_seq, msg=None):
862
"""An unordered sequence specific comparison. It asserts that
863
actual_seq and expected_seq have the same element counts.
866
self.assertEqual(Counter(iter(actual_seq)),
867
Counter(iter(expected_seq)))
869
Asserts that each element has the same count in both sequences.
871
- [0, 1, 1] and [1, 0, 1] compare equal.
872
- [0, 0, 1] and [0, 1] compare unequal.
874
first_seq, second_seq = list(actual_seq), list(expected_seq)
875
with warnings.catch_warnings():
877
# Silence Py3k warning raised during the sorting
878
for _msg in ["(code|dict|type) inequality comparisons",
879
"builtin_function_or_method order comparisons",
880
"comparing unequal types"]:
881
warnings.filterwarnings("ignore", _msg, DeprecationWarning)
883
first = collections.Counter(first_seq)
884
second = collections.Counter(second_seq)
886
# Handle case with unhashable elements
887
differences = _count_diff_all_purpose(first_seq, second_seq)
891
differences = _count_diff_hashable(first_seq, second_seq)
894
standardMsg = 'Element counts were not equal:\n'
895
lines = ['First has %d, Second has %d: %r' % diff for diff in differences]
896
diffMsg = '\n'.join(lines)
897
standardMsg = self._truncateMessage(standardMsg, diffMsg)
898
msg = self._formatMessage(msg, standardMsg)
901
def assertMultiLineEqual(self, first, second, msg=None):
902
"""Assert that two multi-line strings are equal."""
903
self.assertIsInstance(first, basestring,
904
'First argument is not a string')
905
self.assertIsInstance(second, basestring,
906
'Second argument is not a string')
909
# don't use difflib if the strings are too long
910
if (len(first) > self._diffThreshold or
911
len(second) > self._diffThreshold):
912
self._baseAssertEqual(first, second, msg)
913
firstlines = first.splitlines(True)
914
secondlines = second.splitlines(True)
915
if len(firstlines) == 1 and first.strip('\r\n') == first:
916
firstlines = [first + '\n']
917
secondlines = [second + '\n']
918
standardMsg = '%s != %s' % (safe_repr(first, True),
919
safe_repr(second, True))
920
diff = '\n' + ''.join(difflib.ndiff(firstlines, secondlines))
921
standardMsg = self._truncateMessage(standardMsg, diff)
922
self.fail(self._formatMessage(msg, standardMsg))
924
def assertLess(self, a, b, msg=None):
925
"""Just like self.assertTrue(a < b), but with a nicer default message."""
927
standardMsg = '%s not less than %s' % (safe_repr(a), safe_repr(b))
928
self.fail(self._formatMessage(msg, standardMsg))
930
def assertLessEqual(self, a, b, msg=None):
931
"""Just like self.assertTrue(a <= b), but with a nicer default message."""
933
standardMsg = '%s not less than or equal to %s' % (safe_repr(a), safe_repr(b))
934
self.fail(self._formatMessage(msg, standardMsg))
936
def assertGreater(self, a, b, msg=None):
937
"""Just like self.assertTrue(a > b), but with a nicer default message."""
939
standardMsg = '%s not greater than %s' % (safe_repr(a), safe_repr(b))
940
self.fail(self._formatMessage(msg, standardMsg))
942
def assertGreaterEqual(self, a, b, msg=None):
943
"""Just like self.assertTrue(a >= b), but with a nicer default message."""
945
standardMsg = '%s not greater than or equal to %s' % (safe_repr(a), safe_repr(b))
946
self.fail(self._formatMessage(msg, standardMsg))
948
def assertIsNone(self, obj, msg=None):
949
"""Same as self.assertTrue(obj is None), with a nicer default message."""
951
standardMsg = '%s is not None' % (safe_repr(obj),)
952
self.fail(self._formatMessage(msg, standardMsg))
954
def assertIsNotNone(self, obj, msg=None):
955
"""Included for symmetry with assertIsNone."""
957
standardMsg = 'unexpectedly None'
958
self.fail(self._formatMessage(msg, standardMsg))
960
def assertIsInstance(self, obj, cls, msg=None):
961
"""Same as self.assertTrue(isinstance(obj, cls)), with a nicer
963
if not isinstance(obj, cls):
964
standardMsg = '%s is not an instance of %r' % (safe_repr(obj), cls)
965
self.fail(self._formatMessage(msg, standardMsg))
967
def assertNotIsInstance(self, obj, cls, msg=None):
968
"""Included for symmetry with assertIsInstance."""
969
if isinstance(obj, cls):
970
standardMsg = '%s is an instance of %r' % (safe_repr(obj), cls)
971
self.fail(self._formatMessage(msg, standardMsg))
973
def assertRaisesRegexp(self, expected_exception, expected_regexp,
974
callable_obj=None, *args, **kwargs):
975
"""Asserts that the message in a raised exception matches a regexp.
978
expected_exception: Exception class expected to be raised.
979
expected_regexp: Regexp (re pattern object or string) expected
980
to be found in error message.
981
callable_obj: Function to be called.
983
kwargs: Extra kwargs.
985
context = _AssertRaisesContext(expected_exception, self, expected_regexp)
986
if callable_obj is None:
989
callable_obj(*args, **kwargs)
991
def assertRegexpMatches(self, text, expected_regexp, msg=None):
992
"""Fail the test unless the text matches the regular expression."""
993
if isinstance(expected_regexp, basestring):
994
expected_regexp = re.compile(expected_regexp)
995
if not expected_regexp.search(text):
996
msg = msg or "Regexp didn't match"
997
msg = '%s: %r not found in %r' % (msg, expected_regexp.pattern, text)
998
raise self.failureException(msg)
1000
def assertNotRegexpMatches(self, text, unexpected_regexp, msg=None):
1001
"""Fail the test if the text matches the regular expression."""
1002
if isinstance(unexpected_regexp, basestring):
1003
unexpected_regexp = re.compile(unexpected_regexp)
1004
match = unexpected_regexp.search(text)
1006
msg = msg or "Regexp matched"
1007
msg = '%s: %r matches %r in %r' % (msg,
1008
text[match.start():match.end()],
1009
unexpected_regexp.pattern,
1011
raise self.failureException(msg)
1014
class FunctionTestCase(TestCase):
1015
"""A test case that wraps a test function.
1017
This is useful for slipping pre-existing test functions into the
1018
unittest framework. Optionally, set-up and tidy-up functions can be
1019
supplied. As with TestCase, the tidy-up ('tearDown') function will
1020
always be called if the set-up ('setUp') function ran successfully.
1023
def __init__(self, testFunc, setUp=None, tearDown=None, description=None):
1024
super(FunctionTestCase, self).__init__()
1025
self._setUpFunc = setUp
1026
self._tearDownFunc = tearDown
1027
self._testFunc = testFunc
1028
self._description = description
1031
if self._setUpFunc is not None:
1035
if self._tearDownFunc is not None:
1036
self._tearDownFunc()
1042
return self._testFunc.__name__
1044
def __eq__(self, other):
1045
if not isinstance(other, self.__class__):
1046
return NotImplemented
1048
return self._setUpFunc == other._setUpFunc and \
1049
self._tearDownFunc == other._tearDownFunc and \
1050
self._testFunc == other._testFunc and \
1051
self._description == other._description
1053
def __ne__(self, other):
1054
return not self == other
1057
return hash((type(self), self._setUpFunc, self._tearDownFunc,
1058
self._testFunc, self._description))
1061
return "%s (%s)" % (strclass(self.__class__),
1062
self._testFunc.__name__)
1065
return "<%s tec=%s>" % (strclass(self.__class__),
1068
def shortDescription(self):
1069
if self._description is not None:
1070
return self._description
1071
doc = self._testFunc.__doc__
1072
return doc and doc.split("\n")[0].strip() or None