blob: b363c635100726b4246feeb6af75456325b04a50 [file] [log] [blame]
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001"""Test case implementation"""
2
3import sys
4import functools
5import difflib
Antoine Pitrou0715b9f2013-09-14 19:45:47 +02006import logging
Benjamin Petersonbed7d042009-07-19 21:01:52 +00007import pprint
8import re
9import warnings
Raymond Hettinger6e165b32010-11-27 09:31:37 +000010import collections
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010011import contextlib
Antoine Pitrou96810222014-04-29 01:23:50 +020012import traceback
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
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000125 return decorator
126
127def skipIf(condition, reason):
128 """
129 Skip a test if the condition is true.
130 """
131 if condition:
132 return skip(reason)
133 return _id
134
135def skipUnless(condition, reason):
136 """
137 Skip a test unless the condition is true.
138 """
139 if not condition:
140 return skip(reason)
141 return _id
142
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100143def expectedFailure(test_item):
144 test_item.__unittest_expecting_failure__ = True
145 return test_item
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000146
Serhiy Storchaka041dd8e2015-05-21 20:15:40 +0300147def _is_subtype(expected, basetype):
148 if isinstance(expected, tuple):
149 return all(_is_subtype(e, basetype) for e in expected)
150 return isinstance(expected, type) and issubclass(expected, basetype)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000151
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200152class _BaseTestCaseContext:
153
154 def __init__(self, test_case):
155 self.test_case = test_case
156
157 def _raiseFailure(self, standardMsg):
158 msg = self.test_case._formatMessage(self.msg, standardMsg)
159 raise self.test_case.failureException(msg)
160
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200161class _AssertRaisesBaseContext(_BaseTestCaseContext):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000162
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300163 def __init__(self, expected, test_case, expected_regex=None):
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200164 _BaseTestCaseContext.__init__(self, test_case)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000165 self.expected = expected
Ezio Melottib4dc2502011-05-06 15:01:41 +0300166 self.test_case = test_case
R David Murrayef1c2672014-03-25 15:31:50 -0400167 if expected_regex is not None:
Ezio Melottied3a7d22010-12-01 02:32:32 +0000168 expected_regex = re.compile(expected_regex)
169 self.expected_regex = expected_regex
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300170 self.obj_name = None
Ezio Melottib4dc2502011-05-06 15:01:41 +0300171 self.msg = None
172
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300173 def handle(self, name, args, kwargs):
Ezio Melottib4dc2502011-05-06 15:01:41 +0300174 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300175 If args is empty, assertRaises/Warns is being used as a
Ezio Melottib4dc2502011-05-06 15:01:41 +0300176 context manager, so check for a 'msg' kwarg and return self.
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300177 If args is not empty, call a callable passing positional and keyword
178 arguments.
Ezio Melottib4dc2502011-05-06 15:01:41 +0300179 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300180 try:
Victor Stinnerbbd3cf82017-03-28 00:56:28 +0200181 if not _is_subtype(self.expected, self._base_type):
182 raise TypeError('%s() arg 1 must be %s' %
183 (name, self._base_type_str))
Victor Stinnerbbd3cf82017-03-28 00:56:28 +0200184 if not args:
185 self.msg = kwargs.pop('msg', None)
186 if kwargs:
Serhiy Storchaka77d57812018-08-19 10:00:11 +0300187 raise TypeError('%r is an invalid keyword argument for '
188 'this function' % (next(iter(kwargs)),))
Victor Stinnerbbd3cf82017-03-28 00:56:28 +0200189 return self
190
191 callable_obj, *args = args
192 try:
193 self.obj_name = callable_obj.__name__
194 except AttributeError:
195 self.obj_name = str(callable_obj)
196 with self:
197 callable_obj(*args, **kwargs)
198 finally:
199 # bpo-23890: manually break a reference cycle
200 self = None
Ezio Melottib4dc2502011-05-06 15:01:41 +0300201
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000202
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000203class _AssertRaisesContext(_AssertRaisesBaseContext):
204 """A context manager used to implement TestCase.assertRaises* methods."""
205
Serhiy Storchaka041dd8e2015-05-21 20:15:40 +0300206 _base_type = BaseException
207 _base_type_str = 'an exception type or tuple of exception types'
208
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000209 def __enter__(self):
Ezio Melotti49008232010-02-08 21:57:48 +0000210 return self
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000211
212 def __exit__(self, exc_type, exc_value, tb):
213 if exc_type is None:
214 try:
215 exc_name = self.expected.__name__
216 except AttributeError:
217 exc_name = str(self.expected)
218 if self.obj_name:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300219 self._raiseFailure("{} not raised by {}".format(exc_name,
220 self.obj_name))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000221 else:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300222 self._raiseFailure("{} not raised".format(exc_name))
Antoine Pitrou96810222014-04-29 01:23:50 +0200223 else:
224 traceback.clear_frames(tb)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000225 if not issubclass(exc_type, self.expected):
226 # let unexpected exceptions pass through
227 return False
Ezio Melotti49008232010-02-08 21:57:48 +0000228 # store exception, without traceback, for later retrieval
229 self.exception = exc_value.with_traceback(None)
Ezio Melottied3a7d22010-12-01 02:32:32 +0000230 if self.expected_regex is None:
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000231 return True
232
Ezio Melottied3a7d22010-12-01 02:32:32 +0000233 expected_regex = self.expected_regex
234 if not expected_regex.search(str(exc_value)):
Ezio Melottib4dc2502011-05-06 15:01:41 +0300235 self._raiseFailure('"{}" does not match "{}"'.format(
236 expected_regex.pattern, str(exc_value)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000237 return True
238
239
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000240class _AssertWarnsContext(_AssertRaisesBaseContext):
241 """A context manager used to implement TestCase.assertWarns* methods."""
242
Serhiy Storchaka041dd8e2015-05-21 20:15:40 +0300243 _base_type = Warning
244 _base_type_str = 'a warning type or tuple of warning types'
245
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000246 def __enter__(self):
247 # The __warningregistry__'s need to be in a pristine state for tests
248 # to work properly.
249 for v in sys.modules.values():
250 if getattr(v, '__warningregistry__', None):
251 v.__warningregistry__ = {}
252 self.warnings_manager = warnings.catch_warnings(record=True)
253 self.warnings = self.warnings_manager.__enter__()
254 warnings.simplefilter("always", self.expected)
255 return self
256
257 def __exit__(self, exc_type, exc_value, tb):
258 self.warnings_manager.__exit__(exc_type, exc_value, tb)
259 if exc_type is not None:
260 # let unexpected exceptions pass through
261 return
262 try:
263 exc_name = self.expected.__name__
264 except AttributeError:
265 exc_name = str(self.expected)
266 first_matching = None
267 for m in self.warnings:
268 w = m.message
269 if not isinstance(w, self.expected):
270 continue
271 if first_matching is None:
272 first_matching = w
Ezio Melottied3a7d22010-12-01 02:32:32 +0000273 if (self.expected_regex is not None and
274 not self.expected_regex.search(str(w))):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000275 continue
276 # store warning for later retrieval
277 self.warning = w
278 self.filename = m.filename
279 self.lineno = m.lineno
280 return
281 # Now we simply try to choose a helpful failure message
282 if first_matching is not None:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300283 self._raiseFailure('"{}" does not match "{}"'.format(
284 self.expected_regex.pattern, str(first_matching)))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000285 if self.obj_name:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300286 self._raiseFailure("{} not triggered by {}".format(exc_name,
287 self.obj_name))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000288 else:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300289 self._raiseFailure("{} not triggered".format(exc_name))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000290
291
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200292
293_LoggingWatcher = collections.namedtuple("_LoggingWatcher",
294 ["records", "output"])
295
296
297class _CapturingHandler(logging.Handler):
298 """
299 A logging handler capturing all (raw and formatted) logging output.
300 """
301
302 def __init__(self):
303 logging.Handler.__init__(self)
304 self.watcher = _LoggingWatcher([], [])
305
306 def flush(self):
307 pass
308
309 def emit(self, record):
310 self.watcher.records.append(record)
311 msg = self.format(record)
312 self.watcher.output.append(msg)
313
314
315
316class _AssertLogsContext(_BaseTestCaseContext):
317 """A context manager used to implement TestCase.assertLogs()."""
318
319 LOGGING_FORMAT = "%(levelname)s:%(name)s:%(message)s"
320
321 def __init__(self, test_case, logger_name, level):
322 _BaseTestCaseContext.__init__(self, test_case)
323 self.logger_name = logger_name
324 if level:
325 self.level = logging._nameToLevel.get(level, level)
326 else:
327 self.level = logging.INFO
328 self.msg = None
329
330 def __enter__(self):
331 if isinstance(self.logger_name, logging.Logger):
332 logger = self.logger = self.logger_name
333 else:
334 logger = self.logger = logging.getLogger(self.logger_name)
335 formatter = logging.Formatter(self.LOGGING_FORMAT)
336 handler = _CapturingHandler()
337 handler.setFormatter(formatter)
338 self.watcher = handler.watcher
339 self.old_handlers = logger.handlers[:]
340 self.old_level = logger.level
341 self.old_propagate = logger.propagate
342 logger.handlers = [handler]
343 logger.setLevel(self.level)
344 logger.propagate = False
345 return handler.watcher
346
347 def __exit__(self, exc_type, exc_value, tb):
348 self.logger.handlers = self.old_handlers
349 self.logger.propagate = self.old_propagate
350 self.logger.setLevel(self.old_level)
351 if exc_type is not None:
352 # let unexpected exceptions pass through
353 return False
354 if len(self.watcher.records) == 0:
355 self._raiseFailure(
356 "no logs of level {} or higher triggered on {}"
357 .format(logging.getLevelName(self.level), self.logger.name))
358
359
Serhiy Storchaka48fbe522017-06-23 21:47:39 +0300360class _OrderedChainMap(collections.ChainMap):
361 def __iter__(self):
362 seen = set()
363 for mapping in self.maps:
364 for k in mapping:
365 if k not in seen:
366 seen.add(k)
367 yield k
368
369
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000370class TestCase(object):
371 """A class whose instances are single test cases.
372
373 By default, the test code itself should be placed in a method named
374 'runTest'.
375
376 If the fixture may be used for many test cases, create as
377 many test methods as are needed. When instantiating such a TestCase
378 subclass, specify in the constructor arguments the name of the test method
379 that the instance is to execute.
380
381 Test authors should subclass TestCase for their own tests. Construction
382 and deconstruction of the test's environment ('fixture') can be
383 implemented by overriding the 'setUp' and 'tearDown' methods respectively.
384
385 If it is necessary to override the __init__ method, the base class
386 __init__ method must always be called. It is important that subclasses
387 should not change the signature of their __init__ method, since instances
388 of the classes are instantiated automatically by parts of the framework
389 in order to be run.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000390
Ezio Melotti31797e52013-03-29 03:42:29 +0200391 When subclassing TestCase, you can set these attributes:
392 * failureException: determines which exception will be raised when
393 the instance's assertion methods fail; test methods raising this
394 exception will be deemed to have 'failed' rather than 'errored'.
395 * longMessage: determines whether long messages (including repr of
396 objects used in assert methods) will be printed on failure in *addition*
397 to any explicit message passed.
398 * maxDiff: sets the maximum length of a diff in failure messages
399 by assert methods using difflib. It is looked up as an instance
400 attribute so can be configured by individual tests if required.
401 """
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000402
403 failureException = AssertionError
404
Michael Foord5074df62010-12-03 00:53:09 +0000405 longMessage = True
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000406
Michael Foord085dfd32010-06-05 12:17:02 +0000407 maxDiff = 80*8
408
Ezio Melottiedd117f2011-04-27 10:20:38 +0300409 # If a string is longer than _diffThreshold, use normal comparison instead
410 # of difflib. See #11763.
411 _diffThreshold = 2**16
412
Benjamin Peterson847a4112010-03-14 15:04:17 +0000413 # Attribute used by TestSuite for classSetUp
414
415 _classSetupFailed = False
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000416
Lisa Roach0f221d02018-11-08 18:34:33 -0800417 _class_cleanups = []
418
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000419 def __init__(self, methodName='runTest'):
420 """Create an instance of the class that will use the named test
421 method when executed. Raises a ValueError if the instance does
422 not have a method with the specified name.
423 """
424 self._testMethodName = methodName
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100425 self._outcome = None
Michael Foord32e1d832011-01-03 17:00:11 +0000426 self._testMethodDoc = 'No test'
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000427 try:
428 testMethod = getattr(self, methodName)
429 except AttributeError:
Michael Foord32e1d832011-01-03 17:00:11 +0000430 if methodName != 'runTest':
431 # we allow instantiation with no explicit method name
432 # but not an *incorrect* or missing method name
433 raise ValueError("no such test method in %s: %s" %
434 (self.__class__, methodName))
435 else:
436 self._testMethodDoc = testMethod.__doc__
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000437 self._cleanups = []
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100438 self._subtest = None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000439
440 # Map types to custom assertEqual functions that will compare
441 # instances of said type in more detail to generate a more useful
442 # error message.
Benjamin Peterson34b2b262011-07-12 19:21:42 -0500443 self._type_equality_funcs = {}
Michael Foord8ca6d982010-11-20 15:34:26 +0000444 self.addTypeEqualityFunc(dict, 'assertDictEqual')
445 self.addTypeEqualityFunc(list, 'assertListEqual')
446 self.addTypeEqualityFunc(tuple, 'assertTupleEqual')
447 self.addTypeEqualityFunc(set, 'assertSetEqual')
448 self.addTypeEqualityFunc(frozenset, 'assertSetEqual')
449 self.addTypeEqualityFunc(str, 'assertMultiLineEqual')
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000450
451 def addTypeEqualityFunc(self, typeobj, function):
452 """Add a type specific assertEqual style function to compare a type.
453
454 This method is for use by TestCase subclasses that need to register
455 their own type equality functions to provide nicer error messages.
456
457 Args:
458 typeobj: The data type to call this function on when both values
459 are of the same type in assertEqual().
460 function: The callable taking two arguments and an optional
461 msg= argument that raises self.failureException with a
462 useful error message when the two arguments are not equal.
463 """
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000464 self._type_equality_funcs[typeobj] = function
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000465
Serhiy Storchaka42a139e2019-04-01 09:16:35 +0300466 def addCleanup(*args, **kwargs):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000467 """Add a function, with arguments, to be called when the test is
468 completed. Functions added are called on a LIFO basis and are
469 called after tearDown on test failure or success.
470
471 Cleanup items are called even if setUp fails (unlike tearDown)."""
Serhiy Storchaka42a139e2019-04-01 09:16:35 +0300472 if len(args) >= 2:
473 self, function, *args = args
474 elif not args:
475 raise TypeError("descriptor 'addCleanup' of 'TestCase' object "
476 "needs an argument")
477 elif 'function' in kwargs:
478 function = kwargs.pop('function')
479 self, *args = args
480 import warnings
481 warnings.warn("Passing 'function' as keyword argument is deprecated",
482 DeprecationWarning, stacklevel=2)
483 else:
484 raise TypeError('addCleanup expected at least 1 positional '
485 'argument, got %d' % (len(args)-1))
486 args = tuple(args)
487
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000488 self._cleanups.append((function, args, kwargs))
Serhiy Storchakad53cf992019-05-06 22:40:27 +0300489 addCleanup.__text_signature__ = '($self, function, /, *args, **kwargs)'
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000490
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300491 @classmethod
492 def addClassCleanup(cls, function, /, *args, **kwargs):
Lisa Roach0f221d02018-11-08 18:34:33 -0800493 """Same as addCleanup, except the cleanup items are called even if
494 setUpClass fails (unlike tearDownClass)."""
495 cls._class_cleanups.append((function, args, kwargs))
496
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000497 def setUp(self):
498 "Hook method for setting up the test fixture before exercising it."
499 pass
500
501 def tearDown(self):
502 "Hook method for deconstructing the test fixture after testing it."
503 pass
504
Benjamin Peterson847a4112010-03-14 15:04:17 +0000505 @classmethod
506 def setUpClass(cls):
507 "Hook method for setting up class fixture before running tests in the class."
508
509 @classmethod
510 def tearDownClass(cls):
511 "Hook method for deconstructing the class fixture after running all tests in the class."
512
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000513 def countTestCases(self):
514 return 1
515
516 def defaultTestResult(self):
517 return result.TestResult()
518
519 def shortDescription(self):
Michael Foord34c94622010-02-10 15:51:42 +0000520 """Returns a one-line description of the test, or None if no
521 description has been provided.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000522
Michael Foord34c94622010-02-10 15:51:42 +0000523 The default implementation of this method returns the first line of
524 the specified test method's docstring.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000525 """
Michael Foord34c94622010-02-10 15:51:42 +0000526 doc = self._testMethodDoc
527 return doc and doc.split("\n")[0].strip() or None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000528
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000529
530 def id(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000531 return "%s.%s" % (strclass(self.__class__), self._testMethodName)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000532
533 def __eq__(self, other):
534 if type(self) is not type(other):
535 return NotImplemented
536
537 return self._testMethodName == other._testMethodName
538
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000539 def __hash__(self):
540 return hash((type(self), self._testMethodName))
541
542 def __str__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000543 return "%s (%s)" % (self._testMethodName, strclass(self.__class__))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000544
545 def __repr__(self):
546 return "<%s testMethod=%s>" % \
Benjamin Peterson847a4112010-03-14 15:04:17 +0000547 (strclass(self.__class__), self._testMethodName)
548
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100549 def _addSkip(self, result, test_case, reason):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000550 addSkip = getattr(result, 'addSkip', None)
551 if addSkip is not None:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100552 addSkip(test_case, reason)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000553 else:
554 warnings.warn("TestResult has no addSkip method, skips not reported",
555 RuntimeWarning, 2)
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100556 result.addSuccess(test_case)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000557
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100558 @contextlib.contextmanager
Berker Peksag16ea19f2016-09-21 19:34:15 +0300559 def subTest(self, msg=_subtest_msg_sentinel, **params):
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100560 """Return a context manager that will return the enclosed block
561 of code in a subtest identified by the optional message and
562 keyword parameters. A failure in the subtest marks the test
563 case as failed but resumes execution at the end of the enclosed
564 block, allowing further test code to be executed.
565 """
Bruno Oliveirada2bf9f2018-10-12 07:35:55 -0300566 if self._outcome is None or not self._outcome.result_supports_subtests:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100567 yield
568 return
569 parent = self._subtest
570 if parent is None:
Serhiy Storchaka48fbe522017-06-23 21:47:39 +0300571 params_map = _OrderedChainMap(params)
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100572 else:
573 params_map = parent.params.new_child(params)
574 self._subtest = _SubTest(self, msg, params_map)
Michael Foordb3468f72010-12-19 03:19:47 +0000575 try:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100576 with self._outcome.testPartExecutor(self._subtest, isTest=True):
577 yield
578 if not self._outcome.success:
579 result = self._outcome.result
580 if result is not None and result.failfast:
581 raise _ShouldStop
582 elif self._outcome.expectedFailure:
583 # If the test is expecting a failure, we really want to
584 # stop now and register the expected failure.
585 raise _ShouldStop
586 finally:
587 self._subtest = parent
588
589 def _feedErrorsToResult(self, result, errors):
590 for test, exc_info in errors:
591 if isinstance(test, _SubTest):
592 result.addSubTest(test.test_case, test, exc_info)
593 elif exc_info is not None:
594 if issubclass(exc_info[0], self.failureException):
595 result.addFailure(test, exc_info)
596 else:
597 result.addError(test, exc_info)
598
599 def _addExpectedFailure(self, result, exc_info):
600 try:
601 addExpectedFailure = result.addExpectedFailure
602 except AttributeError:
603 warnings.warn("TestResult has no addExpectedFailure method, reporting as passes",
604 RuntimeWarning)
605 result.addSuccess(self)
606 else:
607 addExpectedFailure(self, exc_info)
608
609 def _addUnexpectedSuccess(self, result):
610 try:
611 addUnexpectedSuccess = result.addUnexpectedSuccess
612 except AttributeError:
613 warnings.warn("TestResult has no addUnexpectedSuccess method, reporting as failure",
614 RuntimeWarning)
615 # We need to pass an actual exception and traceback to addFailure,
616 # otherwise the legacy result can choke.
617 try:
618 raise _UnexpectedSuccess from None
619 except _UnexpectedSuccess:
620 result.addFailure(self, sys.exc_info())
621 else:
622 addUnexpectedSuccess(self)
Michael Foordb3468f72010-12-19 03:19:47 +0000623
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300624 def _callSetUp(self):
625 self.setUp()
626
627 def _callTestMethod(self, method):
628 method()
629
630 def _callTearDown(self):
631 self.tearDown()
632
633 def _callCleanup(self, function, /, *args, **kwargs):
634 function(*args, **kwargs)
635
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000636 def run(self, result=None):
637 orig_result = result
638 if result is None:
639 result = self.defaultTestResult()
640 startTestRun = getattr(result, 'startTestRun', None)
641 if startTestRun is not None:
642 startTestRun()
643
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000644 result.startTest(self)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000645
646 testMethod = getattr(self, self._testMethodName)
647 if (getattr(self.__class__, "__unittest_skip__", False) or
648 getattr(testMethod, "__unittest_skip__", False)):
649 # If the class or method was skipped.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000650 try:
Benjamin Peterson847a4112010-03-14 15:04:17 +0000651 skip_why = (getattr(self.__class__, '__unittest_skip_why__', '')
652 or getattr(testMethod, '__unittest_skip_why__', ''))
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100653 self._addSkip(result, self, skip_why)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000654 finally:
655 result.stopTest(self)
656 return
Robert Collinsed599b72015-08-28 10:34:51 +1200657 expecting_failure_method = getattr(testMethod,
658 "__unittest_expecting_failure__", False)
659 expecting_failure_class = getattr(self,
660 "__unittest_expecting_failure__", False)
661 expecting_failure = expecting_failure_class or expecting_failure_method
Victor Stinner031bd532013-12-09 01:52:50 +0100662 outcome = _Outcome(result)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000663 try:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100664 self._outcome = outcome
Michael Foordb3468f72010-12-19 03:19:47 +0000665
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100666 with outcome.testPartExecutor(self):
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300667 self._callSetUp()
Michael Foordb3468f72010-12-19 03:19:47 +0000668 if outcome.success:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100669 outcome.expecting_failure = expecting_failure
670 with outcome.testPartExecutor(self, isTest=True):
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300671 self._callTestMethod(testMethod)
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100672 outcome.expecting_failure = False
673 with outcome.testPartExecutor(self):
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300674 self._callTearDown()
Michael Foordb3468f72010-12-19 03:19:47 +0000675
676 self.doCleanups()
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100677 for test, reason in outcome.skipped:
678 self._addSkip(result, test, reason)
679 self._feedErrorsToResult(result, outcome.errors)
Michael Foordb3468f72010-12-19 03:19:47 +0000680 if outcome.success:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100681 if expecting_failure:
682 if outcome.expectedFailure:
683 self._addExpectedFailure(result, outcome.expectedFailure)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000684 else:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100685 self._addUnexpectedSuccess(result)
686 else:
687 result.addSuccess(self)
Michael Foord1341bb02011-03-14 19:01:46 -0400688 return result
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000689 finally:
690 result.stopTest(self)
691 if orig_result is None:
692 stopTestRun = getattr(result, 'stopTestRun', None)
693 if stopTestRun is not None:
694 stopTestRun()
695
Victor Stinner031bd532013-12-09 01:52:50 +0100696 # explicitly break reference cycles:
697 # outcome.errors -> frame -> outcome -> outcome.errors
698 # outcome.expectedFailure -> frame -> outcome -> outcome.expectedFailure
699 outcome.errors.clear()
700 outcome.expectedFailure = None
701
702 # clear the outcome, no more needed
703 self._outcome = None
704
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000705 def doCleanups(self):
706 """Execute all cleanup functions. Normally called for you after
707 tearDown."""
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100708 outcome = self._outcome or _Outcome()
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000709 while self._cleanups:
Michael Foordb3468f72010-12-19 03:19:47 +0000710 function, args, kwargs = self._cleanups.pop()
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100711 with outcome.testPartExecutor(self):
Andrew Svetlov4dd3e3f2019-05-29 12:33:59 +0300712 self._callCleanup(function, *args, **kwargs)
Michael Foordb3468f72010-12-19 03:19:47 +0000713
714 # return this for backwards compatibility
Lisa Roach0f221d02018-11-08 18:34:33 -0800715 # even though we no longer use it internally
Michael Foordb3468f72010-12-19 03:19:47 +0000716 return outcome.success
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000717
Lisa Roach0f221d02018-11-08 18:34:33 -0800718 @classmethod
719 def doClassCleanups(cls):
720 """Execute all class cleanup functions. Normally called for you after
721 tearDownClass."""
722 cls.tearDown_exceptions = []
723 while cls._class_cleanups:
724 function, args, kwargs = cls._class_cleanups.pop()
725 try:
726 function(*args, **kwargs)
727 except Exception as exc:
728 cls.tearDown_exceptions.append(sys.exc_info())
729
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000730 def __call__(self, *args, **kwds):
731 return self.run(*args, **kwds)
732
733 def debug(self):
734 """Run the test without collecting errors in a TestResult"""
735 self.setUp()
736 getattr(self, self._testMethodName)()
737 self.tearDown()
Michael Foordb8748742010-06-10 16:16:08 +0000738 while self._cleanups:
739 function, args, kwargs = self._cleanups.pop(-1)
740 function(*args, **kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000741
742 def skipTest(self, reason):
743 """Skip this test."""
744 raise SkipTest(reason)
745
746 def fail(self, msg=None):
747 """Fail immediately, with the given message."""
748 raise self.failureException(msg)
749
750 def assertFalse(self, expr, msg=None):
Ezio Melotti3044fa72010-12-18 17:31:58 +0000751 """Check that the expression is false."""
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000752 if expr:
Ezio Melotti3044fa72010-12-18 17:31:58 +0000753 msg = self._formatMessage(msg, "%s is not false" % safe_repr(expr))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000754 raise self.failureException(msg)
755
756 def assertTrue(self, expr, msg=None):
Ezio Melotti3044fa72010-12-18 17:31:58 +0000757 """Check that the expression is true."""
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000758 if not expr:
Ezio Melotti3044fa72010-12-18 17:31:58 +0000759 msg = self._formatMessage(msg, "%s is not true" % safe_repr(expr))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000760 raise self.failureException(msg)
761
762 def _formatMessage(self, msg, standardMsg):
763 """Honour the longMessage attribute when generating failure messages.
764 If longMessage is False this means:
765 * Use only an explicit message if it is provided
766 * Otherwise use the standard message for the assert
767
768 If longMessage is True:
769 * Use the standard message
770 * If an explicit message is provided, plus ' : ' and the explicit message
771 """
772 if not self.longMessage:
773 return msg or standardMsg
774 if msg is None:
775 return standardMsg
Benjamin Peterson847a4112010-03-14 15:04:17 +0000776 try:
777 # don't switch to '{}' formatting in Python 2.X
778 # it changes the way unicode input is handled
779 return '%s : %s' % (standardMsg, msg)
780 except UnicodeDecodeError:
781 return '%s : %s' % (safe_repr(standardMsg), safe_repr(msg))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000782
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300783 def assertRaises(self, expected_exception, *args, **kwargs):
784 """Fail unless an exception of class expected_exception is raised
785 by the callable when invoked with specified positional and
786 keyword arguments. If a different type of exception is
Andrew Svetlov737fb892012-12-18 21:14:22 +0200787 raised, it will not be caught, and the test case will be
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000788 deemed to have suffered an error, exactly as for an
789 unexpected exception.
790
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300791 If called with the callable and arguments omitted, will return a
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000792 context object used like this::
793
Michael Foord1c42b122010-02-05 22:58:21 +0000794 with self.assertRaises(SomeException):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000795 do_something()
Michael Foord1c42b122010-02-05 22:58:21 +0000796
Ezio Melottib4dc2502011-05-06 15:01:41 +0300797 An optional keyword argument 'msg' can be provided when assertRaises
798 is used as a context object.
799
Michael Foord1c42b122010-02-05 22:58:21 +0000800 The context manager keeps a reference to the exception as
Ezio Melotti49008232010-02-08 21:57:48 +0000801 the 'exception' attribute. This allows you to inspect the
Michael Foord1c42b122010-02-05 22:58:21 +0000802 exception after the assertion::
803
804 with self.assertRaises(SomeException) as cm:
805 do_something()
Ezio Melotti49008232010-02-08 21:57:48 +0000806 the_exception = cm.exception
Michael Foordb57ac6d2010-02-05 23:26:29 +0000807 self.assertEqual(the_exception.error_code, 3)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000808 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300809 context = _AssertRaisesContext(expected_exception, self)
Victor Stinnerbbd3cf82017-03-28 00:56:28 +0200810 try:
811 return context.handle('assertRaises', args, kwargs)
812 finally:
813 # bpo-23890: manually break a reference cycle
814 context = None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000815
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300816 def assertWarns(self, expected_warning, *args, **kwargs):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000817 """Fail unless a warning of class warnClass is triggered
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300818 by the callable when invoked with specified positional and
819 keyword arguments. If a different type of warning is
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000820 triggered, it will not be handled: depending on the other
821 warning filtering rules in effect, it might be silenced, printed
822 out, or raised as an exception.
823
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300824 If called with the callable and arguments omitted, will return a
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000825 context object used like this::
826
827 with self.assertWarns(SomeWarning):
828 do_something()
829
Ezio Melottib4dc2502011-05-06 15:01:41 +0300830 An optional keyword argument 'msg' can be provided when assertWarns
831 is used as a context object.
832
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000833 The context manager keeps a reference to the first matching
834 warning as the 'warning' attribute; similarly, the 'filename'
835 and 'lineno' attributes give you information about the line
836 of Python code from which the warning was triggered.
837 This allows you to inspect the warning after the assertion::
838
839 with self.assertWarns(SomeWarning) as cm:
840 do_something()
841 the_warning = cm.warning
842 self.assertEqual(the_warning.some_attribute, 147)
843 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +0300844 context = _AssertWarnsContext(expected_warning, self)
845 return context.handle('assertWarns', args, kwargs)
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000846
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200847 def assertLogs(self, logger=None, level=None):
848 """Fail unless a log message of level *level* or higher is emitted
849 on *logger_name* or its children. If omitted, *level* defaults to
850 INFO and *logger* defaults to the root logger.
851
852 This method must be used as a context manager, and will yield
853 a recording object with two attributes: `output` and `records`.
854 At the end of the context manager, the `output` attribute will
855 be a list of the matching formatted log messages and the
856 `records` attribute will be a list of the corresponding LogRecord
857 objects.
858
859 Example::
860
861 with self.assertLogs('foo', level='INFO') as cm:
862 logging.getLogger('foo').info('first message')
863 logging.getLogger('foo.bar').error('second message')
864 self.assertEqual(cm.output, ['INFO:foo:first message',
865 'ERROR:foo.bar:second message'])
866 """
867 return _AssertLogsContext(self, logger, level)
868
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000869 def _getAssertEqualityFunc(self, first, second):
870 """Get a detailed comparison function for the types of the two args.
871
872 Returns: A callable accepting (first, second, msg=None) that will
873 raise a failure exception if first != second with a useful human
874 readable error message for those types.
875 """
876 #
877 # NOTE(gregory.p.smith): I considered isinstance(first, type(second))
878 # and vice versa. I opted for the conservative approach in case
879 # subclasses are not intended to be compared in detail to their super
880 # class instances using a type equality func. This means testing
881 # subtypes won't automagically use the detailed comparison. Callers
882 # should use their type specific assertSpamEqual method to compare
883 # subclasses if the detailed comparison is desired and appropriate.
884 # See the discussion in http://bugs.python.org/issue2578.
885 #
886 if type(first) is type(second):
887 asserter = self._type_equality_funcs.get(type(first))
888 if asserter is not None:
Benjamin Peterson34b2b262011-07-12 19:21:42 -0500889 if isinstance(asserter, str):
890 asserter = getattr(self, asserter)
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000891 return asserter
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000892
893 return self._baseAssertEqual
894
895 def _baseAssertEqual(self, first, second, msg=None):
896 """The default assertEqual implementation, not type specific."""
897 if not first == second:
Serhiy Storchaka77622f52013-09-23 23:07:00 +0300898 standardMsg = '%s != %s' % _common_shorten_repr(first, second)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000899 msg = self._formatMessage(msg, standardMsg)
900 raise self.failureException(msg)
901
902 def assertEqual(self, first, second, msg=None):
903 """Fail if the two objects are unequal as determined by the '=='
904 operator.
905 """
906 assertion_func = self._getAssertEqualityFunc(first, second)
907 assertion_func(first, second, msg=msg)
908
909 def assertNotEqual(self, first, second, msg=None):
Ezio Melotti90eea972012-11-08 11:08:39 +0200910 """Fail if the two objects are equal as determined by the '!='
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000911 operator.
912 """
913 if not first != second:
Benjamin Peterson847a4112010-03-14 15:04:17 +0000914 msg = self._formatMessage(msg, '%s == %s' % (safe_repr(first),
915 safe_repr(second)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000916 raise self.failureException(msg)
917
Michael Foord321d0592010-11-02 13:44:51 +0000918 def assertAlmostEqual(self, first, second, places=None, msg=None,
Benjamin Petersonb48af542010-04-11 20:43:16 +0000919 delta=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000920 """Fail if the two objects are unequal as determined by their
921 difference rounded to the given number of decimal places
Benjamin Petersonb48af542010-04-11 20:43:16 +0000922 (default 7) and comparing to zero, or by comparing that the
Ron032a6482017-10-18 20:01:23 +0300923 difference between the two objects is more than the given
924 delta.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000925
926 Note that decimal places (from zero) are usually not the same
Martin Pantereb995702016-07-28 01:11:04 +0000927 as significant digits (measured from the most significant digit).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000928
929 If the two objects compare equal then they will automatically
930 compare almost equal.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000931 """
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000932 if first == second:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000933 # shortcut
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000934 return
Benjamin Petersonb48af542010-04-11 20:43:16 +0000935 if delta is not None and places is not None:
936 raise TypeError("specify delta or places not both")
937
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200938 diff = abs(first - second)
Benjamin Petersonb48af542010-04-11 20:43:16 +0000939 if delta is not None:
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200940 if diff <= delta:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000941 return
942
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200943 standardMsg = '%s != %s within %s delta (%s difference)' % (
944 safe_repr(first),
945 safe_repr(second),
946 safe_repr(delta),
947 safe_repr(diff))
Benjamin Petersonb48af542010-04-11 20:43:16 +0000948 else:
949 if places is None:
950 places = 7
951
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200952 if round(diff, places) == 0:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000953 return
954
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200955 standardMsg = '%s != %s within %r places (%s difference)' % (
956 safe_repr(first),
957 safe_repr(second),
958 places,
959 safe_repr(diff))
Benjamin Petersonb48af542010-04-11 20:43:16 +0000960 msg = self._formatMessage(msg, standardMsg)
961 raise self.failureException(msg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000962
Michael Foord321d0592010-11-02 13:44:51 +0000963 def assertNotAlmostEqual(self, first, second, places=None, msg=None,
Benjamin Petersonb48af542010-04-11 20:43:16 +0000964 delta=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000965 """Fail if the two objects are equal as determined by their
966 difference rounded to the given number of decimal places
Benjamin Petersonb48af542010-04-11 20:43:16 +0000967 (default 7) and comparing to zero, or by comparing that the
Ron032a6482017-10-18 20:01:23 +0300968 difference between the two objects is less than the given delta.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000969
970 Note that decimal places (from zero) are usually not the same
Martin Pantereb995702016-07-28 01:11:04 +0000971 as significant digits (measured from the most significant digit).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000972
973 Objects that are equal automatically fail.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000974 """
Benjamin Petersonb48af542010-04-11 20:43:16 +0000975 if delta is not None and places is not None:
976 raise TypeError("specify delta or places not both")
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200977 diff = abs(first - second)
Benjamin Petersonb48af542010-04-11 20:43:16 +0000978 if delta is not None:
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200979 if not (first == second) and diff > delta:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000980 return
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200981 standardMsg = '%s == %s within %s delta (%s difference)' % (
982 safe_repr(first),
983 safe_repr(second),
984 safe_repr(delta),
985 safe_repr(diff))
Benjamin Petersonb48af542010-04-11 20:43:16 +0000986 else:
987 if places is None:
988 places = 7
Giampaolo Rodola5d7a8d02017-05-01 18:18:56 +0200989 if not (first == second) and round(diff, places) != 0:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000990 return
Benjamin Peterson847a4112010-03-14 15:04:17 +0000991 standardMsg = '%s == %s within %r places' % (safe_repr(first),
Benjamin Petersonb48af542010-04-11 20:43:16 +0000992 safe_repr(second),
993 places)
994
995 msg = self._formatMessage(msg, standardMsg)
996 raise self.failureException(msg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000997
Michael Foord085dfd32010-06-05 12:17:02 +0000998 def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000999 """An equality assertion for ordered sequences (like lists and tuples).
1000
R. David Murrayad13f222010-01-29 22:17:58 +00001001 For the purposes of this function, a valid ordered sequence type is one
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001002 which can be indexed, has a length, and has an equality operator.
1003
1004 Args:
1005 seq1: The first sequence to compare.
1006 seq2: The second sequence to compare.
1007 seq_type: The expected datatype of the sequences, or None if no
1008 datatype should be enforced.
1009 msg: Optional message to use on failure instead of a list of
1010 differences.
1011 """
Benjamin Petersonb29614e2012-10-09 11:16:03 -04001012 if seq_type is not None:
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001013 seq_type_name = seq_type.__name__
1014 if not isinstance(seq1, seq_type):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001015 raise self.failureException('First sequence is not a %s: %s'
1016 % (seq_type_name, safe_repr(seq1)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001017 if not isinstance(seq2, seq_type):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001018 raise self.failureException('Second sequence is not a %s: %s'
1019 % (seq_type_name, safe_repr(seq2)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001020 else:
1021 seq_type_name = "sequence"
1022
1023 differing = None
1024 try:
1025 len1 = len(seq1)
1026 except (TypeError, NotImplementedError):
1027 differing = 'First %s has no length. Non-sequence?' % (
1028 seq_type_name)
1029
1030 if differing is None:
1031 try:
1032 len2 = len(seq2)
1033 except (TypeError, NotImplementedError):
1034 differing = 'Second %s has no length. Non-sequence?' % (
1035 seq_type_name)
1036
1037 if differing is None:
1038 if seq1 == seq2:
1039 return
1040
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001041 differing = '%ss differ: %s != %s\n' % (
1042 (seq_type_name.capitalize(),) +
1043 _common_shorten_repr(seq1, seq2))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001044
1045 for i in range(min(len1, len2)):
1046 try:
1047 item1 = seq1[i]
1048 except (TypeError, IndexError, NotImplementedError):
1049 differing += ('\nUnable to index element %d of first %s\n' %
1050 (i, seq_type_name))
1051 break
1052
1053 try:
1054 item2 = seq2[i]
1055 except (TypeError, IndexError, NotImplementedError):
1056 differing += ('\nUnable to index element %d of second %s\n' %
1057 (i, seq_type_name))
1058 break
1059
1060 if item1 != item2:
1061 differing += ('\nFirst differing element %d:\n%s\n%s\n' %
Serhiy Storchaka685fbed2016-04-25 08:58:25 +03001062 ((i,) + _common_shorten_repr(item1, item2)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001063 break
1064 else:
1065 if (len1 == len2 and seq_type is None and
1066 type(seq1) != type(seq2)):
1067 # The sequences are the same, but have differing types.
1068 return
1069
1070 if len1 > len2:
1071 differing += ('\nFirst %s contains %d additional '
1072 'elements.\n' % (seq_type_name, len1 - len2))
1073 try:
1074 differing += ('First extra element %d:\n%s\n' %
Serhiy Storchaka685fbed2016-04-25 08:58:25 +03001075 (len2, safe_repr(seq1[len2])))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001076 except (TypeError, IndexError, NotImplementedError):
1077 differing += ('Unable to index element %d '
1078 'of first %s\n' % (len2, seq_type_name))
1079 elif len1 < len2:
1080 differing += ('\nSecond %s contains %d additional '
1081 'elements.\n' % (seq_type_name, len2 - len1))
1082 try:
1083 differing += ('First extra element %d:\n%s\n' %
Serhiy Storchaka685fbed2016-04-25 08:58:25 +03001084 (len1, safe_repr(seq2[len1])))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001085 except (TypeError, IndexError, NotImplementedError):
1086 differing += ('Unable to index element %d '
1087 'of second %s\n' % (len1, seq_type_name))
Michael Foord2034d9a2010-06-05 11:27:52 +00001088 standardMsg = differing
1089 diffMsg = '\n' + '\n'.join(
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001090 difflib.ndiff(pprint.pformat(seq1).splitlines(),
1091 pprint.pformat(seq2).splitlines()))
Michael Foord085dfd32010-06-05 12:17:02 +00001092
1093 standardMsg = self._truncateMessage(standardMsg, diffMsg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001094 msg = self._formatMessage(msg, standardMsg)
1095 self.fail(msg)
1096
Michael Foord085dfd32010-06-05 12:17:02 +00001097 def _truncateMessage(self, message, diff):
1098 max_diff = self.maxDiff
1099 if max_diff is None or len(diff) <= max_diff:
1100 return message + diff
Michael Foord9dad32e2010-06-05 13:49:56 +00001101 return message + (DIFF_OMITTED % len(diff))
Michael Foord085dfd32010-06-05 12:17:02 +00001102
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001103 def assertListEqual(self, list1, list2, msg=None):
1104 """A list-specific equality assertion.
1105
1106 Args:
1107 list1: The first list to compare.
1108 list2: The second list to compare.
1109 msg: Optional message to use on failure instead of a list of
1110 differences.
1111
1112 """
1113 self.assertSequenceEqual(list1, list2, msg, seq_type=list)
1114
1115 def assertTupleEqual(self, tuple1, tuple2, msg=None):
1116 """A tuple-specific equality assertion.
1117
1118 Args:
1119 tuple1: The first tuple to compare.
1120 tuple2: The second tuple to compare.
1121 msg: Optional message to use on failure instead of a list of
1122 differences.
1123 """
1124 self.assertSequenceEqual(tuple1, tuple2, msg, seq_type=tuple)
1125
1126 def assertSetEqual(self, set1, set2, msg=None):
1127 """A set-specific equality assertion.
1128
1129 Args:
1130 set1: The first set to compare.
1131 set2: The second set to compare.
1132 msg: Optional message to use on failure instead of a list of
1133 differences.
1134
Michael Foord91c9da32010-03-20 17:21:27 +00001135 assertSetEqual uses ducktyping to support different types of sets, and
1136 is optimized for sets specifically (parameters must support a
1137 difference method).
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001138 """
1139 try:
1140 difference1 = set1.difference(set2)
1141 except TypeError as e:
1142 self.fail('invalid type when attempting set difference: %s' % e)
1143 except AttributeError as e:
1144 self.fail('first argument does not support set difference: %s' % e)
1145
1146 try:
1147 difference2 = set2.difference(set1)
1148 except TypeError as e:
1149 self.fail('invalid type when attempting set difference: %s' % e)
1150 except AttributeError as e:
1151 self.fail('second argument does not support set difference: %s' % e)
1152
1153 if not (difference1 or difference2):
1154 return
1155
1156 lines = []
1157 if difference1:
1158 lines.append('Items in the first set but not the second:')
1159 for item in difference1:
1160 lines.append(repr(item))
1161 if difference2:
1162 lines.append('Items in the second set but not the first:')
1163 for item in difference2:
1164 lines.append(repr(item))
1165
1166 standardMsg = '\n'.join(lines)
1167 self.fail(self._formatMessage(msg, standardMsg))
1168
1169 def assertIn(self, member, container, msg=None):
1170 """Just like self.assertTrue(a in b), but with a nicer default message."""
1171 if member not in container:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001172 standardMsg = '%s not found in %s' % (safe_repr(member),
1173 safe_repr(container))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001174 self.fail(self._formatMessage(msg, standardMsg))
1175
1176 def assertNotIn(self, member, container, msg=None):
1177 """Just like self.assertTrue(a not in b), but with a nicer default message."""
1178 if member in container:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001179 standardMsg = '%s unexpectedly found in %s' % (safe_repr(member),
1180 safe_repr(container))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001181 self.fail(self._formatMessage(msg, standardMsg))
1182
1183 def assertIs(self, expr1, expr2, msg=None):
1184 """Just like self.assertTrue(a is b), but with a nicer default message."""
1185 if expr1 is not expr2:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001186 standardMsg = '%s is not %s' % (safe_repr(expr1),
1187 safe_repr(expr2))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001188 self.fail(self._formatMessage(msg, standardMsg))
1189
1190 def assertIsNot(self, expr1, expr2, msg=None):
1191 """Just like self.assertTrue(a is not b), but with a nicer default message."""
1192 if expr1 is expr2:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001193 standardMsg = 'unexpectedly identical: %s' % (safe_repr(expr1),)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001194 self.fail(self._formatMessage(msg, standardMsg))
1195
1196 def assertDictEqual(self, d1, d2, msg=None):
Ezio Melottib3aedd42010-11-20 19:04:17 +00001197 self.assertIsInstance(d1, dict, 'First argument is not a dictionary')
1198 self.assertIsInstance(d2, dict, 'Second argument is not a dictionary')
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001199
1200 if d1 != d2:
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001201 standardMsg = '%s != %s' % _common_shorten_repr(d1, d2)
Michael Foord085dfd32010-06-05 12:17:02 +00001202 diff = ('\n' + '\n'.join(difflib.ndiff(
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001203 pprint.pformat(d1).splitlines(),
1204 pprint.pformat(d2).splitlines())))
Michael Foordcb11b252010-06-05 13:14:43 +00001205 standardMsg = self._truncateMessage(standardMsg, diff)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001206 self.fail(self._formatMessage(msg, standardMsg))
1207
Ezio Melotti0f535012011-04-03 18:02:13 +03001208 def assertDictContainsSubset(self, subset, dictionary, msg=None):
1209 """Checks whether dictionary is a superset of subset."""
1210 warnings.warn('assertDictContainsSubset is deprecated',
1211 DeprecationWarning)
1212 missing = []
1213 mismatched = []
1214 for key, value in subset.items():
1215 if key not in dictionary:
1216 missing.append(key)
1217 elif value != dictionary[key]:
1218 mismatched.append('%s, expected: %s, actual: %s' %
1219 (safe_repr(key), safe_repr(value),
1220 safe_repr(dictionary[key])))
1221
1222 if not (missing or mismatched):
1223 return
1224
1225 standardMsg = ''
1226 if missing:
1227 standardMsg = 'Missing: %s' % ','.join(safe_repr(m) for m in
1228 missing)
1229 if mismatched:
1230 if standardMsg:
1231 standardMsg += '; '
1232 standardMsg += 'Mismatched values: %s' % ','.join(mismatched)
1233
1234 self.fail(self._formatMessage(msg, standardMsg))
1235
1236
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001237 def assertCountEqual(self, first, second, msg=None):
jkleint39baace2019-04-23 01:34:29 -07001238 """Asserts that two iterables have the same elements, the same number of
1239 times, without regard to order.
Michael Foord8442a602010-03-20 16:58:04 +00001240
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001241 self.assertEqual(Counter(list(first)),
1242 Counter(list(second)))
Michael Foord8442a602010-03-20 16:58:04 +00001243
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001244 Example:
Michael Foord8442a602010-03-20 16:58:04 +00001245 - [0, 1, 1] and [1, 0, 1] compare equal.
1246 - [0, 0, 1] and [0, 1] compare unequal.
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001247
Michael Foord8442a602010-03-20 16:58:04 +00001248 """
Michael Foorde180d392011-01-28 19:51:48 +00001249 first_seq, second_seq = list(first), list(second)
Michael Foord8442a602010-03-20 16:58:04 +00001250 try:
Michael Foorde180d392011-01-28 19:51:48 +00001251 first = collections.Counter(first_seq)
1252 second = collections.Counter(second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001253 except TypeError:
Raymond Hettinger6518f5e2010-12-24 00:52:54 +00001254 # Handle case with unhashable elements
Michael Foorde180d392011-01-28 19:51:48 +00001255 differences = _count_diff_all_purpose(first_seq, second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001256 else:
Michael Foorde180d392011-01-28 19:51:48 +00001257 if first == second:
Raymond Hettinger6e165b32010-11-27 09:31:37 +00001258 return
Michael Foorde180d392011-01-28 19:51:48 +00001259 differences = _count_diff_hashable(first_seq, second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001260
Raymond Hettinger93e233d2010-12-24 10:02:22 +00001261 if differences:
1262 standardMsg = 'Element counts were not equal:\n'
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001263 lines = ['First has %d, Second has %d: %r' % diff for diff in differences]
Raymond Hettinger93e233d2010-12-24 10:02:22 +00001264 diffMsg = '\n'.join(lines)
1265 standardMsg = self._truncateMessage(standardMsg, diffMsg)
1266 msg = self._formatMessage(msg, standardMsg)
1267 self.fail(msg)
Michael Foord8442a602010-03-20 16:58:04 +00001268
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001269 def assertMultiLineEqual(self, first, second, msg=None):
1270 """Assert that two multi-line strings are equal."""
Ezio Melottib3aedd42010-11-20 19:04:17 +00001271 self.assertIsInstance(first, str, 'First argument is not a string')
1272 self.assertIsInstance(second, str, 'Second argument is not a string')
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001273
1274 if first != second:
Ezio Melottiedd117f2011-04-27 10:20:38 +03001275 # don't use difflib if the strings are too long
1276 if (len(first) > self._diffThreshold or
1277 len(second) > self._diffThreshold):
1278 self._baseAssertEqual(first, second, msg)
Ezio Melottid8b509b2011-09-28 17:37:55 +03001279 firstlines = first.splitlines(keepends=True)
1280 secondlines = second.splitlines(keepends=True)
Michael Foordc653ce32010-07-10 13:52:22 +00001281 if len(firstlines) == 1 and first.strip('\r\n') == first:
1282 firstlines = [first + '\n']
1283 secondlines = [second + '\n']
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001284 standardMsg = '%s != %s' % _common_shorten_repr(first, second)
Michael Foordc653ce32010-07-10 13:52:22 +00001285 diff = '\n' + ''.join(difflib.ndiff(firstlines, secondlines))
Michael Foordcb11b252010-06-05 13:14:43 +00001286 standardMsg = self._truncateMessage(standardMsg, diff)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001287 self.fail(self._formatMessage(msg, standardMsg))
1288
1289 def assertLess(self, a, b, msg=None):
1290 """Just like self.assertTrue(a < b), but with a nicer default message."""
1291 if not a < b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001292 standardMsg = '%s not less than %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001293 self.fail(self._formatMessage(msg, standardMsg))
1294
1295 def assertLessEqual(self, a, b, msg=None):
1296 """Just like self.assertTrue(a <= b), but with a nicer default message."""
1297 if not a <= b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001298 standardMsg = '%s not less than or equal to %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001299 self.fail(self._formatMessage(msg, standardMsg))
1300
1301 def assertGreater(self, a, b, msg=None):
1302 """Just like self.assertTrue(a > b), but with a nicer default message."""
1303 if not a > b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001304 standardMsg = '%s not greater than %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001305 self.fail(self._formatMessage(msg, standardMsg))
1306
1307 def assertGreaterEqual(self, a, b, msg=None):
1308 """Just like self.assertTrue(a >= b), but with a nicer default message."""
1309 if not a >= b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001310 standardMsg = '%s not greater than or equal to %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001311 self.fail(self._formatMessage(msg, standardMsg))
1312
1313 def assertIsNone(self, obj, msg=None):
1314 """Same as self.assertTrue(obj is None), with a nicer default message."""
1315 if obj is not None:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001316 standardMsg = '%s is not None' % (safe_repr(obj),)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001317 self.fail(self._formatMessage(msg, standardMsg))
1318
1319 def assertIsNotNone(self, obj, msg=None):
1320 """Included for symmetry with assertIsNone."""
1321 if obj is None:
1322 standardMsg = 'unexpectedly None'
1323 self.fail(self._formatMessage(msg, standardMsg))
1324
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001325 def assertIsInstance(self, obj, cls, msg=None):
1326 """Same as self.assertTrue(isinstance(obj, cls)), with a nicer
1327 default message."""
1328 if not isinstance(obj, cls):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001329 standardMsg = '%s is not an instance of %r' % (safe_repr(obj), cls)
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001330 self.fail(self._formatMessage(msg, standardMsg))
1331
1332 def assertNotIsInstance(self, obj, cls, msg=None):
1333 """Included for symmetry with assertIsInstance."""
1334 if isinstance(obj, cls):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001335 standardMsg = '%s is an instance of %r' % (safe_repr(obj), cls)
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001336 self.fail(self._formatMessage(msg, standardMsg))
1337
Ezio Melottied3a7d22010-12-01 02:32:32 +00001338 def assertRaisesRegex(self, expected_exception, expected_regex,
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001339 *args, **kwargs):
Ezio Melottied3a7d22010-12-01 02:32:32 +00001340 """Asserts that the message in a raised exception matches a regex.
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001341
1342 Args:
1343 expected_exception: Exception class expected to be raised.
Serhiy Storchaka0b5e61d2017-10-04 20:09:49 +03001344 expected_regex: Regex (re.Pattern object or string) expected
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001345 to be found in error message.
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001346 args: Function to be called and extra positional args.
1347 kwargs: Extra kwargs.
Ezio Melottib4dc2502011-05-06 15:01:41 +03001348 msg: Optional message used in case of failure. Can only be used
1349 when assertRaisesRegex is used as a context manager.
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001350 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001351 context = _AssertRaisesContext(expected_exception, self, expected_regex)
1352 return context.handle('assertRaisesRegex', args, kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001353
Ezio Melottied3a7d22010-12-01 02:32:32 +00001354 def assertWarnsRegex(self, expected_warning, expected_regex,
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001355 *args, **kwargs):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001356 """Asserts that the message in a triggered warning matches a regexp.
1357 Basic functioning is similar to assertWarns() with the addition
1358 that only warnings whose messages also match the regular expression
1359 are considered successful matches.
1360
1361 Args:
1362 expected_warning: Warning class expected to be triggered.
Serhiy Storchaka0b5e61d2017-10-04 20:09:49 +03001363 expected_regex: Regex (re.Pattern object or string) expected
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001364 to be found in error message.
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001365 args: Function to be called and extra positional args.
1366 kwargs: Extra kwargs.
Ezio Melottib4dc2502011-05-06 15:01:41 +03001367 msg: Optional message used in case of failure. Can only be used
1368 when assertWarnsRegex is used as a context manager.
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001369 """
Serhiy Storchakadf573d62015-05-16 16:29:50 +03001370 context = _AssertWarnsContext(expected_warning, self, expected_regex)
1371 return context.handle('assertWarnsRegex', args, kwargs)
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001372
Ezio Melottied3a7d22010-12-01 02:32:32 +00001373 def assertRegex(self, text, expected_regex, msg=None):
Michael Foorde3ef5f12010-05-08 16:46:14 +00001374 """Fail the test unless the text matches the regular expression."""
Ezio Melottied3a7d22010-12-01 02:32:32 +00001375 if isinstance(expected_regex, (str, bytes)):
Gregory P. Smithed16bf42010-12-16 19:23:05 +00001376 assert expected_regex, "expected_regex must not be empty."
Ezio Melottied3a7d22010-12-01 02:32:32 +00001377 expected_regex = re.compile(expected_regex)
1378 if not expected_regex.search(text):
Robert Collinsbe6caca2015-08-20 11:13:09 +12001379 standardMsg = "Regex didn't match: %r not found in %r" % (
1380 expected_regex.pattern, text)
1381 # _formatMessage ensures the longMessage option is respected
1382 msg = self._formatMessage(msg, standardMsg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001383 raise self.failureException(msg)
1384
Ezio Melotti8f776302010-12-10 02:32:05 +00001385 def assertNotRegex(self, text, unexpected_regex, msg=None):
Michael Foorde3ef5f12010-05-08 16:46:14 +00001386 """Fail the test if the text matches the regular expression."""
Ezio Melottied3a7d22010-12-01 02:32:32 +00001387 if isinstance(unexpected_regex, (str, bytes)):
1388 unexpected_regex = re.compile(unexpected_regex)
1389 match = unexpected_regex.search(text)
Benjamin Petersonb48af542010-04-11 20:43:16 +00001390 if match:
Robert Collinsbe6caca2015-08-20 11:13:09 +12001391 standardMsg = 'Regex matched: %r matches %r in %r' % (
1392 text[match.start() : match.end()],
1393 unexpected_regex.pattern,
1394 text)
1395 # _formatMessage ensures the longMessage option is respected
1396 msg = self._formatMessage(msg, standardMsg)
Benjamin Petersonb48af542010-04-11 20:43:16 +00001397 raise self.failureException(msg)
1398
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001399
Ezio Melottied3a7d22010-12-01 02:32:32 +00001400 def _deprecate(original_func):
1401 def deprecated_func(*args, **kwargs):
1402 warnings.warn(
1403 'Please use {0} instead.'.format(original_func.__name__),
1404 DeprecationWarning, 2)
1405 return original_func(*args, **kwargs)
1406 return deprecated_func
1407
Ezio Melotti361467e2011-04-03 17:37:58 +03001408 # see #9424
Ezio Melotti0f535012011-04-03 18:02:13 +03001409 failUnlessEqual = assertEquals = _deprecate(assertEqual)
1410 failIfEqual = assertNotEquals = _deprecate(assertNotEqual)
1411 failUnlessAlmostEqual = assertAlmostEquals = _deprecate(assertAlmostEqual)
1412 failIfAlmostEqual = assertNotAlmostEquals = _deprecate(assertNotAlmostEqual)
1413 failUnless = assert_ = _deprecate(assertTrue)
1414 failUnlessRaises = _deprecate(assertRaises)
1415 failIf = _deprecate(assertFalse)
Ezio Melottied3a7d22010-12-01 02:32:32 +00001416 assertRaisesRegexp = _deprecate(assertRaisesRegex)
1417 assertRegexpMatches = _deprecate(assertRegex)
Robert Collinsbe6caca2015-08-20 11:13:09 +12001418 assertNotRegexpMatches = _deprecate(assertNotRegex)
Ezio Melottied3a7d22010-12-01 02:32:32 +00001419
1420
1421
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001422class FunctionTestCase(TestCase):
1423 """A test case that wraps a test function.
1424
1425 This is useful for slipping pre-existing test functions into the
1426 unittest framework. Optionally, set-up and tidy-up functions can be
1427 supplied. As with TestCase, the tidy-up ('tearDown') function will
1428 always be called if the set-up ('setUp') function ran successfully.
1429 """
1430
1431 def __init__(self, testFunc, setUp=None, tearDown=None, description=None):
1432 super(FunctionTestCase, self).__init__()
1433 self._setUpFunc = setUp
1434 self._tearDownFunc = tearDown
1435 self._testFunc = testFunc
1436 self._description = description
1437
1438 def setUp(self):
1439 if self._setUpFunc is not None:
1440 self._setUpFunc()
1441
1442 def tearDown(self):
1443 if self._tearDownFunc is not None:
1444 self._tearDownFunc()
1445
1446 def runTest(self):
1447 self._testFunc()
1448
1449 def id(self):
1450 return self._testFunc.__name__
1451
1452 def __eq__(self, other):
1453 if not isinstance(other, self.__class__):
1454 return NotImplemented
1455
1456 return self._setUpFunc == other._setUpFunc and \
1457 self._tearDownFunc == other._tearDownFunc and \
1458 self._testFunc == other._testFunc and \
1459 self._description == other._description
1460
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001461 def __hash__(self):
1462 return hash((type(self), self._setUpFunc, self._tearDownFunc,
1463 self._testFunc, self._description))
1464
1465 def __str__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001466 return "%s (%s)" % (strclass(self.__class__),
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001467 self._testFunc.__name__)
1468
1469 def __repr__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001470 return "<%s tec=%s>" % (strclass(self.__class__),
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001471 self._testFunc)
1472
1473 def shortDescription(self):
1474 if self._description is not None:
1475 return self._description
1476 doc = self._testFunc.__doc__
1477 return doc and doc.split("\n")[0].strip() or None
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001478
1479
1480class _SubTest(TestCase):
1481
1482 def __init__(self, test_case, message, params):
1483 super().__init__()
1484 self._message = message
1485 self.test_case = test_case
1486 self.params = params
1487 self.failureException = test_case.failureException
1488
1489 def runTest(self):
1490 raise NotImplementedError("subtests cannot be run directly")
1491
1492 def _subDescription(self):
1493 parts = []
Berker Peksag16ea19f2016-09-21 19:34:15 +03001494 if self._message is not _subtest_msg_sentinel:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001495 parts.append("[{}]".format(self._message))
1496 if self.params:
1497 params_desc = ', '.join(
1498 "{}={!r}".format(k, v)
Serhiy Storchaka48fbe522017-06-23 21:47:39 +03001499 for (k, v) in self.params.items())
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001500 parts.append("({})".format(params_desc))
1501 return " ".join(parts) or '(<subtest>)'
1502
1503 def id(self):
1504 return "{} {}".format(self.test_case.id(), self._subDescription())
1505
1506 def shortDescription(self):
1507 """Returns a one-line description of the subtest, or None if no
1508 description has been provided.
1509 """
1510 return self.test_case.shortDescription()
1511
1512 def __str__(self):
1513 return "{} {}".format(self.test_case, self._subDescription())