blob: 7ed932fafd13f255f54f5151c8dce709f2db0110 [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
Benjamin Petersonbed7d042009-07-19 21:01:52 +000012
Benjamin Peterson847a4112010-03-14 15:04:17 +000013from . import result
Florent Xiclunac53ae582011-11-04 08:25:54 +010014from .util import (strclass, safe_repr, _count_diff_all_purpose,
Serhiy Storchaka77622f52013-09-23 23:07:00 +030015 _count_diff_hashable, _common_shorten_repr)
Benjamin Petersonbed7d042009-07-19 21:01:52 +000016
Benjamin Petersondccc1fc2010-03-22 00:15:53 +000017__unittest = True
Benjamin Petersonbed7d042009-07-19 21:01:52 +000018
Michael Foord9dad32e2010-06-05 13:49:56 +000019
20DIFF_OMITTED = ('\nDiff is %s characters long. '
21 'Set self.maxDiff to None to see it.')
22
Benjamin Petersonbed7d042009-07-19 21:01:52 +000023class SkipTest(Exception):
24 """
25 Raise this exception in a test to skip it.
26
Ezio Melotti265281a2013-03-27 20:11:55 +020027 Usually you can use TestCase.skipTest() or one of the skipping decorators
Benjamin Petersonbed7d042009-07-19 21:01:52 +000028 instead of raising this directly.
29 """
Benjamin Petersonbed7d042009-07-19 21:01:52 +000030
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010031class _ShouldStop(Exception):
Benjamin Petersonbed7d042009-07-19 21:01:52 +000032 """
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010033 The test should stop.
Benjamin Petersonbed7d042009-07-19 21:01:52 +000034 """
35
Benjamin Petersonbed7d042009-07-19 21:01:52 +000036class _UnexpectedSuccess(Exception):
37 """
38 The test was supposed to fail, but it didn't!
39 """
Michael Foordb3468f72010-12-19 03:19:47 +000040
41
42class _Outcome(object):
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010043 def __init__(self, result=None):
44 self.expecting_failure = False
45 self.result = result
46 self.result_supports_subtests = hasattr(result, "addSubTest")
Michael Foordb3468f72010-12-19 03:19:47 +000047 self.success = True
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010048 self.skipped = []
Michael Foordb3468f72010-12-19 03:19:47 +000049 self.expectedFailure = None
50 self.errors = []
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010051
52 @contextlib.contextmanager
53 def testPartExecutor(self, test_case, isTest=False):
54 old_success = self.success
55 self.success = True
56 try:
57 yield
58 except KeyboardInterrupt:
59 raise
60 except SkipTest as e:
61 self.success = False
62 self.skipped.append((test_case, str(e)))
63 except _ShouldStop:
64 pass
65 except:
66 exc_info = sys.exc_info()
67 if self.expecting_failure:
68 self.expectedFailure = exc_info
69 else:
70 self.success = False
71 self.errors.append((test_case, exc_info))
72 else:
73 if self.result_supports_subtests and self.success:
74 self.errors.append((test_case, None))
75 finally:
76 self.success = self.success and old_success
Michael Foordb3468f72010-12-19 03:19:47 +000077
Benjamin Petersonbed7d042009-07-19 21:01:52 +000078
79def _id(obj):
80 return obj
81
82def skip(reason):
83 """
84 Unconditionally skip a test.
85 """
86 def decorator(test_item):
Antoine Pitroub05ac862012-04-25 14:56:46 +020087 if not isinstance(test_item, type):
Benjamin Peterson847a4112010-03-14 15:04:17 +000088 @functools.wraps(test_item)
89 def skip_wrapper(*args, **kwargs):
90 raise SkipTest(reason)
91 test_item = skip_wrapper
92
93 test_item.__unittest_skip__ = True
94 test_item.__unittest_skip_why__ = reason
95 return test_item
Benjamin Petersonbed7d042009-07-19 21:01:52 +000096 return decorator
97
98def skipIf(condition, reason):
99 """
100 Skip a test if the condition is true.
101 """
102 if condition:
103 return skip(reason)
104 return _id
105
106def skipUnless(condition, reason):
107 """
108 Skip a test unless the condition is true.
109 """
110 if not condition:
111 return skip(reason)
112 return _id
113
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100114def expectedFailure(test_item):
115 test_item.__unittest_expecting_failure__ = True
116 return test_item
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000117
118
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200119class _BaseTestCaseContext:
120
121 def __init__(self, test_case):
122 self.test_case = test_case
123
124 def _raiseFailure(self, standardMsg):
125 msg = self.test_case._formatMessage(self.msg, standardMsg)
126 raise self.test_case.failureException(msg)
127
128
129class _AssertRaisesBaseContext(_BaseTestCaseContext):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000130
131 def __init__(self, expected, test_case, callable_obj=None,
Ezio Melottib4dc2502011-05-06 15:01:41 +0300132 expected_regex=None):
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200133 _BaseTestCaseContext.__init__(self, test_case)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000134 self.expected = expected
Ezio Melottib4dc2502011-05-06 15:01:41 +0300135 self.test_case = test_case
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000136 if callable_obj is not None:
137 try:
138 self.obj_name = callable_obj.__name__
139 except AttributeError:
140 self.obj_name = str(callable_obj)
141 else:
142 self.obj_name = None
Ezio Melottied3a7d22010-12-01 02:32:32 +0000143 if isinstance(expected_regex, (bytes, str)):
144 expected_regex = re.compile(expected_regex)
145 self.expected_regex = expected_regex
Ezio Melottib4dc2502011-05-06 15:01:41 +0300146 self.msg = None
147
Ezio Melottib4dc2502011-05-06 15:01:41 +0300148 def handle(self, name, callable_obj, args, kwargs):
149 """
150 If callable_obj is None, assertRaises/Warns is being used as a
151 context manager, so check for a 'msg' kwarg and return self.
152 If callable_obj is not None, call it passing args and kwargs.
153 """
154 if callable_obj is None:
155 self.msg = kwargs.pop('msg', None)
156 return self
157 with self:
158 callable_obj(*args, **kwargs)
159
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000160
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000161class _AssertRaisesContext(_AssertRaisesBaseContext):
162 """A context manager used to implement TestCase.assertRaises* methods."""
163
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000164 def __enter__(self):
Ezio Melotti49008232010-02-08 21:57:48 +0000165 return self
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000166
167 def __exit__(self, exc_type, exc_value, tb):
168 if exc_type is None:
169 try:
170 exc_name = self.expected.__name__
171 except AttributeError:
172 exc_name = str(self.expected)
173 if self.obj_name:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300174 self._raiseFailure("{} not raised by {}".format(exc_name,
175 self.obj_name))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000176 else:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300177 self._raiseFailure("{} not raised".format(exc_name))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000178 if not issubclass(exc_type, self.expected):
179 # let unexpected exceptions pass through
180 return False
Ezio Melotti49008232010-02-08 21:57:48 +0000181 # store exception, without traceback, for later retrieval
182 self.exception = exc_value.with_traceback(None)
Ezio Melottied3a7d22010-12-01 02:32:32 +0000183 if self.expected_regex is None:
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000184 return True
185
Ezio Melottied3a7d22010-12-01 02:32:32 +0000186 expected_regex = self.expected_regex
187 if not expected_regex.search(str(exc_value)):
Ezio Melottib4dc2502011-05-06 15:01:41 +0300188 self._raiseFailure('"{}" does not match "{}"'.format(
189 expected_regex.pattern, str(exc_value)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000190 return True
191
192
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000193class _AssertWarnsContext(_AssertRaisesBaseContext):
194 """A context manager used to implement TestCase.assertWarns* methods."""
195
196 def __enter__(self):
197 # The __warningregistry__'s need to be in a pristine state for tests
198 # to work properly.
199 for v in sys.modules.values():
200 if getattr(v, '__warningregistry__', None):
201 v.__warningregistry__ = {}
202 self.warnings_manager = warnings.catch_warnings(record=True)
203 self.warnings = self.warnings_manager.__enter__()
204 warnings.simplefilter("always", self.expected)
205 return self
206
207 def __exit__(self, exc_type, exc_value, tb):
208 self.warnings_manager.__exit__(exc_type, exc_value, tb)
209 if exc_type is not None:
210 # let unexpected exceptions pass through
211 return
212 try:
213 exc_name = self.expected.__name__
214 except AttributeError:
215 exc_name = str(self.expected)
216 first_matching = None
217 for m in self.warnings:
218 w = m.message
219 if not isinstance(w, self.expected):
220 continue
221 if first_matching is None:
222 first_matching = w
Ezio Melottied3a7d22010-12-01 02:32:32 +0000223 if (self.expected_regex is not None and
224 not self.expected_regex.search(str(w))):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000225 continue
226 # store warning for later retrieval
227 self.warning = w
228 self.filename = m.filename
229 self.lineno = m.lineno
230 return
231 # Now we simply try to choose a helpful failure message
232 if first_matching is not None:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300233 self._raiseFailure('"{}" does not match "{}"'.format(
234 self.expected_regex.pattern, str(first_matching)))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000235 if self.obj_name:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300236 self._raiseFailure("{} not triggered by {}".format(exc_name,
237 self.obj_name))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000238 else:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300239 self._raiseFailure("{} not triggered".format(exc_name))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000240
241
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200242
243_LoggingWatcher = collections.namedtuple("_LoggingWatcher",
244 ["records", "output"])
245
246
247class _CapturingHandler(logging.Handler):
248 """
249 A logging handler capturing all (raw and formatted) logging output.
250 """
251
252 def __init__(self):
253 logging.Handler.__init__(self)
254 self.watcher = _LoggingWatcher([], [])
255
256 def flush(self):
257 pass
258
259 def emit(self, record):
260 self.watcher.records.append(record)
261 msg = self.format(record)
262 self.watcher.output.append(msg)
263
264
265
266class _AssertLogsContext(_BaseTestCaseContext):
267 """A context manager used to implement TestCase.assertLogs()."""
268
269 LOGGING_FORMAT = "%(levelname)s:%(name)s:%(message)s"
270
271 def __init__(self, test_case, logger_name, level):
272 _BaseTestCaseContext.__init__(self, test_case)
273 self.logger_name = logger_name
274 if level:
275 self.level = logging._nameToLevel.get(level, level)
276 else:
277 self.level = logging.INFO
278 self.msg = None
279
280 def __enter__(self):
281 if isinstance(self.logger_name, logging.Logger):
282 logger = self.logger = self.logger_name
283 else:
284 logger = self.logger = logging.getLogger(self.logger_name)
285 formatter = logging.Formatter(self.LOGGING_FORMAT)
286 handler = _CapturingHandler()
287 handler.setFormatter(formatter)
288 self.watcher = handler.watcher
289 self.old_handlers = logger.handlers[:]
290 self.old_level = logger.level
291 self.old_propagate = logger.propagate
292 logger.handlers = [handler]
293 logger.setLevel(self.level)
294 logger.propagate = False
295 return handler.watcher
296
297 def __exit__(self, exc_type, exc_value, tb):
298 self.logger.handlers = self.old_handlers
299 self.logger.propagate = self.old_propagate
300 self.logger.setLevel(self.old_level)
301 if exc_type is not None:
302 # let unexpected exceptions pass through
303 return False
304 if len(self.watcher.records) == 0:
305 self._raiseFailure(
306 "no logs of level {} or higher triggered on {}"
307 .format(logging.getLevelName(self.level), self.logger.name))
308
309
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000310class TestCase(object):
311 """A class whose instances are single test cases.
312
313 By default, the test code itself should be placed in a method named
314 'runTest'.
315
316 If the fixture may be used for many test cases, create as
317 many test methods as are needed. When instantiating such a TestCase
318 subclass, specify in the constructor arguments the name of the test method
319 that the instance is to execute.
320
321 Test authors should subclass TestCase for their own tests. Construction
322 and deconstruction of the test's environment ('fixture') can be
323 implemented by overriding the 'setUp' and 'tearDown' methods respectively.
324
325 If it is necessary to override the __init__ method, the base class
326 __init__ method must always be called. It is important that subclasses
327 should not change the signature of their __init__ method, since instances
328 of the classes are instantiated automatically by parts of the framework
329 in order to be run.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000330
Ezio Melotti31797e52013-03-29 03:42:29 +0200331 When subclassing TestCase, you can set these attributes:
332 * failureException: determines which exception will be raised when
333 the instance's assertion methods fail; test methods raising this
334 exception will be deemed to have 'failed' rather than 'errored'.
335 * longMessage: determines whether long messages (including repr of
336 objects used in assert methods) will be printed on failure in *addition*
337 to any explicit message passed.
338 * maxDiff: sets the maximum length of a diff in failure messages
339 by assert methods using difflib. It is looked up as an instance
340 attribute so can be configured by individual tests if required.
341 """
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000342
343 failureException = AssertionError
344
Michael Foord5074df62010-12-03 00:53:09 +0000345 longMessage = True
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000346
Michael Foord085dfd32010-06-05 12:17:02 +0000347 maxDiff = 80*8
348
Ezio Melottiedd117f2011-04-27 10:20:38 +0300349 # If a string is longer than _diffThreshold, use normal comparison instead
350 # of difflib. See #11763.
351 _diffThreshold = 2**16
352
Benjamin Peterson847a4112010-03-14 15:04:17 +0000353 # Attribute used by TestSuite for classSetUp
354
355 _classSetupFailed = False
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000356
357 def __init__(self, methodName='runTest'):
358 """Create an instance of the class that will use the named test
359 method when executed. Raises a ValueError if the instance does
360 not have a method with the specified name.
361 """
362 self._testMethodName = methodName
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100363 self._outcome = None
Michael Foord32e1d832011-01-03 17:00:11 +0000364 self._testMethodDoc = 'No test'
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000365 try:
366 testMethod = getattr(self, methodName)
367 except AttributeError:
Michael Foord32e1d832011-01-03 17:00:11 +0000368 if methodName != 'runTest':
369 # we allow instantiation with no explicit method name
370 # but not an *incorrect* or missing method name
371 raise ValueError("no such test method in %s: %s" %
372 (self.__class__, methodName))
373 else:
374 self._testMethodDoc = testMethod.__doc__
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000375 self._cleanups = []
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100376 self._subtest = None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000377
378 # Map types to custom assertEqual functions that will compare
379 # instances of said type in more detail to generate a more useful
380 # error message.
Benjamin Peterson34b2b262011-07-12 19:21:42 -0500381 self._type_equality_funcs = {}
Michael Foord8ca6d982010-11-20 15:34:26 +0000382 self.addTypeEqualityFunc(dict, 'assertDictEqual')
383 self.addTypeEqualityFunc(list, 'assertListEqual')
384 self.addTypeEqualityFunc(tuple, 'assertTupleEqual')
385 self.addTypeEqualityFunc(set, 'assertSetEqual')
386 self.addTypeEqualityFunc(frozenset, 'assertSetEqual')
387 self.addTypeEqualityFunc(str, 'assertMultiLineEqual')
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000388
389 def addTypeEqualityFunc(self, typeobj, function):
390 """Add a type specific assertEqual style function to compare a type.
391
392 This method is for use by TestCase subclasses that need to register
393 their own type equality functions to provide nicer error messages.
394
395 Args:
396 typeobj: The data type to call this function on when both values
397 are of the same type in assertEqual().
398 function: The callable taking two arguments and an optional
399 msg= argument that raises self.failureException with a
400 useful error message when the two arguments are not equal.
401 """
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000402 self._type_equality_funcs[typeobj] = function
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000403
404 def addCleanup(self, function, *args, **kwargs):
405 """Add a function, with arguments, to be called when the test is
406 completed. Functions added are called on a LIFO basis and are
407 called after tearDown on test failure or success.
408
409 Cleanup items are called even if setUp fails (unlike tearDown)."""
410 self._cleanups.append((function, args, kwargs))
411
412 def setUp(self):
413 "Hook method for setting up the test fixture before exercising it."
414 pass
415
416 def tearDown(self):
417 "Hook method for deconstructing the test fixture after testing it."
418 pass
419
Benjamin Peterson847a4112010-03-14 15:04:17 +0000420 @classmethod
421 def setUpClass(cls):
422 "Hook method for setting up class fixture before running tests in the class."
423
424 @classmethod
425 def tearDownClass(cls):
426 "Hook method for deconstructing the class fixture after running all tests in the class."
427
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000428 def countTestCases(self):
429 return 1
430
431 def defaultTestResult(self):
432 return result.TestResult()
433
434 def shortDescription(self):
Michael Foord34c94622010-02-10 15:51:42 +0000435 """Returns a one-line description of the test, or None if no
436 description has been provided.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000437
Michael Foord34c94622010-02-10 15:51:42 +0000438 The default implementation of this method returns the first line of
439 the specified test method's docstring.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000440 """
Michael Foord34c94622010-02-10 15:51:42 +0000441 doc = self._testMethodDoc
442 return doc and doc.split("\n")[0].strip() or None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000443
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000444
445 def id(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000446 return "%s.%s" % (strclass(self.__class__), self._testMethodName)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000447
448 def __eq__(self, other):
449 if type(self) is not type(other):
450 return NotImplemented
451
452 return self._testMethodName == other._testMethodName
453
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000454 def __hash__(self):
455 return hash((type(self), self._testMethodName))
456
457 def __str__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000458 return "%s (%s)" % (self._testMethodName, strclass(self.__class__))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000459
460 def __repr__(self):
461 return "<%s testMethod=%s>" % \
Benjamin Peterson847a4112010-03-14 15:04:17 +0000462 (strclass(self.__class__), self._testMethodName)
463
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100464 def _addSkip(self, result, test_case, reason):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000465 addSkip = getattr(result, 'addSkip', None)
466 if addSkip is not None:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100467 addSkip(test_case, reason)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000468 else:
469 warnings.warn("TestResult has no addSkip method, skips not reported",
470 RuntimeWarning, 2)
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100471 result.addSuccess(test_case)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000472
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100473 @contextlib.contextmanager
474 def subTest(self, msg=None, **params):
475 """Return a context manager that will return the enclosed block
476 of code in a subtest identified by the optional message and
477 keyword parameters. A failure in the subtest marks the test
478 case as failed but resumes execution at the end of the enclosed
479 block, allowing further test code to be executed.
480 """
481 if not self._outcome.result_supports_subtests:
482 yield
483 return
484 parent = self._subtest
485 if parent is None:
486 params_map = collections.ChainMap(params)
487 else:
488 params_map = parent.params.new_child(params)
489 self._subtest = _SubTest(self, msg, params_map)
Michael Foordb3468f72010-12-19 03:19:47 +0000490 try:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100491 with self._outcome.testPartExecutor(self._subtest, isTest=True):
492 yield
493 if not self._outcome.success:
494 result = self._outcome.result
495 if result is not None and result.failfast:
496 raise _ShouldStop
497 elif self._outcome.expectedFailure:
498 # If the test is expecting a failure, we really want to
499 # stop now and register the expected failure.
500 raise _ShouldStop
501 finally:
502 self._subtest = parent
503
504 def _feedErrorsToResult(self, result, errors):
505 for test, exc_info in errors:
506 if isinstance(test, _SubTest):
507 result.addSubTest(test.test_case, test, exc_info)
508 elif exc_info is not None:
509 if issubclass(exc_info[0], self.failureException):
510 result.addFailure(test, exc_info)
511 else:
512 result.addError(test, exc_info)
513
514 def _addExpectedFailure(self, result, exc_info):
515 try:
516 addExpectedFailure = result.addExpectedFailure
517 except AttributeError:
518 warnings.warn("TestResult has no addExpectedFailure method, reporting as passes",
519 RuntimeWarning)
520 result.addSuccess(self)
521 else:
522 addExpectedFailure(self, exc_info)
523
524 def _addUnexpectedSuccess(self, result):
525 try:
526 addUnexpectedSuccess = result.addUnexpectedSuccess
527 except AttributeError:
528 warnings.warn("TestResult has no addUnexpectedSuccess method, reporting as failure",
529 RuntimeWarning)
530 # We need to pass an actual exception and traceback to addFailure,
531 # otherwise the legacy result can choke.
532 try:
533 raise _UnexpectedSuccess from None
534 except _UnexpectedSuccess:
535 result.addFailure(self, sys.exc_info())
536 else:
537 addUnexpectedSuccess(self)
Michael Foordb3468f72010-12-19 03:19:47 +0000538
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000539 def run(self, result=None):
540 orig_result = result
541 if result is None:
542 result = self.defaultTestResult()
543 startTestRun = getattr(result, 'startTestRun', None)
544 if startTestRun is not None:
545 startTestRun()
546
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000547 result.startTest(self)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000548
549 testMethod = getattr(self, self._testMethodName)
550 if (getattr(self.__class__, "__unittest_skip__", False) or
551 getattr(testMethod, "__unittest_skip__", False)):
552 # If the class or method was skipped.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000553 try:
Benjamin Peterson847a4112010-03-14 15:04:17 +0000554 skip_why = (getattr(self.__class__, '__unittest_skip_why__', '')
555 or getattr(testMethod, '__unittest_skip_why__', ''))
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100556 self._addSkip(result, self, skip_why)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000557 finally:
558 result.stopTest(self)
559 return
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100560 expecting_failure = getattr(testMethod,
561 "__unittest_expecting_failure__", False)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000562 try:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100563 outcome = _Outcome(result)
564 self._outcome = outcome
Michael Foordb3468f72010-12-19 03:19:47 +0000565
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100566 with outcome.testPartExecutor(self):
567 self.setUp()
Michael Foordb3468f72010-12-19 03:19:47 +0000568 if outcome.success:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100569 outcome.expecting_failure = expecting_failure
570 with outcome.testPartExecutor(self, isTest=True):
571 testMethod()
572 outcome.expecting_failure = False
573 with outcome.testPartExecutor(self):
574 self.tearDown()
Michael Foordb3468f72010-12-19 03:19:47 +0000575
576 self.doCleanups()
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100577 for test, reason in outcome.skipped:
578 self._addSkip(result, test, reason)
579 self._feedErrorsToResult(result, outcome.errors)
Michael Foordb3468f72010-12-19 03:19:47 +0000580 if outcome.success:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100581 if expecting_failure:
582 if outcome.expectedFailure:
583 self._addExpectedFailure(result, outcome.expectedFailure)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000584 else:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100585 self._addUnexpectedSuccess(result)
586 else:
587 result.addSuccess(self)
Michael Foord1341bb02011-03-14 19:01:46 -0400588 return result
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000589 finally:
590 result.stopTest(self)
591 if orig_result is None:
592 stopTestRun = getattr(result, 'stopTestRun', None)
593 if stopTestRun is not None:
594 stopTestRun()
595
596 def doCleanups(self):
597 """Execute all cleanup functions. Normally called for you after
598 tearDown."""
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100599 outcome = self._outcome or _Outcome()
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000600 while self._cleanups:
Michael Foordb3468f72010-12-19 03:19:47 +0000601 function, args, kwargs = self._cleanups.pop()
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100602 with outcome.testPartExecutor(self):
603 function(*args, **kwargs)
Michael Foordb3468f72010-12-19 03:19:47 +0000604
605 # return this for backwards compatibility
606 # even though we no longer us it internally
607 return outcome.success
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000608
609 def __call__(self, *args, **kwds):
610 return self.run(*args, **kwds)
611
612 def debug(self):
613 """Run the test without collecting errors in a TestResult"""
614 self.setUp()
615 getattr(self, self._testMethodName)()
616 self.tearDown()
Michael Foordb8748742010-06-10 16:16:08 +0000617 while self._cleanups:
618 function, args, kwargs = self._cleanups.pop(-1)
619 function(*args, **kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000620
621 def skipTest(self, reason):
622 """Skip this test."""
623 raise SkipTest(reason)
624
625 def fail(self, msg=None):
626 """Fail immediately, with the given message."""
627 raise self.failureException(msg)
628
629 def assertFalse(self, expr, msg=None):
Ezio Melotti3044fa72010-12-18 17:31:58 +0000630 """Check that the expression is false."""
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000631 if expr:
Ezio Melotti3044fa72010-12-18 17:31:58 +0000632 msg = self._formatMessage(msg, "%s is not false" % safe_repr(expr))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000633 raise self.failureException(msg)
634
635 def assertTrue(self, expr, msg=None):
Ezio Melotti3044fa72010-12-18 17:31:58 +0000636 """Check that the expression is true."""
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000637 if not expr:
Ezio Melotti3044fa72010-12-18 17:31:58 +0000638 msg = self._formatMessage(msg, "%s is not true" % safe_repr(expr))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000639 raise self.failureException(msg)
640
641 def _formatMessage(self, msg, standardMsg):
642 """Honour the longMessage attribute when generating failure messages.
643 If longMessage is False this means:
644 * Use only an explicit message if it is provided
645 * Otherwise use the standard message for the assert
646
647 If longMessage is True:
648 * Use the standard message
649 * If an explicit message is provided, plus ' : ' and the explicit message
650 """
651 if not self.longMessage:
652 return msg or standardMsg
653 if msg is None:
654 return standardMsg
Benjamin Peterson847a4112010-03-14 15:04:17 +0000655 try:
656 # don't switch to '{}' formatting in Python 2.X
657 # it changes the way unicode input is handled
658 return '%s : %s' % (standardMsg, msg)
659 except UnicodeDecodeError:
660 return '%s : %s' % (safe_repr(standardMsg), safe_repr(msg))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000661
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000662 def assertRaises(self, excClass, callableObj=None, *args, **kwargs):
Andrew Svetlov737fb892012-12-18 21:14:22 +0200663 """Fail unless an exception of class excClass is raised
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000664 by callableObj when invoked with arguments args and keyword
665 arguments kwargs. If a different type of exception is
Andrew Svetlov737fb892012-12-18 21:14:22 +0200666 raised, it will not be caught, and the test case will be
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000667 deemed to have suffered an error, exactly as for an
668 unexpected exception.
669
670 If called with callableObj omitted or None, will return a
671 context object used like this::
672
Michael Foord1c42b122010-02-05 22:58:21 +0000673 with self.assertRaises(SomeException):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000674 do_something()
Michael Foord1c42b122010-02-05 22:58:21 +0000675
Ezio Melottib4dc2502011-05-06 15:01:41 +0300676 An optional keyword argument 'msg' can be provided when assertRaises
677 is used as a context object.
678
Michael Foord1c42b122010-02-05 22:58:21 +0000679 The context manager keeps a reference to the exception as
Ezio Melotti49008232010-02-08 21:57:48 +0000680 the 'exception' attribute. This allows you to inspect the
Michael Foord1c42b122010-02-05 22:58:21 +0000681 exception after the assertion::
682
683 with self.assertRaises(SomeException) as cm:
684 do_something()
Ezio Melotti49008232010-02-08 21:57:48 +0000685 the_exception = cm.exception
Michael Foordb57ac6d2010-02-05 23:26:29 +0000686 self.assertEqual(the_exception.error_code, 3)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000687 """
688 context = _AssertRaisesContext(excClass, self, callableObj)
Ezio Melottib4dc2502011-05-06 15:01:41 +0300689 return context.handle('assertRaises', callableObj, args, kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000690
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000691 def assertWarns(self, expected_warning, callable_obj=None, *args, **kwargs):
692 """Fail unless a warning of class warnClass is triggered
Ezio Melottib4dc2502011-05-06 15:01:41 +0300693 by callable_obj when invoked with arguments args and keyword
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000694 arguments kwargs. If a different type of warning is
695 triggered, it will not be handled: depending on the other
696 warning filtering rules in effect, it might be silenced, printed
697 out, or raised as an exception.
698
Ezio Melottib4dc2502011-05-06 15:01:41 +0300699 If called with callable_obj omitted or None, will return a
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000700 context object used like this::
701
702 with self.assertWarns(SomeWarning):
703 do_something()
704
Ezio Melottib4dc2502011-05-06 15:01:41 +0300705 An optional keyword argument 'msg' can be provided when assertWarns
706 is used as a context object.
707
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000708 The context manager keeps a reference to the first matching
709 warning as the 'warning' attribute; similarly, the 'filename'
710 and 'lineno' attributes give you information about the line
711 of Python code from which the warning was triggered.
712 This allows you to inspect the warning after the assertion::
713
714 with self.assertWarns(SomeWarning) as cm:
715 do_something()
716 the_warning = cm.warning
717 self.assertEqual(the_warning.some_attribute, 147)
718 """
719 context = _AssertWarnsContext(expected_warning, self, callable_obj)
Ezio Melottib4dc2502011-05-06 15:01:41 +0300720 return context.handle('assertWarns', callable_obj, args, kwargs)
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000721
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200722 def assertLogs(self, logger=None, level=None):
723 """Fail unless a log message of level *level* or higher is emitted
724 on *logger_name* or its children. If omitted, *level* defaults to
725 INFO and *logger* defaults to the root logger.
726
727 This method must be used as a context manager, and will yield
728 a recording object with two attributes: `output` and `records`.
729 At the end of the context manager, the `output` attribute will
730 be a list of the matching formatted log messages and the
731 `records` attribute will be a list of the corresponding LogRecord
732 objects.
733
734 Example::
735
736 with self.assertLogs('foo', level='INFO') as cm:
737 logging.getLogger('foo').info('first message')
738 logging.getLogger('foo.bar').error('second message')
739 self.assertEqual(cm.output, ['INFO:foo:first message',
740 'ERROR:foo.bar:second message'])
741 """
742 return _AssertLogsContext(self, logger, level)
743
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000744 def _getAssertEqualityFunc(self, first, second):
745 """Get a detailed comparison function for the types of the two args.
746
747 Returns: A callable accepting (first, second, msg=None) that will
748 raise a failure exception if first != second with a useful human
749 readable error message for those types.
750 """
751 #
752 # NOTE(gregory.p.smith): I considered isinstance(first, type(second))
753 # and vice versa. I opted for the conservative approach in case
754 # subclasses are not intended to be compared in detail to their super
755 # class instances using a type equality func. This means testing
756 # subtypes won't automagically use the detailed comparison. Callers
757 # should use their type specific assertSpamEqual method to compare
758 # subclasses if the detailed comparison is desired and appropriate.
759 # See the discussion in http://bugs.python.org/issue2578.
760 #
761 if type(first) is type(second):
762 asserter = self._type_equality_funcs.get(type(first))
763 if asserter is not None:
Benjamin Peterson34b2b262011-07-12 19:21:42 -0500764 if isinstance(asserter, str):
765 asserter = getattr(self, asserter)
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000766 return asserter
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000767
768 return self._baseAssertEqual
769
770 def _baseAssertEqual(self, first, second, msg=None):
771 """The default assertEqual implementation, not type specific."""
772 if not first == second:
Serhiy Storchaka77622f52013-09-23 23:07:00 +0300773 standardMsg = '%s != %s' % _common_shorten_repr(first, second)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000774 msg = self._formatMessage(msg, standardMsg)
775 raise self.failureException(msg)
776
777 def assertEqual(self, first, second, msg=None):
778 """Fail if the two objects are unequal as determined by the '=='
779 operator.
780 """
781 assertion_func = self._getAssertEqualityFunc(first, second)
782 assertion_func(first, second, msg=msg)
783
784 def assertNotEqual(self, first, second, msg=None):
Ezio Melotti90eea972012-11-08 11:08:39 +0200785 """Fail if the two objects are equal as determined by the '!='
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000786 operator.
787 """
788 if not first != second:
Benjamin Peterson847a4112010-03-14 15:04:17 +0000789 msg = self._formatMessage(msg, '%s == %s' % (safe_repr(first),
790 safe_repr(second)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000791 raise self.failureException(msg)
792
Michael Foord321d0592010-11-02 13:44:51 +0000793 def assertAlmostEqual(self, first, second, places=None, msg=None,
Benjamin Petersonb48af542010-04-11 20:43:16 +0000794 delta=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000795 """Fail if the two objects are unequal as determined by their
796 difference rounded to the given number of decimal places
Benjamin Petersonb48af542010-04-11 20:43:16 +0000797 (default 7) and comparing to zero, or by comparing that the
798 between the two objects is more than the given delta.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000799
800 Note that decimal places (from zero) are usually not the same
801 as significant digits (measured from the most signficant digit).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000802
803 If the two objects compare equal then they will automatically
804 compare almost equal.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000805 """
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000806 if first == second:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000807 # shortcut
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000808 return
Benjamin Petersonb48af542010-04-11 20:43:16 +0000809 if delta is not None and places is not None:
810 raise TypeError("specify delta or places not both")
811
812 if delta is not None:
813 if abs(first - second) <= delta:
814 return
815
816 standardMsg = '%s != %s within %s delta' % (safe_repr(first),
817 safe_repr(second),
818 safe_repr(delta))
819 else:
820 if places is None:
821 places = 7
822
823 if round(abs(second-first), places) == 0:
824 return
825
Benjamin Peterson847a4112010-03-14 15:04:17 +0000826 standardMsg = '%s != %s within %r places' % (safe_repr(first),
827 safe_repr(second),
828 places)
Benjamin Petersonb48af542010-04-11 20:43:16 +0000829 msg = self._formatMessage(msg, standardMsg)
830 raise self.failureException(msg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000831
Michael Foord321d0592010-11-02 13:44:51 +0000832 def assertNotAlmostEqual(self, first, second, places=None, msg=None,
Benjamin Petersonb48af542010-04-11 20:43:16 +0000833 delta=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000834 """Fail if the two objects are equal as determined by their
835 difference rounded to the given number of decimal places
Benjamin Petersonb48af542010-04-11 20:43:16 +0000836 (default 7) and comparing to zero, or by comparing that the
837 between the two objects is less than the given delta.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000838
839 Note that decimal places (from zero) are usually not the same
840 as significant digits (measured from the most signficant digit).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000841
842 Objects that are equal automatically fail.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000843 """
Benjamin Petersonb48af542010-04-11 20:43:16 +0000844 if delta is not None and places is not None:
845 raise TypeError("specify delta or places not both")
846 if delta is not None:
847 if not (first == second) and abs(first - second) > delta:
848 return
849 standardMsg = '%s == %s within %s delta' % (safe_repr(first),
850 safe_repr(second),
851 safe_repr(delta))
852 else:
853 if places is None:
854 places = 7
855 if not (first == second) and round(abs(second-first), places) != 0:
856 return
Benjamin Peterson847a4112010-03-14 15:04:17 +0000857 standardMsg = '%s == %s within %r places' % (safe_repr(first),
Benjamin Petersonb48af542010-04-11 20:43:16 +0000858 safe_repr(second),
859 places)
860
861 msg = self._formatMessage(msg, standardMsg)
862 raise self.failureException(msg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000863
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000864
Michael Foord085dfd32010-06-05 12:17:02 +0000865 def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000866 """An equality assertion for ordered sequences (like lists and tuples).
867
R. David Murrayad13f222010-01-29 22:17:58 +0000868 For the purposes of this function, a valid ordered sequence type is one
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000869 which can be indexed, has a length, and has an equality operator.
870
871 Args:
872 seq1: The first sequence to compare.
873 seq2: The second sequence to compare.
874 seq_type: The expected datatype of the sequences, or None if no
875 datatype should be enforced.
876 msg: Optional message to use on failure instead of a list of
877 differences.
878 """
Benjamin Petersonb29614e2012-10-09 11:16:03 -0400879 if seq_type is not None:
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000880 seq_type_name = seq_type.__name__
881 if not isinstance(seq1, seq_type):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000882 raise self.failureException('First sequence is not a %s: %s'
883 % (seq_type_name, safe_repr(seq1)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000884 if not isinstance(seq2, seq_type):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000885 raise self.failureException('Second sequence is not a %s: %s'
886 % (seq_type_name, safe_repr(seq2)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000887 else:
888 seq_type_name = "sequence"
889
890 differing = None
891 try:
892 len1 = len(seq1)
893 except (TypeError, NotImplementedError):
894 differing = 'First %s has no length. Non-sequence?' % (
895 seq_type_name)
896
897 if differing is None:
898 try:
899 len2 = len(seq2)
900 except (TypeError, NotImplementedError):
901 differing = 'Second %s has no length. Non-sequence?' % (
902 seq_type_name)
903
904 if differing is None:
905 if seq1 == seq2:
906 return
907
Serhiy Storchaka77622f52013-09-23 23:07:00 +0300908 differing = '%ss differ: %s != %s\n' % (
909 (seq_type_name.capitalize(),) +
910 _common_shorten_repr(seq1, seq2))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000911
912 for i in range(min(len1, len2)):
913 try:
914 item1 = seq1[i]
915 except (TypeError, IndexError, NotImplementedError):
916 differing += ('\nUnable to index element %d of first %s\n' %
917 (i, seq_type_name))
918 break
919
920 try:
921 item2 = seq2[i]
922 except (TypeError, IndexError, NotImplementedError):
923 differing += ('\nUnable to index element %d of second %s\n' %
924 (i, seq_type_name))
925 break
926
927 if item1 != item2:
928 differing += ('\nFirst differing element %d:\n%s\n%s\n' %
929 (i, item1, item2))
930 break
931 else:
932 if (len1 == len2 and seq_type is None and
933 type(seq1) != type(seq2)):
934 # The sequences are the same, but have differing types.
935 return
936
937 if len1 > len2:
938 differing += ('\nFirst %s contains %d additional '
939 'elements.\n' % (seq_type_name, len1 - len2))
940 try:
941 differing += ('First extra element %d:\n%s\n' %
942 (len2, seq1[len2]))
943 except (TypeError, IndexError, NotImplementedError):
944 differing += ('Unable to index element %d '
945 'of first %s\n' % (len2, seq_type_name))
946 elif len1 < len2:
947 differing += ('\nSecond %s contains %d additional '
948 'elements.\n' % (seq_type_name, len2 - len1))
949 try:
950 differing += ('First extra element %d:\n%s\n' %
951 (len1, seq2[len1]))
952 except (TypeError, IndexError, NotImplementedError):
953 differing += ('Unable to index element %d '
954 'of second %s\n' % (len1, seq_type_name))
Michael Foord2034d9a2010-06-05 11:27:52 +0000955 standardMsg = differing
956 diffMsg = '\n' + '\n'.join(
Benjamin Peterson6e8c7572009-10-04 20:19:21 +0000957 difflib.ndiff(pprint.pformat(seq1).splitlines(),
958 pprint.pformat(seq2).splitlines()))
Michael Foord085dfd32010-06-05 12:17:02 +0000959
960 standardMsg = self._truncateMessage(standardMsg, diffMsg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000961 msg = self._formatMessage(msg, standardMsg)
962 self.fail(msg)
963
Michael Foord085dfd32010-06-05 12:17:02 +0000964 def _truncateMessage(self, message, diff):
965 max_diff = self.maxDiff
966 if max_diff is None or len(diff) <= max_diff:
967 return message + diff
Michael Foord9dad32e2010-06-05 13:49:56 +0000968 return message + (DIFF_OMITTED % len(diff))
Michael Foord085dfd32010-06-05 12:17:02 +0000969
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000970 def assertListEqual(self, list1, list2, msg=None):
971 """A list-specific equality assertion.
972
973 Args:
974 list1: The first list to compare.
975 list2: The second list to compare.
976 msg: Optional message to use on failure instead of a list of
977 differences.
978
979 """
980 self.assertSequenceEqual(list1, list2, msg, seq_type=list)
981
982 def assertTupleEqual(self, tuple1, tuple2, msg=None):
983 """A tuple-specific equality assertion.
984
985 Args:
986 tuple1: The first tuple to compare.
987 tuple2: The second tuple to compare.
988 msg: Optional message to use on failure instead of a list of
989 differences.
990 """
991 self.assertSequenceEqual(tuple1, tuple2, msg, seq_type=tuple)
992
993 def assertSetEqual(self, set1, set2, msg=None):
994 """A set-specific equality assertion.
995
996 Args:
997 set1: The first set to compare.
998 set2: The second set to compare.
999 msg: Optional message to use on failure instead of a list of
1000 differences.
1001
Michael Foord91c9da32010-03-20 17:21:27 +00001002 assertSetEqual uses ducktyping to support different types of sets, and
1003 is optimized for sets specifically (parameters must support a
1004 difference method).
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001005 """
1006 try:
1007 difference1 = set1.difference(set2)
1008 except TypeError as e:
1009 self.fail('invalid type when attempting set difference: %s' % e)
1010 except AttributeError as e:
1011 self.fail('first argument does not support set difference: %s' % e)
1012
1013 try:
1014 difference2 = set2.difference(set1)
1015 except TypeError as e:
1016 self.fail('invalid type when attempting set difference: %s' % e)
1017 except AttributeError as e:
1018 self.fail('second argument does not support set difference: %s' % e)
1019
1020 if not (difference1 or difference2):
1021 return
1022
1023 lines = []
1024 if difference1:
1025 lines.append('Items in the first set but not the second:')
1026 for item in difference1:
1027 lines.append(repr(item))
1028 if difference2:
1029 lines.append('Items in the second set but not the first:')
1030 for item in difference2:
1031 lines.append(repr(item))
1032
1033 standardMsg = '\n'.join(lines)
1034 self.fail(self._formatMessage(msg, standardMsg))
1035
1036 def assertIn(self, member, container, msg=None):
1037 """Just like self.assertTrue(a in b), but with a nicer default message."""
1038 if member not in container:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001039 standardMsg = '%s not found in %s' % (safe_repr(member),
1040 safe_repr(container))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001041 self.fail(self._formatMessage(msg, standardMsg))
1042
1043 def assertNotIn(self, member, container, msg=None):
1044 """Just like self.assertTrue(a not in b), but with a nicer default message."""
1045 if member in container:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001046 standardMsg = '%s unexpectedly found in %s' % (safe_repr(member),
1047 safe_repr(container))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001048 self.fail(self._formatMessage(msg, standardMsg))
1049
1050 def assertIs(self, expr1, expr2, msg=None):
1051 """Just like self.assertTrue(a is b), but with a nicer default message."""
1052 if expr1 is not expr2:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001053 standardMsg = '%s is not %s' % (safe_repr(expr1),
1054 safe_repr(expr2))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001055 self.fail(self._formatMessage(msg, standardMsg))
1056
1057 def assertIsNot(self, expr1, expr2, msg=None):
1058 """Just like self.assertTrue(a is not b), but with a nicer default message."""
1059 if expr1 is expr2:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001060 standardMsg = 'unexpectedly identical: %s' % (safe_repr(expr1),)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001061 self.fail(self._formatMessage(msg, standardMsg))
1062
1063 def assertDictEqual(self, d1, d2, msg=None):
Ezio Melottib3aedd42010-11-20 19:04:17 +00001064 self.assertIsInstance(d1, dict, 'First argument is not a dictionary')
1065 self.assertIsInstance(d2, dict, 'Second argument is not a dictionary')
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001066
1067 if d1 != d2:
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001068 standardMsg = '%s != %s' % _common_shorten_repr(d1, d2)
Michael Foord085dfd32010-06-05 12:17:02 +00001069 diff = ('\n' + '\n'.join(difflib.ndiff(
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001070 pprint.pformat(d1).splitlines(),
1071 pprint.pformat(d2).splitlines())))
Michael Foordcb11b252010-06-05 13:14:43 +00001072 standardMsg = self._truncateMessage(standardMsg, diff)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001073 self.fail(self._formatMessage(msg, standardMsg))
1074
Ezio Melotti0f535012011-04-03 18:02:13 +03001075 def assertDictContainsSubset(self, subset, dictionary, msg=None):
1076 """Checks whether dictionary is a superset of subset."""
1077 warnings.warn('assertDictContainsSubset is deprecated',
1078 DeprecationWarning)
1079 missing = []
1080 mismatched = []
1081 for key, value in subset.items():
1082 if key not in dictionary:
1083 missing.append(key)
1084 elif value != dictionary[key]:
1085 mismatched.append('%s, expected: %s, actual: %s' %
1086 (safe_repr(key), safe_repr(value),
1087 safe_repr(dictionary[key])))
1088
1089 if not (missing or mismatched):
1090 return
1091
1092 standardMsg = ''
1093 if missing:
1094 standardMsg = 'Missing: %s' % ','.join(safe_repr(m) for m in
1095 missing)
1096 if mismatched:
1097 if standardMsg:
1098 standardMsg += '; '
1099 standardMsg += 'Mismatched values: %s' % ','.join(mismatched)
1100
1101 self.fail(self._formatMessage(msg, standardMsg))
1102
1103
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001104 def assertCountEqual(self, first, second, msg=None):
1105 """An unordered sequence comparison asserting that the same elements,
1106 regardless of order. If the same element occurs more than once,
1107 it verifies that the elements occur the same number of times.
Michael Foord8442a602010-03-20 16:58:04 +00001108
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001109 self.assertEqual(Counter(list(first)),
1110 Counter(list(second)))
Michael Foord8442a602010-03-20 16:58:04 +00001111
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001112 Example:
Michael Foord8442a602010-03-20 16:58:04 +00001113 - [0, 1, 1] and [1, 0, 1] compare equal.
1114 - [0, 0, 1] and [0, 1] compare unequal.
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001115
Michael Foord8442a602010-03-20 16:58:04 +00001116 """
Michael Foorde180d392011-01-28 19:51:48 +00001117 first_seq, second_seq = list(first), list(second)
Michael Foord8442a602010-03-20 16:58:04 +00001118 try:
Michael Foorde180d392011-01-28 19:51:48 +00001119 first = collections.Counter(first_seq)
1120 second = collections.Counter(second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001121 except TypeError:
Raymond Hettinger6518f5e2010-12-24 00:52:54 +00001122 # Handle case with unhashable elements
Michael Foorde180d392011-01-28 19:51:48 +00001123 differences = _count_diff_all_purpose(first_seq, second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001124 else:
Michael Foorde180d392011-01-28 19:51:48 +00001125 if first == second:
Raymond Hettinger6e165b32010-11-27 09:31:37 +00001126 return
Michael Foorde180d392011-01-28 19:51:48 +00001127 differences = _count_diff_hashable(first_seq, second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001128
Raymond Hettinger93e233d2010-12-24 10:02:22 +00001129 if differences:
1130 standardMsg = 'Element counts were not equal:\n'
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001131 lines = ['First has %d, Second has %d: %r' % diff for diff in differences]
Raymond Hettinger93e233d2010-12-24 10:02:22 +00001132 diffMsg = '\n'.join(lines)
1133 standardMsg = self._truncateMessage(standardMsg, diffMsg)
1134 msg = self._formatMessage(msg, standardMsg)
1135 self.fail(msg)
Michael Foord8442a602010-03-20 16:58:04 +00001136
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001137 def assertMultiLineEqual(self, first, second, msg=None):
1138 """Assert that two multi-line strings are equal."""
Ezio Melottib3aedd42010-11-20 19:04:17 +00001139 self.assertIsInstance(first, str, 'First argument is not a string')
1140 self.assertIsInstance(second, str, 'Second argument is not a string')
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001141
1142 if first != second:
Ezio Melottiedd117f2011-04-27 10:20:38 +03001143 # don't use difflib if the strings are too long
1144 if (len(first) > self._diffThreshold or
1145 len(second) > self._diffThreshold):
1146 self._baseAssertEqual(first, second, msg)
Ezio Melottid8b509b2011-09-28 17:37:55 +03001147 firstlines = first.splitlines(keepends=True)
1148 secondlines = second.splitlines(keepends=True)
Michael Foordc653ce32010-07-10 13:52:22 +00001149 if len(firstlines) == 1 and first.strip('\r\n') == first:
1150 firstlines = [first + '\n']
1151 secondlines = [second + '\n']
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001152 standardMsg = '%s != %s' % _common_shorten_repr(first, second)
Michael Foordc653ce32010-07-10 13:52:22 +00001153 diff = '\n' + ''.join(difflib.ndiff(firstlines, secondlines))
Michael Foordcb11b252010-06-05 13:14:43 +00001154 standardMsg = self._truncateMessage(standardMsg, diff)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001155 self.fail(self._formatMessage(msg, standardMsg))
1156
1157 def assertLess(self, a, b, msg=None):
1158 """Just like self.assertTrue(a < b), but with a nicer default message."""
1159 if not a < b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001160 standardMsg = '%s not less than %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001161 self.fail(self._formatMessage(msg, standardMsg))
1162
1163 def assertLessEqual(self, a, b, msg=None):
1164 """Just like self.assertTrue(a <= b), but with a nicer default message."""
1165 if not a <= b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001166 standardMsg = '%s not less than or equal to %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001167 self.fail(self._formatMessage(msg, standardMsg))
1168
1169 def assertGreater(self, a, b, msg=None):
1170 """Just like self.assertTrue(a > b), but with a nicer default message."""
1171 if not a > b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001172 standardMsg = '%s not greater than %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001173 self.fail(self._formatMessage(msg, standardMsg))
1174
1175 def assertGreaterEqual(self, a, b, msg=None):
1176 """Just like self.assertTrue(a >= b), but with a nicer default message."""
1177 if not a >= b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001178 standardMsg = '%s not greater than or equal to %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001179 self.fail(self._formatMessage(msg, standardMsg))
1180
1181 def assertIsNone(self, obj, msg=None):
1182 """Same as self.assertTrue(obj is None), with a nicer default message."""
1183 if obj is not None:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001184 standardMsg = '%s is not None' % (safe_repr(obj),)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001185 self.fail(self._formatMessage(msg, standardMsg))
1186
1187 def assertIsNotNone(self, obj, msg=None):
1188 """Included for symmetry with assertIsNone."""
1189 if obj is None:
1190 standardMsg = 'unexpectedly None'
1191 self.fail(self._formatMessage(msg, standardMsg))
1192
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001193 def assertIsInstance(self, obj, cls, msg=None):
1194 """Same as self.assertTrue(isinstance(obj, cls)), with a nicer
1195 default message."""
1196 if not isinstance(obj, cls):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001197 standardMsg = '%s is not an instance of %r' % (safe_repr(obj), cls)
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001198 self.fail(self._formatMessage(msg, standardMsg))
1199
1200 def assertNotIsInstance(self, obj, cls, msg=None):
1201 """Included for symmetry with assertIsInstance."""
1202 if isinstance(obj, cls):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001203 standardMsg = '%s is an instance of %r' % (safe_repr(obj), cls)
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001204 self.fail(self._formatMessage(msg, standardMsg))
1205
Ezio Melottied3a7d22010-12-01 02:32:32 +00001206 def assertRaisesRegex(self, expected_exception, expected_regex,
1207 callable_obj=None, *args, **kwargs):
1208 """Asserts that the message in a raised exception matches a regex.
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001209
1210 Args:
1211 expected_exception: Exception class expected to be raised.
Ezio Melottied3a7d22010-12-01 02:32:32 +00001212 expected_regex: Regex (re pattern object or string) expected
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001213 to be found in error message.
1214 callable_obj: Function to be called.
Ezio Melottib4dc2502011-05-06 15:01:41 +03001215 msg: Optional message used in case of failure. Can only be used
1216 when assertRaisesRegex is used as a context manager.
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001217 args: Extra args.
1218 kwargs: Extra kwargs.
1219 """
1220 context = _AssertRaisesContext(expected_exception, self, callable_obj,
Ezio Melottied3a7d22010-12-01 02:32:32 +00001221 expected_regex)
Ezio Melottib4dc2502011-05-06 15:01:41 +03001222
1223 return context.handle('assertRaisesRegex', callable_obj, args, kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001224
Ezio Melottied3a7d22010-12-01 02:32:32 +00001225 def assertWarnsRegex(self, expected_warning, expected_regex,
1226 callable_obj=None, *args, **kwargs):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001227 """Asserts that the message in a triggered warning matches a regexp.
1228 Basic functioning is similar to assertWarns() with the addition
1229 that only warnings whose messages also match the regular expression
1230 are considered successful matches.
1231
1232 Args:
1233 expected_warning: Warning class expected to be triggered.
Ezio Melottied3a7d22010-12-01 02:32:32 +00001234 expected_regex: Regex (re pattern object or string) expected
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001235 to be found in error message.
1236 callable_obj: Function to be called.
Ezio Melottib4dc2502011-05-06 15:01:41 +03001237 msg: Optional message used in case of failure. Can only be used
1238 when assertWarnsRegex is used as a context manager.
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001239 args: Extra args.
1240 kwargs: Extra kwargs.
1241 """
1242 context = _AssertWarnsContext(expected_warning, self, callable_obj,
Ezio Melottied3a7d22010-12-01 02:32:32 +00001243 expected_regex)
Ezio Melottib4dc2502011-05-06 15:01:41 +03001244 return context.handle('assertWarnsRegex', callable_obj, args, kwargs)
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001245
Ezio Melottied3a7d22010-12-01 02:32:32 +00001246 def assertRegex(self, text, expected_regex, msg=None):
Michael Foorde3ef5f12010-05-08 16:46:14 +00001247 """Fail the test unless the text matches the regular expression."""
Ezio Melottied3a7d22010-12-01 02:32:32 +00001248 if isinstance(expected_regex, (str, bytes)):
Gregory P. Smithed16bf42010-12-16 19:23:05 +00001249 assert expected_regex, "expected_regex must not be empty."
Ezio Melottied3a7d22010-12-01 02:32:32 +00001250 expected_regex = re.compile(expected_regex)
1251 if not expected_regex.search(text):
1252 msg = msg or "Regex didn't match"
1253 msg = '%s: %r not found in %r' % (msg, expected_regex.pattern, text)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001254 raise self.failureException(msg)
1255
Ezio Melotti8f776302010-12-10 02:32:05 +00001256 def assertNotRegex(self, text, unexpected_regex, msg=None):
Michael Foorde3ef5f12010-05-08 16:46:14 +00001257 """Fail the test if the text matches the regular expression."""
Ezio Melottied3a7d22010-12-01 02:32:32 +00001258 if isinstance(unexpected_regex, (str, bytes)):
1259 unexpected_regex = re.compile(unexpected_regex)
1260 match = unexpected_regex.search(text)
Benjamin Petersonb48af542010-04-11 20:43:16 +00001261 if match:
Ezio Melottied3a7d22010-12-01 02:32:32 +00001262 msg = msg or "Regex matched"
Benjamin Petersonb48af542010-04-11 20:43:16 +00001263 msg = '%s: %r matches %r in %r' % (msg,
1264 text[match.start():match.end()],
Ezio Melottied3a7d22010-12-01 02:32:32 +00001265 unexpected_regex.pattern,
Benjamin Petersonb48af542010-04-11 20:43:16 +00001266 text)
1267 raise self.failureException(msg)
1268
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001269
Ezio Melottied3a7d22010-12-01 02:32:32 +00001270 def _deprecate(original_func):
1271 def deprecated_func(*args, **kwargs):
1272 warnings.warn(
1273 'Please use {0} instead.'.format(original_func.__name__),
1274 DeprecationWarning, 2)
1275 return original_func(*args, **kwargs)
1276 return deprecated_func
1277
Ezio Melotti361467e2011-04-03 17:37:58 +03001278 # see #9424
Ezio Melotti0f535012011-04-03 18:02:13 +03001279 failUnlessEqual = assertEquals = _deprecate(assertEqual)
1280 failIfEqual = assertNotEquals = _deprecate(assertNotEqual)
1281 failUnlessAlmostEqual = assertAlmostEquals = _deprecate(assertAlmostEqual)
1282 failIfAlmostEqual = assertNotAlmostEquals = _deprecate(assertNotAlmostEqual)
1283 failUnless = assert_ = _deprecate(assertTrue)
1284 failUnlessRaises = _deprecate(assertRaises)
1285 failIf = _deprecate(assertFalse)
Ezio Melottied3a7d22010-12-01 02:32:32 +00001286 assertRaisesRegexp = _deprecate(assertRaisesRegex)
1287 assertRegexpMatches = _deprecate(assertRegex)
1288
1289
1290
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001291class FunctionTestCase(TestCase):
1292 """A test case that wraps a test function.
1293
1294 This is useful for slipping pre-existing test functions into the
1295 unittest framework. Optionally, set-up and tidy-up functions can be
1296 supplied. As with TestCase, the tidy-up ('tearDown') function will
1297 always be called if the set-up ('setUp') function ran successfully.
1298 """
1299
1300 def __init__(self, testFunc, setUp=None, tearDown=None, description=None):
1301 super(FunctionTestCase, self).__init__()
1302 self._setUpFunc = setUp
1303 self._tearDownFunc = tearDown
1304 self._testFunc = testFunc
1305 self._description = description
1306
1307 def setUp(self):
1308 if self._setUpFunc is not None:
1309 self._setUpFunc()
1310
1311 def tearDown(self):
1312 if self._tearDownFunc is not None:
1313 self._tearDownFunc()
1314
1315 def runTest(self):
1316 self._testFunc()
1317
1318 def id(self):
1319 return self._testFunc.__name__
1320
1321 def __eq__(self, other):
1322 if not isinstance(other, self.__class__):
1323 return NotImplemented
1324
1325 return self._setUpFunc == other._setUpFunc and \
1326 self._tearDownFunc == other._tearDownFunc and \
1327 self._testFunc == other._testFunc and \
1328 self._description == other._description
1329
1330 def __ne__(self, other):
1331 return not self == other
1332
1333 def __hash__(self):
1334 return hash((type(self), self._setUpFunc, self._tearDownFunc,
1335 self._testFunc, self._description))
1336
1337 def __str__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001338 return "%s (%s)" % (strclass(self.__class__),
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001339 self._testFunc.__name__)
1340
1341 def __repr__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001342 return "<%s tec=%s>" % (strclass(self.__class__),
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001343 self._testFunc)
1344
1345 def shortDescription(self):
1346 if self._description is not None:
1347 return self._description
1348 doc = self._testFunc.__doc__
1349 return doc and doc.split("\n")[0].strip() or None
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001350
1351
1352class _SubTest(TestCase):
1353
1354 def __init__(self, test_case, message, params):
1355 super().__init__()
1356 self._message = message
1357 self.test_case = test_case
1358 self.params = params
1359 self.failureException = test_case.failureException
1360
1361 def runTest(self):
1362 raise NotImplementedError("subtests cannot be run directly")
1363
1364 def _subDescription(self):
1365 parts = []
1366 if self._message:
1367 parts.append("[{}]".format(self._message))
1368 if self.params:
1369 params_desc = ', '.join(
1370 "{}={!r}".format(k, v)
1371 for (k, v) in sorted(self.params.items()))
1372 parts.append("({})".format(params_desc))
1373 return " ".join(parts) or '(<subtest>)'
1374
1375 def id(self):
1376 return "{} {}".format(self.test_case.id(), self._subDescription())
1377
1378 def shortDescription(self):
1379 """Returns a one-line description of the subtest, or None if no
1380 description has been provided.
1381 """
1382 return self.test_case.shortDescription()
1383
1384 def __str__(self):
1385 return "{} {}".format(self.test_case, self._subDescription())