Commit 0f535013 authored by Ezio Melotti's avatar Ezio Melotti

#11282: add back the fail* methods and assertDictContainsSubset.

parent b7af6207
...@@ -938,6 +938,35 @@ class TestCase(object): ...@@ -938,6 +938,35 @@ class TestCase(object):
standardMsg = self._truncateMessage(standardMsg, diff) standardMsg = self._truncateMessage(standardMsg, diff)
self.fail(self._formatMessage(msg, standardMsg)) self.fail(self._formatMessage(msg, standardMsg))
def assertDictContainsSubset(self, subset, dictionary, msg=None):
"""Checks whether dictionary is a superset of subset."""
warnings.warn('assertDictContainsSubset is deprecated',
DeprecationWarning)
missing = []
mismatched = []
for key, value in subset.items():
if key not in dictionary:
missing.append(key)
elif value != dictionary[key]:
mismatched.append('%s, expected: %s, actual: %s' %
(safe_repr(key), safe_repr(value),
safe_repr(dictionary[key])))
if not (missing or mismatched):
return
standardMsg = ''
if missing:
standardMsg = 'Missing: %s' % ','.join(safe_repr(m) for m in
missing)
if mismatched:
if standardMsg:
standardMsg += '; '
standardMsg += 'Mismatched values: %s' % ','.join(mismatched)
self.fail(self._formatMessage(msg, standardMsg))
def assertCountEqual(self, first, second, msg=None): def assertCountEqual(self, first, second, msg=None):
"""An unordered sequence comparison asserting that the same elements, """An unordered sequence comparison asserting that the same elements,
regardless of order. If the same element occurs more than once, regardless of order. If the same element occurs more than once,
...@@ -1111,11 +1140,13 @@ class TestCase(object): ...@@ -1111,11 +1140,13 @@ class TestCase(object):
return deprecated_func return deprecated_func
# see #9424 # see #9424
assertEquals = _deprecate(assertEqual) failUnlessEqual = assertEquals = _deprecate(assertEqual)
assertNotEquals = _deprecate(assertNotEqual) failIfEqual = assertNotEquals = _deprecate(assertNotEqual)
assertAlmostEquals = _deprecate(assertAlmostEqual) failUnlessAlmostEqual = assertAlmostEquals = _deprecate(assertAlmostEqual)
assertNotAlmostEquals = _deprecate(assertNotAlmostEqual) failIfAlmostEqual = assertNotAlmostEquals = _deprecate(assertNotAlmostEqual)
assert_ = _deprecate(assertTrue) failUnless = assert_ = _deprecate(assertTrue)
failUnlessRaises = _deprecate(assertRaises)
failIf = _deprecate(assertFalse)
assertRaisesRegexp = _deprecate(assertRaisesRegex) assertRaisesRegexp = _deprecate(assertRaisesRegex)
assertRegexpMatches = _deprecate(assertRegex) assertRegexpMatches = _deprecate(assertRegex)
......
...@@ -19,12 +19,17 @@ def warnfun(): ...@@ -19,12 +19,17 @@ def warnfun():
warnings.warn('rw', RuntimeWarning) warnings.warn('rw', RuntimeWarning)
class TestWarnings(unittest.TestCase): class TestWarnings(unittest.TestCase):
# unittest warnings will be printed at most once per type # unittest warnings will be printed at most once per type (max one message
# for the fail* methods, and one for the assert* methods)
def test_assert(self): def test_assert(self):
self.assertEquals(2+2, 4) self.assertEquals(2+2, 4)
self.assertEquals(2*2, 4) self.assertEquals(2*2, 4)
self.assertEquals(2**2, 4) self.assertEquals(2**2, 4)
def test_fail(self):
self.failUnless(1)
self.failUnless(True)
def test_other_unittest(self): def test_other_unittest(self):
self.assertAlmostEqual(2+2, 4) self.assertAlmostEqual(2+2, 4)
self.assertNotAlmostEqual(4+4, 2) self.assertNotAlmostEqual(4+4, 2)
......
...@@ -223,6 +223,15 @@ class TestLongMessage(unittest.TestCase): ...@@ -223,6 +223,15 @@ class TestLongMessage(unittest.TestCase):
"\+ \{'key': 'value'\}$", "\+ \{'key': 'value'\}$",
"\+ \{'key': 'value'\} : oops$"]) "\+ \{'key': 'value'\} : oops$"])
def testAssertDictContainsSubset(self):
with warnings.catch_warnings():
warnings.simplefilter("ignore", DeprecationWarning)
self.assertMessages('assertDictContainsSubset', ({'key': 'value'}, {}),
["^Missing: 'key'$", "^oops$",
"^Missing: 'key'$",
"^Missing: 'key' : oops$"])
def testAssertMultiLineEqual(self): def testAssertMultiLineEqual(self):
self.assertMessages('assertMultiLineEqual', ("", "foo"), self.assertMessages('assertMultiLineEqual', ("", "foo"),
[r"\+ foo$", "^oops$", [r"\+ foo$", "^oops$",
......
...@@ -523,6 +523,36 @@ class Test_TestCase(unittest.TestCase, TestEquality, TestHashing): ...@@ -523,6 +523,36 @@ class Test_TestCase(unittest.TestCase, TestEquality, TestHashing):
self.assertRaises(self.failureException, self.assertNotIn, 'cow', self.assertRaises(self.failureException, self.assertNotIn, 'cow',
animals) animals)
def testAssertDictContainsSubset(self):
with warnings.catch_warnings():
warnings.simplefilter("ignore", DeprecationWarning)
self.assertDictContainsSubset({}, {})
self.assertDictContainsSubset({}, {'a': 1})
self.assertDictContainsSubset({'a': 1}, {'a': 1})
self.assertDictContainsSubset({'a': 1}, {'a': 1, 'b': 2})
self.assertDictContainsSubset({'a': 1, 'b': 2}, {'a': 1, 'b': 2})
with self.assertRaises(self.failureException):
self.assertDictContainsSubset({1: "one"}, {})
with self.assertRaises(self.failureException):
self.assertDictContainsSubset({'a': 2}, {'a': 1})
with self.assertRaises(self.failureException):
self.assertDictContainsSubset({'c': 1}, {'a': 1})
with self.assertRaises(self.failureException):
self.assertDictContainsSubset({'a': 1, 'c': 1}, {'a': 1})
with self.assertRaises(self.failureException):
self.assertDictContainsSubset({'a': 1, 'c': 1}, {'a': 1})
one = ''.join(chr(i) for i in range(255))
# this used to cause a UnicodeDecodeError constructing the failure msg
with self.assertRaises(self.failureException):
self.assertDictContainsSubset({'foo': one}, {'foo': '\uFFFD'})
def testAssertEqual(self): def testAssertEqual(self):
equal_pairs = [ equal_pairs = [
((), ()), ((), ()),
...@@ -1097,11 +1127,19 @@ test case ...@@ -1097,11 +1127,19 @@ test case
Test that the deprecated methods raise a DeprecationWarning. See #9424. Test that the deprecated methods raise a DeprecationWarning. See #9424.
""" """
old = ( old = (
(self.failIfEqual, (3, 5)),
(self.assertNotEquals, (3, 5)), (self.assertNotEquals, (3, 5)),
(self.failUnlessEqual, (3, 3)),
(self.assertEquals, (3, 3)), (self.assertEquals, (3, 3)),
(self.failUnlessAlmostEqual, (2.0, 2.0)),
(self.assertAlmostEquals, (2.0, 2.0)), (self.assertAlmostEquals, (2.0, 2.0)),
(self.failIfAlmostEqual, (3.0, 5.0)),
(self.assertNotAlmostEquals, (3.0, 5.0)), (self.assertNotAlmostEquals, (3.0, 5.0)),
(self.failUnless, (True,)),
(self.assert_, (True,)), (self.assert_, (True,)),
(self.failUnlessRaises, (TypeError, lambda _: 3.14 + 'spam')),
(self.failIf, (False,)),
(self.assertDictContainsSubset, (dict(a=1, b=2), dict(a=1, b=2, c=3))),
(self.assertRaisesRegexp, (KeyError, 'foo', lambda: {}['foo'])), (self.assertRaisesRegexp, (KeyError, 'foo', lambda: {}['foo'])),
(self.assertRegexpMatches, ('bar', 'bar')), (self.assertRegexpMatches, ('bar', 'bar')),
) )
...@@ -1109,6 +1147,21 @@ test case ...@@ -1109,6 +1147,21 @@ test case
with self.assertWarns(DeprecationWarning): with self.assertWarns(DeprecationWarning):
meth(*args) meth(*args)
# disable this test for now. When the version where the fail* methods will
# be removed is decided, re-enable it and update the version
def _testDeprecatedFailMethods(self):
"""Test that the deprecated fail* methods get removed in 3.x"""
if sys.version_info[:2] < (3, 3):
return
deprecated_names = [
'failIfEqual', 'failUnlessEqual', 'failUnlessAlmostEqual',
'failIfAlmostEqual', 'failUnless', 'failUnlessRaises', 'failIf',
'assertDictContainsSubset',
]
for deprecated_name in deprecated_names:
with self.assertRaises(AttributeError):
getattr(self, deprecated_name) # remove these in 3.x
def testDeepcopy(self): def testDeepcopy(self):
# Issue: 5660 # Issue: 5660
class TestableTest(unittest.TestCase): class TestableTest(unittest.TestCase):
......
...@@ -257,17 +257,19 @@ class Test_TextTestRunner(unittest.TestCase): ...@@ -257,17 +257,19 @@ class Test_TextTestRunner(unittest.TestCase):
return [b.splitlines() for b in p.communicate()] return [b.splitlines() for b in p.communicate()]
opts = dict(stdout=subprocess.PIPE, stderr=subprocess.PIPE, opts = dict(stdout=subprocess.PIPE, stderr=subprocess.PIPE,
cwd=os.path.dirname(__file__)) cwd=os.path.dirname(__file__))
ae_msg = b'Please use assertEqual instead.'
at_msg = b'Please use assertTrue instead.'
# no args -> all the warnings are printed, unittest warnings only once # no args -> all the warnings are printed, unittest warnings only once
p = subprocess.Popen([sys.executable, '_test_warnings.py'], **opts) p = subprocess.Popen([sys.executable, '_test_warnings.py'], **opts)
out, err = get_parse_out_err(p) out, err = get_parse_out_err(p)
self.assertIn(b'OK', err) self.assertIn(b'OK', err)
# check that the total number of warnings in the output is correct # check that the total number of warnings in the output is correct
self.assertEqual(len(out), 11) self.assertEqual(len(out), 12)
# check that the numbers of the different kind of warnings is correct # check that the numbers of the different kind of warnings is correct
for msg in [b'dw', b'iw', b'uw']: for msg in [b'dw', b'iw', b'uw']:
self.assertEqual(out.count(msg), 3) self.assertEqual(out.count(msg), 3)
for msg in [b'rw']: for msg in [ae_msg, at_msg, b'rw']:
self.assertEqual(out.count(msg), 1) self.assertEqual(out.count(msg), 1)
args_list = ( args_list = (
...@@ -292,9 +294,11 @@ class Test_TextTestRunner(unittest.TestCase): ...@@ -292,9 +294,11 @@ class Test_TextTestRunner(unittest.TestCase):
**opts) **opts)
out, err = get_parse_out_err(p) out, err = get_parse_out_err(p)
self.assertIn(b'OK', err) self.assertIn(b'OK', err)
self.assertEqual(len(out), 13) self.assertEqual(len(out), 14)
for msg in [b'dw', b'iw', b'uw', b'rw']: for msg in [b'dw', b'iw', b'uw', b'rw']:
self.assertEqual(out.count(msg), 3) self.assertEqual(out.count(msg), 3)
for msg in [ae_msg, at_msg]:
self.assertEqual(out.count(msg), 1)
def testStdErrLookedUpAtInstantiationTime(self): def testStdErrLookedUpAtInstantiationTime(self):
# see issue 10786 # see issue 10786
......
...@@ -87,6 +87,8 @@ Core and Builtins ...@@ -87,6 +87,8 @@ Core and Builtins
Library Library
------- -------
- unittest.TestCase.assertSameElements has been removed.
- sys.getfilesystemencoding() raises a RuntimeError if initfsencoding() was not - sys.getfilesystemencoding() raises a RuntimeError if initfsencoding() was not
called yet: detect bootstrap (startup) issues earlier. called yet: detect bootstrap (startup) issues earlier.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment