blob: 61003d0c6ead9351625b48cd1682eea223b98c50 [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.
kernc46398fb2020-06-11 20:03:29 +0200255 for v in list(sys.modules.values()):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000256 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
Serhiy Storchaka48fbe522017-06-23 21:47:39 +0300298class _OrderedChainMap(collections.ChainMap):
299 def __iter__(self):
300 seen = set()
301 for mapping in self.maps:
302 for k in mapping:
303 if k not in seen:
304 seen.add(k)
305 yield k
306
307
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000308class TestCase(object):
309 """A class whose instances are single test cases.
310
311 By default, the test code itself should be placed in a method named
312 'runTest'.
313
314 If the fixture may be used for many test cases, create as
315 many test methods as are needed. When instantiating such a TestCase
316 subclass, specify in the constructor arguments the name of the test method
317 that the instance is to execute.
318
319 Test authors should subclass TestCase for their own tests. Construction
320 and deconstruction of the test's environment ('fixture') can be
321 implemented by overriding the 'setUp' and 'tearDown' methods respectively.
322
323 If it is necessary to override the __init__ method, the base class
324 __init__ method must always be called. It is important that subclasses
325 should not change the signature of their __init__ method, since instances
326 of the classes are instantiated automatically by parts of the framework
327 in order to be run.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000328
Ezio Melotti31797e52013-03-29 03:42:29 +0200329 When subclassing TestCase, you can set these attributes:
330 * failureException: determines which exception will be raised when
331 the instance's assertion methods fail; test methods raising this
332 exception will be deemed to have 'failed' rather than 'errored'.
333 * longMessage: determines whether long messages (including repr of
334 objects used in assert methods) will be printed on failure in *addition*
335 to any explicit message passed.
336 * maxDiff: sets the maximum length of a diff in failure messages
337 by assert methods using difflib. It is looked up as an instance
338 attribute so can be configured by individual tests if required.
339 """
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000340
341 failureException = AssertionError
342
Michael Foord5074df62010-12-03 00:53:09 +0000343 longMessage = True
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000344
Michael Foord085dfd32010-06-05 12:17:02 +0000345 maxDiff = 80*8
346
Ezio Melottiedd117f2011-04-27 10:20:38 +0300347 # If a string is longer than _diffThreshold, use normal comparison instead
348 # of difflib. See #11763.
349 _diffThreshold = 2**16
350
Benjamin Peterson847a4112010-03-14 15:04:17 +0000351 # Attribute used by TestSuite for classSetUp
352
353 _classSetupFailed = False
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000354
Lisa Roach0f221d02018-11-08 18:34:33 -0800355 _class_cleanups = []
356
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000357 def __init__(self, methodName='runTest'):
358 """Create an instance of the class that will use the named test
359 method when executed. Raises a ValueError if the instance does
360 not have a method with the specified name.
361 """
362 self._testMethodName = methodName
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100363 self._outcome = None
Michael Foord32e1d832011-01-03 17:00:11 +0000364 self._testMethodDoc = 'No test'
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000365 try:
366 testMethod = getattr(self, methodName)
367 except AttributeError:
Michael Foord32e1d832011-01-03 17:00:11 +0000368 if methodName != 'runTest':
369 # we allow instantiation with no explicit method name
370 # but not an *incorrect* or missing method name
371 raise ValueError("no such test method in %s: %s" %
372 (self.__class__, methodName))
373 else:
374 self._testMethodDoc = testMethod.__doc__
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000375 self._cleanups = []
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100376 self._subtest = None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000377
378 # Map types to custom assertEqual functions that will compare
379 # instances of said type in more detail to generate a more useful
380 # error message.
Benjamin Peterson34b2b262011-07-12 19:21:42 -0500381 self._type_equality_funcs = {}
Michael Foord8ca6d982010-11-20 15:34:26 +0000382 self.addTypeEqualityFunc(dict, 'assertDictEqual')
383 self.addTypeEqualityFunc(list, 'assertListEqual')
384 self.addTypeEqualityFunc(tuple, 'assertTupleEqual')
385 self.addTypeEqualityFunc(set, 'assertSetEqual')
386 self.addTypeEqualityFunc(frozenset, 'assertSetEqual')
387 self.addTypeEqualityFunc(str, 'assertMultiLineEqual')
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000388
389 def addTypeEqualityFunc(self, typeobj, function):
390 """Add a type specific assertEqual style function to compare a type.
391
392 This method is for use by TestCase subclasses that need to register
393 their own type equality functions to provide nicer error messages.
394
395 Args:
396 typeobj: The data type to call this function on when both values
397 are of the same type in assertEqual().
398 function: The callable taking two arguments and an optional
399 msg= argument that raises self.failureException with a
400 useful error message when the two arguments are not equal.
401 """
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000402 self._type_equality_funcs[typeobj] = function
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000403
Serhiy Storchaka142566c2019-06-05 18:22:31 +0300404 def addCleanup(self, function, /, *args, **kwargs):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000405 """Add a function, with arguments, to be called when the test is
406 completed. Functions added are called on a LIFO basis and are
407 called after tearDown on test failure or success.
408
409 Cleanup items are called even if setUp fails (unlike tearDown)."""
410 self._cleanups.append((function, args, kwargs))
411
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300412 @classmethod
413 def addClassCleanup(cls, function, /, *args, **kwargs):
Lisa Roach0f221d02018-11-08 18:34:33 -0800414 """Same as addCleanup, except the cleanup items are called even if
415 setUpClass fails (unlike tearDownClass)."""
416 cls._class_cleanups.append((function, args, kwargs))
417
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000418 def setUp(self):
419 "Hook method for setting up the test fixture before exercising it."
420 pass
421
422 def tearDown(self):
423 "Hook method for deconstructing the test fixture after testing it."
424 pass
425
Benjamin Peterson847a4112010-03-14 15:04:17 +0000426 @classmethod
427 def setUpClass(cls):
428 "Hook method for setting up class fixture before running tests in the class."
429
430 @classmethod
431 def tearDownClass(cls):
432 "Hook method for deconstructing the class fixture after running all tests in the class."
433
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000434 def countTestCases(self):
435 return 1
436
437 def defaultTestResult(self):
438 return result.TestResult()
439
440 def shortDescription(self):
Michael Foord34c94622010-02-10 15:51:42 +0000441 """Returns a one-line description of the test, or None if no
442 description has been provided.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000443
Michael Foord34c94622010-02-10 15:51:42 +0000444 The default implementation of this method returns the first line of
445 the specified test method's docstring.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000446 """
Michael Foord34c94622010-02-10 15:51:42 +0000447 doc = self._testMethodDoc
Steve Cirelli032de732020-02-03 02:06:50 -0500448 return doc.strip().split("\n")[0].strip() if doc else None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000449
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000450
451 def id(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000452 return "%s.%s" % (strclass(self.__class__), self._testMethodName)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000453
454 def __eq__(self, other):
455 if type(self) is not type(other):
456 return NotImplemented
457
458 return self._testMethodName == other._testMethodName
459
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000460 def __hash__(self):
461 return hash((type(self), self._testMethodName))
462
463 def __str__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000464 return "%s (%s)" % (self._testMethodName, strclass(self.__class__))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000465
466 def __repr__(self):
467 return "<%s testMethod=%s>" % \
Benjamin Peterson847a4112010-03-14 15:04:17 +0000468 (strclass(self.__class__), self._testMethodName)
469
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100470 def _addSkip(self, result, test_case, reason):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000471 addSkip = getattr(result, 'addSkip', None)
472 if addSkip is not None:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100473 addSkip(test_case, reason)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000474 else:
475 warnings.warn("TestResult has no addSkip method, skips not reported",
476 RuntimeWarning, 2)
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100477 result.addSuccess(test_case)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000478
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100479 @contextlib.contextmanager
Berker Peksag16ea19f2016-09-21 19:34:15 +0300480 def subTest(self, msg=_subtest_msg_sentinel, **params):
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100481 """Return a context manager that will return the enclosed block
482 of code in a subtest identified by the optional message and
483 keyword parameters. A failure in the subtest marks the test
484 case as failed but resumes execution at the end of the enclosed
485 block, allowing further test code to be executed.
486 """
Bruno Oliveirada2bf9f2018-10-12 07:35:55 -0300487 if self._outcome is None or not self._outcome.result_supports_subtests:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100488 yield
489 return
490 parent = self._subtest
491 if parent is None:
Serhiy Storchaka48fbe522017-06-23 21:47:39 +0300492 params_map = _OrderedChainMap(params)
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100493 else:
494 params_map = parent.params.new_child(params)
495 self._subtest = _SubTest(self, msg, params_map)
Michael Foordb3468f72010-12-19 03:19:47 +0000496 try:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100497 with self._outcome.testPartExecutor(self._subtest, isTest=True):
498 yield
499 if not self._outcome.success:
500 result = self._outcome.result
501 if result is not None and result.failfast:
502 raise _ShouldStop
503 elif self._outcome.expectedFailure:
504 # If the test is expecting a failure, we really want to
505 # stop now and register the expected failure.
506 raise _ShouldStop
507 finally:
508 self._subtest = parent
509
510 def _feedErrorsToResult(self, result, errors):
511 for test, exc_info in errors:
512 if isinstance(test, _SubTest):
513 result.addSubTest(test.test_case, test, exc_info)
514 elif exc_info is not None:
515 if issubclass(exc_info[0], self.failureException):
516 result.addFailure(test, exc_info)
517 else:
518 result.addError(test, exc_info)
519
520 def _addExpectedFailure(self, result, exc_info):
521 try:
522 addExpectedFailure = result.addExpectedFailure
523 except AttributeError:
524 warnings.warn("TestResult has no addExpectedFailure method, reporting as passes",
525 RuntimeWarning)
526 result.addSuccess(self)
527 else:
528 addExpectedFailure(self, exc_info)
529
530 def _addUnexpectedSuccess(self, result):
531 try:
532 addUnexpectedSuccess = result.addUnexpectedSuccess
533 except AttributeError:
534 warnings.warn("TestResult has no addUnexpectedSuccess method, reporting as failure",
535 RuntimeWarning)
536 # We need to pass an actual exception and traceback to addFailure,
537 # otherwise the legacy result can choke.
538 try:
539 raise _UnexpectedSuccess from None
540 except _UnexpectedSuccess:
541 result.addFailure(self, sys.exc_info())
542 else:
543 addUnexpectedSuccess(self)
Michael Foordb3468f72010-12-19 03:19:47 +0000544
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300545 def _callSetUp(self):
546 self.setUp()
547
548 def _callTestMethod(self, method):
549 method()
550
551 def _callTearDown(self):
552 self.tearDown()
553
554 def _callCleanup(self, function, /, *args, **kwargs):
555 function(*args, **kwargs)
556
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000557 def run(self, result=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000558 if result is None:
559 result = self.defaultTestResult()
560 startTestRun = getattr(result, 'startTestRun', None)
Miss Islington (bot)d63114c2021-08-22 00:55:34 -0700561 stopTestRun = getattr(result, 'stopTestRun', None)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000562 if startTestRun is not None:
563 startTestRun()
Miss Islington (bot)d63114c2021-08-22 00:55:34 -0700564 else:
565 stopTestRun = None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000566
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000567 result.startTest(self)
Miss Islington (bot)d63114c2021-08-22 00:55:34 -0700568 try:
569 testMethod = getattr(self, self._testMethodName)
570 if (getattr(self.__class__, "__unittest_skip__", False) or
571 getattr(testMethod, "__unittest_skip__", False)):
572 # If the class or method was skipped.
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)
Miss Islington (bot)243b8de2021-08-30 06:43:38 -0700576 return result
Michael Foordb3468f72010-12-19 03:19:47 +0000577
Miss Islington (bot)d63114c2021-08-22 00:55:34 -0700578 expecting_failure = (
579 getattr(self, "__unittest_expecting_failure__", False) or
580 getattr(testMethod, "__unittest_expecting_failure__", False)
581 )
582 outcome = _Outcome(result)
583 try:
584 self._outcome = outcome
585
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100586 with outcome.testPartExecutor(self):
Miss Islington (bot)d63114c2021-08-22 00:55:34 -0700587 self._callSetUp()
588 if outcome.success:
589 outcome.expecting_failure = expecting_failure
590 with outcome.testPartExecutor(self, isTest=True):
591 self._callTestMethod(testMethod)
592 outcome.expecting_failure = False
593 with outcome.testPartExecutor(self):
594 self._callTearDown()
Michael Foordb3468f72010-12-19 03:19:47 +0000595
Miss Islington (bot)d63114c2021-08-22 00:55:34 -0700596 self.doCleanups()
597 for test, reason in outcome.skipped:
598 self._addSkip(result, test, reason)
599 self._feedErrorsToResult(result, outcome.errors)
600 if outcome.success:
601 if expecting_failure:
602 if outcome.expectedFailure:
603 self._addExpectedFailure(result, outcome.expectedFailure)
604 else:
605 self._addUnexpectedSuccess(result)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000606 else:
Miss Islington (bot)d63114c2021-08-22 00:55:34 -0700607 result.addSuccess(self)
608 return result
609 finally:
610 # explicitly break reference cycles:
611 # outcome.errors -> frame -> outcome -> outcome.errors
612 # outcome.expectedFailure -> frame -> outcome -> outcome.expectedFailure
613 outcome.errors.clear()
614 outcome.expectedFailure = None
615
616 # clear the outcome, no more needed
617 self._outcome = None
618
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000619 finally:
620 result.stopTest(self)
Miss Islington (bot)d63114c2021-08-22 00:55:34 -0700621 if stopTestRun is not None:
622 stopTestRun()
Victor Stinner031bd532013-12-09 01:52:50 +0100623
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000624 def doCleanups(self):
625 """Execute all cleanup functions. Normally called for you after
626 tearDown."""
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100627 outcome = self._outcome or _Outcome()
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000628 while self._cleanups:
Michael Foordb3468f72010-12-19 03:19:47 +0000629 function, args, kwargs = self._cleanups.pop()
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100630 with outcome.testPartExecutor(self):
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300631 self._callCleanup(function, *args, **kwargs)
Michael Foordb3468f72010-12-19 03:19:47 +0000632
633 # return this for backwards compatibility
Lisa Roach0f221d02018-11-08 18:34:33 -0800634 # even though we no longer use it internally
Michael Foordb3468f72010-12-19 03:19:47 +0000635 return outcome.success
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000636
Lisa Roach0f221d02018-11-08 18:34:33 -0800637 @classmethod
638 def doClassCleanups(cls):
639 """Execute all class cleanup functions. Normally called for you after
640 tearDownClass."""
641 cls.tearDown_exceptions = []
642 while cls._class_cleanups:
643 function, args, kwargs = cls._class_cleanups.pop()
644 try:
645 function(*args, **kwargs)
Pablo Galindo293dd232019-11-19 21:34:03 +0000646 except Exception:
Lisa Roach0f221d02018-11-08 18:34:33 -0800647 cls.tearDown_exceptions.append(sys.exc_info())
648
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000649 def __call__(self, *args, **kwds):
650 return self.run(*args, **kwds)
651
652 def debug(self):
653 """Run the test without collecting errors in a TestResult"""
Miss Islington (bot)753f7af2021-09-18 06:22:31 -0700654 testMethod = getattr(self, self._testMethodName)
655 if (getattr(self.__class__, "__unittest_skip__", False) or
656 getattr(testMethod, "__unittest_skip__", False)):
657 # If the class or method was skipped.
658 skip_why = (getattr(self.__class__, '__unittest_skip_why__', '')
659 or getattr(testMethod, '__unittest_skip_why__', ''))
660 raise SkipTest(skip_why)
661
Łukasz Langa44396aa2021-09-22 18:42:15 +0200662 self._callSetUp()
663 self._callTestMethod(testMethod)
664 self._callTearDown()
Michael Foordb8748742010-06-10 16:16:08 +0000665 while self._cleanups:
Łukasz Langa44396aa2021-09-22 18:42:15 +0200666 function, args, kwargs = self._cleanups.pop()
667 self._callCleanup(function, *args, **kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000668
669 def skipTest(self, reason):
670 """Skip this test."""
671 raise SkipTest(reason)
672
673 def fail(self, msg=None):
674 """Fail immediately, with the given message."""
675 raise self.failureException(msg)
676
677 def assertFalse(self, expr, msg=None):
Ezio Melotti3044fa72010-12-18 17:31:58 +0000678 """Check that the expression is false."""
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000679 if expr:
Ezio Melotti3044fa72010-12-18 17:31:58 +0000680 msg = self._formatMessage(msg, "%s is not false" % safe_repr(expr))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000681 raise self.failureException(msg)
682
683 def assertTrue(self, expr, msg=None):
Ezio Melotti3044fa72010-12-18 17:31:58 +0000684 """Check that the expression is true."""
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000685 if not expr:
Ezio Melotti3044fa72010-12-18 17:31:58 +0000686 msg = self._formatMessage(msg, "%s is not true" % safe_repr(expr))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000687 raise self.failureException(msg)
688
689 def _formatMessage(self, msg, standardMsg):
690 """Honour the longMessage attribute when generating failure messages.
691 If longMessage is False this means:
692 * Use only an explicit message if it is provided
693 * Otherwise use the standard message for the assert
694
695 If longMessage is True:
696 * Use the standard message
697 * If an explicit message is provided, plus ' : ' and the explicit message
698 """
699 if not self.longMessage:
700 return msg or standardMsg
701 if msg is None:
702 return standardMsg
Benjamin Peterson847a4112010-03-14 15:04:17 +0000703 try:
704 # don't switch to '{}' formatting in Python 2.X
705 # it changes the way unicode input is handled
706 return '%s : %s' % (standardMsg, msg)
707 except UnicodeDecodeError:
708 return '%s : %s' % (safe_repr(standardMsg), safe_repr(msg))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000709
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300710 def assertRaises(self, expected_exception, *args, **kwargs):
711 """Fail unless an exception of class expected_exception is raised
712 by the callable when invoked with specified positional and
713 keyword arguments. If a different type of exception is
Andrew Svetlov737fb892012-12-18 21:14:22 +0200714 raised, it will not be caught, and the test case will be
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000715 deemed to have suffered an error, exactly as for an
716 unexpected exception.
717
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300718 If called with the callable and arguments omitted, will return a
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000719 context object used like this::
720
Michael Foord1c42b122010-02-05 22:58:21 +0000721 with self.assertRaises(SomeException):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000722 do_something()
Michael Foord1c42b122010-02-05 22:58:21 +0000723
Ezio Melottib4dc2502011-05-06 15:01:41 +0300724 An optional keyword argument 'msg' can be provided when assertRaises
725 is used as a context object.
726
Michael Foord1c42b122010-02-05 22:58:21 +0000727 The context manager keeps a reference to the exception as
Ezio Melotti49008232010-02-08 21:57:48 +0000728 the 'exception' attribute. This allows you to inspect the
Michael Foord1c42b122010-02-05 22:58:21 +0000729 exception after the assertion::
730
731 with self.assertRaises(SomeException) as cm:
732 do_something()
Ezio Melotti49008232010-02-08 21:57:48 +0000733 the_exception = cm.exception
Michael Foordb57ac6d2010-02-05 23:26:29 +0000734 self.assertEqual(the_exception.error_code, 3)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000735 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300736 context = _AssertRaisesContext(expected_exception, self)
Victor Stinnerbbd3cf82017-03-28 00:56:28 +0200737 try:
738 return context.handle('assertRaises', args, kwargs)
739 finally:
740 # bpo-23890: manually break a reference cycle
741 context = None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000742
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300743 def assertWarns(self, expected_warning, *args, **kwargs):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000744 """Fail unless a warning of class warnClass is triggered
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300745 by the callable when invoked with specified positional and
746 keyword arguments. If a different type of warning is
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000747 triggered, it will not be handled: depending on the other
748 warning filtering rules in effect, it might be silenced, printed
749 out, or raised as an exception.
750
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300751 If called with the callable and arguments omitted, will return a
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000752 context object used like this::
753
754 with self.assertWarns(SomeWarning):
755 do_something()
756
Ezio Melottib4dc2502011-05-06 15:01:41 +0300757 An optional keyword argument 'msg' can be provided when assertWarns
758 is used as a context object.
759
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000760 The context manager keeps a reference to the first matching
761 warning as the 'warning' attribute; similarly, the 'filename'
762 and 'lineno' attributes give you information about the line
763 of Python code from which the warning was triggered.
764 This allows you to inspect the warning after the assertion::
765
766 with self.assertWarns(SomeWarning) as cm:
767 do_something()
768 the_warning = cm.warning
769 self.assertEqual(the_warning.some_attribute, 147)
770 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300771 context = _AssertWarnsContext(expected_warning, self)
772 return context.handle('assertWarns', args, kwargs)
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000773
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200774 def assertLogs(self, logger=None, level=None):
775 """Fail unless a log message of level *level* or higher is emitted
776 on *logger_name* or its children. If omitted, *level* defaults to
777 INFO and *logger* defaults to the root logger.
778
779 This method must be used as a context manager, and will yield
780 a recording object with two attributes: `output` and `records`.
781 At the end of the context manager, the `output` attribute will
782 be a list of the matching formatted log messages and the
783 `records` attribute will be a list of the corresponding LogRecord
784 objects.
785
786 Example::
787
788 with self.assertLogs('foo', level='INFO') as cm:
789 logging.getLogger('foo').info('first message')
790 logging.getLogger('foo.bar').error('second message')
791 self.assertEqual(cm.output, ['INFO:foo:first message',
792 'ERROR:foo.bar:second message'])
793 """
Serhiy Storchaka515fce42020-04-25 11:35:18 +0300794 # Lazy import to avoid importing logging if it is not needed.
795 from ._log import _AssertLogsContext
Kit Choi6b34d7b2020-07-01 22:08:38 +0100796 return _AssertLogsContext(self, logger, level, no_logs=False)
797
798 def assertNoLogs(self, logger=None, level=None):
799 """ Fail unless no log messages of level *level* or higher are emitted
800 on *logger_name* or its children.
801
802 This method must be used as a context manager.
803 """
804 from ._log import _AssertLogsContext
805 return _AssertLogsContext(self, logger, level, no_logs=True)
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200806
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000807 def _getAssertEqualityFunc(self, first, second):
808 """Get a detailed comparison function for the types of the two args.
809
810 Returns: A callable accepting (first, second, msg=None) that will
811 raise a failure exception if first != second with a useful human
812 readable error message for those types.
813 """
814 #
815 # NOTE(gregory.p.smith): I considered isinstance(first, type(second))
816 # and vice versa. I opted for the conservative approach in case
817 # subclasses are not intended to be compared in detail to their super
818 # class instances using a type equality func. This means testing
819 # subtypes won't automagically use the detailed comparison. Callers
820 # should use their type specific assertSpamEqual method to compare
821 # subclasses if the detailed comparison is desired and appropriate.
822 # See the discussion in http://bugs.python.org/issue2578.
823 #
824 if type(first) is type(second):
825 asserter = self._type_equality_funcs.get(type(first))
826 if asserter is not None:
Benjamin Peterson34b2b262011-07-12 19:21:42 -0500827 if isinstance(asserter, str):
828 asserter = getattr(self, asserter)
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000829 return asserter
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000830
831 return self._baseAssertEqual
832
833 def _baseAssertEqual(self, first, second, msg=None):
834 """The default assertEqual implementation, not type specific."""
835 if not first == second:
Serhiy Storchaka77622f52013-09-23 23:07:00 +0300836 standardMsg = '%s != %s' % _common_shorten_repr(first, second)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000837 msg = self._formatMessage(msg, standardMsg)
838 raise self.failureException(msg)
839
840 def assertEqual(self, first, second, msg=None):
841 """Fail if the two objects are unequal as determined by the '=='
842 operator.
843 """
844 assertion_func = self._getAssertEqualityFunc(first, second)
845 assertion_func(first, second, msg=msg)
846
847 def assertNotEqual(self, first, second, msg=None):
Ezio Melotti90eea972012-11-08 11:08:39 +0200848 """Fail if the two objects are equal as determined by the '!='
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000849 operator.
850 """
851 if not first != second:
Benjamin Peterson847a4112010-03-14 15:04:17 +0000852 msg = self._formatMessage(msg, '%s == %s' % (safe_repr(first),
853 safe_repr(second)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000854 raise self.failureException(msg)
855
Michael Foord321d0592010-11-02 13:44:51 +0000856 def assertAlmostEqual(self, first, second, places=None, msg=None,
Benjamin Petersonb48af542010-04-11 20:43:16 +0000857 delta=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000858 """Fail if the two objects are unequal as determined by their
859 difference rounded to the given number of decimal places
Benjamin Petersonb48af542010-04-11 20:43:16 +0000860 (default 7) and comparing to zero, or by comparing that the
Ron032a6482017-10-18 20:01:23 +0300861 difference between the two objects is more than the given
862 delta.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000863
864 Note that decimal places (from zero) are usually not the same
Martin Pantereb995702016-07-28 01:11:04 +0000865 as significant digits (measured from the most significant digit).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000866
867 If the two objects compare equal then they will automatically
868 compare almost equal.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000869 """
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000870 if first == second:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000871 # shortcut
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000872 return
Benjamin Petersonb48af542010-04-11 20:43:16 +0000873 if delta is not None and places is not None:
874 raise TypeError("specify delta or places not both")
875
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200876 diff = abs(first - second)
Benjamin Petersonb48af542010-04-11 20:43:16 +0000877 if delta is not None:
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200878 if diff <= delta:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000879 return
880
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200881 standardMsg = '%s != %s within %s delta (%s difference)' % (
882 safe_repr(first),
883 safe_repr(second),
884 safe_repr(delta),
885 safe_repr(diff))
Benjamin Petersonb48af542010-04-11 20:43:16 +0000886 else:
887 if places is None:
888 places = 7
889
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200890 if round(diff, places) == 0:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000891 return
892
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200893 standardMsg = '%s != %s within %r places (%s difference)' % (
894 safe_repr(first),
895 safe_repr(second),
896 places,
897 safe_repr(diff))
Benjamin Petersonb48af542010-04-11 20:43:16 +0000898 msg = self._formatMessage(msg, standardMsg)
899 raise self.failureException(msg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000900
Michael Foord321d0592010-11-02 13:44:51 +0000901 def assertNotAlmostEqual(self, first, second, places=None, msg=None,
Benjamin Petersonb48af542010-04-11 20:43:16 +0000902 delta=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000903 """Fail if the two objects are equal as determined by their
904 difference rounded to the given number of decimal places
Benjamin Petersonb48af542010-04-11 20:43:16 +0000905 (default 7) and comparing to zero, or by comparing that the
Ron032a6482017-10-18 20:01:23 +0300906 difference between the two objects is less than the given delta.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000907
908 Note that decimal places (from zero) are usually not the same
Martin Pantereb995702016-07-28 01:11:04 +0000909 as significant digits (measured from the most significant digit).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000910
911 Objects that are equal automatically fail.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000912 """
Benjamin Petersonb48af542010-04-11 20:43:16 +0000913 if delta is not None and places is not None:
914 raise TypeError("specify delta or places not both")
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200915 diff = abs(first - second)
Benjamin Petersonb48af542010-04-11 20:43:16 +0000916 if delta is not None:
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200917 if not (first == second) and diff > delta:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000918 return
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200919 standardMsg = '%s == %s within %s delta (%s difference)' % (
920 safe_repr(first),
921 safe_repr(second),
922 safe_repr(delta),
923 safe_repr(diff))
Benjamin Petersonb48af542010-04-11 20:43:16 +0000924 else:
925 if places is None:
926 places = 7
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200927 if not (first == second) and round(diff, places) != 0:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000928 return
Benjamin Peterson847a4112010-03-14 15:04:17 +0000929 standardMsg = '%s == %s within %r places' % (safe_repr(first),
Benjamin Petersonb48af542010-04-11 20:43:16 +0000930 safe_repr(second),
931 places)
932
933 msg = self._formatMessage(msg, standardMsg)
934 raise self.failureException(msg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000935
Michael Foord085dfd32010-06-05 12:17:02 +0000936 def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000937 """An equality assertion for ordered sequences (like lists and tuples).
938
R. David Murrayad13f222010-01-29 22:17:58 +0000939 For the purposes of this function, a valid ordered sequence type is one
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000940 which can be indexed, has a length, and has an equality operator.
941
942 Args:
943 seq1: The first sequence to compare.
944 seq2: The second sequence to compare.
945 seq_type: The expected datatype of the sequences, or None if no
946 datatype should be enforced.
947 msg: Optional message to use on failure instead of a list of
948 differences.
949 """
Benjamin Petersonb29614e2012-10-09 11:16:03 -0400950 if seq_type is not None:
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000951 seq_type_name = seq_type.__name__
952 if not isinstance(seq1, seq_type):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000953 raise self.failureException('First sequence is not a %s: %s'
954 % (seq_type_name, safe_repr(seq1)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000955 if not isinstance(seq2, seq_type):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000956 raise self.failureException('Second sequence is not a %s: %s'
957 % (seq_type_name, safe_repr(seq2)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000958 else:
959 seq_type_name = "sequence"
960
961 differing = None
962 try:
963 len1 = len(seq1)
964 except (TypeError, NotImplementedError):
965 differing = 'First %s has no length. Non-sequence?' % (
966 seq_type_name)
967
968 if differing is None:
969 try:
970 len2 = len(seq2)
971 except (TypeError, NotImplementedError):
972 differing = 'Second %s has no length. Non-sequence?' % (
973 seq_type_name)
974
975 if differing is None:
976 if seq1 == seq2:
977 return
978
Serhiy Storchaka77622f52013-09-23 23:07:00 +0300979 differing = '%ss differ: %s != %s\n' % (
980 (seq_type_name.capitalize(),) +
981 _common_shorten_repr(seq1, seq2))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000982
983 for i in range(min(len1, len2)):
984 try:
985 item1 = seq1[i]
986 except (TypeError, IndexError, NotImplementedError):
987 differing += ('\nUnable to index element %d of first %s\n' %
988 (i, seq_type_name))
989 break
990
991 try:
992 item2 = seq2[i]
993 except (TypeError, IndexError, NotImplementedError):
994 differing += ('\nUnable to index element %d of second %s\n' %
995 (i, seq_type_name))
996 break
997
998 if item1 != item2:
999 differing += ('\nFirst differing element %d:\n%s\n%s\n' %
Serhiy Storchaka685fbed2016-04-25 08:58:25 +03001000 ((i,) + _common_shorten_repr(item1, item2)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001001 break
1002 else:
1003 if (len1 == len2 and seq_type is None and
1004 type(seq1) != type(seq2)):
1005 # The sequences are the same, but have differing types.
1006 return
1007
1008 if len1 > len2:
1009 differing += ('\nFirst %s contains %d additional '
1010 'elements.\n' % (seq_type_name, len1 - len2))
1011 try:
1012 differing += ('First extra element %d:\n%s\n' %
Serhiy Storchaka685fbed2016-04-25 08:58:25 +03001013 (len2, safe_repr(seq1[len2])))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001014 except (TypeError, IndexError, NotImplementedError):
1015 differing += ('Unable to index element %d '
1016 'of first %s\n' % (len2, seq_type_name))
1017 elif len1 < len2:
1018 differing += ('\nSecond %s contains %d additional '
1019 'elements.\n' % (seq_type_name, len2 - len1))
1020 try:
1021 differing += ('First extra element %d:\n%s\n' %
Serhiy Storchaka685fbed2016-04-25 08:58:25 +03001022 (len1, safe_repr(seq2[len1])))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001023 except (TypeError, IndexError, NotImplementedError):
1024 differing += ('Unable to index element %d '
1025 'of second %s\n' % (len1, seq_type_name))
Michael Foord2034d9a2010-06-05 11:27:52 +00001026 standardMsg = differing
1027 diffMsg = '\n' + '\n'.join(
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001028 difflib.ndiff(pprint.pformat(seq1).splitlines(),
1029 pprint.pformat(seq2).splitlines()))
Michael Foord085dfd32010-06-05 12:17:02 +00001030
1031 standardMsg = self._truncateMessage(standardMsg, diffMsg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001032 msg = self._formatMessage(msg, standardMsg)
1033 self.fail(msg)
1034
Michael Foord085dfd32010-06-05 12:17:02 +00001035 def _truncateMessage(self, message, diff):
1036 max_diff = self.maxDiff
1037 if max_diff is None or len(diff) <= max_diff:
1038 return message + diff
Michael Foord9dad32e2010-06-05 13:49:56 +00001039 return message + (DIFF_OMITTED % len(diff))
Michael Foord085dfd32010-06-05 12:17:02 +00001040
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001041 def assertListEqual(self, list1, list2, msg=None):
1042 """A list-specific equality assertion.
1043
1044 Args:
1045 list1: The first list to compare.
1046 list2: The second list to compare.
1047 msg: Optional message to use on failure instead of a list of
1048 differences.
1049
1050 """
1051 self.assertSequenceEqual(list1, list2, msg, seq_type=list)
1052
1053 def assertTupleEqual(self, tuple1, tuple2, msg=None):
1054 """A tuple-specific equality assertion.
1055
1056 Args:
1057 tuple1: The first tuple to compare.
1058 tuple2: The second tuple to compare.
1059 msg: Optional message to use on failure instead of a list of
1060 differences.
1061 """
1062 self.assertSequenceEqual(tuple1, tuple2, msg, seq_type=tuple)
1063
1064 def assertSetEqual(self, set1, set2, msg=None):
1065 """A set-specific equality assertion.
1066
1067 Args:
1068 set1: The first set to compare.
1069 set2: The second set to compare.
1070 msg: Optional message to use on failure instead of a list of
1071 differences.
1072
Michael Foord91c9da32010-03-20 17:21:27 +00001073 assertSetEqual uses ducktyping to support different types of sets, and
1074 is optimized for sets specifically (parameters must support a
1075 difference method).
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001076 """
1077 try:
1078 difference1 = set1.difference(set2)
1079 except TypeError as e:
1080 self.fail('invalid type when attempting set difference: %s' % e)
1081 except AttributeError as e:
1082 self.fail('first argument does not support set difference: %s' % e)
1083
1084 try:
1085 difference2 = set2.difference(set1)
1086 except TypeError as e:
1087 self.fail('invalid type when attempting set difference: %s' % e)
1088 except AttributeError as e:
1089 self.fail('second argument does not support set difference: %s' % e)
1090
1091 if not (difference1 or difference2):
1092 return
1093
1094 lines = []
1095 if difference1:
1096 lines.append('Items in the first set but not the second:')
1097 for item in difference1:
1098 lines.append(repr(item))
1099 if difference2:
1100 lines.append('Items in the second set but not the first:')
1101 for item in difference2:
1102 lines.append(repr(item))
1103
1104 standardMsg = '\n'.join(lines)
1105 self.fail(self._formatMessage(msg, standardMsg))
1106
1107 def assertIn(self, member, container, msg=None):
1108 """Just like self.assertTrue(a in b), but with a nicer default message."""
1109 if member not in container:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001110 standardMsg = '%s not found in %s' % (safe_repr(member),
1111 safe_repr(container))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001112 self.fail(self._formatMessage(msg, standardMsg))
1113
1114 def assertNotIn(self, member, container, msg=None):
1115 """Just like self.assertTrue(a not in b), but with a nicer default message."""
1116 if member in container:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001117 standardMsg = '%s unexpectedly found in %s' % (safe_repr(member),
1118 safe_repr(container))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001119 self.fail(self._formatMessage(msg, standardMsg))
1120
1121 def assertIs(self, expr1, expr2, msg=None):
1122 """Just like self.assertTrue(a is b), but with a nicer default message."""
1123 if expr1 is not expr2:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001124 standardMsg = '%s is not %s' % (safe_repr(expr1),
1125 safe_repr(expr2))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001126 self.fail(self._formatMessage(msg, standardMsg))
1127
1128 def assertIsNot(self, expr1, expr2, msg=None):
1129 """Just like self.assertTrue(a is not b), but with a nicer default message."""
1130 if expr1 is expr2:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001131 standardMsg = 'unexpectedly identical: %s' % (safe_repr(expr1),)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001132 self.fail(self._formatMessage(msg, standardMsg))
1133
1134 def assertDictEqual(self, d1, d2, msg=None):
Ezio Melottib3aedd42010-11-20 19:04:17 +00001135 self.assertIsInstance(d1, dict, 'First argument is not a dictionary')
1136 self.assertIsInstance(d2, dict, 'Second argument is not a dictionary')
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001137
1138 if d1 != d2:
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001139 standardMsg = '%s != %s' % _common_shorten_repr(d1, d2)
Michael Foord085dfd32010-06-05 12:17:02 +00001140 diff = ('\n' + '\n'.join(difflib.ndiff(
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001141 pprint.pformat(d1).splitlines(),
1142 pprint.pformat(d2).splitlines())))
Michael Foordcb11b252010-06-05 13:14:43 +00001143 standardMsg = self._truncateMessage(standardMsg, diff)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001144 self.fail(self._formatMessage(msg, standardMsg))
1145
Ezio Melotti0f535012011-04-03 18:02:13 +03001146 def assertDictContainsSubset(self, subset, dictionary, msg=None):
1147 """Checks whether dictionary is a superset of subset."""
1148 warnings.warn('assertDictContainsSubset is deprecated',
Anthony Sottile7c99e432021-11-15 22:11:02 -05001149 DeprecationWarning,
1150 stacklevel=2)
Ezio Melotti0f535012011-04-03 18:02:13 +03001151 missing = []
1152 mismatched = []
1153 for key, value in subset.items():
1154 if key not in dictionary:
1155 missing.append(key)
1156 elif value != dictionary[key]:
1157 mismatched.append('%s, expected: %s, actual: %s' %
1158 (safe_repr(key), safe_repr(value),
1159 safe_repr(dictionary[key])))
1160
1161 if not (missing or mismatched):
1162 return
1163
1164 standardMsg = ''
1165 if missing:
1166 standardMsg = 'Missing: %s' % ','.join(safe_repr(m) for m in
1167 missing)
1168 if mismatched:
1169 if standardMsg:
1170 standardMsg += '; '
1171 standardMsg += 'Mismatched values: %s' % ','.join(mismatched)
1172
1173 self.fail(self._formatMessage(msg, standardMsg))
1174
1175
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001176 def assertCountEqual(self, first, second, msg=None):
jkleint39baace2019-04-23 01:34:29 -07001177 """Asserts that two iterables have the same elements, the same number of
1178 times, without regard to order.
Michael Foord8442a602010-03-20 16:58:04 +00001179
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001180 self.assertEqual(Counter(list(first)),
1181 Counter(list(second)))
Michael Foord8442a602010-03-20 16:58:04 +00001182
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001183 Example:
Michael Foord8442a602010-03-20 16:58:04 +00001184 - [0, 1, 1] and [1, 0, 1] compare equal.
1185 - [0, 0, 1] and [0, 1] compare unequal.
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001186
Michael Foord8442a602010-03-20 16:58:04 +00001187 """
Michael Foorde180d392011-01-28 19:51:48 +00001188 first_seq, second_seq = list(first), list(second)
Michael Foord8442a602010-03-20 16:58:04 +00001189 try:
Michael Foorde180d392011-01-28 19:51:48 +00001190 first = collections.Counter(first_seq)
1191 second = collections.Counter(second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001192 except TypeError:
Raymond Hettinger6518f5e2010-12-24 00:52:54 +00001193 # Handle case with unhashable elements
Michael Foorde180d392011-01-28 19:51:48 +00001194 differences = _count_diff_all_purpose(first_seq, second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001195 else:
Michael Foorde180d392011-01-28 19:51:48 +00001196 if first == second:
Raymond Hettinger6e165b32010-11-27 09:31:37 +00001197 return
Michael Foorde180d392011-01-28 19:51:48 +00001198 differences = _count_diff_hashable(first_seq, second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001199
Raymond Hettinger93e233d2010-12-24 10:02:22 +00001200 if differences:
1201 standardMsg = 'Element counts were not equal:\n'
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001202 lines = ['First has %d, Second has %d: %r' % diff for diff in differences]
Raymond Hettinger93e233d2010-12-24 10:02:22 +00001203 diffMsg = '\n'.join(lines)
1204 standardMsg = self._truncateMessage(standardMsg, diffMsg)
1205 msg = self._formatMessage(msg, standardMsg)
1206 self.fail(msg)
Michael Foord8442a602010-03-20 16:58:04 +00001207
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001208 def assertMultiLineEqual(self, first, second, msg=None):
1209 """Assert that two multi-line strings are equal."""
Ezio Melottib3aedd42010-11-20 19:04:17 +00001210 self.assertIsInstance(first, str, 'First argument is not a string')
1211 self.assertIsInstance(second, str, 'Second argument is not a string')
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001212
1213 if first != second:
Ezio Melottiedd117f2011-04-27 10:20:38 +03001214 # don't use difflib if the strings are too long
1215 if (len(first) > self._diffThreshold or
1216 len(second) > self._diffThreshold):
1217 self._baseAssertEqual(first, second, msg)
Ezio Melottid8b509b2011-09-28 17:37:55 +03001218 firstlines = first.splitlines(keepends=True)
1219 secondlines = second.splitlines(keepends=True)
Michael Foordc653ce32010-07-10 13:52:22 +00001220 if len(firstlines) == 1 and first.strip('\r\n') == first:
1221 firstlines = [first + '\n']
1222 secondlines = [second + '\n']
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001223 standardMsg = '%s != %s' % _common_shorten_repr(first, second)
Michael Foordc653ce32010-07-10 13:52:22 +00001224 diff = '\n' + ''.join(difflib.ndiff(firstlines, secondlines))
Michael Foordcb11b252010-06-05 13:14:43 +00001225 standardMsg = self._truncateMessage(standardMsg, diff)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001226 self.fail(self._formatMessage(msg, standardMsg))
1227
1228 def assertLess(self, a, b, msg=None):
1229 """Just like self.assertTrue(a < b), but with a nicer default message."""
1230 if not a < b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001231 standardMsg = '%s not less than %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001232 self.fail(self._formatMessage(msg, standardMsg))
1233
1234 def assertLessEqual(self, a, b, msg=None):
1235 """Just like self.assertTrue(a <= b), but with a nicer default message."""
1236 if not a <= b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001237 standardMsg = '%s not less than or equal to %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001238 self.fail(self._formatMessage(msg, standardMsg))
1239
1240 def assertGreater(self, a, b, msg=None):
1241 """Just like self.assertTrue(a > b), but with a nicer default message."""
1242 if not a > b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001243 standardMsg = '%s not greater than %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001244 self.fail(self._formatMessage(msg, standardMsg))
1245
1246 def assertGreaterEqual(self, a, b, msg=None):
1247 """Just like self.assertTrue(a >= b), but with a nicer default message."""
1248 if not a >= b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001249 standardMsg = '%s not greater than or equal to %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001250 self.fail(self._formatMessage(msg, standardMsg))
1251
1252 def assertIsNone(self, obj, msg=None):
1253 """Same as self.assertTrue(obj is None), with a nicer default message."""
1254 if obj is not None:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001255 standardMsg = '%s is not None' % (safe_repr(obj),)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001256 self.fail(self._formatMessage(msg, standardMsg))
1257
1258 def assertIsNotNone(self, obj, msg=None):
1259 """Included for symmetry with assertIsNone."""
1260 if obj is None:
1261 standardMsg = 'unexpectedly None'
1262 self.fail(self._formatMessage(msg, standardMsg))
1263
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001264 def assertIsInstance(self, obj, cls, msg=None):
1265 """Same as self.assertTrue(isinstance(obj, cls)), with a nicer
1266 default message."""
1267 if not isinstance(obj, cls):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001268 standardMsg = '%s is not an instance of %r' % (safe_repr(obj), cls)
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001269 self.fail(self._formatMessage(msg, standardMsg))
1270
1271 def assertNotIsInstance(self, obj, cls, msg=None):
1272 """Included for symmetry with assertIsInstance."""
1273 if isinstance(obj, cls):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001274 standardMsg = '%s is an instance of %r' % (safe_repr(obj), cls)
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001275 self.fail(self._formatMessage(msg, standardMsg))
1276
Ezio Melottied3a7d22010-12-01 02:32:32 +00001277 def assertRaisesRegex(self, expected_exception, expected_regex,
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001278 *args, **kwargs):
Ezio Melottied3a7d22010-12-01 02:32:32 +00001279 """Asserts that the message in a raised exception matches a regex.
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001280
1281 Args:
1282 expected_exception: Exception class expected to be raised.
Serhiy Storchaka0b5e61d2017-10-04 20:09:49 +03001283 expected_regex: Regex (re.Pattern object or string) expected
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001284 to be found in error message.
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001285 args: Function to be called and extra positional args.
1286 kwargs: Extra kwargs.
Ezio Melottib4dc2502011-05-06 15:01:41 +03001287 msg: Optional message used in case of failure. Can only be used
1288 when assertRaisesRegex is used as a context manager.
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001289 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001290 context = _AssertRaisesContext(expected_exception, self, expected_regex)
1291 return context.handle('assertRaisesRegex', args, kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001292
Ezio Melottied3a7d22010-12-01 02:32:32 +00001293 def assertWarnsRegex(self, expected_warning, expected_regex,
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001294 *args, **kwargs):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001295 """Asserts that the message in a triggered warning matches a regexp.
1296 Basic functioning is similar to assertWarns() with the addition
1297 that only warnings whose messages also match the regular expression
1298 are considered successful matches.
1299
1300 Args:
1301 expected_warning: Warning class expected to be triggered.
Serhiy Storchaka0b5e61d2017-10-04 20:09:49 +03001302 expected_regex: Regex (re.Pattern object or string) expected
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001303 to be found in error message.
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001304 args: Function to be called and extra positional args.
1305 kwargs: Extra kwargs.
Ezio Melottib4dc2502011-05-06 15:01:41 +03001306 msg: Optional message used in case of failure. Can only be used
1307 when assertWarnsRegex is used as a context manager.
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001308 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001309 context = _AssertWarnsContext(expected_warning, self, expected_regex)
1310 return context.handle('assertWarnsRegex', args, kwargs)
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001311
Ezio Melottied3a7d22010-12-01 02:32:32 +00001312 def assertRegex(self, text, expected_regex, msg=None):
Michael Foorde3ef5f12010-05-08 16:46:14 +00001313 """Fail the test unless the text matches the regular expression."""
Ezio Melottied3a7d22010-12-01 02:32:32 +00001314 if isinstance(expected_regex, (str, bytes)):
Gregory P. Smithed16bf42010-12-16 19:23:05 +00001315 assert expected_regex, "expected_regex must not be empty."
Ezio Melottied3a7d22010-12-01 02:32:32 +00001316 expected_regex = re.compile(expected_regex)
1317 if not expected_regex.search(text):
Robert Collinsbe6caca2015-08-20 11:13:09 +12001318 standardMsg = "Regex didn't match: %r not found in %r" % (
1319 expected_regex.pattern, text)
1320 # _formatMessage ensures the longMessage option is respected
1321 msg = self._formatMessage(msg, standardMsg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001322 raise self.failureException(msg)
1323
Ezio Melotti8f776302010-12-10 02:32:05 +00001324 def assertNotRegex(self, text, unexpected_regex, msg=None):
Michael Foorde3ef5f12010-05-08 16:46:14 +00001325 """Fail the test if the text matches the regular expression."""
Ezio Melottied3a7d22010-12-01 02:32:32 +00001326 if isinstance(unexpected_regex, (str, bytes)):
1327 unexpected_regex = re.compile(unexpected_regex)
1328 match = unexpected_regex.search(text)
Benjamin Petersonb48af542010-04-11 20:43:16 +00001329 if match:
Robert Collinsbe6caca2015-08-20 11:13:09 +12001330 standardMsg = 'Regex matched: %r matches %r in %r' % (
1331 text[match.start() : match.end()],
1332 unexpected_regex.pattern,
1333 text)
1334 # _formatMessage ensures the longMessage option is respected
1335 msg = self._formatMessage(msg, standardMsg)
Benjamin Petersonb48af542010-04-11 20:43:16 +00001336 raise self.failureException(msg)
1337
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001338
Ezio Melottied3a7d22010-12-01 02:32:32 +00001339 def _deprecate(original_func):
1340 def deprecated_func(*args, **kwargs):
1341 warnings.warn(
1342 'Please use {0} instead.'.format(original_func.__name__),
1343 DeprecationWarning, 2)
1344 return original_func(*args, **kwargs)
1345 return deprecated_func
1346
Ezio Melotti361467e2011-04-03 17:37:58 +03001347 # see #9424
Ezio Melotti0f535012011-04-03 18:02:13 +03001348 failUnlessEqual = assertEquals = _deprecate(assertEqual)
1349 failIfEqual = assertNotEquals = _deprecate(assertNotEqual)
1350 failUnlessAlmostEqual = assertAlmostEquals = _deprecate(assertAlmostEqual)
1351 failIfAlmostEqual = assertNotAlmostEquals = _deprecate(assertNotAlmostEqual)
1352 failUnless = assert_ = _deprecate(assertTrue)
1353 failUnlessRaises = _deprecate(assertRaises)
1354 failIf = _deprecate(assertFalse)
Ezio Melottied3a7d22010-12-01 02:32:32 +00001355 assertRaisesRegexp = _deprecate(assertRaisesRegex)
1356 assertRegexpMatches = _deprecate(assertRegex)
Robert Collinsbe6caca2015-08-20 11:13:09 +12001357 assertNotRegexpMatches = _deprecate(assertNotRegex)
Ezio Melottied3a7d22010-12-01 02:32:32 +00001358
1359
1360
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001361class FunctionTestCase(TestCase):
1362 """A test case that wraps a test function.
1363
1364 This is useful for slipping pre-existing test functions into the
1365 unittest framework. Optionally, set-up and tidy-up functions can be
1366 supplied. As with TestCase, the tidy-up ('tearDown') function will
1367 always be called if the set-up ('setUp') function ran successfully.
1368 """
1369
1370 def __init__(self, testFunc, setUp=None, tearDown=None, description=None):
1371 super(FunctionTestCase, self).__init__()
1372 self._setUpFunc = setUp
1373 self._tearDownFunc = tearDown
1374 self._testFunc = testFunc
1375 self._description = description
1376
1377 def setUp(self):
1378 if self._setUpFunc is not None:
1379 self._setUpFunc()
1380
1381 def tearDown(self):
1382 if self._tearDownFunc is not None:
1383 self._tearDownFunc()
1384
1385 def runTest(self):
1386 self._testFunc()
1387
1388 def id(self):
1389 return self._testFunc.__name__
1390
1391 def __eq__(self, other):
1392 if not isinstance(other, self.__class__):
1393 return NotImplemented
1394
1395 return self._setUpFunc == other._setUpFunc and \
1396 self._tearDownFunc == other._tearDownFunc and \
1397 self._testFunc == other._testFunc and \
1398 self._description == other._description
1399
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001400 def __hash__(self):
1401 return hash((type(self), self._setUpFunc, self._tearDownFunc,
1402 self._testFunc, self._description))
1403
1404 def __str__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001405 return "%s (%s)" % (strclass(self.__class__),
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001406 self._testFunc.__name__)
1407
1408 def __repr__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001409 return "<%s tec=%s>" % (strclass(self.__class__),
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001410 self._testFunc)
1411
1412 def shortDescription(self):
1413 if self._description is not None:
1414 return self._description
1415 doc = self._testFunc.__doc__
1416 return doc and doc.split("\n")[0].strip() or None
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001417
1418
1419class _SubTest(TestCase):
1420
1421 def __init__(self, test_case, message, params):
1422 super().__init__()
1423 self._message = message
1424 self.test_case = test_case
1425 self.params = params
1426 self.failureException = test_case.failureException
1427
1428 def runTest(self):
1429 raise NotImplementedError("subtests cannot be run directly")
1430
1431 def _subDescription(self):
1432 parts = []
Berker Peksag16ea19f2016-09-21 19:34:15 +03001433 if self._message is not _subtest_msg_sentinel:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001434 parts.append("[{}]".format(self._message))
1435 if self.params:
1436 params_desc = ', '.join(
1437 "{}={!r}".format(k, v)
Serhiy Storchaka48fbe522017-06-23 21:47:39 +03001438 for (k, v) in self.params.items())
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001439 parts.append("({})".format(params_desc))
1440 return " ".join(parts) or '(<subtest>)'
1441
1442 def id(self):
1443 return "{} {}".format(self.test_case.id(), self._subDescription())
1444
1445 def shortDescription(self):
1446 """Returns a one-line description of the subtest, or None if no
1447 description has been provided.
1448 """
1449 return self.test_case.shortDescription()
1450
1451 def __str__(self):
1452 return "{} {}".format(self.test_case, self._subDescription())