blob: f8bc865ee82039f70258ab2fd9e809649ca7896a [file] [log] [blame]
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001"""Test case implementation"""
2
3import sys
4import functools
5import difflib
6import pprint
7import re
8import warnings
Raymond Hettinger6e165b32010-11-27 09:31:37 +00009import collections
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010010import contextlib
Antoine Pitrou96810222014-04-29 01:23:50 +020011import traceback
Naitree Zhud5fd75c2019-09-09 22:06:48 +080012import types
Benjamin Petersonbed7d042009-07-19 21:01:52 +000013
Benjamin Peterson847a4112010-03-14 15:04:17 +000014from . import result
Florent Xiclunac53ae582011-11-04 08:25:54 +010015from .util import (strclass, safe_repr, _count_diff_all_purpose,
Serhiy Storchaka77622f52013-09-23 23:07:00 +030016 _count_diff_hashable, _common_shorten_repr)
Benjamin Petersonbed7d042009-07-19 21:01:52 +000017
Benjamin Petersondccc1fc2010-03-22 00:15:53 +000018__unittest = True
Benjamin Petersonbed7d042009-07-19 21:01:52 +000019
Berker Peksag16ea19f2016-09-21 19:34:15 +030020_subtest_msg_sentinel = object()
Michael Foord9dad32e2010-06-05 13:49:56 +000021
22DIFF_OMITTED = ('\nDiff is %s characters long. '
23 'Set self.maxDiff to None to see it.')
24
Benjamin Petersonbed7d042009-07-19 21:01:52 +000025class SkipTest(Exception):
26 """
27 Raise this exception in a test to skip it.
28
Ezio Melotti265281a2013-03-27 20:11:55 +020029 Usually you can use TestCase.skipTest() or one of the skipping decorators
Benjamin Petersonbed7d042009-07-19 21:01:52 +000030 instead of raising this directly.
31 """
Benjamin Petersonbed7d042009-07-19 21:01:52 +000032
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010033class _ShouldStop(Exception):
Benjamin Petersonbed7d042009-07-19 21:01:52 +000034 """
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010035 The test should stop.
Benjamin Petersonbed7d042009-07-19 21:01:52 +000036 """
37
Benjamin Petersonbed7d042009-07-19 21:01:52 +000038class _UnexpectedSuccess(Exception):
39 """
40 The test was supposed to fail, but it didn't!
41 """
Michael Foordb3468f72010-12-19 03:19:47 +000042
43
44class _Outcome(object):
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010045 def __init__(self, result=None):
46 self.expecting_failure = False
47 self.result = result
48 self.result_supports_subtests = hasattr(result, "addSubTest")
Michael Foordb3468f72010-12-19 03:19:47 +000049 self.success = True
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010050 self.skipped = []
Michael Foordb3468f72010-12-19 03:19:47 +000051 self.expectedFailure = None
52 self.errors = []
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010053
54 @contextlib.contextmanager
55 def testPartExecutor(self, test_case, isTest=False):
56 old_success = self.success
57 self.success = True
58 try:
59 yield
60 except KeyboardInterrupt:
61 raise
62 except SkipTest as e:
63 self.success = False
64 self.skipped.append((test_case, str(e)))
65 except _ShouldStop:
66 pass
67 except:
68 exc_info = sys.exc_info()
69 if self.expecting_failure:
70 self.expectedFailure = exc_info
71 else:
72 self.success = False
73 self.errors.append((test_case, exc_info))
Victor Stinner031bd532013-12-09 01:52:50 +010074 # explicitly break a reference cycle:
75 # exc_info -> frame -> exc_info
76 exc_info = None
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010077 else:
78 if self.result_supports_subtests and self.success:
79 self.errors.append((test_case, None))
80 finally:
81 self.success = self.success and old_success
Michael Foordb3468f72010-12-19 03:19:47 +000082
Benjamin Petersonbed7d042009-07-19 21:01:52 +000083
84def _id(obj):
85 return obj
86
Lisa Roach0f221d02018-11-08 18:34:33 -080087
88_module_cleanups = []
Serhiy Storchaka2085bd02019-06-01 11:00:15 +030089def addModuleCleanup(function, /, *args, **kwargs):
Lisa Roach0f221d02018-11-08 18:34:33 -080090 """Same as addCleanup, except the cleanup items are called even if
91 setUpModule fails (unlike tearDownModule)."""
92 _module_cleanups.append((function, args, kwargs))
93
94
95def doModuleCleanups():
96 """Execute all module cleanup functions. Normally called for you after
97 tearDownModule."""
98 exceptions = []
99 while _module_cleanups:
100 function, args, kwargs = _module_cleanups.pop()
101 try:
102 function(*args, **kwargs)
103 except Exception as exc:
104 exceptions.append(exc)
105 if exceptions:
106 # Swallows all but first exception. If a multi-exception handler
107 # gets written we should use that here instead.
108 raise exceptions[0]
109
110
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000111def skip(reason):
112 """
113 Unconditionally skip a test.
114 """
115 def decorator(test_item):
Antoine Pitroub05ac862012-04-25 14:56:46 +0200116 if not isinstance(test_item, type):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000117 @functools.wraps(test_item)
118 def skip_wrapper(*args, **kwargs):
119 raise SkipTest(reason)
120 test_item = skip_wrapper
121
122 test_item.__unittest_skip__ = True
123 test_item.__unittest_skip_why__ = reason
124 return test_item
Naitree Zhud5fd75c2019-09-09 22:06:48 +0800125 if isinstance(reason, types.FunctionType):
126 test_item = reason
127 reason = ''
128 return decorator(test_item)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000129 return decorator
130
131def skipIf(condition, reason):
132 """
133 Skip a test if the condition is true.
134 """
135 if condition:
136 return skip(reason)
137 return _id
138
139def skipUnless(condition, reason):
140 """
141 Skip a test unless the condition is true.
142 """
143 if not condition:
144 return skip(reason)
145 return _id
146
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100147def expectedFailure(test_item):
148 test_item.__unittest_expecting_failure__ = True
149 return test_item
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000150
Serhiy Storchaka041dd8e2015-05-21 20:15:40 +0300151def _is_subtype(expected, basetype):
152 if isinstance(expected, tuple):
153 return all(_is_subtype(e, basetype) for e in expected)
154 return isinstance(expected, type) and issubclass(expected, basetype)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000155
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200156class _BaseTestCaseContext:
157
158 def __init__(self, test_case):
159 self.test_case = test_case
160
161 def _raiseFailure(self, standardMsg):
162 msg = self.test_case._formatMessage(self.msg, standardMsg)
163 raise self.test_case.failureException(msg)
164
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200165class _AssertRaisesBaseContext(_BaseTestCaseContext):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000166
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300167 def __init__(self, expected, test_case, expected_regex=None):
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200168 _BaseTestCaseContext.__init__(self, test_case)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000169 self.expected = expected
Ezio Melottib4dc2502011-05-06 15:01:41 +0300170 self.test_case = test_case
R David Murrayef1c2672014-03-25 15:31:50 -0400171 if expected_regex is not None:
Ezio Melottied3a7d22010-12-01 02:32:32 +0000172 expected_regex = re.compile(expected_regex)
173 self.expected_regex = expected_regex
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300174 self.obj_name = None
Ezio Melottib4dc2502011-05-06 15:01:41 +0300175 self.msg = None
176
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300177 def handle(self, name, args, kwargs):
Ezio Melottib4dc2502011-05-06 15:01:41 +0300178 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300179 If args is empty, assertRaises/Warns is being used as a
Ezio Melottib4dc2502011-05-06 15:01:41 +0300180 context manager, so check for a 'msg' kwarg and return self.
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300181 If args is not empty, call a callable passing positional and keyword
182 arguments.
Ezio Melottib4dc2502011-05-06 15:01:41 +0300183 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300184 try:
Victor Stinnerbbd3cf82017-03-28 00:56:28 +0200185 if not _is_subtype(self.expected, self._base_type):
186 raise TypeError('%s() arg 1 must be %s' %
187 (name, self._base_type_str))
Victor Stinnerbbd3cf82017-03-28 00:56:28 +0200188 if not args:
189 self.msg = kwargs.pop('msg', None)
190 if kwargs:
Serhiy Storchaka77d57812018-08-19 10:00:11 +0300191 raise TypeError('%r is an invalid keyword argument for '
192 'this function' % (next(iter(kwargs)),))
Victor Stinnerbbd3cf82017-03-28 00:56:28 +0200193 return self
194
195 callable_obj, *args = args
196 try:
197 self.obj_name = callable_obj.__name__
198 except AttributeError:
199 self.obj_name = str(callable_obj)
200 with self:
201 callable_obj(*args, **kwargs)
202 finally:
203 # bpo-23890: manually break a reference cycle
204 self = None
Ezio Melottib4dc2502011-05-06 15:01:41 +0300205
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000206
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000207class _AssertRaisesContext(_AssertRaisesBaseContext):
208 """A context manager used to implement TestCase.assertRaises* methods."""
209
Serhiy Storchaka041dd8e2015-05-21 20:15:40 +0300210 _base_type = BaseException
211 _base_type_str = 'an exception type or tuple of exception types'
212
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000213 def __enter__(self):
Ezio Melotti49008232010-02-08 21:57:48 +0000214 return self
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000215
216 def __exit__(self, exc_type, exc_value, tb):
217 if exc_type is None:
218 try:
219 exc_name = self.expected.__name__
220 except AttributeError:
221 exc_name = str(self.expected)
222 if self.obj_name:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300223 self._raiseFailure("{} not raised by {}".format(exc_name,
224 self.obj_name))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000225 else:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300226 self._raiseFailure("{} not raised".format(exc_name))
Antoine Pitrou96810222014-04-29 01:23:50 +0200227 else:
228 traceback.clear_frames(tb)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000229 if not issubclass(exc_type, self.expected):
230 # let unexpected exceptions pass through
231 return False
Ezio Melotti49008232010-02-08 21:57:48 +0000232 # store exception, without traceback, for later retrieval
233 self.exception = exc_value.with_traceback(None)
Ezio Melottied3a7d22010-12-01 02:32:32 +0000234 if self.expected_regex is None:
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000235 return True
236
Ezio Melottied3a7d22010-12-01 02:32:32 +0000237 expected_regex = self.expected_regex
238 if not expected_regex.search(str(exc_value)):
Ezio Melottib4dc2502011-05-06 15:01:41 +0300239 self._raiseFailure('"{}" does not match "{}"'.format(
240 expected_regex.pattern, str(exc_value)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000241 return True
242
Batuhan TaÅŸkaya03615562020-04-10 17:46:36 +0300243 __class_getitem__ = classmethod(types.GenericAlias)
244
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000245
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000246class _AssertWarnsContext(_AssertRaisesBaseContext):
247 """A context manager used to implement TestCase.assertWarns* methods."""
248
Serhiy Storchaka041dd8e2015-05-21 20:15:40 +0300249 _base_type = Warning
250 _base_type_str = 'a warning type or tuple of warning types'
251
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000252 def __enter__(self):
253 # The __warningregistry__'s need to be in a pristine state for tests
254 # to work properly.
255 for v in sys.modules.values():
256 if getattr(v, '__warningregistry__', None):
257 v.__warningregistry__ = {}
258 self.warnings_manager = warnings.catch_warnings(record=True)
259 self.warnings = self.warnings_manager.__enter__()
260 warnings.simplefilter("always", self.expected)
261 return self
262
263 def __exit__(self, exc_type, exc_value, tb):
264 self.warnings_manager.__exit__(exc_type, exc_value, tb)
265 if exc_type is not None:
266 # let unexpected exceptions pass through
267 return
268 try:
269 exc_name = self.expected.__name__
270 except AttributeError:
271 exc_name = str(self.expected)
272 first_matching = None
273 for m in self.warnings:
274 w = m.message
275 if not isinstance(w, self.expected):
276 continue
277 if first_matching is None:
278 first_matching = w
Ezio Melottied3a7d22010-12-01 02:32:32 +0000279 if (self.expected_regex is not None and
280 not self.expected_regex.search(str(w))):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000281 continue
282 # store warning for later retrieval
283 self.warning = w
284 self.filename = m.filename
285 self.lineno = m.lineno
286 return
287 # Now we simply try to choose a helpful failure message
288 if first_matching is not None:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300289 self._raiseFailure('"{}" does not match "{}"'.format(
290 self.expected_regex.pattern, str(first_matching)))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000291 if self.obj_name:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300292 self._raiseFailure("{} not triggered by {}".format(exc_name,
293 self.obj_name))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000294 else:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300295 self._raiseFailure("{} not triggered".format(exc_name))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000296
297
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200298
Serhiy Storchaka48fbe522017-06-23 21:47:39 +0300299class _OrderedChainMap(collections.ChainMap):
300 def __iter__(self):
301 seen = set()
302 for mapping in self.maps:
303 for k in mapping:
304 if k not in seen:
305 seen.add(k)
306 yield k
307
308
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000309class TestCase(object):
310 """A class whose instances are single test cases.
311
312 By default, the test code itself should be placed in a method named
313 'runTest'.
314
315 If the fixture may be used for many test cases, create as
316 many test methods as are needed. When instantiating such a TestCase
317 subclass, specify in the constructor arguments the name of the test method
318 that the instance is to execute.
319
320 Test authors should subclass TestCase for their own tests. Construction
321 and deconstruction of the test's environment ('fixture') can be
322 implemented by overriding the 'setUp' and 'tearDown' methods respectively.
323
324 If it is necessary to override the __init__ method, the base class
325 __init__ method must always be called. It is important that subclasses
326 should not change the signature of their __init__ method, since instances
327 of the classes are instantiated automatically by parts of the framework
328 in order to be run.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000329
Ezio Melotti31797e52013-03-29 03:42:29 +0200330 When subclassing TestCase, you can set these attributes:
331 * failureException: determines which exception will be raised when
332 the instance's assertion methods fail; test methods raising this
333 exception will be deemed to have 'failed' rather than 'errored'.
334 * longMessage: determines whether long messages (including repr of
335 objects used in assert methods) will be printed on failure in *addition*
336 to any explicit message passed.
337 * maxDiff: sets the maximum length of a diff in failure messages
338 by assert methods using difflib. It is looked up as an instance
339 attribute so can be configured by individual tests if required.
340 """
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000341
342 failureException = AssertionError
343
Michael Foord5074df62010-12-03 00:53:09 +0000344 longMessage = True
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000345
Michael Foord085dfd32010-06-05 12:17:02 +0000346 maxDiff = 80*8
347
Ezio Melottiedd117f2011-04-27 10:20:38 +0300348 # If a string is longer than _diffThreshold, use normal comparison instead
349 # of difflib. See #11763.
350 _diffThreshold = 2**16
351
Benjamin Peterson847a4112010-03-14 15:04:17 +0000352 # Attribute used by TestSuite for classSetUp
353
354 _classSetupFailed = False
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000355
Lisa Roach0f221d02018-11-08 18:34:33 -0800356 _class_cleanups = []
357
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000358 def __init__(self, methodName='runTest'):
359 """Create an instance of the class that will use the named test
360 method when executed. Raises a ValueError if the instance does
361 not have a method with the specified name.
362 """
363 self._testMethodName = methodName
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100364 self._outcome = None
Michael Foord32e1d832011-01-03 17:00:11 +0000365 self._testMethodDoc = 'No test'
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000366 try:
367 testMethod = getattr(self, methodName)
368 except AttributeError:
Michael Foord32e1d832011-01-03 17:00:11 +0000369 if methodName != 'runTest':
370 # we allow instantiation with no explicit method name
371 # but not an *incorrect* or missing method name
372 raise ValueError("no such test method in %s: %s" %
373 (self.__class__, methodName))
374 else:
375 self._testMethodDoc = testMethod.__doc__
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000376 self._cleanups = []
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100377 self._subtest = None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000378
379 # Map types to custom assertEqual functions that will compare
380 # instances of said type in more detail to generate a more useful
381 # error message.
Benjamin Peterson34b2b262011-07-12 19:21:42 -0500382 self._type_equality_funcs = {}
Michael Foord8ca6d982010-11-20 15:34:26 +0000383 self.addTypeEqualityFunc(dict, 'assertDictEqual')
384 self.addTypeEqualityFunc(list, 'assertListEqual')
385 self.addTypeEqualityFunc(tuple, 'assertTupleEqual')
386 self.addTypeEqualityFunc(set, 'assertSetEqual')
387 self.addTypeEqualityFunc(frozenset, 'assertSetEqual')
388 self.addTypeEqualityFunc(str, 'assertMultiLineEqual')
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000389
390 def addTypeEqualityFunc(self, typeobj, function):
391 """Add a type specific assertEqual style function to compare a type.
392
393 This method is for use by TestCase subclasses that need to register
394 their own type equality functions to provide nicer error messages.
395
396 Args:
397 typeobj: The data type to call this function on when both values
398 are of the same type in assertEqual().
399 function: The callable taking two arguments and an optional
400 msg= argument that raises self.failureException with a
401 useful error message when the two arguments are not equal.
402 """
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000403 self._type_equality_funcs[typeobj] = function
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000404
Serhiy Storchaka142566c2019-06-05 18:22:31 +0300405 def addCleanup(self, function, /, *args, **kwargs):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000406 """Add a function, with arguments, to be called when the test is
407 completed. Functions added are called on a LIFO basis and are
408 called after tearDown on test failure or success.
409
410 Cleanup items are called even if setUp fails (unlike tearDown)."""
411 self._cleanups.append((function, args, kwargs))
412
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300413 @classmethod
414 def addClassCleanup(cls, function, /, *args, **kwargs):
Lisa Roach0f221d02018-11-08 18:34:33 -0800415 """Same as addCleanup, except the cleanup items are called even if
416 setUpClass fails (unlike tearDownClass)."""
417 cls._class_cleanups.append((function, args, kwargs))
418
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000419 def setUp(self):
420 "Hook method for setting up the test fixture before exercising it."
421 pass
422
423 def tearDown(self):
424 "Hook method for deconstructing the test fixture after testing it."
425 pass
426
Benjamin Peterson847a4112010-03-14 15:04:17 +0000427 @classmethod
428 def setUpClass(cls):
429 "Hook method for setting up class fixture before running tests in the class."
430
431 @classmethod
432 def tearDownClass(cls):
433 "Hook method for deconstructing the class fixture after running all tests in the class."
434
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000435 def countTestCases(self):
436 return 1
437
438 def defaultTestResult(self):
439 return result.TestResult()
440
441 def shortDescription(self):
Michael Foord34c94622010-02-10 15:51:42 +0000442 """Returns a one-line description of the test, or None if no
443 description has been provided.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000444
Michael Foord34c94622010-02-10 15:51:42 +0000445 The default implementation of this method returns the first line of
446 the specified test method's docstring.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000447 """
Michael Foord34c94622010-02-10 15:51:42 +0000448 doc = self._testMethodDoc
Steve Cirelli032de732020-02-03 02:06:50 -0500449 return doc.strip().split("\n")[0].strip() if doc else None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000450
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000451
452 def id(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000453 return "%s.%s" % (strclass(self.__class__), self._testMethodName)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000454
455 def __eq__(self, other):
456 if type(self) is not type(other):
457 return NotImplemented
458
459 return self._testMethodName == other._testMethodName
460
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000461 def __hash__(self):
462 return hash((type(self), self._testMethodName))
463
464 def __str__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000465 return "%s (%s)" % (self._testMethodName, strclass(self.__class__))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000466
467 def __repr__(self):
468 return "<%s testMethod=%s>" % \
Benjamin Peterson847a4112010-03-14 15:04:17 +0000469 (strclass(self.__class__), self._testMethodName)
470
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100471 def _addSkip(self, result, test_case, reason):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000472 addSkip = getattr(result, 'addSkip', None)
473 if addSkip is not None:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100474 addSkip(test_case, reason)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000475 else:
476 warnings.warn("TestResult has no addSkip method, skips not reported",
477 RuntimeWarning, 2)
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100478 result.addSuccess(test_case)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000479
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100480 @contextlib.contextmanager
Berker Peksag16ea19f2016-09-21 19:34:15 +0300481 def subTest(self, msg=_subtest_msg_sentinel, **params):
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100482 """Return a context manager that will return the enclosed block
483 of code in a subtest identified by the optional message and
484 keyword parameters. A failure in the subtest marks the test
485 case as failed but resumes execution at the end of the enclosed
486 block, allowing further test code to be executed.
487 """
Bruno Oliveirada2bf9f2018-10-12 07:35:55 -0300488 if self._outcome is None or not self._outcome.result_supports_subtests:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100489 yield
490 return
491 parent = self._subtest
492 if parent is None:
Serhiy Storchaka48fbe522017-06-23 21:47:39 +0300493 params_map = _OrderedChainMap(params)
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100494 else:
495 params_map = parent.params.new_child(params)
496 self._subtest = _SubTest(self, msg, params_map)
Michael Foordb3468f72010-12-19 03:19:47 +0000497 try:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100498 with self._outcome.testPartExecutor(self._subtest, isTest=True):
499 yield
500 if not self._outcome.success:
501 result = self._outcome.result
502 if result is not None and result.failfast:
503 raise _ShouldStop
504 elif self._outcome.expectedFailure:
505 # If the test is expecting a failure, we really want to
506 # stop now and register the expected failure.
507 raise _ShouldStop
508 finally:
509 self._subtest = parent
510
511 def _feedErrorsToResult(self, result, errors):
512 for test, exc_info in errors:
513 if isinstance(test, _SubTest):
514 result.addSubTest(test.test_case, test, exc_info)
515 elif exc_info is not None:
516 if issubclass(exc_info[0], self.failureException):
517 result.addFailure(test, exc_info)
518 else:
519 result.addError(test, exc_info)
520
521 def _addExpectedFailure(self, result, exc_info):
522 try:
523 addExpectedFailure = result.addExpectedFailure
524 except AttributeError:
525 warnings.warn("TestResult has no addExpectedFailure method, reporting as passes",
526 RuntimeWarning)
527 result.addSuccess(self)
528 else:
529 addExpectedFailure(self, exc_info)
530
531 def _addUnexpectedSuccess(self, result):
532 try:
533 addUnexpectedSuccess = result.addUnexpectedSuccess
534 except AttributeError:
535 warnings.warn("TestResult has no addUnexpectedSuccess method, reporting as failure",
536 RuntimeWarning)
537 # We need to pass an actual exception and traceback to addFailure,
538 # otherwise the legacy result can choke.
539 try:
540 raise _UnexpectedSuccess from None
541 except _UnexpectedSuccess:
542 result.addFailure(self, sys.exc_info())
543 else:
544 addUnexpectedSuccess(self)
Michael Foordb3468f72010-12-19 03:19:47 +0000545
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300546 def _callSetUp(self):
547 self.setUp()
548
549 def _callTestMethod(self, method):
550 method()
551
552 def _callTearDown(self):
553 self.tearDown()
554
555 def _callCleanup(self, function, /, *args, **kwargs):
556 function(*args, **kwargs)
557
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000558 def run(self, result=None):
559 orig_result = result
560 if result is None:
561 result = self.defaultTestResult()
562 startTestRun = getattr(result, 'startTestRun', None)
563 if startTestRun is not None:
564 startTestRun()
565
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000566 result.startTest(self)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000567
568 testMethod = getattr(self, self._testMethodName)
569 if (getattr(self.__class__, "__unittest_skip__", False) or
570 getattr(testMethod, "__unittest_skip__", False)):
571 # If the class or method was skipped.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000572 try:
Benjamin Peterson847a4112010-03-14 15:04:17 +0000573 skip_why = (getattr(self.__class__, '__unittest_skip_why__', '')
574 or getattr(testMethod, '__unittest_skip_why__', ''))
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100575 self._addSkip(result, self, skip_why)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000576 finally:
577 result.stopTest(self)
578 return
Robert Collinsed599b72015-08-28 10:34:51 +1200579 expecting_failure_method = getattr(testMethod,
580 "__unittest_expecting_failure__", False)
581 expecting_failure_class = getattr(self,
582 "__unittest_expecting_failure__", False)
583 expecting_failure = expecting_failure_class or expecting_failure_method
Victor Stinner031bd532013-12-09 01:52:50 +0100584 outcome = _Outcome(result)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000585 try:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100586 self._outcome = outcome
Michael Foordb3468f72010-12-19 03:19:47 +0000587
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100588 with outcome.testPartExecutor(self):
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300589 self._callSetUp()
Michael Foordb3468f72010-12-19 03:19:47 +0000590 if outcome.success:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100591 outcome.expecting_failure = expecting_failure
592 with outcome.testPartExecutor(self, isTest=True):
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300593 self._callTestMethod(testMethod)
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100594 outcome.expecting_failure = False
595 with outcome.testPartExecutor(self):
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300596 self._callTearDown()
Michael Foordb3468f72010-12-19 03:19:47 +0000597
598 self.doCleanups()
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100599 for test, reason in outcome.skipped:
600 self._addSkip(result, test, reason)
601 self._feedErrorsToResult(result, outcome.errors)
Michael Foordb3468f72010-12-19 03:19:47 +0000602 if outcome.success:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100603 if expecting_failure:
604 if outcome.expectedFailure:
605 self._addExpectedFailure(result, outcome.expectedFailure)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000606 else:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100607 self._addUnexpectedSuccess(result)
608 else:
609 result.addSuccess(self)
Michael Foord1341bb02011-03-14 19:01:46 -0400610 return result
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000611 finally:
612 result.stopTest(self)
613 if orig_result is None:
614 stopTestRun = getattr(result, 'stopTestRun', None)
615 if stopTestRun is not None:
616 stopTestRun()
617
Victor Stinner031bd532013-12-09 01:52:50 +0100618 # explicitly break reference cycles:
619 # outcome.errors -> frame -> outcome -> outcome.errors
620 # outcome.expectedFailure -> frame -> outcome -> outcome.expectedFailure
621 outcome.errors.clear()
622 outcome.expectedFailure = None
623
624 # clear the outcome, no more needed
625 self._outcome = None
626
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000627 def doCleanups(self):
628 """Execute all cleanup functions. Normally called for you after
629 tearDown."""
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100630 outcome = self._outcome or _Outcome()
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000631 while self._cleanups:
Michael Foordb3468f72010-12-19 03:19:47 +0000632 function, args, kwargs = self._cleanups.pop()
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100633 with outcome.testPartExecutor(self):
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300634 self._callCleanup(function, *args, **kwargs)
Michael Foordb3468f72010-12-19 03:19:47 +0000635
636 # return this for backwards compatibility
Lisa Roach0f221d02018-11-08 18:34:33 -0800637 # even though we no longer use it internally
Michael Foordb3468f72010-12-19 03:19:47 +0000638 return outcome.success
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000639
Lisa Roach0f221d02018-11-08 18:34:33 -0800640 @classmethod
641 def doClassCleanups(cls):
642 """Execute all class cleanup functions. Normally called for you after
643 tearDownClass."""
644 cls.tearDown_exceptions = []
645 while cls._class_cleanups:
646 function, args, kwargs = cls._class_cleanups.pop()
647 try:
648 function(*args, **kwargs)
Pablo Galindo293dd232019-11-19 21:34:03 +0000649 except Exception:
Lisa Roach0f221d02018-11-08 18:34:33 -0800650 cls.tearDown_exceptions.append(sys.exc_info())
651
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000652 def __call__(self, *args, **kwds):
653 return self.run(*args, **kwds)
654
655 def debug(self):
656 """Run the test without collecting errors in a TestResult"""
657 self.setUp()
658 getattr(self, self._testMethodName)()
659 self.tearDown()
Michael Foordb8748742010-06-10 16:16:08 +0000660 while self._cleanups:
661 function, args, kwargs = self._cleanups.pop(-1)
662 function(*args, **kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000663
664 def skipTest(self, reason):
665 """Skip this test."""
666 raise SkipTest(reason)
667
668 def fail(self, msg=None):
669 """Fail immediately, with the given message."""
670 raise self.failureException(msg)
671
672 def assertFalse(self, expr, msg=None):
Ezio Melotti3044fa72010-12-18 17:31:58 +0000673 """Check that the expression is false."""
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000674 if expr:
Ezio Melotti3044fa72010-12-18 17:31:58 +0000675 msg = self._formatMessage(msg, "%s is not false" % safe_repr(expr))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000676 raise self.failureException(msg)
677
678 def assertTrue(self, expr, msg=None):
Ezio Melotti3044fa72010-12-18 17:31:58 +0000679 """Check that the expression is true."""
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000680 if not expr:
Ezio Melotti3044fa72010-12-18 17:31:58 +0000681 msg = self._formatMessage(msg, "%s is not true" % safe_repr(expr))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000682 raise self.failureException(msg)
683
684 def _formatMessage(self, msg, standardMsg):
685 """Honour the longMessage attribute when generating failure messages.
686 If longMessage is False this means:
687 * Use only an explicit message if it is provided
688 * Otherwise use the standard message for the assert
689
690 If longMessage is True:
691 * Use the standard message
692 * If an explicit message is provided, plus ' : ' and the explicit message
693 """
694 if not self.longMessage:
695 return msg or standardMsg
696 if msg is None:
697 return standardMsg
Benjamin Peterson847a4112010-03-14 15:04:17 +0000698 try:
699 # don't switch to '{}' formatting in Python 2.X
700 # it changes the way unicode input is handled
701 return '%s : %s' % (standardMsg, msg)
702 except UnicodeDecodeError:
703 return '%s : %s' % (safe_repr(standardMsg), safe_repr(msg))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000704
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300705 def assertRaises(self, expected_exception, *args, **kwargs):
706 """Fail unless an exception of class expected_exception is raised
707 by the callable when invoked with specified positional and
708 keyword arguments. If a different type of exception is
Andrew Svetlov737fb892012-12-18 21:14:22 +0200709 raised, it will not be caught, and the test case will be
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000710 deemed to have suffered an error, exactly as for an
711 unexpected exception.
712
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300713 If called with the callable and arguments omitted, will return a
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000714 context object used like this::
715
Michael Foord1c42b122010-02-05 22:58:21 +0000716 with self.assertRaises(SomeException):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000717 do_something()
Michael Foord1c42b122010-02-05 22:58:21 +0000718
Ezio Melottib4dc2502011-05-06 15:01:41 +0300719 An optional keyword argument 'msg' can be provided when assertRaises
720 is used as a context object.
721
Michael Foord1c42b122010-02-05 22:58:21 +0000722 The context manager keeps a reference to the exception as
Ezio Melotti49008232010-02-08 21:57:48 +0000723 the 'exception' attribute. This allows you to inspect the
Michael Foord1c42b122010-02-05 22:58:21 +0000724 exception after the assertion::
725
726 with self.assertRaises(SomeException) as cm:
727 do_something()
Ezio Melotti49008232010-02-08 21:57:48 +0000728 the_exception = cm.exception
Michael Foordb57ac6d2010-02-05 23:26:29 +0000729 self.assertEqual(the_exception.error_code, 3)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000730 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300731 context = _AssertRaisesContext(expected_exception, self)
Victor Stinnerbbd3cf82017-03-28 00:56:28 +0200732 try:
733 return context.handle('assertRaises', args, kwargs)
734 finally:
735 # bpo-23890: manually break a reference cycle
736 context = None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000737
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300738 def assertWarns(self, expected_warning, *args, **kwargs):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000739 """Fail unless a warning of class warnClass is triggered
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300740 by the callable when invoked with specified positional and
741 keyword arguments. If a different type of warning is
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000742 triggered, it will not be handled: depending on the other
743 warning filtering rules in effect, it might be silenced, printed
744 out, or raised as an exception.
745
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300746 If called with the callable and arguments omitted, will return a
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000747 context object used like this::
748
749 with self.assertWarns(SomeWarning):
750 do_something()
751
Ezio Melottib4dc2502011-05-06 15:01:41 +0300752 An optional keyword argument 'msg' can be provided when assertWarns
753 is used as a context object.
754
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000755 The context manager keeps a reference to the first matching
756 warning as the 'warning' attribute; similarly, the 'filename'
757 and 'lineno' attributes give you information about the line
758 of Python code from which the warning was triggered.
759 This allows you to inspect the warning after the assertion::
760
761 with self.assertWarns(SomeWarning) as cm:
762 do_something()
763 the_warning = cm.warning
764 self.assertEqual(the_warning.some_attribute, 147)
765 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300766 context = _AssertWarnsContext(expected_warning, self)
767 return context.handle('assertWarns', args, kwargs)
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000768
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200769 def assertLogs(self, logger=None, level=None):
770 """Fail unless a log message of level *level* or higher is emitted
771 on *logger_name* or its children. If omitted, *level* defaults to
772 INFO and *logger* defaults to the root logger.
773
774 This method must be used as a context manager, and will yield
775 a recording object with two attributes: `output` and `records`.
776 At the end of the context manager, the `output` attribute will
777 be a list of the matching formatted log messages and the
778 `records` attribute will be a list of the corresponding LogRecord
779 objects.
780
781 Example::
782
783 with self.assertLogs('foo', level='INFO') as cm:
784 logging.getLogger('foo').info('first message')
785 logging.getLogger('foo.bar').error('second message')
786 self.assertEqual(cm.output, ['INFO:foo:first message',
787 'ERROR:foo.bar:second message'])
788 """
Serhiy Storchaka515fce42020-04-25 11:35:18 +0300789 # Lazy import to avoid importing logging if it is not needed.
790 from ._log import _AssertLogsContext
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200791 return _AssertLogsContext(self, logger, level)
792
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000793 def _getAssertEqualityFunc(self, first, second):
794 """Get a detailed comparison function for the types of the two args.
795
796 Returns: A callable accepting (first, second, msg=None) that will
797 raise a failure exception if first != second with a useful human
798 readable error message for those types.
799 """
800 #
801 # NOTE(gregory.p.smith): I considered isinstance(first, type(second))
802 # and vice versa. I opted for the conservative approach in case
803 # subclasses are not intended to be compared in detail to their super
804 # class instances using a type equality func. This means testing
805 # subtypes won't automagically use the detailed comparison. Callers
806 # should use their type specific assertSpamEqual method to compare
807 # subclasses if the detailed comparison is desired and appropriate.
808 # See the discussion in http://bugs.python.org/issue2578.
809 #
810 if type(first) is type(second):
811 asserter = self._type_equality_funcs.get(type(first))
812 if asserter is not None:
Benjamin Peterson34b2b262011-07-12 19:21:42 -0500813 if isinstance(asserter, str):
814 asserter = getattr(self, asserter)
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000815 return asserter
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000816
817 return self._baseAssertEqual
818
819 def _baseAssertEqual(self, first, second, msg=None):
820 """The default assertEqual implementation, not type specific."""
821 if not first == second:
Serhiy Storchaka77622f52013-09-23 23:07:00 +0300822 standardMsg = '%s != %s' % _common_shorten_repr(first, second)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000823 msg = self._formatMessage(msg, standardMsg)
824 raise self.failureException(msg)
825
826 def assertEqual(self, first, second, msg=None):
827 """Fail if the two objects are unequal as determined by the '=='
828 operator.
829 """
830 assertion_func = self._getAssertEqualityFunc(first, second)
831 assertion_func(first, second, msg=msg)
832
833 def assertNotEqual(self, first, second, msg=None):
Ezio Melotti90eea972012-11-08 11:08:39 +0200834 """Fail if the two objects are equal as determined by the '!='
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000835 operator.
836 """
837 if not first != second:
Benjamin Peterson847a4112010-03-14 15:04:17 +0000838 msg = self._formatMessage(msg, '%s == %s' % (safe_repr(first),
839 safe_repr(second)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000840 raise self.failureException(msg)
841
Michael Foord321d0592010-11-02 13:44:51 +0000842 def assertAlmostEqual(self, first, second, places=None, msg=None,
Benjamin Petersonb48af542010-04-11 20:43:16 +0000843 delta=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000844 """Fail if the two objects are unequal as determined by their
845 difference rounded to the given number of decimal places
Benjamin Petersonb48af542010-04-11 20:43:16 +0000846 (default 7) and comparing to zero, or by comparing that the
Ron032a6482017-10-18 20:01:23 +0300847 difference between the two objects is more than the given
848 delta.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000849
850 Note that decimal places (from zero) are usually not the same
Martin Pantereb995702016-07-28 01:11:04 +0000851 as significant digits (measured from the most significant digit).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000852
853 If the two objects compare equal then they will automatically
854 compare almost equal.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000855 """
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000856 if first == second:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000857 # shortcut
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000858 return
Benjamin Petersonb48af542010-04-11 20:43:16 +0000859 if delta is not None and places is not None:
860 raise TypeError("specify delta or places not both")
861
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200862 diff = abs(first - second)
Benjamin Petersonb48af542010-04-11 20:43:16 +0000863 if delta is not None:
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200864 if diff <= delta:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000865 return
866
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200867 standardMsg = '%s != %s within %s delta (%s difference)' % (
868 safe_repr(first),
869 safe_repr(second),
870 safe_repr(delta),
871 safe_repr(diff))
Benjamin Petersonb48af542010-04-11 20:43:16 +0000872 else:
873 if places is None:
874 places = 7
875
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200876 if round(diff, places) == 0:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000877 return
878
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200879 standardMsg = '%s != %s within %r places (%s difference)' % (
880 safe_repr(first),
881 safe_repr(second),
882 places,
883 safe_repr(diff))
Benjamin Petersonb48af542010-04-11 20:43:16 +0000884 msg = self._formatMessage(msg, standardMsg)
885 raise self.failureException(msg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000886
Michael Foord321d0592010-11-02 13:44:51 +0000887 def assertNotAlmostEqual(self, first, second, places=None, msg=None,
Benjamin Petersonb48af542010-04-11 20:43:16 +0000888 delta=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000889 """Fail if the two objects are equal as determined by their
890 difference rounded to the given number of decimal places
Benjamin Petersonb48af542010-04-11 20:43:16 +0000891 (default 7) and comparing to zero, or by comparing that the
Ron032a6482017-10-18 20:01:23 +0300892 difference between the two objects is less than the given delta.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000893
894 Note that decimal places (from zero) are usually not the same
Martin Pantereb995702016-07-28 01:11:04 +0000895 as significant digits (measured from the most significant digit).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000896
897 Objects that are equal automatically fail.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000898 """
Benjamin Petersonb48af542010-04-11 20:43:16 +0000899 if delta is not None and places is not None:
900 raise TypeError("specify delta or places not both")
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200901 diff = abs(first - second)
Benjamin Petersonb48af542010-04-11 20:43:16 +0000902 if delta is not None:
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200903 if not (first == second) and diff > delta:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000904 return
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200905 standardMsg = '%s == %s within %s delta (%s difference)' % (
906 safe_repr(first),
907 safe_repr(second),
908 safe_repr(delta),
909 safe_repr(diff))
Benjamin Petersonb48af542010-04-11 20:43:16 +0000910 else:
911 if places is None:
912 places = 7
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200913 if not (first == second) and round(diff, places) != 0:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000914 return
Benjamin Peterson847a4112010-03-14 15:04:17 +0000915 standardMsg = '%s == %s within %r places' % (safe_repr(first),
Benjamin Petersonb48af542010-04-11 20:43:16 +0000916 safe_repr(second),
917 places)
918
919 msg = self._formatMessage(msg, standardMsg)
920 raise self.failureException(msg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000921
Michael Foord085dfd32010-06-05 12:17:02 +0000922 def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000923 """An equality assertion for ordered sequences (like lists and tuples).
924
R. David Murrayad13f222010-01-29 22:17:58 +0000925 For the purposes of this function, a valid ordered sequence type is one
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000926 which can be indexed, has a length, and has an equality operator.
927
928 Args:
929 seq1: The first sequence to compare.
930 seq2: The second sequence to compare.
931 seq_type: The expected datatype of the sequences, or None if no
932 datatype should be enforced.
933 msg: Optional message to use on failure instead of a list of
934 differences.
935 """
Benjamin Petersonb29614e2012-10-09 11:16:03 -0400936 if seq_type is not None:
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000937 seq_type_name = seq_type.__name__
938 if not isinstance(seq1, seq_type):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000939 raise self.failureException('First sequence is not a %s: %s'
940 % (seq_type_name, safe_repr(seq1)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000941 if not isinstance(seq2, seq_type):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000942 raise self.failureException('Second sequence is not a %s: %s'
943 % (seq_type_name, safe_repr(seq2)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000944 else:
945 seq_type_name = "sequence"
946
947 differing = None
948 try:
949 len1 = len(seq1)
950 except (TypeError, NotImplementedError):
951 differing = 'First %s has no length. Non-sequence?' % (
952 seq_type_name)
953
954 if differing is None:
955 try:
956 len2 = len(seq2)
957 except (TypeError, NotImplementedError):
958 differing = 'Second %s has no length. Non-sequence?' % (
959 seq_type_name)
960
961 if differing is None:
962 if seq1 == seq2:
963 return
964
Serhiy Storchaka77622f52013-09-23 23:07:00 +0300965 differing = '%ss differ: %s != %s\n' % (
966 (seq_type_name.capitalize(),) +
967 _common_shorten_repr(seq1, seq2))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000968
969 for i in range(min(len1, len2)):
970 try:
971 item1 = seq1[i]
972 except (TypeError, IndexError, NotImplementedError):
973 differing += ('\nUnable to index element %d of first %s\n' %
974 (i, seq_type_name))
975 break
976
977 try:
978 item2 = seq2[i]
979 except (TypeError, IndexError, NotImplementedError):
980 differing += ('\nUnable to index element %d of second %s\n' %
981 (i, seq_type_name))
982 break
983
984 if item1 != item2:
985 differing += ('\nFirst differing element %d:\n%s\n%s\n' %
Serhiy Storchaka685fbed2016-04-25 08:58:25 +0300986 ((i,) + _common_shorten_repr(item1, item2)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000987 break
988 else:
989 if (len1 == len2 and seq_type is None and
990 type(seq1) != type(seq2)):
991 # The sequences are the same, but have differing types.
992 return
993
994 if len1 > len2:
995 differing += ('\nFirst %s contains %d additional '
996 'elements.\n' % (seq_type_name, len1 - len2))
997 try:
998 differing += ('First extra element %d:\n%s\n' %
Serhiy Storchaka685fbed2016-04-25 08:58:25 +0300999 (len2, safe_repr(seq1[len2])))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001000 except (TypeError, IndexError, NotImplementedError):
1001 differing += ('Unable to index element %d '
1002 'of first %s\n' % (len2, seq_type_name))
1003 elif len1 < len2:
1004 differing += ('\nSecond %s contains %d additional '
1005 'elements.\n' % (seq_type_name, len2 - len1))
1006 try:
1007 differing += ('First extra element %d:\n%s\n' %
Serhiy Storchaka685fbed2016-04-25 08:58:25 +03001008 (len1, safe_repr(seq2[len1])))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001009 except (TypeError, IndexError, NotImplementedError):
1010 differing += ('Unable to index element %d '
1011 'of second %s\n' % (len1, seq_type_name))
Michael Foord2034d9a2010-06-05 11:27:52 +00001012 standardMsg = differing
1013 diffMsg = '\n' + '\n'.join(
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001014 difflib.ndiff(pprint.pformat(seq1).splitlines(),
1015 pprint.pformat(seq2).splitlines()))
Michael Foord085dfd32010-06-05 12:17:02 +00001016
1017 standardMsg = self._truncateMessage(standardMsg, diffMsg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001018 msg = self._formatMessage(msg, standardMsg)
1019 self.fail(msg)
1020
Michael Foord085dfd32010-06-05 12:17:02 +00001021 def _truncateMessage(self, message, diff):
1022 max_diff = self.maxDiff
1023 if max_diff is None or len(diff) <= max_diff:
1024 return message + diff
Michael Foord9dad32e2010-06-05 13:49:56 +00001025 return message + (DIFF_OMITTED % len(diff))
Michael Foord085dfd32010-06-05 12:17:02 +00001026
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001027 def assertListEqual(self, list1, list2, msg=None):
1028 """A list-specific equality assertion.
1029
1030 Args:
1031 list1: The first list to compare.
1032 list2: The second list to compare.
1033 msg: Optional message to use on failure instead of a list of
1034 differences.
1035
1036 """
1037 self.assertSequenceEqual(list1, list2, msg, seq_type=list)
1038
1039 def assertTupleEqual(self, tuple1, tuple2, msg=None):
1040 """A tuple-specific equality assertion.
1041
1042 Args:
1043 tuple1: The first tuple to compare.
1044 tuple2: The second tuple to compare.
1045 msg: Optional message to use on failure instead of a list of
1046 differences.
1047 """
1048 self.assertSequenceEqual(tuple1, tuple2, msg, seq_type=tuple)
1049
1050 def assertSetEqual(self, set1, set2, msg=None):
1051 """A set-specific equality assertion.
1052
1053 Args:
1054 set1: The first set to compare.
1055 set2: The second set to compare.
1056 msg: Optional message to use on failure instead of a list of
1057 differences.
1058
Michael Foord91c9da32010-03-20 17:21:27 +00001059 assertSetEqual uses ducktyping to support different types of sets, and
1060 is optimized for sets specifically (parameters must support a
1061 difference method).
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001062 """
1063 try:
1064 difference1 = set1.difference(set2)
1065 except TypeError as e:
1066 self.fail('invalid type when attempting set difference: %s' % e)
1067 except AttributeError as e:
1068 self.fail('first argument does not support set difference: %s' % e)
1069
1070 try:
1071 difference2 = set2.difference(set1)
1072 except TypeError as e:
1073 self.fail('invalid type when attempting set difference: %s' % e)
1074 except AttributeError as e:
1075 self.fail('second argument does not support set difference: %s' % e)
1076
1077 if not (difference1 or difference2):
1078 return
1079
1080 lines = []
1081 if difference1:
1082 lines.append('Items in the first set but not the second:')
1083 for item in difference1:
1084 lines.append(repr(item))
1085 if difference2:
1086 lines.append('Items in the second set but not the first:')
1087 for item in difference2:
1088 lines.append(repr(item))
1089
1090 standardMsg = '\n'.join(lines)
1091 self.fail(self._formatMessage(msg, standardMsg))
1092
1093 def assertIn(self, member, container, msg=None):
1094 """Just like self.assertTrue(a in b), but with a nicer default message."""
1095 if member not in container:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001096 standardMsg = '%s not found in %s' % (safe_repr(member),
1097 safe_repr(container))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001098 self.fail(self._formatMessage(msg, standardMsg))
1099
1100 def assertNotIn(self, member, container, msg=None):
1101 """Just like self.assertTrue(a not in b), but with a nicer default message."""
1102 if member in container:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001103 standardMsg = '%s unexpectedly found in %s' % (safe_repr(member),
1104 safe_repr(container))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001105 self.fail(self._formatMessage(msg, standardMsg))
1106
1107 def assertIs(self, expr1, expr2, msg=None):
1108 """Just like self.assertTrue(a is b), but with a nicer default message."""
1109 if expr1 is not expr2:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001110 standardMsg = '%s is not %s' % (safe_repr(expr1),
1111 safe_repr(expr2))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001112 self.fail(self._formatMessage(msg, standardMsg))
1113
1114 def assertIsNot(self, expr1, expr2, msg=None):
1115 """Just like self.assertTrue(a is not b), but with a nicer default message."""
1116 if expr1 is expr2:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001117 standardMsg = 'unexpectedly identical: %s' % (safe_repr(expr1),)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001118 self.fail(self._formatMessage(msg, standardMsg))
1119
1120 def assertDictEqual(self, d1, d2, msg=None):
Ezio Melottib3aedd42010-11-20 19:04:17 +00001121 self.assertIsInstance(d1, dict, 'First argument is not a dictionary')
1122 self.assertIsInstance(d2, dict, 'Second argument is not a dictionary')
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001123
1124 if d1 != d2:
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001125 standardMsg = '%s != %s' % _common_shorten_repr(d1, d2)
Michael Foord085dfd32010-06-05 12:17:02 +00001126 diff = ('\n' + '\n'.join(difflib.ndiff(
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001127 pprint.pformat(d1).splitlines(),
1128 pprint.pformat(d2).splitlines())))
Michael Foordcb11b252010-06-05 13:14:43 +00001129 standardMsg = self._truncateMessage(standardMsg, diff)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001130 self.fail(self._formatMessage(msg, standardMsg))
1131
Ezio Melotti0f535012011-04-03 18:02:13 +03001132 def assertDictContainsSubset(self, subset, dictionary, msg=None):
1133 """Checks whether dictionary is a superset of subset."""
1134 warnings.warn('assertDictContainsSubset is deprecated',
1135 DeprecationWarning)
1136 missing = []
1137 mismatched = []
1138 for key, value in subset.items():
1139 if key not in dictionary:
1140 missing.append(key)
1141 elif value != dictionary[key]:
1142 mismatched.append('%s, expected: %s, actual: %s' %
1143 (safe_repr(key), safe_repr(value),
1144 safe_repr(dictionary[key])))
1145
1146 if not (missing or mismatched):
1147 return
1148
1149 standardMsg = ''
1150 if missing:
1151 standardMsg = 'Missing: %s' % ','.join(safe_repr(m) for m in
1152 missing)
1153 if mismatched:
1154 if standardMsg:
1155 standardMsg += '; '
1156 standardMsg += 'Mismatched values: %s' % ','.join(mismatched)
1157
1158 self.fail(self._formatMessage(msg, standardMsg))
1159
1160
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001161 def assertCountEqual(self, first, second, msg=None):
jkleint39baace2019-04-23 01:34:29 -07001162 """Asserts that two iterables have the same elements, the same number of
1163 times, without regard to order.
Michael Foord8442a602010-03-20 16:58:04 +00001164
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001165 self.assertEqual(Counter(list(first)),
1166 Counter(list(second)))
Michael Foord8442a602010-03-20 16:58:04 +00001167
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001168 Example:
Michael Foord8442a602010-03-20 16:58:04 +00001169 - [0, 1, 1] and [1, 0, 1] compare equal.
1170 - [0, 0, 1] and [0, 1] compare unequal.
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001171
Michael Foord8442a602010-03-20 16:58:04 +00001172 """
Michael Foorde180d392011-01-28 19:51:48 +00001173 first_seq, second_seq = list(first), list(second)
Michael Foord8442a602010-03-20 16:58:04 +00001174 try:
Michael Foorde180d392011-01-28 19:51:48 +00001175 first = collections.Counter(first_seq)
1176 second = collections.Counter(second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001177 except TypeError:
Raymond Hettinger6518f5e2010-12-24 00:52:54 +00001178 # Handle case with unhashable elements
Michael Foorde180d392011-01-28 19:51:48 +00001179 differences = _count_diff_all_purpose(first_seq, second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001180 else:
Michael Foorde180d392011-01-28 19:51:48 +00001181 if first == second:
Raymond Hettinger6e165b32010-11-27 09:31:37 +00001182 return
Michael Foorde180d392011-01-28 19:51:48 +00001183 differences = _count_diff_hashable(first_seq, second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001184
Raymond Hettinger93e233d2010-12-24 10:02:22 +00001185 if differences:
1186 standardMsg = 'Element counts were not equal:\n'
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001187 lines = ['First has %d, Second has %d: %r' % diff for diff in differences]
Raymond Hettinger93e233d2010-12-24 10:02:22 +00001188 diffMsg = '\n'.join(lines)
1189 standardMsg = self._truncateMessage(standardMsg, diffMsg)
1190 msg = self._formatMessage(msg, standardMsg)
1191 self.fail(msg)
Michael Foord8442a602010-03-20 16:58:04 +00001192
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001193 def assertMultiLineEqual(self, first, second, msg=None):
1194 """Assert that two multi-line strings are equal."""
Ezio Melottib3aedd42010-11-20 19:04:17 +00001195 self.assertIsInstance(first, str, 'First argument is not a string')
1196 self.assertIsInstance(second, str, 'Second argument is not a string')
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001197
1198 if first != second:
Ezio Melottiedd117f2011-04-27 10:20:38 +03001199 # don't use difflib if the strings are too long
1200 if (len(first) > self._diffThreshold or
1201 len(second) > self._diffThreshold):
1202 self._baseAssertEqual(first, second, msg)
Ezio Melottid8b509b2011-09-28 17:37:55 +03001203 firstlines = first.splitlines(keepends=True)
1204 secondlines = second.splitlines(keepends=True)
Michael Foordc653ce32010-07-10 13:52:22 +00001205 if len(firstlines) == 1 and first.strip('\r\n') == first:
1206 firstlines = [first + '\n']
1207 secondlines = [second + '\n']
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001208 standardMsg = '%s != %s' % _common_shorten_repr(first, second)
Michael Foordc653ce32010-07-10 13:52:22 +00001209 diff = '\n' + ''.join(difflib.ndiff(firstlines, secondlines))
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
1213 def assertLess(self, a, b, msg=None):
1214 """Just like self.assertTrue(a < b), but with a nicer default message."""
1215 if not a < b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001216 standardMsg = '%s not less than %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001217 self.fail(self._formatMessage(msg, standardMsg))
1218
1219 def assertLessEqual(self, a, b, msg=None):
1220 """Just like self.assertTrue(a <= b), but with a nicer default message."""
1221 if not a <= b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001222 standardMsg = '%s not less than or equal to %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001223 self.fail(self._formatMessage(msg, standardMsg))
1224
1225 def assertGreater(self, a, b, msg=None):
1226 """Just like self.assertTrue(a > b), but with a nicer default message."""
1227 if not a > b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001228 standardMsg = '%s not greater than %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001229 self.fail(self._formatMessage(msg, standardMsg))
1230
1231 def assertGreaterEqual(self, a, b, msg=None):
1232 """Just like self.assertTrue(a >= b), but with a nicer default message."""
1233 if not a >= b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001234 standardMsg = '%s not greater than or equal to %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001235 self.fail(self._formatMessage(msg, standardMsg))
1236
1237 def assertIsNone(self, obj, msg=None):
1238 """Same as self.assertTrue(obj is None), with a nicer default message."""
1239 if obj is not None:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001240 standardMsg = '%s is not None' % (safe_repr(obj),)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001241 self.fail(self._formatMessage(msg, standardMsg))
1242
1243 def assertIsNotNone(self, obj, msg=None):
1244 """Included for symmetry with assertIsNone."""
1245 if obj is None:
1246 standardMsg = 'unexpectedly None'
1247 self.fail(self._formatMessage(msg, standardMsg))
1248
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001249 def assertIsInstance(self, obj, cls, msg=None):
1250 """Same as self.assertTrue(isinstance(obj, cls)), with a nicer
1251 default message."""
1252 if not isinstance(obj, cls):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001253 standardMsg = '%s is not an instance of %r' % (safe_repr(obj), cls)
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001254 self.fail(self._formatMessage(msg, standardMsg))
1255
1256 def assertNotIsInstance(self, obj, cls, msg=None):
1257 """Included for symmetry with assertIsInstance."""
1258 if isinstance(obj, cls):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001259 standardMsg = '%s is an instance of %r' % (safe_repr(obj), cls)
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001260 self.fail(self._formatMessage(msg, standardMsg))
1261
Ezio Melottied3a7d22010-12-01 02:32:32 +00001262 def assertRaisesRegex(self, expected_exception, expected_regex,
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001263 *args, **kwargs):
Ezio Melottied3a7d22010-12-01 02:32:32 +00001264 """Asserts that the message in a raised exception matches a regex.
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001265
1266 Args:
1267 expected_exception: Exception class expected to be raised.
Serhiy Storchaka0b5e61d2017-10-04 20:09:49 +03001268 expected_regex: Regex (re.Pattern object or string) expected
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001269 to be found in error message.
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001270 args: Function to be called and extra positional args.
1271 kwargs: Extra kwargs.
Ezio Melottib4dc2502011-05-06 15:01:41 +03001272 msg: Optional message used in case of failure. Can only be used
1273 when assertRaisesRegex is used as a context manager.
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001274 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001275 context = _AssertRaisesContext(expected_exception, self, expected_regex)
1276 return context.handle('assertRaisesRegex', args, kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001277
Ezio Melottied3a7d22010-12-01 02:32:32 +00001278 def assertWarnsRegex(self, expected_warning, expected_regex,
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001279 *args, **kwargs):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001280 """Asserts that the message in a triggered warning matches a regexp.
1281 Basic functioning is similar to assertWarns() with the addition
1282 that only warnings whose messages also match the regular expression
1283 are considered successful matches.
1284
1285 Args:
1286 expected_warning: Warning class expected to be triggered.
Serhiy Storchaka0b5e61d2017-10-04 20:09:49 +03001287 expected_regex: Regex (re.Pattern object or string) expected
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001288 to be found in error message.
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001289 args: Function to be called and extra positional args.
1290 kwargs: Extra kwargs.
Ezio Melottib4dc2502011-05-06 15:01:41 +03001291 msg: Optional message used in case of failure. Can only be used
1292 when assertWarnsRegex is used as a context manager.
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001293 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001294 context = _AssertWarnsContext(expected_warning, self, expected_regex)
1295 return context.handle('assertWarnsRegex', args, kwargs)
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001296
Ezio Melottied3a7d22010-12-01 02:32:32 +00001297 def assertRegex(self, text, expected_regex, msg=None):
Michael Foorde3ef5f12010-05-08 16:46:14 +00001298 """Fail the test unless the text matches the regular expression."""
Ezio Melottied3a7d22010-12-01 02:32:32 +00001299 if isinstance(expected_regex, (str, bytes)):
Gregory P. Smithed16bf42010-12-16 19:23:05 +00001300 assert expected_regex, "expected_regex must not be empty."
Ezio Melottied3a7d22010-12-01 02:32:32 +00001301 expected_regex = re.compile(expected_regex)
1302 if not expected_regex.search(text):
Robert Collinsbe6caca2015-08-20 11:13:09 +12001303 standardMsg = "Regex didn't match: %r not found in %r" % (
1304 expected_regex.pattern, text)
1305 # _formatMessage ensures the longMessage option is respected
1306 msg = self._formatMessage(msg, standardMsg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001307 raise self.failureException(msg)
1308
Ezio Melotti8f776302010-12-10 02:32:05 +00001309 def assertNotRegex(self, text, unexpected_regex, msg=None):
Michael Foorde3ef5f12010-05-08 16:46:14 +00001310 """Fail the test if the text matches the regular expression."""
Ezio Melottied3a7d22010-12-01 02:32:32 +00001311 if isinstance(unexpected_regex, (str, bytes)):
1312 unexpected_regex = re.compile(unexpected_regex)
1313 match = unexpected_regex.search(text)
Benjamin Petersonb48af542010-04-11 20:43:16 +00001314 if match:
Robert Collinsbe6caca2015-08-20 11:13:09 +12001315 standardMsg = 'Regex matched: %r matches %r in %r' % (
1316 text[match.start() : match.end()],
1317 unexpected_regex.pattern,
1318 text)
1319 # _formatMessage ensures the longMessage option is respected
1320 msg = self._formatMessage(msg, standardMsg)
Benjamin Petersonb48af542010-04-11 20:43:16 +00001321 raise self.failureException(msg)
1322
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001323
Ezio Melottied3a7d22010-12-01 02:32:32 +00001324 def _deprecate(original_func):
1325 def deprecated_func(*args, **kwargs):
1326 warnings.warn(
1327 'Please use {0} instead.'.format(original_func.__name__),
1328 DeprecationWarning, 2)
1329 return original_func(*args, **kwargs)
1330 return deprecated_func
1331
Ezio Melotti361467e2011-04-03 17:37:58 +03001332 # see #9424
Ezio Melotti0f535012011-04-03 18:02:13 +03001333 failUnlessEqual = assertEquals = _deprecate(assertEqual)
1334 failIfEqual = assertNotEquals = _deprecate(assertNotEqual)
1335 failUnlessAlmostEqual = assertAlmostEquals = _deprecate(assertAlmostEqual)
1336 failIfAlmostEqual = assertNotAlmostEquals = _deprecate(assertNotAlmostEqual)
1337 failUnless = assert_ = _deprecate(assertTrue)
1338 failUnlessRaises = _deprecate(assertRaises)
1339 failIf = _deprecate(assertFalse)
Ezio Melottied3a7d22010-12-01 02:32:32 +00001340 assertRaisesRegexp = _deprecate(assertRaisesRegex)
1341 assertRegexpMatches = _deprecate(assertRegex)
Robert Collinsbe6caca2015-08-20 11:13:09 +12001342 assertNotRegexpMatches = _deprecate(assertNotRegex)
Ezio Melottied3a7d22010-12-01 02:32:32 +00001343
1344
1345
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001346class FunctionTestCase(TestCase):
1347 """A test case that wraps a test function.
1348
1349 This is useful for slipping pre-existing test functions into the
1350 unittest framework. Optionally, set-up and tidy-up functions can be
1351 supplied. As with TestCase, the tidy-up ('tearDown') function will
1352 always be called if the set-up ('setUp') function ran successfully.
1353 """
1354
1355 def __init__(self, testFunc, setUp=None, tearDown=None, description=None):
1356 super(FunctionTestCase, self).__init__()
1357 self._setUpFunc = setUp
1358 self._tearDownFunc = tearDown
1359 self._testFunc = testFunc
1360 self._description = description
1361
1362 def setUp(self):
1363 if self._setUpFunc is not None:
1364 self._setUpFunc()
1365
1366 def tearDown(self):
1367 if self._tearDownFunc is not None:
1368 self._tearDownFunc()
1369
1370 def runTest(self):
1371 self._testFunc()
1372
1373 def id(self):
1374 return self._testFunc.__name__
1375
1376 def __eq__(self, other):
1377 if not isinstance(other, self.__class__):
1378 return NotImplemented
1379
1380 return self._setUpFunc == other._setUpFunc and \
1381 self._tearDownFunc == other._tearDownFunc and \
1382 self._testFunc == other._testFunc and \
1383 self._description == other._description
1384
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001385 def __hash__(self):
1386 return hash((type(self), self._setUpFunc, self._tearDownFunc,
1387 self._testFunc, self._description))
1388
1389 def __str__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001390 return "%s (%s)" % (strclass(self.__class__),
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001391 self._testFunc.__name__)
1392
1393 def __repr__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001394 return "<%s tec=%s>" % (strclass(self.__class__),
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001395 self._testFunc)
1396
1397 def shortDescription(self):
1398 if self._description is not None:
1399 return self._description
1400 doc = self._testFunc.__doc__
1401 return doc and doc.split("\n")[0].strip() or None
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001402
1403
1404class _SubTest(TestCase):
1405
1406 def __init__(self, test_case, message, params):
1407 super().__init__()
1408 self._message = message
1409 self.test_case = test_case
1410 self.params = params
1411 self.failureException = test_case.failureException
1412
1413 def runTest(self):
1414 raise NotImplementedError("subtests cannot be run directly")
1415
1416 def _subDescription(self):
1417 parts = []
Berker Peksag16ea19f2016-09-21 19:34:15 +03001418 if self._message is not _subtest_msg_sentinel:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001419 parts.append("[{}]".format(self._message))
1420 if self.params:
1421 params_desc = ', '.join(
1422 "{}={!r}".format(k, v)
Serhiy Storchaka48fbe522017-06-23 21:47:39 +03001423 for (k, v) in self.params.items())
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001424 parts.append("({})".format(params_desc))
1425 return " ".join(parts) or '(<subtest>)'
1426
1427 def id(self):
1428 return "{} {}".format(self.test_case.id(), self._subDescription())
1429
1430 def shortDescription(self):
1431 """Returns a one-line description of the subtest, or None if no
1432 description has been provided.
1433 """
1434 return self.test_case.shortDescription()
1435
1436 def __str__(self):
1437 return "{} {}".format(self.test_case, self._subDescription())