blob: b639c64d02a7aac4c2d292c194a2df71f4858414 [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
Miss Islington (bot)3bd4bed2019-09-09 08:01:15 -070013import 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
Miss Islington (bot)3bd4bed2019-09-09 08:01:15 -0700126 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 Storchaka42a139e2019-04-01 09:16:35 +0300471 def addCleanup(*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)."""
Serhiy Storchaka42a139e2019-04-01 09:16:35 +0300477 if len(args) >= 2:
478 self, function, *args = args
479 elif not args:
480 raise TypeError("descriptor 'addCleanup' of 'TestCase' object "
481 "needs an argument")
482 elif 'function' in kwargs:
483 function = kwargs.pop('function')
484 self, *args = args
485 import warnings
486 warnings.warn("Passing 'function' as keyword argument is deprecated",
487 DeprecationWarning, stacklevel=2)
488 else:
489 raise TypeError('addCleanup expected at least 1 positional '
490 'argument, got %d' % (len(args)-1))
491 args = tuple(args)
492
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000493 self._cleanups.append((function, args, kwargs))
Serhiy Storchakad53cf992019-05-06 22:40:27 +0300494 addCleanup.__text_signature__ = '($self, function, /, *args, **kwargs)'
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000495
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300496 @classmethod
497 def addClassCleanup(cls, function, /, *args, **kwargs):
Lisa Roach0f221d02018-11-08 18:34:33 -0800498 """Same as addCleanup, except the cleanup items are called even if
499 setUpClass fails (unlike tearDownClass)."""
500 cls._class_cleanups.append((function, args, kwargs))
501
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000502 def setUp(self):
503 "Hook method for setting up the test fixture before exercising it."
504 pass
505
506 def tearDown(self):
507 "Hook method for deconstructing the test fixture after testing it."
508 pass
509
Benjamin Peterson847a4112010-03-14 15:04:17 +0000510 @classmethod
511 def setUpClass(cls):
512 "Hook method for setting up class fixture before running tests in the class."
513
514 @classmethod
515 def tearDownClass(cls):
516 "Hook method for deconstructing the class fixture after running all tests in the class."
517
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000518 def countTestCases(self):
519 return 1
520
521 def defaultTestResult(self):
522 return result.TestResult()
523
524 def shortDescription(self):
Michael Foord34c94622010-02-10 15:51:42 +0000525 """Returns a one-line description of the test, or None if no
526 description has been provided.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000527
Michael Foord34c94622010-02-10 15:51:42 +0000528 The default implementation of this method returns the first line of
529 the specified test method's docstring.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000530 """
Michael Foord34c94622010-02-10 15:51:42 +0000531 doc = self._testMethodDoc
532 return doc and doc.split("\n")[0].strip() or None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000533
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000534
535 def id(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000536 return "%s.%s" % (strclass(self.__class__), self._testMethodName)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000537
538 def __eq__(self, other):
539 if type(self) is not type(other):
540 return NotImplemented
541
542 return self._testMethodName == other._testMethodName
543
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000544 def __hash__(self):
545 return hash((type(self), self._testMethodName))
546
547 def __str__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000548 return "%s (%s)" % (self._testMethodName, strclass(self.__class__))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000549
550 def __repr__(self):
551 return "<%s testMethod=%s>" % \
Benjamin Peterson847a4112010-03-14 15:04:17 +0000552 (strclass(self.__class__), self._testMethodName)
553
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100554 def _addSkip(self, result, test_case, reason):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000555 addSkip = getattr(result, 'addSkip', None)
556 if addSkip is not None:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100557 addSkip(test_case, reason)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000558 else:
559 warnings.warn("TestResult has no addSkip method, skips not reported",
560 RuntimeWarning, 2)
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100561 result.addSuccess(test_case)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000562
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100563 @contextlib.contextmanager
Berker Peksag16ea19f2016-09-21 19:34:15 +0300564 def subTest(self, msg=_subtest_msg_sentinel, **params):
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100565 """Return a context manager that will return the enclosed block
566 of code in a subtest identified by the optional message and
567 keyword parameters. A failure in the subtest marks the test
568 case as failed but resumes execution at the end of the enclosed
569 block, allowing further test code to be executed.
570 """
Bruno Oliveirada2bf9f2018-10-12 07:35:55 -0300571 if self._outcome is None or not self._outcome.result_supports_subtests:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100572 yield
573 return
574 parent = self._subtest
575 if parent is None:
Serhiy Storchaka48fbe522017-06-23 21:47:39 +0300576 params_map = _OrderedChainMap(params)
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100577 else:
578 params_map = parent.params.new_child(params)
579 self._subtest = _SubTest(self, msg, params_map)
Michael Foordb3468f72010-12-19 03:19:47 +0000580 try:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100581 with self._outcome.testPartExecutor(self._subtest, isTest=True):
582 yield
583 if not self._outcome.success:
584 result = self._outcome.result
585 if result is not None and result.failfast:
586 raise _ShouldStop
587 elif self._outcome.expectedFailure:
588 # If the test is expecting a failure, we really want to
589 # stop now and register the expected failure.
590 raise _ShouldStop
591 finally:
592 self._subtest = parent
593
594 def _feedErrorsToResult(self, result, errors):
595 for test, exc_info in errors:
596 if isinstance(test, _SubTest):
597 result.addSubTest(test.test_case, test, exc_info)
598 elif exc_info is not None:
599 if issubclass(exc_info[0], self.failureException):
600 result.addFailure(test, exc_info)
601 else:
602 result.addError(test, exc_info)
603
604 def _addExpectedFailure(self, result, exc_info):
605 try:
606 addExpectedFailure = result.addExpectedFailure
607 except AttributeError:
608 warnings.warn("TestResult has no addExpectedFailure method, reporting as passes",
609 RuntimeWarning)
610 result.addSuccess(self)
611 else:
612 addExpectedFailure(self, exc_info)
613
614 def _addUnexpectedSuccess(self, result):
615 try:
616 addUnexpectedSuccess = result.addUnexpectedSuccess
617 except AttributeError:
618 warnings.warn("TestResult has no addUnexpectedSuccess method, reporting as failure",
619 RuntimeWarning)
620 # We need to pass an actual exception and traceback to addFailure,
621 # otherwise the legacy result can choke.
622 try:
623 raise _UnexpectedSuccess from None
624 except _UnexpectedSuccess:
625 result.addFailure(self, sys.exc_info())
626 else:
627 addUnexpectedSuccess(self)
Michael Foordb3468f72010-12-19 03:19:47 +0000628
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300629 def _callSetUp(self):
630 self.setUp()
631
632 def _callTestMethod(self, method):
633 method()
634
635 def _callTearDown(self):
636 self.tearDown()
637
638 def _callCleanup(self, function, /, *args, **kwargs):
639 function(*args, **kwargs)
640
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000641 def run(self, result=None):
642 orig_result = result
643 if result is None:
644 result = self.defaultTestResult()
645 startTestRun = getattr(result, 'startTestRun', None)
646 if startTestRun is not None:
647 startTestRun()
648
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000649 result.startTest(self)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000650
651 testMethod = getattr(self, self._testMethodName)
652 if (getattr(self.__class__, "__unittest_skip__", False) or
653 getattr(testMethod, "__unittest_skip__", False)):
654 # If the class or method was skipped.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000655 try:
Benjamin Peterson847a4112010-03-14 15:04:17 +0000656 skip_why = (getattr(self.__class__, '__unittest_skip_why__', '')
657 or getattr(testMethod, '__unittest_skip_why__', ''))
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100658 self._addSkip(result, self, skip_why)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000659 finally:
660 result.stopTest(self)
661 return
Robert Collinsed599b72015-08-28 10:34:51 +1200662 expecting_failure_method = getattr(testMethod,
663 "__unittest_expecting_failure__", False)
664 expecting_failure_class = getattr(self,
665 "__unittest_expecting_failure__", False)
666 expecting_failure = expecting_failure_class or expecting_failure_method
Victor Stinner031bd532013-12-09 01:52:50 +0100667 outcome = _Outcome(result)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000668 try:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100669 self._outcome = outcome
Michael Foordb3468f72010-12-19 03:19:47 +0000670
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100671 with outcome.testPartExecutor(self):
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300672 self._callSetUp()
Michael Foordb3468f72010-12-19 03:19:47 +0000673 if outcome.success:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100674 outcome.expecting_failure = expecting_failure
675 with outcome.testPartExecutor(self, isTest=True):
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300676 self._callTestMethod(testMethod)
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100677 outcome.expecting_failure = False
678 with outcome.testPartExecutor(self):
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300679 self._callTearDown()
Michael Foordb3468f72010-12-19 03:19:47 +0000680
681 self.doCleanups()
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100682 for test, reason in outcome.skipped:
683 self._addSkip(result, test, reason)
684 self._feedErrorsToResult(result, outcome.errors)
Michael Foordb3468f72010-12-19 03:19:47 +0000685 if outcome.success:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100686 if expecting_failure:
687 if outcome.expectedFailure:
688 self._addExpectedFailure(result, outcome.expectedFailure)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000689 else:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100690 self._addUnexpectedSuccess(result)
691 else:
692 result.addSuccess(self)
Michael Foord1341bb02011-03-14 19:01:46 -0400693 return result
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000694 finally:
695 result.stopTest(self)
696 if orig_result is None:
697 stopTestRun = getattr(result, 'stopTestRun', None)
698 if stopTestRun is not None:
699 stopTestRun()
700
Victor Stinner031bd532013-12-09 01:52:50 +0100701 # explicitly break reference cycles:
702 # outcome.errors -> frame -> outcome -> outcome.errors
703 # outcome.expectedFailure -> frame -> outcome -> outcome.expectedFailure
704 outcome.errors.clear()
705 outcome.expectedFailure = None
706
707 # clear the outcome, no more needed
708 self._outcome = None
709
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000710 def doCleanups(self):
711 """Execute all cleanup functions. Normally called for you after
712 tearDown."""
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100713 outcome = self._outcome or _Outcome()
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000714 while self._cleanups:
Michael Foordb3468f72010-12-19 03:19:47 +0000715 function, args, kwargs = self._cleanups.pop()
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100716 with outcome.testPartExecutor(self):
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300717 self._callCleanup(function, *args, **kwargs)
Michael Foordb3468f72010-12-19 03:19:47 +0000718
719 # return this for backwards compatibility
Lisa Roach0f221d02018-11-08 18:34:33 -0800720 # even though we no longer use it internally
Michael Foordb3468f72010-12-19 03:19:47 +0000721 return outcome.success
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000722
Lisa Roach0f221d02018-11-08 18:34:33 -0800723 @classmethod
724 def doClassCleanups(cls):
725 """Execute all class cleanup functions. Normally called for you after
726 tearDownClass."""
727 cls.tearDown_exceptions = []
728 while cls._class_cleanups:
729 function, args, kwargs = cls._class_cleanups.pop()
730 try:
731 function(*args, **kwargs)
732 except Exception as exc:
733 cls.tearDown_exceptions.append(sys.exc_info())
734
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000735 def __call__(self, *args, **kwds):
736 return self.run(*args, **kwds)
737
738 def debug(self):
739 """Run the test without collecting errors in a TestResult"""
740 self.setUp()
741 getattr(self, self._testMethodName)()
742 self.tearDown()
Michael Foordb8748742010-06-10 16:16:08 +0000743 while self._cleanups:
744 function, args, kwargs = self._cleanups.pop(-1)
745 function(*args, **kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000746
747 def skipTest(self, reason):
748 """Skip this test."""
749 raise SkipTest(reason)
750
751 def fail(self, msg=None):
752 """Fail immediately, with the given message."""
753 raise self.failureException(msg)
754
755 def assertFalse(self, expr, msg=None):
Ezio Melotti3044fa72010-12-18 17:31:58 +0000756 """Check that the expression is false."""
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000757 if expr:
Ezio Melotti3044fa72010-12-18 17:31:58 +0000758 msg = self._formatMessage(msg, "%s is not false" % safe_repr(expr))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000759 raise self.failureException(msg)
760
761 def assertTrue(self, expr, msg=None):
Ezio Melotti3044fa72010-12-18 17:31:58 +0000762 """Check that the expression is true."""
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000763 if not expr:
Ezio Melotti3044fa72010-12-18 17:31:58 +0000764 msg = self._formatMessage(msg, "%s is not true" % safe_repr(expr))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000765 raise self.failureException(msg)
766
767 def _formatMessage(self, msg, standardMsg):
768 """Honour the longMessage attribute when generating failure messages.
769 If longMessage is False this means:
770 * Use only an explicit message if it is provided
771 * Otherwise use the standard message for the assert
772
773 If longMessage is True:
774 * Use the standard message
775 * If an explicit message is provided, plus ' : ' and the explicit message
776 """
777 if not self.longMessage:
778 return msg or standardMsg
779 if msg is None:
780 return standardMsg
Benjamin Peterson847a4112010-03-14 15:04:17 +0000781 try:
782 # don't switch to '{}' formatting in Python 2.X
783 # it changes the way unicode input is handled
784 return '%s : %s' % (standardMsg, msg)
785 except UnicodeDecodeError:
786 return '%s : %s' % (safe_repr(standardMsg), safe_repr(msg))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000787
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300788 def assertRaises(self, expected_exception, *args, **kwargs):
789 """Fail unless an exception of class expected_exception is raised
790 by the callable when invoked with specified positional and
791 keyword arguments. If a different type of exception is
Andrew Svetlov737fb892012-12-18 21:14:22 +0200792 raised, it will not be caught, and the test case will be
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000793 deemed to have suffered an error, exactly as for an
794 unexpected exception.
795
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300796 If called with the callable and arguments omitted, will return a
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000797 context object used like this::
798
Michael Foord1c42b122010-02-05 22:58:21 +0000799 with self.assertRaises(SomeException):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000800 do_something()
Michael Foord1c42b122010-02-05 22:58:21 +0000801
Ezio Melottib4dc2502011-05-06 15:01:41 +0300802 An optional keyword argument 'msg' can be provided when assertRaises
803 is used as a context object.
804
Michael Foord1c42b122010-02-05 22:58:21 +0000805 The context manager keeps a reference to the exception as
Ezio Melotti49008232010-02-08 21:57:48 +0000806 the 'exception' attribute. This allows you to inspect the
Michael Foord1c42b122010-02-05 22:58:21 +0000807 exception after the assertion::
808
809 with self.assertRaises(SomeException) as cm:
810 do_something()
Ezio Melotti49008232010-02-08 21:57:48 +0000811 the_exception = cm.exception
Michael Foordb57ac6d2010-02-05 23:26:29 +0000812 self.assertEqual(the_exception.error_code, 3)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000813 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300814 context = _AssertRaisesContext(expected_exception, self)
Victor Stinnerbbd3cf82017-03-28 00:56:28 +0200815 try:
816 return context.handle('assertRaises', args, kwargs)
817 finally:
818 # bpo-23890: manually break a reference cycle
819 context = None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000820
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300821 def assertWarns(self, expected_warning, *args, **kwargs):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000822 """Fail unless a warning of class warnClass is triggered
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300823 by the callable when invoked with specified positional and
824 keyword arguments. If a different type of warning is
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000825 triggered, it will not be handled: depending on the other
826 warning filtering rules in effect, it might be silenced, printed
827 out, or raised as an exception.
828
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300829 If called with the callable and arguments omitted, will return a
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000830 context object used like this::
831
832 with self.assertWarns(SomeWarning):
833 do_something()
834
Ezio Melottib4dc2502011-05-06 15:01:41 +0300835 An optional keyword argument 'msg' can be provided when assertWarns
836 is used as a context object.
837
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000838 The context manager keeps a reference to the first matching
839 warning as the 'warning' attribute; similarly, the 'filename'
840 and 'lineno' attributes give you information about the line
841 of Python code from which the warning was triggered.
842 This allows you to inspect the warning after the assertion::
843
844 with self.assertWarns(SomeWarning) as cm:
845 do_something()
846 the_warning = cm.warning
847 self.assertEqual(the_warning.some_attribute, 147)
848 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300849 context = _AssertWarnsContext(expected_warning, self)
850 return context.handle('assertWarns', args, kwargs)
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000851
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200852 def assertLogs(self, logger=None, level=None):
853 """Fail unless a log message of level *level* or higher is emitted
854 on *logger_name* or its children. If omitted, *level* defaults to
855 INFO and *logger* defaults to the root logger.
856
857 This method must be used as a context manager, and will yield
858 a recording object with two attributes: `output` and `records`.
859 At the end of the context manager, the `output` attribute will
860 be a list of the matching formatted log messages and the
861 `records` attribute will be a list of the corresponding LogRecord
862 objects.
863
864 Example::
865
866 with self.assertLogs('foo', level='INFO') as cm:
867 logging.getLogger('foo').info('first message')
868 logging.getLogger('foo.bar').error('second message')
869 self.assertEqual(cm.output, ['INFO:foo:first message',
870 'ERROR:foo.bar:second message'])
871 """
872 return _AssertLogsContext(self, logger, level)
873
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000874 def _getAssertEqualityFunc(self, first, second):
875 """Get a detailed comparison function for the types of the two args.
876
877 Returns: A callable accepting (first, second, msg=None) that will
878 raise a failure exception if first != second with a useful human
879 readable error message for those types.
880 """
881 #
882 # NOTE(gregory.p.smith): I considered isinstance(first, type(second))
883 # and vice versa. I opted for the conservative approach in case
884 # subclasses are not intended to be compared in detail to their super
885 # class instances using a type equality func. This means testing
886 # subtypes won't automagically use the detailed comparison. Callers
887 # should use their type specific assertSpamEqual method to compare
888 # subclasses if the detailed comparison is desired and appropriate.
889 # See the discussion in http://bugs.python.org/issue2578.
890 #
891 if type(first) is type(second):
892 asserter = self._type_equality_funcs.get(type(first))
893 if asserter is not None:
Benjamin Peterson34b2b262011-07-12 19:21:42 -0500894 if isinstance(asserter, str):
895 asserter = getattr(self, asserter)
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000896 return asserter
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000897
898 return self._baseAssertEqual
899
900 def _baseAssertEqual(self, first, second, msg=None):
901 """The default assertEqual implementation, not type specific."""
902 if not first == second:
Serhiy Storchaka77622f52013-09-23 23:07:00 +0300903 standardMsg = '%s != %s' % _common_shorten_repr(first, second)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000904 msg = self._formatMessage(msg, standardMsg)
905 raise self.failureException(msg)
906
907 def assertEqual(self, first, second, msg=None):
908 """Fail if the two objects are unequal as determined by the '=='
909 operator.
910 """
911 assertion_func = self._getAssertEqualityFunc(first, second)
912 assertion_func(first, second, msg=msg)
913
914 def assertNotEqual(self, first, second, msg=None):
Ezio Melotti90eea972012-11-08 11:08:39 +0200915 """Fail if the two objects are equal as determined by the '!='
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000916 operator.
917 """
918 if not first != second:
Benjamin Peterson847a4112010-03-14 15:04:17 +0000919 msg = self._formatMessage(msg, '%s == %s' % (safe_repr(first),
920 safe_repr(second)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000921 raise self.failureException(msg)
922
Michael Foord321d0592010-11-02 13:44:51 +0000923 def assertAlmostEqual(self, first, second, places=None, msg=None,
Benjamin Petersonb48af542010-04-11 20:43:16 +0000924 delta=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000925 """Fail if the two objects are unequal as determined by their
926 difference rounded to the given number of decimal places
Benjamin Petersonb48af542010-04-11 20:43:16 +0000927 (default 7) and comparing to zero, or by comparing that the
Ron032a6482017-10-18 20:01:23 +0300928 difference between the two objects is more than the given
929 delta.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000930
931 Note that decimal places (from zero) are usually not the same
Martin Pantereb995702016-07-28 01:11:04 +0000932 as significant digits (measured from the most significant digit).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000933
934 If the two objects compare equal then they will automatically
935 compare almost equal.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000936 """
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000937 if first == second:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000938 # shortcut
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000939 return
Benjamin Petersonb48af542010-04-11 20:43:16 +0000940 if delta is not None and places is not None:
941 raise TypeError("specify delta or places not both")
942
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200943 diff = abs(first - second)
Benjamin Petersonb48af542010-04-11 20:43:16 +0000944 if delta is not None:
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200945 if diff <= delta:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000946 return
947
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200948 standardMsg = '%s != %s within %s delta (%s difference)' % (
949 safe_repr(first),
950 safe_repr(second),
951 safe_repr(delta),
952 safe_repr(diff))
Benjamin Petersonb48af542010-04-11 20:43:16 +0000953 else:
954 if places is None:
955 places = 7
956
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200957 if round(diff, places) == 0:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000958 return
959
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200960 standardMsg = '%s != %s within %r places (%s difference)' % (
961 safe_repr(first),
962 safe_repr(second),
963 places,
964 safe_repr(diff))
Benjamin Petersonb48af542010-04-11 20:43:16 +0000965 msg = self._formatMessage(msg, standardMsg)
966 raise self.failureException(msg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000967
Michael Foord321d0592010-11-02 13:44:51 +0000968 def assertNotAlmostEqual(self, first, second, places=None, msg=None,
Benjamin Petersonb48af542010-04-11 20:43:16 +0000969 delta=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000970 """Fail if the two objects are equal as determined by their
971 difference rounded to the given number of decimal places
Benjamin Petersonb48af542010-04-11 20:43:16 +0000972 (default 7) and comparing to zero, or by comparing that the
Ron032a6482017-10-18 20:01:23 +0300973 difference between the two objects is less than the given delta.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000974
975 Note that decimal places (from zero) are usually not the same
Martin Pantereb995702016-07-28 01:11:04 +0000976 as significant digits (measured from the most significant digit).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000977
978 Objects that are equal automatically fail.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000979 """
Benjamin Petersonb48af542010-04-11 20:43:16 +0000980 if delta is not None and places is not None:
981 raise TypeError("specify delta or places not both")
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200982 diff = abs(first - second)
Benjamin Petersonb48af542010-04-11 20:43:16 +0000983 if delta is not None:
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200984 if not (first == second) and diff > delta:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000985 return
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200986 standardMsg = '%s == %s within %s delta (%s difference)' % (
987 safe_repr(first),
988 safe_repr(second),
989 safe_repr(delta),
990 safe_repr(diff))
Benjamin Petersonb48af542010-04-11 20:43:16 +0000991 else:
992 if places is None:
993 places = 7
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200994 if not (first == second) and round(diff, places) != 0:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000995 return
Benjamin Peterson847a4112010-03-14 15:04:17 +0000996 standardMsg = '%s == %s within %r places' % (safe_repr(first),
Benjamin Petersonb48af542010-04-11 20:43:16 +0000997 safe_repr(second),
998 places)
999
1000 msg = self._formatMessage(msg, standardMsg)
1001 raise self.failureException(msg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001002
Michael Foord085dfd32010-06-05 12:17:02 +00001003 def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001004 """An equality assertion for ordered sequences (like lists and tuples).
1005
R. David Murrayad13f222010-01-29 22:17:58 +00001006 For the purposes of this function, a valid ordered sequence type is one
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001007 which can be indexed, has a length, and has an equality operator.
1008
1009 Args:
1010 seq1: The first sequence to compare.
1011 seq2: The second sequence to compare.
1012 seq_type: The expected datatype of the sequences, or None if no
1013 datatype should be enforced.
1014 msg: Optional message to use on failure instead of a list of
1015 differences.
1016 """
Benjamin Petersonb29614e2012-10-09 11:16:03 -04001017 if seq_type is not None:
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001018 seq_type_name = seq_type.__name__
1019 if not isinstance(seq1, seq_type):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001020 raise self.failureException('First sequence is not a %s: %s'
1021 % (seq_type_name, safe_repr(seq1)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001022 if not isinstance(seq2, seq_type):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001023 raise self.failureException('Second sequence is not a %s: %s'
1024 % (seq_type_name, safe_repr(seq2)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001025 else:
1026 seq_type_name = "sequence"
1027
1028 differing = None
1029 try:
1030 len1 = len(seq1)
1031 except (TypeError, NotImplementedError):
1032 differing = 'First %s has no length. Non-sequence?' % (
1033 seq_type_name)
1034
1035 if differing is None:
1036 try:
1037 len2 = len(seq2)
1038 except (TypeError, NotImplementedError):
1039 differing = 'Second %s has no length. Non-sequence?' % (
1040 seq_type_name)
1041
1042 if differing is None:
1043 if seq1 == seq2:
1044 return
1045
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001046 differing = '%ss differ: %s != %s\n' % (
1047 (seq_type_name.capitalize(),) +
1048 _common_shorten_repr(seq1, seq2))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001049
1050 for i in range(min(len1, len2)):
1051 try:
1052 item1 = seq1[i]
1053 except (TypeError, IndexError, NotImplementedError):
1054 differing += ('\nUnable to index element %d of first %s\n' %
1055 (i, seq_type_name))
1056 break
1057
1058 try:
1059 item2 = seq2[i]
1060 except (TypeError, IndexError, NotImplementedError):
1061 differing += ('\nUnable to index element %d of second %s\n' %
1062 (i, seq_type_name))
1063 break
1064
1065 if item1 != item2:
1066 differing += ('\nFirst differing element %d:\n%s\n%s\n' %
Serhiy Storchaka685fbed2016-04-25 08:58:25 +03001067 ((i,) + _common_shorten_repr(item1, item2)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001068 break
1069 else:
1070 if (len1 == len2 and seq_type is None and
1071 type(seq1) != type(seq2)):
1072 # The sequences are the same, but have differing types.
1073 return
1074
1075 if len1 > len2:
1076 differing += ('\nFirst %s contains %d additional '
1077 'elements.\n' % (seq_type_name, len1 - len2))
1078 try:
1079 differing += ('First extra element %d:\n%s\n' %
Serhiy Storchaka685fbed2016-04-25 08:58:25 +03001080 (len2, safe_repr(seq1[len2])))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001081 except (TypeError, IndexError, NotImplementedError):
1082 differing += ('Unable to index element %d '
1083 'of first %s\n' % (len2, seq_type_name))
1084 elif len1 < len2:
1085 differing += ('\nSecond %s contains %d additional '
1086 'elements.\n' % (seq_type_name, len2 - len1))
1087 try:
1088 differing += ('First extra element %d:\n%s\n' %
Serhiy Storchaka685fbed2016-04-25 08:58:25 +03001089 (len1, safe_repr(seq2[len1])))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001090 except (TypeError, IndexError, NotImplementedError):
1091 differing += ('Unable to index element %d '
1092 'of second %s\n' % (len1, seq_type_name))
Michael Foord2034d9a2010-06-05 11:27:52 +00001093 standardMsg = differing
1094 diffMsg = '\n' + '\n'.join(
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001095 difflib.ndiff(pprint.pformat(seq1).splitlines(),
1096 pprint.pformat(seq2).splitlines()))
Michael Foord085dfd32010-06-05 12:17:02 +00001097
1098 standardMsg = self._truncateMessage(standardMsg, diffMsg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001099 msg = self._formatMessage(msg, standardMsg)
1100 self.fail(msg)
1101
Michael Foord085dfd32010-06-05 12:17:02 +00001102 def _truncateMessage(self, message, diff):
1103 max_diff = self.maxDiff
1104 if max_diff is None or len(diff) <= max_diff:
1105 return message + diff
Michael Foord9dad32e2010-06-05 13:49:56 +00001106 return message + (DIFF_OMITTED % len(diff))
Michael Foord085dfd32010-06-05 12:17:02 +00001107
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001108 def assertListEqual(self, list1, list2, msg=None):
1109 """A list-specific equality assertion.
1110
1111 Args:
1112 list1: The first list to compare.
1113 list2: The second list to compare.
1114 msg: Optional message to use on failure instead of a list of
1115 differences.
1116
1117 """
1118 self.assertSequenceEqual(list1, list2, msg, seq_type=list)
1119
1120 def assertTupleEqual(self, tuple1, tuple2, msg=None):
1121 """A tuple-specific equality assertion.
1122
1123 Args:
1124 tuple1: The first tuple to compare.
1125 tuple2: The second tuple to compare.
1126 msg: Optional message to use on failure instead of a list of
1127 differences.
1128 """
1129 self.assertSequenceEqual(tuple1, tuple2, msg, seq_type=tuple)
1130
1131 def assertSetEqual(self, set1, set2, msg=None):
1132 """A set-specific equality assertion.
1133
1134 Args:
1135 set1: The first set to compare.
1136 set2: The second set to compare.
1137 msg: Optional message to use on failure instead of a list of
1138 differences.
1139
Michael Foord91c9da32010-03-20 17:21:27 +00001140 assertSetEqual uses ducktyping to support different types of sets, and
1141 is optimized for sets specifically (parameters must support a
1142 difference method).
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001143 """
1144 try:
1145 difference1 = set1.difference(set2)
1146 except TypeError as e:
1147 self.fail('invalid type when attempting set difference: %s' % e)
1148 except AttributeError as e:
1149 self.fail('first argument does not support set difference: %s' % e)
1150
1151 try:
1152 difference2 = set2.difference(set1)
1153 except TypeError as e:
1154 self.fail('invalid type when attempting set difference: %s' % e)
1155 except AttributeError as e:
1156 self.fail('second argument does not support set difference: %s' % e)
1157
1158 if not (difference1 or difference2):
1159 return
1160
1161 lines = []
1162 if difference1:
1163 lines.append('Items in the first set but not the second:')
1164 for item in difference1:
1165 lines.append(repr(item))
1166 if difference2:
1167 lines.append('Items in the second set but not the first:')
1168 for item in difference2:
1169 lines.append(repr(item))
1170
1171 standardMsg = '\n'.join(lines)
1172 self.fail(self._formatMessage(msg, standardMsg))
1173
1174 def assertIn(self, member, container, msg=None):
1175 """Just like self.assertTrue(a in b), but with a nicer default message."""
1176 if member not in container:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001177 standardMsg = '%s not found in %s' % (safe_repr(member),
1178 safe_repr(container))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001179 self.fail(self._formatMessage(msg, standardMsg))
1180
1181 def assertNotIn(self, member, container, msg=None):
1182 """Just like self.assertTrue(a not in b), but with a nicer default message."""
1183 if member in container:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001184 standardMsg = '%s unexpectedly found in %s' % (safe_repr(member),
1185 safe_repr(container))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001186 self.fail(self._formatMessage(msg, standardMsg))
1187
1188 def assertIs(self, expr1, expr2, msg=None):
1189 """Just like self.assertTrue(a is b), but with a nicer default message."""
1190 if expr1 is not expr2:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001191 standardMsg = '%s is not %s' % (safe_repr(expr1),
1192 safe_repr(expr2))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001193 self.fail(self._formatMessage(msg, standardMsg))
1194
1195 def assertIsNot(self, expr1, expr2, msg=None):
1196 """Just like self.assertTrue(a is not b), but with a nicer default message."""
1197 if expr1 is expr2:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001198 standardMsg = 'unexpectedly identical: %s' % (safe_repr(expr1),)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001199 self.fail(self._formatMessage(msg, standardMsg))
1200
1201 def assertDictEqual(self, d1, d2, msg=None):
Ezio Melottib3aedd42010-11-20 19:04:17 +00001202 self.assertIsInstance(d1, dict, 'First argument is not a dictionary')
1203 self.assertIsInstance(d2, dict, 'Second argument is not a dictionary')
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001204
1205 if d1 != d2:
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001206 standardMsg = '%s != %s' % _common_shorten_repr(d1, d2)
Michael Foord085dfd32010-06-05 12:17:02 +00001207 diff = ('\n' + '\n'.join(difflib.ndiff(
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001208 pprint.pformat(d1).splitlines(),
1209 pprint.pformat(d2).splitlines())))
Michael Foordcb11b252010-06-05 13:14:43 +00001210 standardMsg = self._truncateMessage(standardMsg, diff)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001211 self.fail(self._formatMessage(msg, standardMsg))
1212
Ezio Melotti0f535012011-04-03 18:02:13 +03001213 def assertDictContainsSubset(self, subset, dictionary, msg=None):
1214 """Checks whether dictionary is a superset of subset."""
1215 warnings.warn('assertDictContainsSubset is deprecated',
1216 DeprecationWarning)
1217 missing = []
1218 mismatched = []
1219 for key, value in subset.items():
1220 if key not in dictionary:
1221 missing.append(key)
1222 elif value != dictionary[key]:
1223 mismatched.append('%s, expected: %s, actual: %s' %
1224 (safe_repr(key), safe_repr(value),
1225 safe_repr(dictionary[key])))
1226
1227 if not (missing or mismatched):
1228 return
1229
1230 standardMsg = ''
1231 if missing:
1232 standardMsg = 'Missing: %s' % ','.join(safe_repr(m) for m in
1233 missing)
1234 if mismatched:
1235 if standardMsg:
1236 standardMsg += '; '
1237 standardMsg += 'Mismatched values: %s' % ','.join(mismatched)
1238
1239 self.fail(self._formatMessage(msg, standardMsg))
1240
1241
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001242 def assertCountEqual(self, first, second, msg=None):
jkleint39baace2019-04-23 01:34:29 -07001243 """Asserts that two iterables have the same elements, the same number of
1244 times, without regard to order.
Michael Foord8442a602010-03-20 16:58:04 +00001245
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001246 self.assertEqual(Counter(list(first)),
1247 Counter(list(second)))
Michael Foord8442a602010-03-20 16:58:04 +00001248
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001249 Example:
Michael Foord8442a602010-03-20 16:58:04 +00001250 - [0, 1, 1] and [1, 0, 1] compare equal.
1251 - [0, 0, 1] and [0, 1] compare unequal.
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001252
Michael Foord8442a602010-03-20 16:58:04 +00001253 """
Michael Foorde180d392011-01-28 19:51:48 +00001254 first_seq, second_seq = list(first), list(second)
Michael Foord8442a602010-03-20 16:58:04 +00001255 try:
Michael Foorde180d392011-01-28 19:51:48 +00001256 first = collections.Counter(first_seq)
1257 second = collections.Counter(second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001258 except TypeError:
Raymond Hettinger6518f5e2010-12-24 00:52:54 +00001259 # Handle case with unhashable elements
Michael Foorde180d392011-01-28 19:51:48 +00001260 differences = _count_diff_all_purpose(first_seq, second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001261 else:
Michael Foorde180d392011-01-28 19:51:48 +00001262 if first == second:
Raymond Hettinger6e165b32010-11-27 09:31:37 +00001263 return
Michael Foorde180d392011-01-28 19:51:48 +00001264 differences = _count_diff_hashable(first_seq, second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001265
Raymond Hettinger93e233d2010-12-24 10:02:22 +00001266 if differences:
1267 standardMsg = 'Element counts were not equal:\n'
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001268 lines = ['First has %d, Second has %d: %r' % diff for diff in differences]
Raymond Hettinger93e233d2010-12-24 10:02:22 +00001269 diffMsg = '\n'.join(lines)
1270 standardMsg = self._truncateMessage(standardMsg, diffMsg)
1271 msg = self._formatMessage(msg, standardMsg)
1272 self.fail(msg)
Michael Foord8442a602010-03-20 16:58:04 +00001273
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001274 def assertMultiLineEqual(self, first, second, msg=None):
1275 """Assert that two multi-line strings are equal."""
Ezio Melottib3aedd42010-11-20 19:04:17 +00001276 self.assertIsInstance(first, str, 'First argument is not a string')
1277 self.assertIsInstance(second, str, 'Second argument is not a string')
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001278
1279 if first != second:
Ezio Melottiedd117f2011-04-27 10:20:38 +03001280 # don't use difflib if the strings are too long
1281 if (len(first) > self._diffThreshold or
1282 len(second) > self._diffThreshold):
1283 self._baseAssertEqual(first, second, msg)
Ezio Melottid8b509b2011-09-28 17:37:55 +03001284 firstlines = first.splitlines(keepends=True)
1285 secondlines = second.splitlines(keepends=True)
Michael Foordc653ce32010-07-10 13:52:22 +00001286 if len(firstlines) == 1 and first.strip('\r\n') == first:
1287 firstlines = [first + '\n']
1288 secondlines = [second + '\n']
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001289 standardMsg = '%s != %s' % _common_shorten_repr(first, second)
Michael Foordc653ce32010-07-10 13:52:22 +00001290 diff = '\n' + ''.join(difflib.ndiff(firstlines, secondlines))
Michael Foordcb11b252010-06-05 13:14:43 +00001291 standardMsg = self._truncateMessage(standardMsg, diff)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001292 self.fail(self._formatMessage(msg, standardMsg))
1293
1294 def assertLess(self, a, b, msg=None):
1295 """Just like self.assertTrue(a < b), but with a nicer default message."""
1296 if not a < b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001297 standardMsg = '%s not less than %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001298 self.fail(self._formatMessage(msg, standardMsg))
1299
1300 def assertLessEqual(self, a, b, msg=None):
1301 """Just like self.assertTrue(a <= b), but with a nicer default message."""
1302 if not a <= b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001303 standardMsg = '%s not less than or equal to %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001304 self.fail(self._formatMessage(msg, standardMsg))
1305
1306 def assertGreater(self, a, b, msg=None):
1307 """Just like self.assertTrue(a > b), but with a nicer default message."""
1308 if not a > b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001309 standardMsg = '%s not greater than %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001310 self.fail(self._formatMessage(msg, standardMsg))
1311
1312 def assertGreaterEqual(self, a, b, msg=None):
1313 """Just like self.assertTrue(a >= b), but with a nicer default message."""
1314 if not a >= b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001315 standardMsg = '%s not greater than or equal to %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001316 self.fail(self._formatMessage(msg, standardMsg))
1317
1318 def assertIsNone(self, obj, msg=None):
1319 """Same as self.assertTrue(obj is None), with a nicer default message."""
1320 if obj is not None:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001321 standardMsg = '%s is not None' % (safe_repr(obj),)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001322 self.fail(self._formatMessage(msg, standardMsg))
1323
1324 def assertIsNotNone(self, obj, msg=None):
1325 """Included for symmetry with assertIsNone."""
1326 if obj is None:
1327 standardMsg = 'unexpectedly None'
1328 self.fail(self._formatMessage(msg, standardMsg))
1329
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001330 def assertIsInstance(self, obj, cls, msg=None):
1331 """Same as self.assertTrue(isinstance(obj, cls)), with a nicer
1332 default message."""
1333 if not isinstance(obj, cls):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001334 standardMsg = '%s is not an instance of %r' % (safe_repr(obj), cls)
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001335 self.fail(self._formatMessage(msg, standardMsg))
1336
1337 def assertNotIsInstance(self, obj, cls, msg=None):
1338 """Included for symmetry with assertIsInstance."""
1339 if isinstance(obj, cls):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001340 standardMsg = '%s is an instance of %r' % (safe_repr(obj), cls)
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001341 self.fail(self._formatMessage(msg, standardMsg))
1342
Ezio Melottied3a7d22010-12-01 02:32:32 +00001343 def assertRaisesRegex(self, expected_exception, expected_regex,
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001344 *args, **kwargs):
Ezio Melottied3a7d22010-12-01 02:32:32 +00001345 """Asserts that the message in a raised exception matches a regex.
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001346
1347 Args:
1348 expected_exception: Exception class expected to be raised.
Serhiy Storchaka0b5e61d2017-10-04 20:09:49 +03001349 expected_regex: Regex (re.Pattern object or string) expected
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001350 to be found in error message.
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001351 args: Function to be called and extra positional args.
1352 kwargs: Extra kwargs.
Ezio Melottib4dc2502011-05-06 15:01:41 +03001353 msg: Optional message used in case of failure. Can only be used
1354 when assertRaisesRegex is used as a context manager.
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001355 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001356 context = _AssertRaisesContext(expected_exception, self, expected_regex)
1357 return context.handle('assertRaisesRegex', args, kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001358
Ezio Melottied3a7d22010-12-01 02:32:32 +00001359 def assertWarnsRegex(self, expected_warning, expected_regex,
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001360 *args, **kwargs):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001361 """Asserts that the message in a triggered warning matches a regexp.
1362 Basic functioning is similar to assertWarns() with the addition
1363 that only warnings whose messages also match the regular expression
1364 are considered successful matches.
1365
1366 Args:
1367 expected_warning: Warning class expected to be triggered.
Serhiy Storchaka0b5e61d2017-10-04 20:09:49 +03001368 expected_regex: Regex (re.Pattern object or string) expected
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001369 to be found in error message.
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001370 args: Function to be called and extra positional args.
1371 kwargs: Extra kwargs.
Ezio Melottib4dc2502011-05-06 15:01:41 +03001372 msg: Optional message used in case of failure. Can only be used
1373 when assertWarnsRegex is used as a context manager.
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001374 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001375 context = _AssertWarnsContext(expected_warning, self, expected_regex)
1376 return context.handle('assertWarnsRegex', args, kwargs)
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001377
Ezio Melottied3a7d22010-12-01 02:32:32 +00001378 def assertRegex(self, text, expected_regex, msg=None):
Michael Foorde3ef5f12010-05-08 16:46:14 +00001379 """Fail the test unless the text matches the regular expression."""
Ezio Melottied3a7d22010-12-01 02:32:32 +00001380 if isinstance(expected_regex, (str, bytes)):
Gregory P. Smithed16bf42010-12-16 19:23:05 +00001381 assert expected_regex, "expected_regex must not be empty."
Ezio Melottied3a7d22010-12-01 02:32:32 +00001382 expected_regex = re.compile(expected_regex)
1383 if not expected_regex.search(text):
Robert Collinsbe6caca2015-08-20 11:13:09 +12001384 standardMsg = "Regex didn't match: %r not found in %r" % (
1385 expected_regex.pattern, text)
1386 # _formatMessage ensures the longMessage option is respected
1387 msg = self._formatMessage(msg, standardMsg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001388 raise self.failureException(msg)
1389
Ezio Melotti8f776302010-12-10 02:32:05 +00001390 def assertNotRegex(self, text, unexpected_regex, msg=None):
Michael Foorde3ef5f12010-05-08 16:46:14 +00001391 """Fail the test if the text matches the regular expression."""
Ezio Melottied3a7d22010-12-01 02:32:32 +00001392 if isinstance(unexpected_regex, (str, bytes)):
1393 unexpected_regex = re.compile(unexpected_regex)
1394 match = unexpected_regex.search(text)
Benjamin Petersonb48af542010-04-11 20:43:16 +00001395 if match:
Robert Collinsbe6caca2015-08-20 11:13:09 +12001396 standardMsg = 'Regex matched: %r matches %r in %r' % (
1397 text[match.start() : match.end()],
1398 unexpected_regex.pattern,
1399 text)
1400 # _formatMessage ensures the longMessage option is respected
1401 msg = self._formatMessage(msg, standardMsg)
Benjamin Petersonb48af542010-04-11 20:43:16 +00001402 raise self.failureException(msg)
1403
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001404
Ezio Melottied3a7d22010-12-01 02:32:32 +00001405 def _deprecate(original_func):
1406 def deprecated_func(*args, **kwargs):
1407 warnings.warn(
1408 'Please use {0} instead.'.format(original_func.__name__),
1409 DeprecationWarning, 2)
1410 return original_func(*args, **kwargs)
1411 return deprecated_func
1412
Ezio Melotti361467e2011-04-03 17:37:58 +03001413 # see #9424
Ezio Melotti0f535012011-04-03 18:02:13 +03001414 failUnlessEqual = assertEquals = _deprecate(assertEqual)
1415 failIfEqual = assertNotEquals = _deprecate(assertNotEqual)
1416 failUnlessAlmostEqual = assertAlmostEquals = _deprecate(assertAlmostEqual)
1417 failIfAlmostEqual = assertNotAlmostEquals = _deprecate(assertNotAlmostEqual)
1418 failUnless = assert_ = _deprecate(assertTrue)
1419 failUnlessRaises = _deprecate(assertRaises)
1420 failIf = _deprecate(assertFalse)
Ezio Melottied3a7d22010-12-01 02:32:32 +00001421 assertRaisesRegexp = _deprecate(assertRaisesRegex)
1422 assertRegexpMatches = _deprecate(assertRegex)
Robert Collinsbe6caca2015-08-20 11:13:09 +12001423 assertNotRegexpMatches = _deprecate(assertNotRegex)
Ezio Melottied3a7d22010-12-01 02:32:32 +00001424
1425
1426
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001427class FunctionTestCase(TestCase):
1428 """A test case that wraps a test function.
1429
1430 This is useful for slipping pre-existing test functions into the
1431 unittest framework. Optionally, set-up and tidy-up functions can be
1432 supplied. As with TestCase, the tidy-up ('tearDown') function will
1433 always be called if the set-up ('setUp') function ran successfully.
1434 """
1435
1436 def __init__(self, testFunc, setUp=None, tearDown=None, description=None):
1437 super(FunctionTestCase, self).__init__()
1438 self._setUpFunc = setUp
1439 self._tearDownFunc = tearDown
1440 self._testFunc = testFunc
1441 self._description = description
1442
1443 def setUp(self):
1444 if self._setUpFunc is not None:
1445 self._setUpFunc()
1446
1447 def tearDown(self):
1448 if self._tearDownFunc is not None:
1449 self._tearDownFunc()
1450
1451 def runTest(self):
1452 self._testFunc()
1453
1454 def id(self):
1455 return self._testFunc.__name__
1456
1457 def __eq__(self, other):
1458 if not isinstance(other, self.__class__):
1459 return NotImplemented
1460
1461 return self._setUpFunc == other._setUpFunc and \
1462 self._tearDownFunc == other._tearDownFunc and \
1463 self._testFunc == other._testFunc and \
1464 self._description == other._description
1465
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001466 def __hash__(self):
1467 return hash((type(self), self._setUpFunc, self._tearDownFunc,
1468 self._testFunc, self._description))
1469
1470 def __str__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001471 return "%s (%s)" % (strclass(self.__class__),
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001472 self._testFunc.__name__)
1473
1474 def __repr__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001475 return "<%s tec=%s>" % (strclass(self.__class__),
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001476 self._testFunc)
1477
1478 def shortDescription(self):
1479 if self._description is not None:
1480 return self._description
1481 doc = self._testFunc.__doc__
1482 return doc and doc.split("\n")[0].strip() or None
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001483
1484
1485class _SubTest(TestCase):
1486
1487 def __init__(self, test_case, message, params):
1488 super().__init__()
1489 self._message = message
1490 self.test_case = test_case
1491 self.params = params
1492 self.failureException = test_case.failureException
1493
1494 def runTest(self):
1495 raise NotImplementedError("subtests cannot be run directly")
1496
1497 def _subDescription(self):
1498 parts = []
Berker Peksag16ea19f2016-09-21 19:34:15 +03001499 if self._message is not _subtest_msg_sentinel:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001500 parts.append("[{}]".format(self._message))
1501 if self.params:
1502 params_desc = ', '.join(
1503 "{}={!r}".format(k, v)
Serhiy Storchaka48fbe522017-06-23 21:47:39 +03001504 for (k, v) in self.params.items())
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001505 parts.append("({})".format(params_desc))
1506 return " ".join(parts) or '(<subtest>)'
1507
1508 def id(self):
1509 return "{} {}".format(self.test_case.id(), self._subDescription())
1510
1511 def shortDescription(self):
1512 """Returns a one-line description of the subtest, or None if no
1513 description has been provided.
1514 """
1515 return self.test_case.shortDescription()
1516
1517 def __str__(self):
1518 return "{} {}".format(self.test_case, self._subDescription())