blob: 69888a5a688c84cc8c8bb633342a64cab3eabd7d [file] [log] [blame]
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001"""Test case implementation"""
2
3import sys
4import functools
5import difflib
Antoine Pitrou0715b9f2013-09-14 19:45:47 +02006import logging
Benjamin Petersonbed7d042009-07-19 21:01:52 +00007import pprint
8import re
9import warnings
Raymond Hettinger6e165b32010-11-27 09:31:37 +000010import collections
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010011import contextlib
Antoine Pitrou96810222014-04-29 01:23:50 +020012import traceback
Benjamin Petersonbed7d042009-07-19 21:01:52 +000013
Benjamin Peterson847a4112010-03-14 15:04:17 +000014from . import result
Florent Xiclunac53ae582011-11-04 08:25:54 +010015from .util import (strclass, safe_repr, _count_diff_all_purpose,
Serhiy Storchaka77622f52013-09-23 23:07:00 +030016 _count_diff_hashable, _common_shorten_repr)
Benjamin Petersonbed7d042009-07-19 21:01:52 +000017
Benjamin Petersondccc1fc2010-03-22 00:15:53 +000018__unittest = True
Benjamin Petersonbed7d042009-07-19 21:01:52 +000019
Michael Foord9dad32e2010-06-05 13:49:56 +000020
21DIFF_OMITTED = ('\nDiff is %s characters long. '
22 'Set self.maxDiff to None to see it.')
23
Benjamin Petersonbed7d042009-07-19 21:01:52 +000024class SkipTest(Exception):
25 """
26 Raise this exception in a test to skip it.
27
Ezio Melotti265281a2013-03-27 20:11:55 +020028 Usually you can use TestCase.skipTest() or one of the skipping decorators
Benjamin Petersonbed7d042009-07-19 21:01:52 +000029 instead of raising this directly.
30 """
Benjamin Petersonbed7d042009-07-19 21:01:52 +000031
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010032class _ShouldStop(Exception):
Benjamin Petersonbed7d042009-07-19 21:01:52 +000033 """
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010034 The test should stop.
Benjamin Petersonbed7d042009-07-19 21:01:52 +000035 """
36
Benjamin Petersonbed7d042009-07-19 21:01:52 +000037class _UnexpectedSuccess(Exception):
38 """
39 The test was supposed to fail, but it didn't!
40 """
Michael Foordb3468f72010-12-19 03:19:47 +000041
42
43class _Outcome(object):
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010044 def __init__(self, result=None):
45 self.expecting_failure = False
46 self.result = result
47 self.result_supports_subtests = hasattr(result, "addSubTest")
Michael Foordb3468f72010-12-19 03:19:47 +000048 self.success = True
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010049 self.skipped = []
Michael Foordb3468f72010-12-19 03:19:47 +000050 self.expectedFailure = None
51 self.errors = []
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010052
53 @contextlib.contextmanager
54 def testPartExecutor(self, test_case, isTest=False):
55 old_success = self.success
56 self.success = True
57 try:
58 yield
59 except KeyboardInterrupt:
60 raise
61 except SkipTest as e:
62 self.success = False
63 self.skipped.append((test_case, str(e)))
64 except _ShouldStop:
65 pass
66 except:
67 exc_info = sys.exc_info()
68 if self.expecting_failure:
69 self.expectedFailure = exc_info
70 else:
71 self.success = False
72 self.errors.append((test_case, exc_info))
Victor Stinner031bd532013-12-09 01:52:50 +010073 # explicitly break a reference cycle:
74 # exc_info -> frame -> exc_info
75 exc_info = None
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010076 else:
77 if self.result_supports_subtests and self.success:
78 self.errors.append((test_case, None))
79 finally:
80 self.success = self.success and old_success
Michael Foordb3468f72010-12-19 03:19:47 +000081
Benjamin Petersonbed7d042009-07-19 21:01:52 +000082
83def _id(obj):
84 return obj
85
86def skip(reason):
87 """
88 Unconditionally skip a test.
89 """
90 def decorator(test_item):
Antoine Pitroub05ac862012-04-25 14:56:46 +020091 if not isinstance(test_item, type):
Benjamin Peterson847a4112010-03-14 15:04:17 +000092 @functools.wraps(test_item)
93 def skip_wrapper(*args, **kwargs):
94 raise SkipTest(reason)
95 test_item = skip_wrapper
96
97 test_item.__unittest_skip__ = True
98 test_item.__unittest_skip_why__ = reason
99 return test_item
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000100 return decorator
101
102def skipIf(condition, reason):
103 """
104 Skip a test if the condition is true.
105 """
106 if condition:
107 return skip(reason)
108 return _id
109
110def skipUnless(condition, reason):
111 """
112 Skip a test unless the condition is true.
113 """
114 if not condition:
115 return skip(reason)
116 return _id
117
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100118def expectedFailure(test_item):
119 test_item.__unittest_expecting_failure__ = True
120 return test_item
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000121
122
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200123class _BaseTestCaseContext:
124
125 def __init__(self, test_case):
126 self.test_case = test_case
127
128 def _raiseFailure(self, standardMsg):
129 msg = self.test_case._formatMessage(self.msg, standardMsg)
130 raise self.test_case.failureException(msg)
131
132
133class _AssertRaisesBaseContext(_BaseTestCaseContext):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000134
135 def __init__(self, expected, test_case, callable_obj=None,
Ezio Melottib4dc2502011-05-06 15:01:41 +0300136 expected_regex=None):
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200137 _BaseTestCaseContext.__init__(self, test_case)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000138 self.expected = expected
Ezio Melottib4dc2502011-05-06 15:01:41 +0300139 self.test_case = test_case
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000140 if callable_obj is not None:
141 try:
142 self.obj_name = callable_obj.__name__
143 except AttributeError:
144 self.obj_name = str(callable_obj)
145 else:
146 self.obj_name = None
R David Murrayef1c2672014-03-25 15:31:50 -0400147 if expected_regex is not None:
Ezio Melottied3a7d22010-12-01 02:32:32 +0000148 expected_regex = re.compile(expected_regex)
149 self.expected_regex = expected_regex
Ezio Melottib4dc2502011-05-06 15:01:41 +0300150 self.msg = None
151
Ezio Melottib4dc2502011-05-06 15:01:41 +0300152 def handle(self, name, callable_obj, args, kwargs):
153 """
154 If callable_obj is None, assertRaises/Warns is being used as a
155 context manager, so check for a 'msg' kwarg and return self.
156 If callable_obj is not None, call it passing args and kwargs.
157 """
158 if callable_obj is None:
159 self.msg = kwargs.pop('msg', None)
160 return self
161 with self:
162 callable_obj(*args, **kwargs)
163
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000164
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000165class _AssertRaisesContext(_AssertRaisesBaseContext):
166 """A context manager used to implement TestCase.assertRaises* methods."""
167
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000168 def __enter__(self):
Ezio Melotti49008232010-02-08 21:57:48 +0000169 return self
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000170
171 def __exit__(self, exc_type, exc_value, tb):
172 if exc_type is None:
173 try:
174 exc_name = self.expected.__name__
175 except AttributeError:
176 exc_name = str(self.expected)
177 if self.obj_name:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300178 self._raiseFailure("{} not raised by {}".format(exc_name,
179 self.obj_name))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000180 else:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300181 self._raiseFailure("{} not raised".format(exc_name))
Antoine Pitrou96810222014-04-29 01:23:50 +0200182 else:
183 traceback.clear_frames(tb)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000184 if not issubclass(exc_type, self.expected):
185 # let unexpected exceptions pass through
186 return False
Ezio Melotti49008232010-02-08 21:57:48 +0000187 # store exception, without traceback, for later retrieval
188 self.exception = exc_value.with_traceback(None)
Ezio Melottied3a7d22010-12-01 02:32:32 +0000189 if self.expected_regex is None:
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000190 return True
191
Ezio Melottied3a7d22010-12-01 02:32:32 +0000192 expected_regex = self.expected_regex
193 if not expected_regex.search(str(exc_value)):
Ezio Melottib4dc2502011-05-06 15:01:41 +0300194 self._raiseFailure('"{}" does not match "{}"'.format(
195 expected_regex.pattern, str(exc_value)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000196 return True
197
198
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000199class _AssertWarnsContext(_AssertRaisesBaseContext):
200 """A context manager used to implement TestCase.assertWarns* methods."""
201
202 def __enter__(self):
203 # The __warningregistry__'s need to be in a pristine state for tests
204 # to work properly.
205 for v in sys.modules.values():
206 if getattr(v, '__warningregistry__', None):
207 v.__warningregistry__ = {}
208 self.warnings_manager = warnings.catch_warnings(record=True)
209 self.warnings = self.warnings_manager.__enter__()
210 warnings.simplefilter("always", self.expected)
211 return self
212
213 def __exit__(self, exc_type, exc_value, tb):
214 self.warnings_manager.__exit__(exc_type, exc_value, tb)
215 if exc_type is not None:
216 # let unexpected exceptions pass through
217 return
218 try:
219 exc_name = self.expected.__name__
220 except AttributeError:
221 exc_name = str(self.expected)
222 first_matching = None
223 for m in self.warnings:
224 w = m.message
225 if not isinstance(w, self.expected):
226 continue
227 if first_matching is None:
228 first_matching = w
Ezio Melottied3a7d22010-12-01 02:32:32 +0000229 if (self.expected_regex is not None and
230 not self.expected_regex.search(str(w))):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000231 continue
232 # store warning for later retrieval
233 self.warning = w
234 self.filename = m.filename
235 self.lineno = m.lineno
236 return
237 # Now we simply try to choose a helpful failure message
238 if first_matching is not None:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300239 self._raiseFailure('"{}" does not match "{}"'.format(
240 self.expected_regex.pattern, str(first_matching)))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000241 if self.obj_name:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300242 self._raiseFailure("{} not triggered by {}".format(exc_name,
243 self.obj_name))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000244 else:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300245 self._raiseFailure("{} not triggered".format(exc_name))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000246
247
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200248
249_LoggingWatcher = collections.namedtuple("_LoggingWatcher",
250 ["records", "output"])
251
252
253class _CapturingHandler(logging.Handler):
254 """
255 A logging handler capturing all (raw and formatted) logging output.
256 """
257
258 def __init__(self):
259 logging.Handler.__init__(self)
260 self.watcher = _LoggingWatcher([], [])
261
262 def flush(self):
263 pass
264
265 def emit(self, record):
266 self.watcher.records.append(record)
267 msg = self.format(record)
268 self.watcher.output.append(msg)
269
270
271
272class _AssertLogsContext(_BaseTestCaseContext):
273 """A context manager used to implement TestCase.assertLogs()."""
274
275 LOGGING_FORMAT = "%(levelname)s:%(name)s:%(message)s"
276
277 def __init__(self, test_case, logger_name, level):
278 _BaseTestCaseContext.__init__(self, test_case)
279 self.logger_name = logger_name
280 if level:
281 self.level = logging._nameToLevel.get(level, level)
282 else:
283 self.level = logging.INFO
284 self.msg = None
285
286 def __enter__(self):
287 if isinstance(self.logger_name, logging.Logger):
288 logger = self.logger = self.logger_name
289 else:
290 logger = self.logger = logging.getLogger(self.logger_name)
291 formatter = logging.Formatter(self.LOGGING_FORMAT)
292 handler = _CapturingHandler()
293 handler.setFormatter(formatter)
294 self.watcher = handler.watcher
295 self.old_handlers = logger.handlers[:]
296 self.old_level = logger.level
297 self.old_propagate = logger.propagate
298 logger.handlers = [handler]
299 logger.setLevel(self.level)
300 logger.propagate = False
301 return handler.watcher
302
303 def __exit__(self, exc_type, exc_value, tb):
304 self.logger.handlers = self.old_handlers
305 self.logger.propagate = self.old_propagate
306 self.logger.setLevel(self.old_level)
307 if exc_type is not None:
308 # let unexpected exceptions pass through
309 return False
310 if len(self.watcher.records) == 0:
311 self._raiseFailure(
312 "no logs of level {} or higher triggered on {}"
313 .format(logging.getLevelName(self.level), self.logger.name))
314
315
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000316class TestCase(object):
317 """A class whose instances are single test cases.
318
319 By default, the test code itself should be placed in a method named
320 'runTest'.
321
322 If the fixture may be used for many test cases, create as
323 many test methods as are needed. When instantiating such a TestCase
324 subclass, specify in the constructor arguments the name of the test method
325 that the instance is to execute.
326
327 Test authors should subclass TestCase for their own tests. Construction
328 and deconstruction of the test's environment ('fixture') can be
329 implemented by overriding the 'setUp' and 'tearDown' methods respectively.
330
331 If it is necessary to override the __init__ method, the base class
332 __init__ method must always be called. It is important that subclasses
333 should not change the signature of their __init__ method, since instances
334 of the classes are instantiated automatically by parts of the framework
335 in order to be run.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000336
Ezio Melotti31797e52013-03-29 03:42:29 +0200337 When subclassing TestCase, you can set these attributes:
338 * failureException: determines which exception will be raised when
339 the instance's assertion methods fail; test methods raising this
340 exception will be deemed to have 'failed' rather than 'errored'.
341 * longMessage: determines whether long messages (including repr of
342 objects used in assert methods) will be printed on failure in *addition*
343 to any explicit message passed.
344 * maxDiff: sets the maximum length of a diff in failure messages
345 by assert methods using difflib. It is looked up as an instance
346 attribute so can be configured by individual tests if required.
347 """
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000348
349 failureException = AssertionError
350
Michael Foord5074df62010-12-03 00:53:09 +0000351 longMessage = True
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000352
Michael Foord085dfd32010-06-05 12:17:02 +0000353 maxDiff = 80*8
354
Ezio Melottiedd117f2011-04-27 10:20:38 +0300355 # If a string is longer than _diffThreshold, use normal comparison instead
356 # of difflib. See #11763.
357 _diffThreshold = 2**16
358
Benjamin Peterson847a4112010-03-14 15:04:17 +0000359 # Attribute used by TestSuite for classSetUp
360
361 _classSetupFailed = False
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000362
363 def __init__(self, methodName='runTest'):
364 """Create an instance of the class that will use the named test
365 method when executed. Raises a ValueError if the instance does
366 not have a method with the specified name.
367 """
368 self._testMethodName = methodName
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100369 self._outcome = None
Michael Foord32e1d832011-01-03 17:00:11 +0000370 self._testMethodDoc = 'No test'
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000371 try:
372 testMethod = getattr(self, methodName)
373 except AttributeError:
Michael Foord32e1d832011-01-03 17:00:11 +0000374 if methodName != 'runTest':
375 # we allow instantiation with no explicit method name
376 # but not an *incorrect* or missing method name
377 raise ValueError("no such test method in %s: %s" %
378 (self.__class__, methodName))
379 else:
380 self._testMethodDoc = testMethod.__doc__
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000381 self._cleanups = []
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100382 self._subtest = None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000383
384 # Map types to custom assertEqual functions that will compare
385 # instances of said type in more detail to generate a more useful
386 # error message.
Benjamin Peterson34b2b262011-07-12 19:21:42 -0500387 self._type_equality_funcs = {}
Michael Foord8ca6d982010-11-20 15:34:26 +0000388 self.addTypeEqualityFunc(dict, 'assertDictEqual')
389 self.addTypeEqualityFunc(list, 'assertListEqual')
390 self.addTypeEqualityFunc(tuple, 'assertTupleEqual')
391 self.addTypeEqualityFunc(set, 'assertSetEqual')
392 self.addTypeEqualityFunc(frozenset, 'assertSetEqual')
393 self.addTypeEqualityFunc(str, 'assertMultiLineEqual')
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000394
395 def addTypeEqualityFunc(self, typeobj, function):
396 """Add a type specific assertEqual style function to compare a type.
397
398 This method is for use by TestCase subclasses that need to register
399 their own type equality functions to provide nicer error messages.
400
401 Args:
402 typeobj: The data type to call this function on when both values
403 are of the same type in assertEqual().
404 function: The callable taking two arguments and an optional
405 msg= argument that raises self.failureException with a
406 useful error message when the two arguments are not equal.
407 """
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000408 self._type_equality_funcs[typeobj] = function
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000409
410 def addCleanup(self, function, *args, **kwargs):
411 """Add a function, with arguments, to be called when the test is
412 completed. Functions added are called on a LIFO basis and are
413 called after tearDown on test failure or success.
414
415 Cleanup items are called even if setUp fails (unlike tearDown)."""
416 self._cleanups.append((function, args, kwargs))
417
418 def setUp(self):
419 "Hook method for setting up the test fixture before exercising it."
420 pass
421
422 def tearDown(self):
423 "Hook method for deconstructing the test fixture after testing it."
424 pass
425
Benjamin Peterson847a4112010-03-14 15:04:17 +0000426 @classmethod
427 def setUpClass(cls):
428 "Hook method for setting up class fixture before running tests in the class."
429
430 @classmethod
431 def tearDownClass(cls):
432 "Hook method for deconstructing the class fixture after running all tests in the class."
433
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000434 def countTestCases(self):
435 return 1
436
437 def defaultTestResult(self):
438 return result.TestResult()
439
440 def shortDescription(self):
Michael Foord34c94622010-02-10 15:51:42 +0000441 """Returns a one-line description of the test, or None if no
442 description has been provided.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000443
Michael Foord34c94622010-02-10 15:51:42 +0000444 The default implementation of this method returns the first line of
445 the specified test method's docstring.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000446 """
Michael Foord34c94622010-02-10 15:51:42 +0000447 doc = self._testMethodDoc
448 return doc and doc.split("\n")[0].strip() or None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000449
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000450
451 def id(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000452 return "%s.%s" % (strclass(self.__class__), self._testMethodName)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000453
454 def __eq__(self, other):
455 if type(self) is not type(other):
456 return NotImplemented
457
458 return self._testMethodName == other._testMethodName
459
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000460 def __hash__(self):
461 return hash((type(self), self._testMethodName))
462
463 def __str__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000464 return "%s (%s)" % (self._testMethodName, strclass(self.__class__))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000465
466 def __repr__(self):
467 return "<%s testMethod=%s>" % \
Benjamin Peterson847a4112010-03-14 15:04:17 +0000468 (strclass(self.__class__), self._testMethodName)
469
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100470 def _addSkip(self, result, test_case, reason):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000471 addSkip = getattr(result, 'addSkip', None)
472 if addSkip is not None:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100473 addSkip(test_case, reason)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000474 else:
475 warnings.warn("TestResult has no addSkip method, skips not reported",
476 RuntimeWarning, 2)
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100477 result.addSuccess(test_case)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000478
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100479 @contextlib.contextmanager
480 def subTest(self, msg=None, **params):
481 """Return a context manager that will return the enclosed block
482 of code in a subtest identified by the optional message and
483 keyword parameters. A failure in the subtest marks the test
484 case as failed but resumes execution at the end of the enclosed
485 block, allowing further test code to be executed.
486 """
487 if not self._outcome.result_supports_subtests:
488 yield
489 return
490 parent = self._subtest
491 if parent is None:
492 params_map = collections.ChainMap(params)
493 else:
494 params_map = parent.params.new_child(params)
495 self._subtest = _SubTest(self, msg, params_map)
Michael Foordb3468f72010-12-19 03:19:47 +0000496 try:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100497 with self._outcome.testPartExecutor(self._subtest, isTest=True):
498 yield
499 if not self._outcome.success:
500 result = self._outcome.result
501 if result is not None and result.failfast:
502 raise _ShouldStop
503 elif self._outcome.expectedFailure:
504 # If the test is expecting a failure, we really want to
505 # stop now and register the expected failure.
506 raise _ShouldStop
507 finally:
508 self._subtest = parent
509
510 def _feedErrorsToResult(self, result, errors):
511 for test, exc_info in errors:
512 if isinstance(test, _SubTest):
513 result.addSubTest(test.test_case, test, exc_info)
514 elif exc_info is not None:
515 if issubclass(exc_info[0], self.failureException):
516 result.addFailure(test, exc_info)
517 else:
518 result.addError(test, exc_info)
519
520 def _addExpectedFailure(self, result, exc_info):
521 try:
522 addExpectedFailure = result.addExpectedFailure
523 except AttributeError:
524 warnings.warn("TestResult has no addExpectedFailure method, reporting as passes",
525 RuntimeWarning)
526 result.addSuccess(self)
527 else:
528 addExpectedFailure(self, exc_info)
529
530 def _addUnexpectedSuccess(self, result):
531 try:
532 addUnexpectedSuccess = result.addUnexpectedSuccess
533 except AttributeError:
534 warnings.warn("TestResult has no addUnexpectedSuccess method, reporting as failure",
535 RuntimeWarning)
536 # We need to pass an actual exception and traceback to addFailure,
537 # otherwise the legacy result can choke.
538 try:
539 raise _UnexpectedSuccess from None
540 except _UnexpectedSuccess:
541 result.addFailure(self, sys.exc_info())
542 else:
543 addUnexpectedSuccess(self)
Michael Foordb3468f72010-12-19 03:19:47 +0000544
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000545 def run(self, result=None):
546 orig_result = result
547 if result is None:
548 result = self.defaultTestResult()
549 startTestRun = getattr(result, 'startTestRun', None)
550 if startTestRun is not None:
551 startTestRun()
552
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000553 result.startTest(self)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000554
555 testMethod = getattr(self, self._testMethodName)
556 if (getattr(self.__class__, "__unittest_skip__", False) or
557 getattr(testMethod, "__unittest_skip__", False)):
558 # If the class or method was skipped.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000559 try:
Benjamin Peterson847a4112010-03-14 15:04:17 +0000560 skip_why = (getattr(self.__class__, '__unittest_skip_why__', '')
561 or getattr(testMethod, '__unittest_skip_why__', ''))
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100562 self._addSkip(result, self, skip_why)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000563 finally:
564 result.stopTest(self)
565 return
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100566 expecting_failure = getattr(testMethod,
567 "__unittest_expecting_failure__", False)
Victor Stinner031bd532013-12-09 01:52:50 +0100568 outcome = _Outcome(result)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000569 try:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100570 self._outcome = outcome
Michael Foordb3468f72010-12-19 03:19:47 +0000571
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100572 with outcome.testPartExecutor(self):
573 self.setUp()
Michael Foordb3468f72010-12-19 03:19:47 +0000574 if outcome.success:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100575 outcome.expecting_failure = expecting_failure
576 with outcome.testPartExecutor(self, isTest=True):
577 testMethod()
578 outcome.expecting_failure = False
579 with outcome.testPartExecutor(self):
580 self.tearDown()
Michael Foordb3468f72010-12-19 03:19:47 +0000581
582 self.doCleanups()
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100583 for test, reason in outcome.skipped:
584 self._addSkip(result, test, reason)
585 self._feedErrorsToResult(result, outcome.errors)
Michael Foordb3468f72010-12-19 03:19:47 +0000586 if outcome.success:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100587 if expecting_failure:
588 if outcome.expectedFailure:
589 self._addExpectedFailure(result, outcome.expectedFailure)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000590 else:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100591 self._addUnexpectedSuccess(result)
592 else:
593 result.addSuccess(self)
Michael Foord1341bb02011-03-14 19:01:46 -0400594 return result
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000595 finally:
596 result.stopTest(self)
597 if orig_result is None:
598 stopTestRun = getattr(result, 'stopTestRun', None)
599 if stopTestRun is not None:
600 stopTestRun()
601
Victor Stinner031bd532013-12-09 01:52:50 +0100602 # explicitly break reference cycles:
603 # outcome.errors -> frame -> outcome -> outcome.errors
604 # outcome.expectedFailure -> frame -> outcome -> outcome.expectedFailure
605 outcome.errors.clear()
606 outcome.expectedFailure = None
607
608 # clear the outcome, no more needed
609 self._outcome = None
610
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000611 def doCleanups(self):
612 """Execute all cleanup functions. Normally called for you after
613 tearDown."""
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100614 outcome = self._outcome or _Outcome()
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000615 while self._cleanups:
Michael Foordb3468f72010-12-19 03:19:47 +0000616 function, args, kwargs = self._cleanups.pop()
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100617 with outcome.testPartExecutor(self):
618 function(*args, **kwargs)
Michael Foordb3468f72010-12-19 03:19:47 +0000619
620 # return this for backwards compatibility
621 # even though we no longer us it internally
622 return outcome.success
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000623
624 def __call__(self, *args, **kwds):
625 return self.run(*args, **kwds)
626
627 def debug(self):
628 """Run the test without collecting errors in a TestResult"""
629 self.setUp()
630 getattr(self, self._testMethodName)()
631 self.tearDown()
Michael Foordb8748742010-06-10 16:16:08 +0000632 while self._cleanups:
633 function, args, kwargs = self._cleanups.pop(-1)
634 function(*args, **kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000635
636 def skipTest(self, reason):
637 """Skip this test."""
638 raise SkipTest(reason)
639
640 def fail(self, msg=None):
641 """Fail immediately, with the given message."""
642 raise self.failureException(msg)
643
644 def assertFalse(self, expr, msg=None):
Ezio Melotti3044fa72010-12-18 17:31:58 +0000645 """Check that the expression is false."""
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000646 if expr:
Ezio Melotti3044fa72010-12-18 17:31:58 +0000647 msg = self._formatMessage(msg, "%s is not false" % safe_repr(expr))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000648 raise self.failureException(msg)
649
650 def assertTrue(self, expr, msg=None):
Ezio Melotti3044fa72010-12-18 17:31:58 +0000651 """Check that the expression is true."""
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000652 if not expr:
Ezio Melotti3044fa72010-12-18 17:31:58 +0000653 msg = self._formatMessage(msg, "%s is not true" % safe_repr(expr))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000654 raise self.failureException(msg)
655
656 def _formatMessage(self, msg, standardMsg):
657 """Honour the longMessage attribute when generating failure messages.
658 If longMessage is False this means:
659 * Use only an explicit message if it is provided
660 * Otherwise use the standard message for the assert
661
662 If longMessage is True:
663 * Use the standard message
664 * If an explicit message is provided, plus ' : ' and the explicit message
665 """
666 if not self.longMessage:
667 return msg or standardMsg
668 if msg is None:
669 return standardMsg
Benjamin Peterson847a4112010-03-14 15:04:17 +0000670 try:
671 # don't switch to '{}' formatting in Python 2.X
672 # it changes the way unicode input is handled
673 return '%s : %s' % (standardMsg, msg)
674 except UnicodeDecodeError:
675 return '%s : %s' % (safe_repr(standardMsg), safe_repr(msg))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000676
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000677 def assertRaises(self, excClass, callableObj=None, *args, **kwargs):
Andrew Svetlov737fb892012-12-18 21:14:22 +0200678 """Fail unless an exception of class excClass is raised
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000679 by callableObj when invoked with arguments args and keyword
680 arguments kwargs. If a different type of exception is
Andrew Svetlov737fb892012-12-18 21:14:22 +0200681 raised, it will not be caught, and the test case will be
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000682 deemed to have suffered an error, exactly as for an
683 unexpected exception.
684
685 If called with callableObj omitted or None, will return a
686 context object used like this::
687
Michael Foord1c42b122010-02-05 22:58:21 +0000688 with self.assertRaises(SomeException):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000689 do_something()
Michael Foord1c42b122010-02-05 22:58:21 +0000690
Ezio Melottib4dc2502011-05-06 15:01:41 +0300691 An optional keyword argument 'msg' can be provided when assertRaises
692 is used as a context object.
693
Michael Foord1c42b122010-02-05 22:58:21 +0000694 The context manager keeps a reference to the exception as
Ezio Melotti49008232010-02-08 21:57:48 +0000695 the 'exception' attribute. This allows you to inspect the
Michael Foord1c42b122010-02-05 22:58:21 +0000696 exception after the assertion::
697
698 with self.assertRaises(SomeException) as cm:
699 do_something()
Ezio Melotti49008232010-02-08 21:57:48 +0000700 the_exception = cm.exception
Michael Foordb57ac6d2010-02-05 23:26:29 +0000701 self.assertEqual(the_exception.error_code, 3)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000702 """
703 context = _AssertRaisesContext(excClass, self, callableObj)
Ezio Melottib4dc2502011-05-06 15:01:41 +0300704 return context.handle('assertRaises', callableObj, args, kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000705
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000706 def assertWarns(self, expected_warning, callable_obj=None, *args, **kwargs):
707 """Fail unless a warning of class warnClass is triggered
Ezio Melottib4dc2502011-05-06 15:01:41 +0300708 by callable_obj when invoked with arguments args and keyword
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000709 arguments kwargs. If a different type of warning is
710 triggered, it will not be handled: depending on the other
711 warning filtering rules in effect, it might be silenced, printed
712 out, or raised as an exception.
713
Ezio Melottib4dc2502011-05-06 15:01:41 +0300714 If called with callable_obj omitted or None, will return a
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000715 context object used like this::
716
717 with self.assertWarns(SomeWarning):
718 do_something()
719
Ezio Melottib4dc2502011-05-06 15:01:41 +0300720 An optional keyword argument 'msg' can be provided when assertWarns
721 is used as a context object.
722
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000723 The context manager keeps a reference to the first matching
724 warning as the 'warning' attribute; similarly, the 'filename'
725 and 'lineno' attributes give you information about the line
726 of Python code from which the warning was triggered.
727 This allows you to inspect the warning after the assertion::
728
729 with self.assertWarns(SomeWarning) as cm:
730 do_something()
731 the_warning = cm.warning
732 self.assertEqual(the_warning.some_attribute, 147)
733 """
734 context = _AssertWarnsContext(expected_warning, self, callable_obj)
Ezio Melottib4dc2502011-05-06 15:01:41 +0300735 return context.handle('assertWarns', callable_obj, args, kwargs)
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000736
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200737 def assertLogs(self, logger=None, level=None):
738 """Fail unless a log message of level *level* or higher is emitted
739 on *logger_name* or its children. If omitted, *level* defaults to
740 INFO and *logger* defaults to the root logger.
741
742 This method must be used as a context manager, and will yield
743 a recording object with two attributes: `output` and `records`.
744 At the end of the context manager, the `output` attribute will
745 be a list of the matching formatted log messages and the
746 `records` attribute will be a list of the corresponding LogRecord
747 objects.
748
749 Example::
750
751 with self.assertLogs('foo', level='INFO') as cm:
752 logging.getLogger('foo').info('first message')
753 logging.getLogger('foo.bar').error('second message')
754 self.assertEqual(cm.output, ['INFO:foo:first message',
755 'ERROR:foo.bar:second message'])
756 """
757 return _AssertLogsContext(self, logger, level)
758
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000759 def _getAssertEqualityFunc(self, first, second):
760 """Get a detailed comparison function for the types of the two args.
761
762 Returns: A callable accepting (first, second, msg=None) that will
763 raise a failure exception if first != second with a useful human
764 readable error message for those types.
765 """
766 #
767 # NOTE(gregory.p.smith): I considered isinstance(first, type(second))
768 # and vice versa. I opted for the conservative approach in case
769 # subclasses are not intended to be compared in detail to their super
770 # class instances using a type equality func. This means testing
771 # subtypes won't automagically use the detailed comparison. Callers
772 # should use their type specific assertSpamEqual method to compare
773 # subclasses if the detailed comparison is desired and appropriate.
774 # See the discussion in http://bugs.python.org/issue2578.
775 #
776 if type(first) is type(second):
777 asserter = self._type_equality_funcs.get(type(first))
778 if asserter is not None:
Benjamin Peterson34b2b262011-07-12 19:21:42 -0500779 if isinstance(asserter, str):
780 asserter = getattr(self, asserter)
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000781 return asserter
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000782
783 return self._baseAssertEqual
784
785 def _baseAssertEqual(self, first, second, msg=None):
786 """The default assertEqual implementation, not type specific."""
787 if not first == second:
Serhiy Storchaka77622f52013-09-23 23:07:00 +0300788 standardMsg = '%s != %s' % _common_shorten_repr(first, second)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000789 msg = self._formatMessage(msg, standardMsg)
790 raise self.failureException(msg)
791
792 def assertEqual(self, first, second, msg=None):
793 """Fail if the two objects are unequal as determined by the '=='
794 operator.
795 """
796 assertion_func = self._getAssertEqualityFunc(first, second)
797 assertion_func(first, second, msg=msg)
798
799 def assertNotEqual(self, first, second, msg=None):
Ezio Melotti90eea972012-11-08 11:08:39 +0200800 """Fail if the two objects are equal as determined by the '!='
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000801 operator.
802 """
803 if not first != second:
Benjamin Peterson847a4112010-03-14 15:04:17 +0000804 msg = self._formatMessage(msg, '%s == %s' % (safe_repr(first),
805 safe_repr(second)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000806 raise self.failureException(msg)
807
Michael Foord321d0592010-11-02 13:44:51 +0000808 def assertAlmostEqual(self, first, second, places=None, msg=None,
Benjamin Petersonb48af542010-04-11 20:43:16 +0000809 delta=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000810 """Fail if the two objects are unequal as determined by their
811 difference rounded to the given number of decimal places
Benjamin Petersonb48af542010-04-11 20:43:16 +0000812 (default 7) and comparing to zero, or by comparing that the
813 between the two objects is more than the given delta.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000814
815 Note that decimal places (from zero) are usually not the same
816 as significant digits (measured from the most signficant digit).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000817
818 If the two objects compare equal then they will automatically
819 compare almost equal.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000820 """
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000821 if first == second:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000822 # shortcut
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000823 return
Benjamin Petersonb48af542010-04-11 20:43:16 +0000824 if delta is not None and places is not None:
825 raise TypeError("specify delta or places not both")
826
827 if delta is not None:
828 if abs(first - second) <= delta:
829 return
830
831 standardMsg = '%s != %s within %s delta' % (safe_repr(first),
832 safe_repr(second),
833 safe_repr(delta))
834 else:
835 if places is None:
836 places = 7
837
838 if round(abs(second-first), places) == 0:
839 return
840
Benjamin Peterson847a4112010-03-14 15:04:17 +0000841 standardMsg = '%s != %s within %r places' % (safe_repr(first),
842 safe_repr(second),
843 places)
Benjamin Petersonb48af542010-04-11 20:43:16 +0000844 msg = self._formatMessage(msg, standardMsg)
845 raise self.failureException(msg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000846
Michael Foord321d0592010-11-02 13:44:51 +0000847 def assertNotAlmostEqual(self, first, second, places=None, msg=None,
Benjamin Petersonb48af542010-04-11 20:43:16 +0000848 delta=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000849 """Fail if the two objects are equal as determined by their
850 difference rounded to the given number of decimal places
Benjamin Petersonb48af542010-04-11 20:43:16 +0000851 (default 7) and comparing to zero, or by comparing that the
852 between the two objects is less than the given delta.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000853
854 Note that decimal places (from zero) are usually not the same
855 as significant digits (measured from the most signficant digit).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000856
857 Objects that are equal automatically fail.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000858 """
Benjamin Petersonb48af542010-04-11 20:43:16 +0000859 if delta is not None and places is not None:
860 raise TypeError("specify delta or places not both")
861 if delta is not None:
862 if not (first == second) and abs(first - second) > delta:
863 return
864 standardMsg = '%s == %s within %s delta' % (safe_repr(first),
865 safe_repr(second),
866 safe_repr(delta))
867 else:
868 if places is None:
869 places = 7
870 if not (first == second) and round(abs(second-first), places) != 0:
871 return
Benjamin Peterson847a4112010-03-14 15:04:17 +0000872 standardMsg = '%s == %s within %r places' % (safe_repr(first),
Benjamin Petersonb48af542010-04-11 20:43:16 +0000873 safe_repr(second),
874 places)
875
876 msg = self._formatMessage(msg, standardMsg)
877 raise self.failureException(msg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000878
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000879
Michael Foord085dfd32010-06-05 12:17:02 +0000880 def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000881 """An equality assertion for ordered sequences (like lists and tuples).
882
R. David Murrayad13f222010-01-29 22:17:58 +0000883 For the purposes of this function, a valid ordered sequence type is one
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000884 which can be indexed, has a length, and has an equality operator.
885
886 Args:
887 seq1: The first sequence to compare.
888 seq2: The second sequence to compare.
889 seq_type: The expected datatype of the sequences, or None if no
890 datatype should be enforced.
891 msg: Optional message to use on failure instead of a list of
892 differences.
893 """
Benjamin Petersonb29614e2012-10-09 11:16:03 -0400894 if seq_type is not None:
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000895 seq_type_name = seq_type.__name__
896 if not isinstance(seq1, seq_type):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000897 raise self.failureException('First sequence is not a %s: %s'
898 % (seq_type_name, safe_repr(seq1)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000899 if not isinstance(seq2, seq_type):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000900 raise self.failureException('Second sequence is not a %s: %s'
901 % (seq_type_name, safe_repr(seq2)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000902 else:
903 seq_type_name = "sequence"
904
905 differing = None
906 try:
907 len1 = len(seq1)
908 except (TypeError, NotImplementedError):
909 differing = 'First %s has no length. Non-sequence?' % (
910 seq_type_name)
911
912 if differing is None:
913 try:
914 len2 = len(seq2)
915 except (TypeError, NotImplementedError):
916 differing = 'Second %s has no length. Non-sequence?' % (
917 seq_type_name)
918
919 if differing is None:
920 if seq1 == seq2:
921 return
922
Serhiy Storchaka77622f52013-09-23 23:07:00 +0300923 differing = '%ss differ: %s != %s\n' % (
924 (seq_type_name.capitalize(),) +
925 _common_shorten_repr(seq1, seq2))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000926
927 for i in range(min(len1, len2)):
928 try:
929 item1 = seq1[i]
930 except (TypeError, IndexError, NotImplementedError):
931 differing += ('\nUnable to index element %d of first %s\n' %
932 (i, seq_type_name))
933 break
934
935 try:
936 item2 = seq2[i]
937 except (TypeError, IndexError, NotImplementedError):
938 differing += ('\nUnable to index element %d of second %s\n' %
939 (i, seq_type_name))
940 break
941
942 if item1 != item2:
943 differing += ('\nFirst differing element %d:\n%s\n%s\n' %
944 (i, item1, item2))
945 break
946 else:
947 if (len1 == len2 and seq_type is None and
948 type(seq1) != type(seq2)):
949 # The sequences are the same, but have differing types.
950 return
951
952 if len1 > len2:
953 differing += ('\nFirst %s contains %d additional '
954 'elements.\n' % (seq_type_name, len1 - len2))
955 try:
956 differing += ('First extra element %d:\n%s\n' %
957 (len2, seq1[len2]))
958 except (TypeError, IndexError, NotImplementedError):
959 differing += ('Unable to index element %d '
960 'of first %s\n' % (len2, seq_type_name))
961 elif len1 < len2:
962 differing += ('\nSecond %s contains %d additional '
963 'elements.\n' % (seq_type_name, len2 - len1))
964 try:
965 differing += ('First extra element %d:\n%s\n' %
966 (len1, seq2[len1]))
967 except (TypeError, IndexError, NotImplementedError):
968 differing += ('Unable to index element %d '
969 'of second %s\n' % (len1, seq_type_name))
Michael Foord2034d9a2010-06-05 11:27:52 +0000970 standardMsg = differing
971 diffMsg = '\n' + '\n'.join(
Benjamin Peterson6e8c7572009-10-04 20:19:21 +0000972 difflib.ndiff(pprint.pformat(seq1).splitlines(),
973 pprint.pformat(seq2).splitlines()))
Michael Foord085dfd32010-06-05 12:17:02 +0000974
975 standardMsg = self._truncateMessage(standardMsg, diffMsg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000976 msg = self._formatMessage(msg, standardMsg)
977 self.fail(msg)
978
Michael Foord085dfd32010-06-05 12:17:02 +0000979 def _truncateMessage(self, message, diff):
980 max_diff = self.maxDiff
981 if max_diff is None or len(diff) <= max_diff:
982 return message + diff
Michael Foord9dad32e2010-06-05 13:49:56 +0000983 return message + (DIFF_OMITTED % len(diff))
Michael Foord085dfd32010-06-05 12:17:02 +0000984
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000985 def assertListEqual(self, list1, list2, msg=None):
986 """A list-specific equality assertion.
987
988 Args:
989 list1: The first list to compare.
990 list2: The second list to compare.
991 msg: Optional message to use on failure instead of a list of
992 differences.
993
994 """
995 self.assertSequenceEqual(list1, list2, msg, seq_type=list)
996
997 def assertTupleEqual(self, tuple1, tuple2, msg=None):
998 """A tuple-specific equality assertion.
999
1000 Args:
1001 tuple1: The first tuple to compare.
1002 tuple2: The second tuple to compare.
1003 msg: Optional message to use on failure instead of a list of
1004 differences.
1005 """
1006 self.assertSequenceEqual(tuple1, tuple2, msg, seq_type=tuple)
1007
1008 def assertSetEqual(self, set1, set2, msg=None):
1009 """A set-specific equality assertion.
1010
1011 Args:
1012 set1: The first set to compare.
1013 set2: The second set to compare.
1014 msg: Optional message to use on failure instead of a list of
1015 differences.
1016
Michael Foord91c9da32010-03-20 17:21:27 +00001017 assertSetEqual uses ducktyping to support different types of sets, and
1018 is optimized for sets specifically (parameters must support a
1019 difference method).
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001020 """
1021 try:
1022 difference1 = set1.difference(set2)
1023 except TypeError as e:
1024 self.fail('invalid type when attempting set difference: %s' % e)
1025 except AttributeError as e:
1026 self.fail('first argument does not support set difference: %s' % e)
1027
1028 try:
1029 difference2 = set2.difference(set1)
1030 except TypeError as e:
1031 self.fail('invalid type when attempting set difference: %s' % e)
1032 except AttributeError as e:
1033 self.fail('second argument does not support set difference: %s' % e)
1034
1035 if not (difference1 or difference2):
1036 return
1037
1038 lines = []
1039 if difference1:
1040 lines.append('Items in the first set but not the second:')
1041 for item in difference1:
1042 lines.append(repr(item))
1043 if difference2:
1044 lines.append('Items in the second set but not the first:')
1045 for item in difference2:
1046 lines.append(repr(item))
1047
1048 standardMsg = '\n'.join(lines)
1049 self.fail(self._formatMessage(msg, standardMsg))
1050
1051 def assertIn(self, member, container, msg=None):
1052 """Just like self.assertTrue(a in b), but with a nicer default message."""
1053 if member not in container:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001054 standardMsg = '%s not found in %s' % (safe_repr(member),
1055 safe_repr(container))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001056 self.fail(self._formatMessage(msg, standardMsg))
1057
1058 def assertNotIn(self, member, container, msg=None):
1059 """Just like self.assertTrue(a not in b), but with a nicer default message."""
1060 if member in container:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001061 standardMsg = '%s unexpectedly found in %s' % (safe_repr(member),
1062 safe_repr(container))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001063 self.fail(self._formatMessage(msg, standardMsg))
1064
1065 def assertIs(self, expr1, expr2, msg=None):
1066 """Just like self.assertTrue(a is b), but with a nicer default message."""
1067 if expr1 is not expr2:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001068 standardMsg = '%s is not %s' % (safe_repr(expr1),
1069 safe_repr(expr2))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001070 self.fail(self._formatMessage(msg, standardMsg))
1071
1072 def assertIsNot(self, expr1, expr2, msg=None):
1073 """Just like self.assertTrue(a is not b), but with a nicer default message."""
1074 if expr1 is expr2:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001075 standardMsg = 'unexpectedly identical: %s' % (safe_repr(expr1),)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001076 self.fail(self._formatMessage(msg, standardMsg))
1077
1078 def assertDictEqual(self, d1, d2, msg=None):
Ezio Melottib3aedd42010-11-20 19:04:17 +00001079 self.assertIsInstance(d1, dict, 'First argument is not a dictionary')
1080 self.assertIsInstance(d2, dict, 'Second argument is not a dictionary')
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001081
1082 if d1 != d2:
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001083 standardMsg = '%s != %s' % _common_shorten_repr(d1, d2)
Michael Foord085dfd32010-06-05 12:17:02 +00001084 diff = ('\n' + '\n'.join(difflib.ndiff(
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001085 pprint.pformat(d1).splitlines(),
1086 pprint.pformat(d2).splitlines())))
Michael Foordcb11b252010-06-05 13:14:43 +00001087 standardMsg = self._truncateMessage(standardMsg, diff)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001088 self.fail(self._formatMessage(msg, standardMsg))
1089
Ezio Melotti0f535012011-04-03 18:02:13 +03001090 def assertDictContainsSubset(self, subset, dictionary, msg=None):
1091 """Checks whether dictionary is a superset of subset."""
1092 warnings.warn('assertDictContainsSubset is deprecated',
1093 DeprecationWarning)
1094 missing = []
1095 mismatched = []
1096 for key, value in subset.items():
1097 if key not in dictionary:
1098 missing.append(key)
1099 elif value != dictionary[key]:
1100 mismatched.append('%s, expected: %s, actual: %s' %
1101 (safe_repr(key), safe_repr(value),
1102 safe_repr(dictionary[key])))
1103
1104 if not (missing or mismatched):
1105 return
1106
1107 standardMsg = ''
1108 if missing:
1109 standardMsg = 'Missing: %s' % ','.join(safe_repr(m) for m in
1110 missing)
1111 if mismatched:
1112 if standardMsg:
1113 standardMsg += '; '
1114 standardMsg += 'Mismatched values: %s' % ','.join(mismatched)
1115
1116 self.fail(self._formatMessage(msg, standardMsg))
1117
1118
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001119 def assertCountEqual(self, first, second, msg=None):
1120 """An unordered sequence comparison asserting that the same elements,
1121 regardless of order. If the same element occurs more than once,
1122 it verifies that the elements occur the same number of times.
Michael Foord8442a602010-03-20 16:58:04 +00001123
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001124 self.assertEqual(Counter(list(first)),
1125 Counter(list(second)))
Michael Foord8442a602010-03-20 16:58:04 +00001126
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001127 Example:
Michael Foord8442a602010-03-20 16:58:04 +00001128 - [0, 1, 1] and [1, 0, 1] compare equal.
1129 - [0, 0, 1] and [0, 1] compare unequal.
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001130
Michael Foord8442a602010-03-20 16:58:04 +00001131 """
Michael Foorde180d392011-01-28 19:51:48 +00001132 first_seq, second_seq = list(first), list(second)
Michael Foord8442a602010-03-20 16:58:04 +00001133 try:
Michael Foorde180d392011-01-28 19:51:48 +00001134 first = collections.Counter(first_seq)
1135 second = collections.Counter(second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001136 except TypeError:
Raymond Hettinger6518f5e2010-12-24 00:52:54 +00001137 # Handle case with unhashable elements
Michael Foorde180d392011-01-28 19:51:48 +00001138 differences = _count_diff_all_purpose(first_seq, second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001139 else:
Michael Foorde180d392011-01-28 19:51:48 +00001140 if first == second:
Raymond Hettinger6e165b32010-11-27 09:31:37 +00001141 return
Michael Foorde180d392011-01-28 19:51:48 +00001142 differences = _count_diff_hashable(first_seq, second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001143
Raymond Hettinger93e233d2010-12-24 10:02:22 +00001144 if differences:
1145 standardMsg = 'Element counts were not equal:\n'
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001146 lines = ['First has %d, Second has %d: %r' % diff for diff in differences]
Raymond Hettinger93e233d2010-12-24 10:02:22 +00001147 diffMsg = '\n'.join(lines)
1148 standardMsg = self._truncateMessage(standardMsg, diffMsg)
1149 msg = self._formatMessage(msg, standardMsg)
1150 self.fail(msg)
Michael Foord8442a602010-03-20 16:58:04 +00001151
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001152 def assertMultiLineEqual(self, first, second, msg=None):
1153 """Assert that two multi-line strings are equal."""
Ezio Melottib3aedd42010-11-20 19:04:17 +00001154 self.assertIsInstance(first, str, 'First argument is not a string')
1155 self.assertIsInstance(second, str, 'Second argument is not a string')
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001156
1157 if first != second:
Ezio Melottiedd117f2011-04-27 10:20:38 +03001158 # don't use difflib if the strings are too long
1159 if (len(first) > self._diffThreshold or
1160 len(second) > self._diffThreshold):
1161 self._baseAssertEqual(first, second, msg)
Ezio Melottid8b509b2011-09-28 17:37:55 +03001162 firstlines = first.splitlines(keepends=True)
1163 secondlines = second.splitlines(keepends=True)
Michael Foordc653ce32010-07-10 13:52:22 +00001164 if len(firstlines) == 1 and first.strip('\r\n') == first:
1165 firstlines = [first + '\n']
1166 secondlines = [second + '\n']
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001167 standardMsg = '%s != %s' % _common_shorten_repr(first, second)
Michael Foordc653ce32010-07-10 13:52:22 +00001168 diff = '\n' + ''.join(difflib.ndiff(firstlines, secondlines))
Michael Foordcb11b252010-06-05 13:14:43 +00001169 standardMsg = self._truncateMessage(standardMsg, diff)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001170 self.fail(self._formatMessage(msg, standardMsg))
1171
1172 def assertLess(self, a, b, msg=None):
1173 """Just like self.assertTrue(a < b), but with a nicer default message."""
1174 if not a < b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001175 standardMsg = '%s not less than %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001176 self.fail(self._formatMessage(msg, standardMsg))
1177
1178 def assertLessEqual(self, a, b, msg=None):
1179 """Just like self.assertTrue(a <= b), but with a nicer default message."""
1180 if not a <= b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001181 standardMsg = '%s not less than or equal to %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001182 self.fail(self._formatMessage(msg, standardMsg))
1183
1184 def assertGreater(self, a, b, msg=None):
1185 """Just like self.assertTrue(a > b), but with a nicer default message."""
1186 if not a > b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001187 standardMsg = '%s not greater than %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001188 self.fail(self._formatMessage(msg, standardMsg))
1189
1190 def assertGreaterEqual(self, a, b, msg=None):
1191 """Just like self.assertTrue(a >= b), but with a nicer default message."""
1192 if not a >= b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001193 standardMsg = '%s not greater than or equal to %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001194 self.fail(self._formatMessage(msg, standardMsg))
1195
1196 def assertIsNone(self, obj, msg=None):
1197 """Same as self.assertTrue(obj is None), with a nicer default message."""
1198 if obj is not None:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001199 standardMsg = '%s is not None' % (safe_repr(obj),)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001200 self.fail(self._formatMessage(msg, standardMsg))
1201
1202 def assertIsNotNone(self, obj, msg=None):
1203 """Included for symmetry with assertIsNone."""
1204 if obj is None:
1205 standardMsg = 'unexpectedly None'
1206 self.fail(self._formatMessage(msg, standardMsg))
1207
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001208 def assertIsInstance(self, obj, cls, msg=None):
1209 """Same as self.assertTrue(isinstance(obj, cls)), with a nicer
1210 default message."""
1211 if not isinstance(obj, cls):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001212 standardMsg = '%s is not an instance of %r' % (safe_repr(obj), cls)
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001213 self.fail(self._formatMessage(msg, standardMsg))
1214
1215 def assertNotIsInstance(self, obj, cls, msg=None):
1216 """Included for symmetry with assertIsInstance."""
1217 if isinstance(obj, cls):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001218 standardMsg = '%s is an instance of %r' % (safe_repr(obj), cls)
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001219 self.fail(self._formatMessage(msg, standardMsg))
1220
Ezio Melottied3a7d22010-12-01 02:32:32 +00001221 def assertRaisesRegex(self, expected_exception, expected_regex,
1222 callable_obj=None, *args, **kwargs):
1223 """Asserts that the message in a raised exception matches a regex.
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001224
1225 Args:
1226 expected_exception: Exception class expected to be raised.
Ezio Melottied3a7d22010-12-01 02:32:32 +00001227 expected_regex: Regex (re pattern object or string) expected
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001228 to be found in error message.
1229 callable_obj: Function to be called.
Ezio Melottib4dc2502011-05-06 15:01:41 +03001230 msg: Optional message used in case of failure. Can only be used
1231 when assertRaisesRegex is used as a context manager.
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001232 args: Extra args.
1233 kwargs: Extra kwargs.
1234 """
1235 context = _AssertRaisesContext(expected_exception, self, callable_obj,
Ezio Melottied3a7d22010-12-01 02:32:32 +00001236 expected_regex)
Ezio Melottib4dc2502011-05-06 15:01:41 +03001237
1238 return context.handle('assertRaisesRegex', callable_obj, args, kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001239
Ezio Melottied3a7d22010-12-01 02:32:32 +00001240 def assertWarnsRegex(self, expected_warning, expected_regex,
1241 callable_obj=None, *args, **kwargs):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001242 """Asserts that the message in a triggered warning matches a regexp.
1243 Basic functioning is similar to assertWarns() with the addition
1244 that only warnings whose messages also match the regular expression
1245 are considered successful matches.
1246
1247 Args:
1248 expected_warning: Warning class expected to be triggered.
Ezio Melottied3a7d22010-12-01 02:32:32 +00001249 expected_regex: Regex (re pattern object or string) expected
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001250 to be found in error message.
1251 callable_obj: Function to be called.
Ezio Melottib4dc2502011-05-06 15:01:41 +03001252 msg: Optional message used in case of failure. Can only be used
1253 when assertWarnsRegex is used as a context manager.
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001254 args: Extra args.
1255 kwargs: Extra kwargs.
1256 """
1257 context = _AssertWarnsContext(expected_warning, self, callable_obj,
Ezio Melottied3a7d22010-12-01 02:32:32 +00001258 expected_regex)
Ezio Melottib4dc2502011-05-06 15:01:41 +03001259 return context.handle('assertWarnsRegex', callable_obj, args, kwargs)
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001260
Ezio Melottied3a7d22010-12-01 02:32:32 +00001261 def assertRegex(self, text, expected_regex, msg=None):
Michael Foorde3ef5f12010-05-08 16:46:14 +00001262 """Fail the test unless the text matches the regular expression."""
Ezio Melottied3a7d22010-12-01 02:32:32 +00001263 if isinstance(expected_regex, (str, bytes)):
Gregory P. Smithed16bf42010-12-16 19:23:05 +00001264 assert expected_regex, "expected_regex must not be empty."
Ezio Melottied3a7d22010-12-01 02:32:32 +00001265 expected_regex = re.compile(expected_regex)
1266 if not expected_regex.search(text):
1267 msg = msg or "Regex didn't match"
1268 msg = '%s: %r not found in %r' % (msg, expected_regex.pattern, text)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001269 raise self.failureException(msg)
1270
Ezio Melotti8f776302010-12-10 02:32:05 +00001271 def assertNotRegex(self, text, unexpected_regex, msg=None):
Michael Foorde3ef5f12010-05-08 16:46:14 +00001272 """Fail the test if the text matches the regular expression."""
Ezio Melottied3a7d22010-12-01 02:32:32 +00001273 if isinstance(unexpected_regex, (str, bytes)):
1274 unexpected_regex = re.compile(unexpected_regex)
1275 match = unexpected_regex.search(text)
Benjamin Petersonb48af542010-04-11 20:43:16 +00001276 if match:
Ezio Melottied3a7d22010-12-01 02:32:32 +00001277 msg = msg or "Regex matched"
Benjamin Petersonb48af542010-04-11 20:43:16 +00001278 msg = '%s: %r matches %r in %r' % (msg,
1279 text[match.start():match.end()],
Ezio Melottied3a7d22010-12-01 02:32:32 +00001280 unexpected_regex.pattern,
Benjamin Petersonb48af542010-04-11 20:43:16 +00001281 text)
1282 raise self.failureException(msg)
1283
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001284
Ezio Melottied3a7d22010-12-01 02:32:32 +00001285 def _deprecate(original_func):
1286 def deprecated_func(*args, **kwargs):
1287 warnings.warn(
1288 'Please use {0} instead.'.format(original_func.__name__),
1289 DeprecationWarning, 2)
1290 return original_func(*args, **kwargs)
1291 return deprecated_func
1292
Ezio Melotti361467e2011-04-03 17:37:58 +03001293 # see #9424
Ezio Melotti0f535012011-04-03 18:02:13 +03001294 failUnlessEqual = assertEquals = _deprecate(assertEqual)
1295 failIfEqual = assertNotEquals = _deprecate(assertNotEqual)
1296 failUnlessAlmostEqual = assertAlmostEquals = _deprecate(assertAlmostEqual)
1297 failIfAlmostEqual = assertNotAlmostEquals = _deprecate(assertNotAlmostEqual)
1298 failUnless = assert_ = _deprecate(assertTrue)
1299 failUnlessRaises = _deprecate(assertRaises)
1300 failIf = _deprecate(assertFalse)
Ezio Melottied3a7d22010-12-01 02:32:32 +00001301 assertRaisesRegexp = _deprecate(assertRaisesRegex)
1302 assertRegexpMatches = _deprecate(assertRegex)
1303
1304
1305
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001306class FunctionTestCase(TestCase):
1307 """A test case that wraps a test function.
1308
1309 This is useful for slipping pre-existing test functions into the
1310 unittest framework. Optionally, set-up and tidy-up functions can be
1311 supplied. As with TestCase, the tidy-up ('tearDown') function will
1312 always be called if the set-up ('setUp') function ran successfully.
1313 """
1314
1315 def __init__(self, testFunc, setUp=None, tearDown=None, description=None):
1316 super(FunctionTestCase, self).__init__()
1317 self._setUpFunc = setUp
1318 self._tearDownFunc = tearDown
1319 self._testFunc = testFunc
1320 self._description = description
1321
1322 def setUp(self):
1323 if self._setUpFunc is not None:
1324 self._setUpFunc()
1325
1326 def tearDown(self):
1327 if self._tearDownFunc is not None:
1328 self._tearDownFunc()
1329
1330 def runTest(self):
1331 self._testFunc()
1332
1333 def id(self):
1334 return self._testFunc.__name__
1335
1336 def __eq__(self, other):
1337 if not isinstance(other, self.__class__):
1338 return NotImplemented
1339
1340 return self._setUpFunc == other._setUpFunc and \
1341 self._tearDownFunc == other._tearDownFunc and \
1342 self._testFunc == other._testFunc and \
1343 self._description == other._description
1344
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001345 def __hash__(self):
1346 return hash((type(self), self._setUpFunc, self._tearDownFunc,
1347 self._testFunc, self._description))
1348
1349 def __str__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001350 return "%s (%s)" % (strclass(self.__class__),
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001351 self._testFunc.__name__)
1352
1353 def __repr__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001354 return "<%s tec=%s>" % (strclass(self.__class__),
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001355 self._testFunc)
1356
1357 def shortDescription(self):
1358 if self._description is not None:
1359 return self._description
1360 doc = self._testFunc.__doc__
1361 return doc and doc.split("\n")[0].strip() or None
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001362
1363
1364class _SubTest(TestCase):
1365
1366 def __init__(self, test_case, message, params):
1367 super().__init__()
1368 self._message = message
1369 self.test_case = test_case
1370 self.params = params
1371 self.failureException = test_case.failureException
1372
1373 def runTest(self):
1374 raise NotImplementedError("subtests cannot be run directly")
1375
1376 def _subDescription(self):
1377 parts = []
1378 if self._message:
1379 parts.append("[{}]".format(self._message))
1380 if self.params:
1381 params_desc = ', '.join(
1382 "{}={!r}".format(k, v)
1383 for (k, v) in sorted(self.params.items()))
1384 parts.append("({})".format(params_desc))
1385 return " ".join(parts) or '(<subtest>)'
1386
1387 def id(self):
1388 return "{} {}".format(self.test_case.id(), self._subDescription())
1389
1390 def shortDescription(self):
1391 """Returns a one-line description of the subtest, or None if no
1392 description has been provided.
1393 """
1394 return self.test_case.shortDescription()
1395
1396 def __str__(self):
1397 return "{} {}".format(self.test_case, self._subDescription())