blob: bac9789c943fa73815523eb05db790a988fdc9ff [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
Naitree Zhud5fd75c2019-09-09 22:06:48 +080013import types
Benjamin Petersonbed7d042009-07-19 21:01:52 +000014
Benjamin Peterson847a4112010-03-14 15:04:17 +000015from . import result
Florent Xiclunac53ae582011-11-04 08:25:54 +010016from .util import (strclass, safe_repr, _count_diff_all_purpose,
Serhiy Storchaka77622f52013-09-23 23:07:00 +030017 _count_diff_hashable, _common_shorten_repr)
Benjamin Petersonbed7d042009-07-19 21:01:52 +000018
Benjamin Petersondccc1fc2010-03-22 00:15:53 +000019__unittest = True
Benjamin Petersonbed7d042009-07-19 21:01:52 +000020
Berker Peksag16ea19f2016-09-21 19:34:15 +030021_subtest_msg_sentinel = object()
Michael Foord9dad32e2010-06-05 13:49:56 +000022
23DIFF_OMITTED = ('\nDiff is %s characters long. '
24 'Set self.maxDiff to None to see it.')
25
Benjamin Petersonbed7d042009-07-19 21:01:52 +000026class SkipTest(Exception):
27 """
28 Raise this exception in a test to skip it.
29
Ezio Melotti265281a2013-03-27 20:11:55 +020030 Usually you can use TestCase.skipTest() or one of the skipping decorators
Benjamin Petersonbed7d042009-07-19 21:01:52 +000031 instead of raising this directly.
32 """
Benjamin Petersonbed7d042009-07-19 21:01:52 +000033
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010034class _ShouldStop(Exception):
Benjamin Petersonbed7d042009-07-19 21:01:52 +000035 """
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010036 The test should stop.
Benjamin Petersonbed7d042009-07-19 21:01:52 +000037 """
38
Benjamin Petersonbed7d042009-07-19 21:01:52 +000039class _UnexpectedSuccess(Exception):
40 """
41 The test was supposed to fail, but it didn't!
42 """
Michael Foordb3468f72010-12-19 03:19:47 +000043
44
45class _Outcome(object):
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010046 def __init__(self, result=None):
47 self.expecting_failure = False
48 self.result = result
49 self.result_supports_subtests = hasattr(result, "addSubTest")
Michael Foordb3468f72010-12-19 03:19:47 +000050 self.success = True
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010051 self.skipped = []
Michael Foordb3468f72010-12-19 03:19:47 +000052 self.expectedFailure = None
53 self.errors = []
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010054
55 @contextlib.contextmanager
56 def testPartExecutor(self, test_case, isTest=False):
57 old_success = self.success
58 self.success = True
59 try:
60 yield
61 except KeyboardInterrupt:
62 raise
63 except SkipTest as e:
64 self.success = False
65 self.skipped.append((test_case, str(e)))
66 except _ShouldStop:
67 pass
68 except:
69 exc_info = sys.exc_info()
70 if self.expecting_failure:
71 self.expectedFailure = exc_info
72 else:
73 self.success = False
74 self.errors.append((test_case, exc_info))
Victor Stinner031bd532013-12-09 01:52:50 +010075 # explicitly break a reference cycle:
76 # exc_info -> frame -> exc_info
77 exc_info = None
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010078 else:
79 if self.result_supports_subtests and self.success:
80 self.errors.append((test_case, None))
81 finally:
82 self.success = self.success and old_success
Michael Foordb3468f72010-12-19 03:19:47 +000083
Benjamin Petersonbed7d042009-07-19 21:01:52 +000084
85def _id(obj):
86 return obj
87
Lisa Roach0f221d02018-11-08 18:34:33 -080088
89_module_cleanups = []
Serhiy Storchaka2085bd02019-06-01 11:00:15 +030090def addModuleCleanup(function, /, *args, **kwargs):
Lisa Roach0f221d02018-11-08 18:34:33 -080091 """Same as addCleanup, except the cleanup items are called even if
92 setUpModule fails (unlike tearDownModule)."""
93 _module_cleanups.append((function, args, kwargs))
94
95
96def doModuleCleanups():
97 """Execute all module cleanup functions. Normally called for you after
98 tearDownModule."""
99 exceptions = []
100 while _module_cleanups:
101 function, args, kwargs = _module_cleanups.pop()
102 try:
103 function(*args, **kwargs)
104 except Exception as exc:
105 exceptions.append(exc)
106 if exceptions:
107 # Swallows all but first exception. If a multi-exception handler
108 # gets written we should use that here instead.
109 raise exceptions[0]
110
111
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000112def skip(reason):
113 """
114 Unconditionally skip a test.
115 """
116 def decorator(test_item):
Antoine Pitroub05ac862012-04-25 14:56:46 +0200117 if not isinstance(test_item, type):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000118 @functools.wraps(test_item)
119 def skip_wrapper(*args, **kwargs):
120 raise SkipTest(reason)
121 test_item = skip_wrapper
122
123 test_item.__unittest_skip__ = True
124 test_item.__unittest_skip_why__ = reason
125 return test_item
Naitree Zhud5fd75c2019-09-09 22:06:48 +0800126 if isinstance(reason, types.FunctionType):
127 test_item = reason
128 reason = ''
129 return decorator(test_item)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000130 return decorator
131
132def skipIf(condition, reason):
133 """
134 Skip a test if the condition is true.
135 """
136 if condition:
137 return skip(reason)
138 return _id
139
140def skipUnless(condition, reason):
141 """
142 Skip a test unless the condition is true.
143 """
144 if not condition:
145 return skip(reason)
146 return _id
147
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100148def expectedFailure(test_item):
149 test_item.__unittest_expecting_failure__ = True
150 return test_item
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000151
Serhiy Storchaka041dd8e2015-05-21 20:15:40 +0300152def _is_subtype(expected, basetype):
153 if isinstance(expected, tuple):
154 return all(_is_subtype(e, basetype) for e in expected)
155 return isinstance(expected, type) and issubclass(expected, basetype)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000156
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200157class _BaseTestCaseContext:
158
159 def __init__(self, test_case):
160 self.test_case = test_case
161
162 def _raiseFailure(self, standardMsg):
163 msg = self.test_case._formatMessage(self.msg, standardMsg)
164 raise self.test_case.failureException(msg)
165
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200166class _AssertRaisesBaseContext(_BaseTestCaseContext):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000167
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300168 def __init__(self, expected, test_case, expected_regex=None):
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200169 _BaseTestCaseContext.__init__(self, test_case)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000170 self.expected = expected
Ezio Melottib4dc2502011-05-06 15:01:41 +0300171 self.test_case = test_case
R David Murrayef1c2672014-03-25 15:31:50 -0400172 if expected_regex is not None:
Ezio Melottied3a7d22010-12-01 02:32:32 +0000173 expected_regex = re.compile(expected_regex)
174 self.expected_regex = expected_regex
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300175 self.obj_name = None
Ezio Melottib4dc2502011-05-06 15:01:41 +0300176 self.msg = None
177
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300178 def handle(self, name, args, kwargs):
Ezio Melottib4dc2502011-05-06 15:01:41 +0300179 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300180 If args is empty, assertRaises/Warns is being used as a
Ezio Melottib4dc2502011-05-06 15:01:41 +0300181 context manager, so check for a 'msg' kwarg and return self.
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300182 If args is not empty, call a callable passing positional and keyword
183 arguments.
Ezio Melottib4dc2502011-05-06 15:01:41 +0300184 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300185 try:
Victor Stinnerbbd3cf82017-03-28 00:56:28 +0200186 if not _is_subtype(self.expected, self._base_type):
187 raise TypeError('%s() arg 1 must be %s' %
188 (name, self._base_type_str))
Victor Stinnerbbd3cf82017-03-28 00:56:28 +0200189 if not args:
190 self.msg = kwargs.pop('msg', None)
191 if kwargs:
Serhiy Storchaka77d57812018-08-19 10:00:11 +0300192 raise TypeError('%r is an invalid keyword argument for '
193 'this function' % (next(iter(kwargs)),))
Victor Stinnerbbd3cf82017-03-28 00:56:28 +0200194 return self
195
196 callable_obj, *args = args
197 try:
198 self.obj_name = callable_obj.__name__
199 except AttributeError:
200 self.obj_name = str(callable_obj)
201 with self:
202 callable_obj(*args, **kwargs)
203 finally:
204 # bpo-23890: manually break a reference cycle
205 self = None
Ezio Melottib4dc2502011-05-06 15:01:41 +0300206
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000207
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000208class _AssertRaisesContext(_AssertRaisesBaseContext):
209 """A context manager used to implement TestCase.assertRaises* methods."""
210
Serhiy Storchaka041dd8e2015-05-21 20:15:40 +0300211 _base_type = BaseException
212 _base_type_str = 'an exception type or tuple of exception types'
213
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000214 def __enter__(self):
Ezio Melotti49008232010-02-08 21:57:48 +0000215 return self
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000216
217 def __exit__(self, exc_type, exc_value, tb):
218 if exc_type is None:
219 try:
220 exc_name = self.expected.__name__
221 except AttributeError:
222 exc_name = str(self.expected)
223 if self.obj_name:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300224 self._raiseFailure("{} not raised by {}".format(exc_name,
225 self.obj_name))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000226 else:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300227 self._raiseFailure("{} not raised".format(exc_name))
Antoine Pitrou96810222014-04-29 01:23:50 +0200228 else:
229 traceback.clear_frames(tb)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000230 if not issubclass(exc_type, self.expected):
231 # let unexpected exceptions pass through
232 return False
Ezio Melotti49008232010-02-08 21:57:48 +0000233 # store exception, without traceback, for later retrieval
234 self.exception = exc_value.with_traceback(None)
Ezio Melottied3a7d22010-12-01 02:32:32 +0000235 if self.expected_regex is None:
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000236 return True
237
Ezio Melottied3a7d22010-12-01 02:32:32 +0000238 expected_regex = self.expected_regex
239 if not expected_regex.search(str(exc_value)):
Ezio Melottib4dc2502011-05-06 15:01:41 +0300240 self._raiseFailure('"{}" does not match "{}"'.format(
241 expected_regex.pattern, str(exc_value)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000242 return True
243
244
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000245class _AssertWarnsContext(_AssertRaisesBaseContext):
246 """A context manager used to implement TestCase.assertWarns* methods."""
247
Serhiy Storchaka041dd8e2015-05-21 20:15:40 +0300248 _base_type = Warning
249 _base_type_str = 'a warning type or tuple of warning types'
250
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000251 def __enter__(self):
252 # The __warningregistry__'s need to be in a pristine state for tests
253 # to work properly.
254 for v in sys.modules.values():
255 if getattr(v, '__warningregistry__', None):
256 v.__warningregistry__ = {}
257 self.warnings_manager = warnings.catch_warnings(record=True)
258 self.warnings = self.warnings_manager.__enter__()
259 warnings.simplefilter("always", self.expected)
260 return self
261
262 def __exit__(self, exc_type, exc_value, tb):
263 self.warnings_manager.__exit__(exc_type, exc_value, tb)
264 if exc_type is not None:
265 # let unexpected exceptions pass through
266 return
267 try:
268 exc_name = self.expected.__name__
269 except AttributeError:
270 exc_name = str(self.expected)
271 first_matching = None
272 for m in self.warnings:
273 w = m.message
274 if not isinstance(w, self.expected):
275 continue
276 if first_matching is None:
277 first_matching = w
Ezio Melottied3a7d22010-12-01 02:32:32 +0000278 if (self.expected_regex is not None and
279 not self.expected_regex.search(str(w))):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000280 continue
281 # store warning for later retrieval
282 self.warning = w
283 self.filename = m.filename
284 self.lineno = m.lineno
285 return
286 # Now we simply try to choose a helpful failure message
287 if first_matching is not None:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300288 self._raiseFailure('"{}" does not match "{}"'.format(
289 self.expected_regex.pattern, str(first_matching)))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000290 if self.obj_name:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300291 self._raiseFailure("{} not triggered by {}".format(exc_name,
292 self.obj_name))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000293 else:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300294 self._raiseFailure("{} not triggered".format(exc_name))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000295
296
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200297
298_LoggingWatcher = collections.namedtuple("_LoggingWatcher",
299 ["records", "output"])
300
301
302class _CapturingHandler(logging.Handler):
303 """
304 A logging handler capturing all (raw and formatted) logging output.
305 """
306
307 def __init__(self):
308 logging.Handler.__init__(self)
309 self.watcher = _LoggingWatcher([], [])
310
311 def flush(self):
312 pass
313
314 def emit(self, record):
315 self.watcher.records.append(record)
316 msg = self.format(record)
317 self.watcher.output.append(msg)
318
319
320
321class _AssertLogsContext(_BaseTestCaseContext):
322 """A context manager used to implement TestCase.assertLogs()."""
323
324 LOGGING_FORMAT = "%(levelname)s:%(name)s:%(message)s"
325
326 def __init__(self, test_case, logger_name, level):
327 _BaseTestCaseContext.__init__(self, test_case)
328 self.logger_name = logger_name
329 if level:
330 self.level = logging._nameToLevel.get(level, level)
331 else:
332 self.level = logging.INFO
333 self.msg = None
334
335 def __enter__(self):
336 if isinstance(self.logger_name, logging.Logger):
337 logger = self.logger = self.logger_name
338 else:
339 logger = self.logger = logging.getLogger(self.logger_name)
340 formatter = logging.Formatter(self.LOGGING_FORMAT)
341 handler = _CapturingHandler()
342 handler.setFormatter(formatter)
343 self.watcher = handler.watcher
344 self.old_handlers = logger.handlers[:]
345 self.old_level = logger.level
346 self.old_propagate = logger.propagate
347 logger.handlers = [handler]
348 logger.setLevel(self.level)
349 logger.propagate = False
350 return handler.watcher
351
352 def __exit__(self, exc_type, exc_value, tb):
353 self.logger.handlers = self.old_handlers
354 self.logger.propagate = self.old_propagate
355 self.logger.setLevel(self.old_level)
356 if exc_type is not None:
357 # let unexpected exceptions pass through
358 return False
359 if len(self.watcher.records) == 0:
360 self._raiseFailure(
361 "no logs of level {} or higher triggered on {}"
362 .format(logging.getLevelName(self.level), self.logger.name))
363
364
Serhiy Storchaka48fbe522017-06-23 21:47:39 +0300365class _OrderedChainMap(collections.ChainMap):
366 def __iter__(self):
367 seen = set()
368 for mapping in self.maps:
369 for k in mapping:
370 if k not in seen:
371 seen.add(k)
372 yield k
373
374
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000375class TestCase(object):
376 """A class whose instances are single test cases.
377
378 By default, the test code itself should be placed in a method named
379 'runTest'.
380
381 If the fixture may be used for many test cases, create as
382 many test methods as are needed. When instantiating such a TestCase
383 subclass, specify in the constructor arguments the name of the test method
384 that the instance is to execute.
385
386 Test authors should subclass TestCase for their own tests. Construction
387 and deconstruction of the test's environment ('fixture') can be
388 implemented by overriding the 'setUp' and 'tearDown' methods respectively.
389
390 If it is necessary to override the __init__ method, the base class
391 __init__ method must always be called. It is important that subclasses
392 should not change the signature of their __init__ method, since instances
393 of the classes are instantiated automatically by parts of the framework
394 in order to be run.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000395
Ezio Melotti31797e52013-03-29 03:42:29 +0200396 When subclassing TestCase, you can set these attributes:
397 * failureException: determines which exception will be raised when
398 the instance's assertion methods fail; test methods raising this
399 exception will be deemed to have 'failed' rather than 'errored'.
400 * longMessage: determines whether long messages (including repr of
401 objects used in assert methods) will be printed on failure in *addition*
402 to any explicit message passed.
403 * maxDiff: sets the maximum length of a diff in failure messages
404 by assert methods using difflib. It is looked up as an instance
405 attribute so can be configured by individual tests if required.
406 """
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000407
408 failureException = AssertionError
409
Michael Foord5074df62010-12-03 00:53:09 +0000410 longMessage = True
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000411
Michael Foord085dfd32010-06-05 12:17:02 +0000412 maxDiff = 80*8
413
Ezio Melottiedd117f2011-04-27 10:20:38 +0300414 # If a string is longer than _diffThreshold, use normal comparison instead
415 # of difflib. See #11763.
416 _diffThreshold = 2**16
417
Benjamin Peterson847a4112010-03-14 15:04:17 +0000418 # Attribute used by TestSuite for classSetUp
419
420 _classSetupFailed = False
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000421
Lisa Roach0f221d02018-11-08 18:34:33 -0800422 _class_cleanups = []
423
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000424 def __init__(self, methodName='runTest'):
425 """Create an instance of the class that will use the named test
426 method when executed. Raises a ValueError if the instance does
427 not have a method with the specified name.
428 """
429 self._testMethodName = methodName
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100430 self._outcome = None
Michael Foord32e1d832011-01-03 17:00:11 +0000431 self._testMethodDoc = 'No test'
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000432 try:
433 testMethod = getattr(self, methodName)
434 except AttributeError:
Michael Foord32e1d832011-01-03 17:00:11 +0000435 if methodName != 'runTest':
436 # we allow instantiation with no explicit method name
437 # but not an *incorrect* or missing method name
438 raise ValueError("no such test method in %s: %s" %
439 (self.__class__, methodName))
440 else:
441 self._testMethodDoc = testMethod.__doc__
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000442 self._cleanups = []
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100443 self._subtest = None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000444
445 # Map types to custom assertEqual functions that will compare
446 # instances of said type in more detail to generate a more useful
447 # error message.
Benjamin Peterson34b2b262011-07-12 19:21:42 -0500448 self._type_equality_funcs = {}
Michael Foord8ca6d982010-11-20 15:34:26 +0000449 self.addTypeEqualityFunc(dict, 'assertDictEqual')
450 self.addTypeEqualityFunc(list, 'assertListEqual')
451 self.addTypeEqualityFunc(tuple, 'assertTupleEqual')
452 self.addTypeEqualityFunc(set, 'assertSetEqual')
453 self.addTypeEqualityFunc(frozenset, 'assertSetEqual')
454 self.addTypeEqualityFunc(str, 'assertMultiLineEqual')
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000455
456 def addTypeEqualityFunc(self, typeobj, function):
457 """Add a type specific assertEqual style function to compare a type.
458
459 This method is for use by TestCase subclasses that need to register
460 their own type equality functions to provide nicer error messages.
461
462 Args:
463 typeobj: The data type to call this function on when both values
464 are of the same type in assertEqual().
465 function: The callable taking two arguments and an optional
466 msg= argument that raises self.failureException with a
467 useful error message when the two arguments are not equal.
468 """
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000469 self._type_equality_funcs[typeobj] = function
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000470
Serhiy Storchaka142566c2019-06-05 18:22:31 +0300471 def addCleanup(self, function, /, *args, **kwargs):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000472 """Add a function, with arguments, to be called when the test is
473 completed. Functions added are called on a LIFO basis and are
474 called after tearDown on test failure or success.
475
476 Cleanup items are called even if setUp fails (unlike tearDown)."""
477 self._cleanups.append((function, args, kwargs))
478
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300479 @classmethod
480 def addClassCleanup(cls, function, /, *args, **kwargs):
Lisa Roach0f221d02018-11-08 18:34:33 -0800481 """Same as addCleanup, except the cleanup items are called even if
482 setUpClass fails (unlike tearDownClass)."""
483 cls._class_cleanups.append((function, args, kwargs))
484
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000485 def setUp(self):
486 "Hook method for setting up the test fixture before exercising it."
487 pass
488
489 def tearDown(self):
490 "Hook method for deconstructing the test fixture after testing it."
491 pass
492
Benjamin Peterson847a4112010-03-14 15:04:17 +0000493 @classmethod
494 def setUpClass(cls):
495 "Hook method for setting up class fixture before running tests in the class."
496
497 @classmethod
498 def tearDownClass(cls):
499 "Hook method for deconstructing the class fixture after running all tests in the class."
500
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000501 def countTestCases(self):
502 return 1
503
504 def defaultTestResult(self):
505 return result.TestResult()
506
507 def shortDescription(self):
Michael Foord34c94622010-02-10 15:51:42 +0000508 """Returns a one-line description of the test, or None if no
509 description has been provided.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000510
Michael Foord34c94622010-02-10 15:51:42 +0000511 The default implementation of this method returns the first line of
512 the specified test method's docstring.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000513 """
Michael Foord34c94622010-02-10 15:51:42 +0000514 doc = self._testMethodDoc
515 return doc and doc.split("\n")[0].strip() or None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000516
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000517
518 def id(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000519 return "%s.%s" % (strclass(self.__class__), self._testMethodName)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000520
521 def __eq__(self, other):
522 if type(self) is not type(other):
523 return NotImplemented
524
525 return self._testMethodName == other._testMethodName
526
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000527 def __hash__(self):
528 return hash((type(self), self._testMethodName))
529
530 def __str__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000531 return "%s (%s)" % (self._testMethodName, strclass(self.__class__))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000532
533 def __repr__(self):
534 return "<%s testMethod=%s>" % \
Benjamin Peterson847a4112010-03-14 15:04:17 +0000535 (strclass(self.__class__), self._testMethodName)
536
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100537 def _addSkip(self, result, test_case, reason):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000538 addSkip = getattr(result, 'addSkip', None)
539 if addSkip is not None:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100540 addSkip(test_case, reason)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000541 else:
542 warnings.warn("TestResult has no addSkip method, skips not reported",
543 RuntimeWarning, 2)
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100544 result.addSuccess(test_case)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000545
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100546 @contextlib.contextmanager
Berker Peksag16ea19f2016-09-21 19:34:15 +0300547 def subTest(self, msg=_subtest_msg_sentinel, **params):
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100548 """Return a context manager that will return the enclosed block
549 of code in a subtest identified by the optional message and
550 keyword parameters. A failure in the subtest marks the test
551 case as failed but resumes execution at the end of the enclosed
552 block, allowing further test code to be executed.
553 """
Bruno Oliveirada2bf9f2018-10-12 07:35:55 -0300554 if self._outcome is None or not self._outcome.result_supports_subtests:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100555 yield
556 return
557 parent = self._subtest
558 if parent is None:
Serhiy Storchaka48fbe522017-06-23 21:47:39 +0300559 params_map = _OrderedChainMap(params)
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100560 else:
561 params_map = parent.params.new_child(params)
562 self._subtest = _SubTest(self, msg, params_map)
Michael Foordb3468f72010-12-19 03:19:47 +0000563 try:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100564 with self._outcome.testPartExecutor(self._subtest, isTest=True):
565 yield
566 if not self._outcome.success:
567 result = self._outcome.result
568 if result is not None and result.failfast:
569 raise _ShouldStop
570 elif self._outcome.expectedFailure:
571 # If the test is expecting a failure, we really want to
572 # stop now and register the expected failure.
573 raise _ShouldStop
574 finally:
575 self._subtest = parent
576
577 def _feedErrorsToResult(self, result, errors):
578 for test, exc_info in errors:
579 if isinstance(test, _SubTest):
580 result.addSubTest(test.test_case, test, exc_info)
581 elif exc_info is not None:
582 if issubclass(exc_info[0], self.failureException):
583 result.addFailure(test, exc_info)
584 else:
585 result.addError(test, exc_info)
586
587 def _addExpectedFailure(self, result, exc_info):
588 try:
589 addExpectedFailure = result.addExpectedFailure
590 except AttributeError:
591 warnings.warn("TestResult has no addExpectedFailure method, reporting as passes",
592 RuntimeWarning)
593 result.addSuccess(self)
594 else:
595 addExpectedFailure(self, exc_info)
596
597 def _addUnexpectedSuccess(self, result):
598 try:
599 addUnexpectedSuccess = result.addUnexpectedSuccess
600 except AttributeError:
601 warnings.warn("TestResult has no addUnexpectedSuccess method, reporting as failure",
602 RuntimeWarning)
603 # We need to pass an actual exception and traceback to addFailure,
604 # otherwise the legacy result can choke.
605 try:
606 raise _UnexpectedSuccess from None
607 except _UnexpectedSuccess:
608 result.addFailure(self, sys.exc_info())
609 else:
610 addUnexpectedSuccess(self)
Michael Foordb3468f72010-12-19 03:19:47 +0000611
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300612 def _callSetUp(self):
613 self.setUp()
614
615 def _callTestMethod(self, method):
616 method()
617
618 def _callTearDown(self):
619 self.tearDown()
620
621 def _callCleanup(self, function, /, *args, **kwargs):
622 function(*args, **kwargs)
623
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000624 def run(self, result=None):
625 orig_result = result
626 if result is None:
627 result = self.defaultTestResult()
628 startTestRun = getattr(result, 'startTestRun', None)
629 if startTestRun is not None:
630 startTestRun()
631
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000632 result.startTest(self)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000633
634 testMethod = getattr(self, self._testMethodName)
635 if (getattr(self.__class__, "__unittest_skip__", False) or
636 getattr(testMethod, "__unittest_skip__", False)):
637 # If the class or method was skipped.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000638 try:
Benjamin Peterson847a4112010-03-14 15:04:17 +0000639 skip_why = (getattr(self.__class__, '__unittest_skip_why__', '')
640 or getattr(testMethod, '__unittest_skip_why__', ''))
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100641 self._addSkip(result, self, skip_why)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000642 finally:
643 result.stopTest(self)
644 return
Robert Collinsed599b72015-08-28 10:34:51 +1200645 expecting_failure_method = getattr(testMethod,
646 "__unittest_expecting_failure__", False)
647 expecting_failure_class = getattr(self,
648 "__unittest_expecting_failure__", False)
649 expecting_failure = expecting_failure_class or expecting_failure_method
Victor Stinner031bd532013-12-09 01:52:50 +0100650 outcome = _Outcome(result)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000651 try:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100652 self._outcome = outcome
Michael Foordb3468f72010-12-19 03:19:47 +0000653
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100654 with outcome.testPartExecutor(self):
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300655 self._callSetUp()
Michael Foordb3468f72010-12-19 03:19:47 +0000656 if outcome.success:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100657 outcome.expecting_failure = expecting_failure
658 with outcome.testPartExecutor(self, isTest=True):
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300659 self._callTestMethod(testMethod)
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100660 outcome.expecting_failure = False
661 with outcome.testPartExecutor(self):
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300662 self._callTearDown()
Michael Foordb3468f72010-12-19 03:19:47 +0000663
664 self.doCleanups()
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100665 for test, reason in outcome.skipped:
666 self._addSkip(result, test, reason)
667 self._feedErrorsToResult(result, outcome.errors)
Michael Foordb3468f72010-12-19 03:19:47 +0000668 if outcome.success:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100669 if expecting_failure:
670 if outcome.expectedFailure:
671 self._addExpectedFailure(result, outcome.expectedFailure)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000672 else:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100673 self._addUnexpectedSuccess(result)
674 else:
675 result.addSuccess(self)
Michael Foord1341bb02011-03-14 19:01:46 -0400676 return result
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000677 finally:
678 result.stopTest(self)
679 if orig_result is None:
680 stopTestRun = getattr(result, 'stopTestRun', None)
681 if stopTestRun is not None:
682 stopTestRun()
683
Victor Stinner031bd532013-12-09 01:52:50 +0100684 # explicitly break reference cycles:
685 # outcome.errors -> frame -> outcome -> outcome.errors
686 # outcome.expectedFailure -> frame -> outcome -> outcome.expectedFailure
687 outcome.errors.clear()
688 outcome.expectedFailure = None
689
690 # clear the outcome, no more needed
691 self._outcome = None
692
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000693 def doCleanups(self):
694 """Execute all cleanup functions. Normally called for you after
695 tearDown."""
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100696 outcome = self._outcome or _Outcome()
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000697 while self._cleanups:
Michael Foordb3468f72010-12-19 03:19:47 +0000698 function, args, kwargs = self._cleanups.pop()
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100699 with outcome.testPartExecutor(self):
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300700 self._callCleanup(function, *args, **kwargs)
Michael Foordb3468f72010-12-19 03:19:47 +0000701
702 # return this for backwards compatibility
Lisa Roach0f221d02018-11-08 18:34:33 -0800703 # even though we no longer use it internally
Michael Foordb3468f72010-12-19 03:19:47 +0000704 return outcome.success
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000705
Lisa Roach0f221d02018-11-08 18:34:33 -0800706 @classmethod
707 def doClassCleanups(cls):
708 """Execute all class cleanup functions. Normally called for you after
709 tearDownClass."""
710 cls.tearDown_exceptions = []
711 while cls._class_cleanups:
712 function, args, kwargs = cls._class_cleanups.pop()
713 try:
714 function(*args, **kwargs)
715 except Exception as exc:
716 cls.tearDown_exceptions.append(sys.exc_info())
717
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000718 def __call__(self, *args, **kwds):
719 return self.run(*args, **kwds)
720
721 def debug(self):
722 """Run the test without collecting errors in a TestResult"""
723 self.setUp()
724 getattr(self, self._testMethodName)()
725 self.tearDown()
Michael Foordb8748742010-06-10 16:16:08 +0000726 while self._cleanups:
727 function, args, kwargs = self._cleanups.pop(-1)
728 function(*args, **kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000729
730 def skipTest(self, reason):
731 """Skip this test."""
732 raise SkipTest(reason)
733
734 def fail(self, msg=None):
735 """Fail immediately, with the given message."""
736 raise self.failureException(msg)
737
738 def assertFalse(self, expr, msg=None):
Ezio Melotti3044fa72010-12-18 17:31:58 +0000739 """Check that the expression is false."""
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000740 if expr:
Ezio Melotti3044fa72010-12-18 17:31:58 +0000741 msg = self._formatMessage(msg, "%s is not false" % safe_repr(expr))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000742 raise self.failureException(msg)
743
744 def assertTrue(self, expr, msg=None):
Ezio Melotti3044fa72010-12-18 17:31:58 +0000745 """Check that the expression is true."""
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000746 if not expr:
Ezio Melotti3044fa72010-12-18 17:31:58 +0000747 msg = self._formatMessage(msg, "%s is not true" % safe_repr(expr))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000748 raise self.failureException(msg)
749
750 def _formatMessage(self, msg, standardMsg):
751 """Honour the longMessage attribute when generating failure messages.
752 If longMessage is False this means:
753 * Use only an explicit message if it is provided
754 * Otherwise use the standard message for the assert
755
756 If longMessage is True:
757 * Use the standard message
758 * If an explicit message is provided, plus ' : ' and the explicit message
759 """
760 if not self.longMessage:
761 return msg or standardMsg
762 if msg is None:
763 return standardMsg
Benjamin Peterson847a4112010-03-14 15:04:17 +0000764 try:
765 # don't switch to '{}' formatting in Python 2.X
766 # it changes the way unicode input is handled
767 return '%s : %s' % (standardMsg, msg)
768 except UnicodeDecodeError:
769 return '%s : %s' % (safe_repr(standardMsg), safe_repr(msg))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000770
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300771 def assertRaises(self, expected_exception, *args, **kwargs):
772 """Fail unless an exception of class expected_exception is raised
773 by the callable when invoked with specified positional and
774 keyword arguments. If a different type of exception is
Andrew Svetlov737fb892012-12-18 21:14:22 +0200775 raised, it will not be caught, and the test case will be
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000776 deemed to have suffered an error, exactly as for an
777 unexpected exception.
778
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300779 If called with the callable and arguments omitted, will return a
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000780 context object used like this::
781
Michael Foord1c42b122010-02-05 22:58:21 +0000782 with self.assertRaises(SomeException):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000783 do_something()
Michael Foord1c42b122010-02-05 22:58:21 +0000784
Ezio Melottib4dc2502011-05-06 15:01:41 +0300785 An optional keyword argument 'msg' can be provided when assertRaises
786 is used as a context object.
787
Michael Foord1c42b122010-02-05 22:58:21 +0000788 The context manager keeps a reference to the exception as
Ezio Melotti49008232010-02-08 21:57:48 +0000789 the 'exception' attribute. This allows you to inspect the
Michael Foord1c42b122010-02-05 22:58:21 +0000790 exception after the assertion::
791
792 with self.assertRaises(SomeException) as cm:
793 do_something()
Ezio Melotti49008232010-02-08 21:57:48 +0000794 the_exception = cm.exception
Michael Foordb57ac6d2010-02-05 23:26:29 +0000795 self.assertEqual(the_exception.error_code, 3)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000796 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300797 context = _AssertRaisesContext(expected_exception, self)
Victor Stinnerbbd3cf82017-03-28 00:56:28 +0200798 try:
799 return context.handle('assertRaises', args, kwargs)
800 finally:
801 # bpo-23890: manually break a reference cycle
802 context = None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000803
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300804 def assertWarns(self, expected_warning, *args, **kwargs):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000805 """Fail unless a warning of class warnClass is triggered
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300806 by the callable when invoked with specified positional and
807 keyword arguments. If a different type of warning is
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000808 triggered, it will not be handled: depending on the other
809 warning filtering rules in effect, it might be silenced, printed
810 out, or raised as an exception.
811
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300812 If called with the callable and arguments omitted, will return a
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000813 context object used like this::
814
815 with self.assertWarns(SomeWarning):
816 do_something()
817
Ezio Melottib4dc2502011-05-06 15:01:41 +0300818 An optional keyword argument 'msg' can be provided when assertWarns
819 is used as a context object.
820
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000821 The context manager keeps a reference to the first matching
822 warning as the 'warning' attribute; similarly, the 'filename'
823 and 'lineno' attributes give you information about the line
824 of Python code from which the warning was triggered.
825 This allows you to inspect the warning after the assertion::
826
827 with self.assertWarns(SomeWarning) as cm:
828 do_something()
829 the_warning = cm.warning
830 self.assertEqual(the_warning.some_attribute, 147)
831 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300832 context = _AssertWarnsContext(expected_warning, self)
833 return context.handle('assertWarns', args, kwargs)
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000834
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200835 def assertLogs(self, logger=None, level=None):
836 """Fail unless a log message of level *level* or higher is emitted
837 on *logger_name* or its children. If omitted, *level* defaults to
838 INFO and *logger* defaults to the root logger.
839
840 This method must be used as a context manager, and will yield
841 a recording object with two attributes: `output` and `records`.
842 At the end of the context manager, the `output` attribute will
843 be a list of the matching formatted log messages and the
844 `records` attribute will be a list of the corresponding LogRecord
845 objects.
846
847 Example::
848
849 with self.assertLogs('foo', level='INFO') as cm:
850 logging.getLogger('foo').info('first message')
851 logging.getLogger('foo.bar').error('second message')
852 self.assertEqual(cm.output, ['INFO:foo:first message',
853 'ERROR:foo.bar:second message'])
854 """
855 return _AssertLogsContext(self, logger, level)
856
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000857 def _getAssertEqualityFunc(self, first, second):
858 """Get a detailed comparison function for the types of the two args.
859
860 Returns: A callable accepting (first, second, msg=None) that will
861 raise a failure exception if first != second with a useful human
862 readable error message for those types.
863 """
864 #
865 # NOTE(gregory.p.smith): I considered isinstance(first, type(second))
866 # and vice versa. I opted for the conservative approach in case
867 # subclasses are not intended to be compared in detail to their super
868 # class instances using a type equality func. This means testing
869 # subtypes won't automagically use the detailed comparison. Callers
870 # should use their type specific assertSpamEqual method to compare
871 # subclasses if the detailed comparison is desired and appropriate.
872 # See the discussion in http://bugs.python.org/issue2578.
873 #
874 if type(first) is type(second):
875 asserter = self._type_equality_funcs.get(type(first))
876 if asserter is not None:
Benjamin Peterson34b2b262011-07-12 19:21:42 -0500877 if isinstance(asserter, str):
878 asserter = getattr(self, asserter)
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000879 return asserter
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000880
881 return self._baseAssertEqual
882
883 def _baseAssertEqual(self, first, second, msg=None):
884 """The default assertEqual implementation, not type specific."""
885 if not first == second:
Serhiy Storchaka77622f52013-09-23 23:07:00 +0300886 standardMsg = '%s != %s' % _common_shorten_repr(first, second)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000887 msg = self._formatMessage(msg, standardMsg)
888 raise self.failureException(msg)
889
890 def assertEqual(self, first, second, msg=None):
891 """Fail if the two objects are unequal as determined by the '=='
892 operator.
893 """
894 assertion_func = self._getAssertEqualityFunc(first, second)
895 assertion_func(first, second, msg=msg)
896
897 def assertNotEqual(self, first, second, msg=None):
Ezio Melotti90eea972012-11-08 11:08:39 +0200898 """Fail if the two objects are equal as determined by the '!='
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000899 operator.
900 """
901 if not first != second:
Benjamin Peterson847a4112010-03-14 15:04:17 +0000902 msg = self._formatMessage(msg, '%s == %s' % (safe_repr(first),
903 safe_repr(second)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000904 raise self.failureException(msg)
905
Michael Foord321d0592010-11-02 13:44:51 +0000906 def assertAlmostEqual(self, first, second, places=None, msg=None,
Benjamin Petersonb48af542010-04-11 20:43:16 +0000907 delta=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000908 """Fail if the two objects are unequal as determined by their
909 difference rounded to the given number of decimal places
Benjamin Petersonb48af542010-04-11 20:43:16 +0000910 (default 7) and comparing to zero, or by comparing that the
Ron032a6482017-10-18 20:01:23 +0300911 difference between the two objects is more than the given
912 delta.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000913
914 Note that decimal places (from zero) are usually not the same
Martin Pantereb995702016-07-28 01:11:04 +0000915 as significant digits (measured from the most significant digit).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000916
917 If the two objects compare equal then they will automatically
918 compare almost equal.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000919 """
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000920 if first == second:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000921 # shortcut
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000922 return
Benjamin Petersonb48af542010-04-11 20:43:16 +0000923 if delta is not None and places is not None:
924 raise TypeError("specify delta or places not both")
925
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200926 diff = abs(first - second)
Benjamin Petersonb48af542010-04-11 20:43:16 +0000927 if delta is not None:
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200928 if diff <= delta:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000929 return
930
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200931 standardMsg = '%s != %s within %s delta (%s difference)' % (
932 safe_repr(first),
933 safe_repr(second),
934 safe_repr(delta),
935 safe_repr(diff))
Benjamin Petersonb48af542010-04-11 20:43:16 +0000936 else:
937 if places is None:
938 places = 7
939
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200940 if round(diff, places) == 0:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000941 return
942
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200943 standardMsg = '%s != %s within %r places (%s difference)' % (
944 safe_repr(first),
945 safe_repr(second),
946 places,
947 safe_repr(diff))
Benjamin Petersonb48af542010-04-11 20:43:16 +0000948 msg = self._formatMessage(msg, standardMsg)
949 raise self.failureException(msg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000950
Michael Foord321d0592010-11-02 13:44:51 +0000951 def assertNotAlmostEqual(self, first, second, places=None, msg=None,
Benjamin Petersonb48af542010-04-11 20:43:16 +0000952 delta=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000953 """Fail if the two objects are equal as determined by their
954 difference rounded to the given number of decimal places
Benjamin Petersonb48af542010-04-11 20:43:16 +0000955 (default 7) and comparing to zero, or by comparing that the
Ron032a6482017-10-18 20:01:23 +0300956 difference between the two objects is less than the given delta.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000957
958 Note that decimal places (from zero) are usually not the same
Martin Pantereb995702016-07-28 01:11:04 +0000959 as significant digits (measured from the most significant digit).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000960
961 Objects that are equal automatically fail.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000962 """
Benjamin Petersonb48af542010-04-11 20:43:16 +0000963 if delta is not None and places is not None:
964 raise TypeError("specify delta or places not both")
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200965 diff = abs(first - second)
Benjamin Petersonb48af542010-04-11 20:43:16 +0000966 if delta is not None:
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200967 if not (first == second) and diff > delta:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000968 return
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200969 standardMsg = '%s == %s within %s delta (%s difference)' % (
970 safe_repr(first),
971 safe_repr(second),
972 safe_repr(delta),
973 safe_repr(diff))
Benjamin Petersonb48af542010-04-11 20:43:16 +0000974 else:
975 if places is None:
976 places = 7
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200977 if not (first == second) and round(diff, places) != 0:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000978 return
Benjamin Peterson847a4112010-03-14 15:04:17 +0000979 standardMsg = '%s == %s within %r places' % (safe_repr(first),
Benjamin Petersonb48af542010-04-11 20:43:16 +0000980 safe_repr(second),
981 places)
982
983 msg = self._formatMessage(msg, standardMsg)
984 raise self.failureException(msg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000985
Michael Foord085dfd32010-06-05 12:17:02 +0000986 def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000987 """An equality assertion for ordered sequences (like lists and tuples).
988
R. David Murrayad13f222010-01-29 22:17:58 +0000989 For the purposes of this function, a valid ordered sequence type is one
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000990 which can be indexed, has a length, and has an equality operator.
991
992 Args:
993 seq1: The first sequence to compare.
994 seq2: The second sequence to compare.
995 seq_type: The expected datatype of the sequences, or None if no
996 datatype should be enforced.
997 msg: Optional message to use on failure instead of a list of
998 differences.
999 """
Benjamin Petersonb29614e2012-10-09 11:16:03 -04001000 if seq_type is not None:
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001001 seq_type_name = seq_type.__name__
1002 if not isinstance(seq1, seq_type):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001003 raise self.failureException('First sequence is not a %s: %s'
1004 % (seq_type_name, safe_repr(seq1)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001005 if not isinstance(seq2, seq_type):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001006 raise self.failureException('Second sequence is not a %s: %s'
1007 % (seq_type_name, safe_repr(seq2)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001008 else:
1009 seq_type_name = "sequence"
1010
1011 differing = None
1012 try:
1013 len1 = len(seq1)
1014 except (TypeError, NotImplementedError):
1015 differing = 'First %s has no length. Non-sequence?' % (
1016 seq_type_name)
1017
1018 if differing is None:
1019 try:
1020 len2 = len(seq2)
1021 except (TypeError, NotImplementedError):
1022 differing = 'Second %s has no length. Non-sequence?' % (
1023 seq_type_name)
1024
1025 if differing is None:
1026 if seq1 == seq2:
1027 return
1028
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001029 differing = '%ss differ: %s != %s\n' % (
1030 (seq_type_name.capitalize(),) +
1031 _common_shorten_repr(seq1, seq2))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001032
1033 for i in range(min(len1, len2)):
1034 try:
1035 item1 = seq1[i]
1036 except (TypeError, IndexError, NotImplementedError):
1037 differing += ('\nUnable to index element %d of first %s\n' %
1038 (i, seq_type_name))
1039 break
1040
1041 try:
1042 item2 = seq2[i]
1043 except (TypeError, IndexError, NotImplementedError):
1044 differing += ('\nUnable to index element %d of second %s\n' %
1045 (i, seq_type_name))
1046 break
1047
1048 if item1 != item2:
1049 differing += ('\nFirst differing element %d:\n%s\n%s\n' %
Serhiy Storchaka685fbed2016-04-25 08:58:25 +03001050 ((i,) + _common_shorten_repr(item1, item2)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001051 break
1052 else:
1053 if (len1 == len2 and seq_type is None and
1054 type(seq1) != type(seq2)):
1055 # The sequences are the same, but have differing types.
1056 return
1057
1058 if len1 > len2:
1059 differing += ('\nFirst %s contains %d additional '
1060 'elements.\n' % (seq_type_name, len1 - len2))
1061 try:
1062 differing += ('First extra element %d:\n%s\n' %
Serhiy Storchaka685fbed2016-04-25 08:58:25 +03001063 (len2, safe_repr(seq1[len2])))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001064 except (TypeError, IndexError, NotImplementedError):
1065 differing += ('Unable to index element %d '
1066 'of first %s\n' % (len2, seq_type_name))
1067 elif len1 < len2:
1068 differing += ('\nSecond %s contains %d additional '
1069 'elements.\n' % (seq_type_name, len2 - len1))
1070 try:
1071 differing += ('First extra element %d:\n%s\n' %
Serhiy Storchaka685fbed2016-04-25 08:58:25 +03001072 (len1, safe_repr(seq2[len1])))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001073 except (TypeError, IndexError, NotImplementedError):
1074 differing += ('Unable to index element %d '
1075 'of second %s\n' % (len1, seq_type_name))
Michael Foord2034d9a2010-06-05 11:27:52 +00001076 standardMsg = differing
1077 diffMsg = '\n' + '\n'.join(
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001078 difflib.ndiff(pprint.pformat(seq1).splitlines(),
1079 pprint.pformat(seq2).splitlines()))
Michael Foord085dfd32010-06-05 12:17:02 +00001080
1081 standardMsg = self._truncateMessage(standardMsg, diffMsg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001082 msg = self._formatMessage(msg, standardMsg)
1083 self.fail(msg)
1084
Michael Foord085dfd32010-06-05 12:17:02 +00001085 def _truncateMessage(self, message, diff):
1086 max_diff = self.maxDiff
1087 if max_diff is None or len(diff) <= max_diff:
1088 return message + diff
Michael Foord9dad32e2010-06-05 13:49:56 +00001089 return message + (DIFF_OMITTED % len(diff))
Michael Foord085dfd32010-06-05 12:17:02 +00001090
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001091 def assertListEqual(self, list1, list2, msg=None):
1092 """A list-specific equality assertion.
1093
1094 Args:
1095 list1: The first list to compare.
1096 list2: The second list to compare.
1097 msg: Optional message to use on failure instead of a list of
1098 differences.
1099
1100 """
1101 self.assertSequenceEqual(list1, list2, msg, seq_type=list)
1102
1103 def assertTupleEqual(self, tuple1, tuple2, msg=None):
1104 """A tuple-specific equality assertion.
1105
1106 Args:
1107 tuple1: The first tuple to compare.
1108 tuple2: The second tuple to compare.
1109 msg: Optional message to use on failure instead of a list of
1110 differences.
1111 """
1112 self.assertSequenceEqual(tuple1, tuple2, msg, seq_type=tuple)
1113
1114 def assertSetEqual(self, set1, set2, msg=None):
1115 """A set-specific equality assertion.
1116
1117 Args:
1118 set1: The first set to compare.
1119 set2: The second set to compare.
1120 msg: Optional message to use on failure instead of a list of
1121 differences.
1122
Michael Foord91c9da32010-03-20 17:21:27 +00001123 assertSetEqual uses ducktyping to support different types of sets, and
1124 is optimized for sets specifically (parameters must support a
1125 difference method).
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001126 """
1127 try:
1128 difference1 = set1.difference(set2)
1129 except TypeError as e:
1130 self.fail('invalid type when attempting set difference: %s' % e)
1131 except AttributeError as e:
1132 self.fail('first argument does not support set difference: %s' % e)
1133
1134 try:
1135 difference2 = set2.difference(set1)
1136 except TypeError as e:
1137 self.fail('invalid type when attempting set difference: %s' % e)
1138 except AttributeError as e:
1139 self.fail('second argument does not support set difference: %s' % e)
1140
1141 if not (difference1 or difference2):
1142 return
1143
1144 lines = []
1145 if difference1:
1146 lines.append('Items in the first set but not the second:')
1147 for item in difference1:
1148 lines.append(repr(item))
1149 if difference2:
1150 lines.append('Items in the second set but not the first:')
1151 for item in difference2:
1152 lines.append(repr(item))
1153
1154 standardMsg = '\n'.join(lines)
1155 self.fail(self._formatMessage(msg, standardMsg))
1156
1157 def assertIn(self, member, container, msg=None):
1158 """Just like self.assertTrue(a in b), but with a nicer default message."""
1159 if member not in container:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001160 standardMsg = '%s not found in %s' % (safe_repr(member),
1161 safe_repr(container))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001162 self.fail(self._formatMessage(msg, standardMsg))
1163
1164 def assertNotIn(self, member, container, msg=None):
1165 """Just like self.assertTrue(a not in b), but with a nicer default message."""
1166 if member in container:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001167 standardMsg = '%s unexpectedly found in %s' % (safe_repr(member),
1168 safe_repr(container))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001169 self.fail(self._formatMessage(msg, standardMsg))
1170
1171 def assertIs(self, expr1, expr2, msg=None):
1172 """Just like self.assertTrue(a is b), but with a nicer default message."""
1173 if expr1 is not expr2:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001174 standardMsg = '%s is not %s' % (safe_repr(expr1),
1175 safe_repr(expr2))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001176 self.fail(self._formatMessage(msg, standardMsg))
1177
1178 def assertIsNot(self, expr1, expr2, msg=None):
1179 """Just like self.assertTrue(a is not b), but with a nicer default message."""
1180 if expr1 is expr2:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001181 standardMsg = 'unexpectedly identical: %s' % (safe_repr(expr1),)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001182 self.fail(self._formatMessage(msg, standardMsg))
1183
1184 def assertDictEqual(self, d1, d2, msg=None):
Ezio Melottib3aedd42010-11-20 19:04:17 +00001185 self.assertIsInstance(d1, dict, 'First argument is not a dictionary')
1186 self.assertIsInstance(d2, dict, 'Second argument is not a dictionary')
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001187
1188 if d1 != d2:
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001189 standardMsg = '%s != %s' % _common_shorten_repr(d1, d2)
Michael Foord085dfd32010-06-05 12:17:02 +00001190 diff = ('\n' + '\n'.join(difflib.ndiff(
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001191 pprint.pformat(d1).splitlines(),
1192 pprint.pformat(d2).splitlines())))
Michael Foordcb11b252010-06-05 13:14:43 +00001193 standardMsg = self._truncateMessage(standardMsg, diff)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001194 self.fail(self._formatMessage(msg, standardMsg))
1195
Ezio Melotti0f535012011-04-03 18:02:13 +03001196 def assertDictContainsSubset(self, subset, dictionary, msg=None):
1197 """Checks whether dictionary is a superset of subset."""
1198 warnings.warn('assertDictContainsSubset is deprecated',
1199 DeprecationWarning)
1200 missing = []
1201 mismatched = []
1202 for key, value in subset.items():
1203 if key not in dictionary:
1204 missing.append(key)
1205 elif value != dictionary[key]:
1206 mismatched.append('%s, expected: %s, actual: %s' %
1207 (safe_repr(key), safe_repr(value),
1208 safe_repr(dictionary[key])))
1209
1210 if not (missing or mismatched):
1211 return
1212
1213 standardMsg = ''
1214 if missing:
1215 standardMsg = 'Missing: %s' % ','.join(safe_repr(m) for m in
1216 missing)
1217 if mismatched:
1218 if standardMsg:
1219 standardMsg += '; '
1220 standardMsg += 'Mismatched values: %s' % ','.join(mismatched)
1221
1222 self.fail(self._formatMessage(msg, standardMsg))
1223
1224
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001225 def assertCountEqual(self, first, second, msg=None):
jkleint39baace2019-04-23 01:34:29 -07001226 """Asserts that two iterables have the same elements, the same number of
1227 times, without regard to order.
Michael Foord8442a602010-03-20 16:58:04 +00001228
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001229 self.assertEqual(Counter(list(first)),
1230 Counter(list(second)))
Michael Foord8442a602010-03-20 16:58:04 +00001231
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001232 Example:
Michael Foord8442a602010-03-20 16:58:04 +00001233 - [0, 1, 1] and [1, 0, 1] compare equal.
1234 - [0, 0, 1] and [0, 1] compare unequal.
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001235
Michael Foord8442a602010-03-20 16:58:04 +00001236 """
Michael Foorde180d392011-01-28 19:51:48 +00001237 first_seq, second_seq = list(first), list(second)
Michael Foord8442a602010-03-20 16:58:04 +00001238 try:
Michael Foorde180d392011-01-28 19:51:48 +00001239 first = collections.Counter(first_seq)
1240 second = collections.Counter(second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001241 except TypeError:
Raymond Hettinger6518f5e2010-12-24 00:52:54 +00001242 # Handle case with unhashable elements
Michael Foorde180d392011-01-28 19:51:48 +00001243 differences = _count_diff_all_purpose(first_seq, second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001244 else:
Michael Foorde180d392011-01-28 19:51:48 +00001245 if first == second:
Raymond Hettinger6e165b32010-11-27 09:31:37 +00001246 return
Michael Foorde180d392011-01-28 19:51:48 +00001247 differences = _count_diff_hashable(first_seq, second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001248
Raymond Hettinger93e233d2010-12-24 10:02:22 +00001249 if differences:
1250 standardMsg = 'Element counts were not equal:\n'
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001251 lines = ['First has %d, Second has %d: %r' % diff for diff in differences]
Raymond Hettinger93e233d2010-12-24 10:02:22 +00001252 diffMsg = '\n'.join(lines)
1253 standardMsg = self._truncateMessage(standardMsg, diffMsg)
1254 msg = self._formatMessage(msg, standardMsg)
1255 self.fail(msg)
Michael Foord8442a602010-03-20 16:58:04 +00001256
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001257 def assertMultiLineEqual(self, first, second, msg=None):
1258 """Assert that two multi-line strings are equal."""
Ezio Melottib3aedd42010-11-20 19:04:17 +00001259 self.assertIsInstance(first, str, 'First argument is not a string')
1260 self.assertIsInstance(second, str, 'Second argument is not a string')
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001261
1262 if first != second:
Ezio Melottiedd117f2011-04-27 10:20:38 +03001263 # don't use difflib if the strings are too long
1264 if (len(first) > self._diffThreshold or
1265 len(second) > self._diffThreshold):
1266 self._baseAssertEqual(first, second, msg)
Ezio Melottid8b509b2011-09-28 17:37:55 +03001267 firstlines = first.splitlines(keepends=True)
1268 secondlines = second.splitlines(keepends=True)
Michael Foordc653ce32010-07-10 13:52:22 +00001269 if len(firstlines) == 1 and first.strip('\r\n') == first:
1270 firstlines = [first + '\n']
1271 secondlines = [second + '\n']
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001272 standardMsg = '%s != %s' % _common_shorten_repr(first, second)
Michael Foordc653ce32010-07-10 13:52:22 +00001273 diff = '\n' + ''.join(difflib.ndiff(firstlines, secondlines))
Michael Foordcb11b252010-06-05 13:14:43 +00001274 standardMsg = self._truncateMessage(standardMsg, diff)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001275 self.fail(self._formatMessage(msg, standardMsg))
1276
1277 def assertLess(self, a, b, msg=None):
1278 """Just like self.assertTrue(a < b), but with a nicer default message."""
1279 if not a < b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001280 standardMsg = '%s not less than %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001281 self.fail(self._formatMessage(msg, standardMsg))
1282
1283 def assertLessEqual(self, a, b, msg=None):
1284 """Just like self.assertTrue(a <= b), but with a nicer default message."""
1285 if not a <= b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001286 standardMsg = '%s not less than or equal to %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001287 self.fail(self._formatMessage(msg, standardMsg))
1288
1289 def assertGreater(self, a, b, msg=None):
1290 """Just like self.assertTrue(a > b), but with a nicer default message."""
1291 if not a > b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001292 standardMsg = '%s not greater than %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001293 self.fail(self._formatMessage(msg, standardMsg))
1294
1295 def assertGreaterEqual(self, a, b, msg=None):
1296 """Just like self.assertTrue(a >= b), but with a nicer default message."""
1297 if not a >= b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001298 standardMsg = '%s not greater than or equal to %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001299 self.fail(self._formatMessage(msg, standardMsg))
1300
1301 def assertIsNone(self, obj, msg=None):
1302 """Same as self.assertTrue(obj is None), with a nicer default message."""
1303 if obj is not None:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001304 standardMsg = '%s is not None' % (safe_repr(obj),)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001305 self.fail(self._formatMessage(msg, standardMsg))
1306
1307 def assertIsNotNone(self, obj, msg=None):
1308 """Included for symmetry with assertIsNone."""
1309 if obj is None:
1310 standardMsg = 'unexpectedly None'
1311 self.fail(self._formatMessage(msg, standardMsg))
1312
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001313 def assertIsInstance(self, obj, cls, msg=None):
1314 """Same as self.assertTrue(isinstance(obj, cls)), with a nicer
1315 default message."""
1316 if not isinstance(obj, cls):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001317 standardMsg = '%s is not an instance of %r' % (safe_repr(obj), cls)
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001318 self.fail(self._formatMessage(msg, standardMsg))
1319
1320 def assertNotIsInstance(self, obj, cls, msg=None):
1321 """Included for symmetry with assertIsInstance."""
1322 if isinstance(obj, cls):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001323 standardMsg = '%s is an instance of %r' % (safe_repr(obj), cls)
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001324 self.fail(self._formatMessage(msg, standardMsg))
1325
Ezio Melottied3a7d22010-12-01 02:32:32 +00001326 def assertRaisesRegex(self, expected_exception, expected_regex,
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001327 *args, **kwargs):
Ezio Melottied3a7d22010-12-01 02:32:32 +00001328 """Asserts that the message in a raised exception matches a regex.
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001329
1330 Args:
1331 expected_exception: Exception class expected to be raised.
Serhiy Storchaka0b5e61d2017-10-04 20:09:49 +03001332 expected_regex: Regex (re.Pattern object or string) expected
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001333 to be found in error message.
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001334 args: Function to be called and extra positional args.
1335 kwargs: Extra kwargs.
Ezio Melottib4dc2502011-05-06 15:01:41 +03001336 msg: Optional message used in case of failure. Can only be used
1337 when assertRaisesRegex is used as a context manager.
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001338 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001339 context = _AssertRaisesContext(expected_exception, self, expected_regex)
1340 return context.handle('assertRaisesRegex', args, kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001341
Ezio Melottied3a7d22010-12-01 02:32:32 +00001342 def assertWarnsRegex(self, expected_warning, expected_regex,
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001343 *args, **kwargs):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001344 """Asserts that the message in a triggered warning matches a regexp.
1345 Basic functioning is similar to assertWarns() with the addition
1346 that only warnings whose messages also match the regular expression
1347 are considered successful matches.
1348
1349 Args:
1350 expected_warning: Warning class expected to be triggered.
Serhiy Storchaka0b5e61d2017-10-04 20:09:49 +03001351 expected_regex: Regex (re.Pattern object or string) expected
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001352 to be found in error message.
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001353 args: Function to be called and extra positional args.
1354 kwargs: Extra kwargs.
Ezio Melottib4dc2502011-05-06 15:01:41 +03001355 msg: Optional message used in case of failure. Can only be used
1356 when assertWarnsRegex is used as a context manager.
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001357 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001358 context = _AssertWarnsContext(expected_warning, self, expected_regex)
1359 return context.handle('assertWarnsRegex', args, kwargs)
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001360
Ezio Melottied3a7d22010-12-01 02:32:32 +00001361 def assertRegex(self, text, expected_regex, msg=None):
Michael Foorde3ef5f12010-05-08 16:46:14 +00001362 """Fail the test unless the text matches the regular expression."""
Ezio Melottied3a7d22010-12-01 02:32:32 +00001363 if isinstance(expected_regex, (str, bytes)):
Gregory P. Smithed16bf42010-12-16 19:23:05 +00001364 assert expected_regex, "expected_regex must not be empty."
Ezio Melottied3a7d22010-12-01 02:32:32 +00001365 expected_regex = re.compile(expected_regex)
1366 if not expected_regex.search(text):
Robert Collinsbe6caca2015-08-20 11:13:09 +12001367 standardMsg = "Regex didn't match: %r not found in %r" % (
1368 expected_regex.pattern, text)
1369 # _formatMessage ensures the longMessage option is respected
1370 msg = self._formatMessage(msg, standardMsg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001371 raise self.failureException(msg)
1372
Ezio Melotti8f776302010-12-10 02:32:05 +00001373 def assertNotRegex(self, text, unexpected_regex, msg=None):
Michael Foorde3ef5f12010-05-08 16:46:14 +00001374 """Fail the test if the text matches the regular expression."""
Ezio Melottied3a7d22010-12-01 02:32:32 +00001375 if isinstance(unexpected_regex, (str, bytes)):
1376 unexpected_regex = re.compile(unexpected_regex)
1377 match = unexpected_regex.search(text)
Benjamin Petersonb48af542010-04-11 20:43:16 +00001378 if match:
Robert Collinsbe6caca2015-08-20 11:13:09 +12001379 standardMsg = 'Regex matched: %r matches %r in %r' % (
1380 text[match.start() : match.end()],
1381 unexpected_regex.pattern,
1382 text)
1383 # _formatMessage ensures the longMessage option is respected
1384 msg = self._formatMessage(msg, standardMsg)
Benjamin Petersonb48af542010-04-11 20:43:16 +00001385 raise self.failureException(msg)
1386
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001387
Ezio Melottied3a7d22010-12-01 02:32:32 +00001388 def _deprecate(original_func):
1389 def deprecated_func(*args, **kwargs):
1390 warnings.warn(
1391 'Please use {0} instead.'.format(original_func.__name__),
1392 DeprecationWarning, 2)
1393 return original_func(*args, **kwargs)
1394 return deprecated_func
1395
Ezio Melotti361467e2011-04-03 17:37:58 +03001396 # see #9424
Ezio Melotti0f535012011-04-03 18:02:13 +03001397 failUnlessEqual = assertEquals = _deprecate(assertEqual)
1398 failIfEqual = assertNotEquals = _deprecate(assertNotEqual)
1399 failUnlessAlmostEqual = assertAlmostEquals = _deprecate(assertAlmostEqual)
1400 failIfAlmostEqual = assertNotAlmostEquals = _deprecate(assertNotAlmostEqual)
1401 failUnless = assert_ = _deprecate(assertTrue)
1402 failUnlessRaises = _deprecate(assertRaises)
1403 failIf = _deprecate(assertFalse)
Ezio Melottied3a7d22010-12-01 02:32:32 +00001404 assertRaisesRegexp = _deprecate(assertRaisesRegex)
1405 assertRegexpMatches = _deprecate(assertRegex)
Robert Collinsbe6caca2015-08-20 11:13:09 +12001406 assertNotRegexpMatches = _deprecate(assertNotRegex)
Ezio Melottied3a7d22010-12-01 02:32:32 +00001407
1408
1409
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001410class FunctionTestCase(TestCase):
1411 """A test case that wraps a test function.
1412
1413 This is useful for slipping pre-existing test functions into the
1414 unittest framework. Optionally, set-up and tidy-up functions can be
1415 supplied. As with TestCase, the tidy-up ('tearDown') function will
1416 always be called if the set-up ('setUp') function ran successfully.
1417 """
1418
1419 def __init__(self, testFunc, setUp=None, tearDown=None, description=None):
1420 super(FunctionTestCase, self).__init__()
1421 self._setUpFunc = setUp
1422 self._tearDownFunc = tearDown
1423 self._testFunc = testFunc
1424 self._description = description
1425
1426 def setUp(self):
1427 if self._setUpFunc is not None:
1428 self._setUpFunc()
1429
1430 def tearDown(self):
1431 if self._tearDownFunc is not None:
1432 self._tearDownFunc()
1433
1434 def runTest(self):
1435 self._testFunc()
1436
1437 def id(self):
1438 return self._testFunc.__name__
1439
1440 def __eq__(self, other):
1441 if not isinstance(other, self.__class__):
1442 return NotImplemented
1443
1444 return self._setUpFunc == other._setUpFunc and \
1445 self._tearDownFunc == other._tearDownFunc and \
1446 self._testFunc == other._testFunc and \
1447 self._description == other._description
1448
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001449 def __hash__(self):
1450 return hash((type(self), self._setUpFunc, self._tearDownFunc,
1451 self._testFunc, self._description))
1452
1453 def __str__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001454 return "%s (%s)" % (strclass(self.__class__),
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001455 self._testFunc.__name__)
1456
1457 def __repr__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001458 return "<%s tec=%s>" % (strclass(self.__class__),
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001459 self._testFunc)
1460
1461 def shortDescription(self):
1462 if self._description is not None:
1463 return self._description
1464 doc = self._testFunc.__doc__
1465 return doc and doc.split("\n")[0].strip() or None
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001466
1467
1468class _SubTest(TestCase):
1469
1470 def __init__(self, test_case, message, params):
1471 super().__init__()
1472 self._message = message
1473 self.test_case = test_case
1474 self.params = params
1475 self.failureException = test_case.failureException
1476
1477 def runTest(self):
1478 raise NotImplementedError("subtests cannot be run directly")
1479
1480 def _subDescription(self):
1481 parts = []
Berker Peksag16ea19f2016-09-21 19:34:15 +03001482 if self._message is not _subtest_msg_sentinel:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001483 parts.append("[{}]".format(self._message))
1484 if self.params:
1485 params_desc = ', '.join(
1486 "{}={!r}".format(k, v)
Serhiy Storchaka48fbe522017-06-23 21:47:39 +03001487 for (k, v) in self.params.items())
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001488 parts.append("({})".format(params_desc))
1489 return " ".join(parts) or '(<subtest>)'
1490
1491 def id(self):
1492 return "{} {}".format(self.test_case.id(), self._subDescription())
1493
1494 def shortDescription(self):
1495 """Returns a one-line description of the subtest, or None if no
1496 description has been provided.
1497 """
1498 return self.test_case.shortDescription()
1499
1500 def __str__(self):
1501 return "{} {}".format(self.test_case, self._subDescription())