Objects that compare equal automatically pass or fail assertAlmostEqual and assertNotAlmostEqual tests on unittest.TestCase. Issue 6567.

This commit is contained in:
Michael Foord 2009-09-13 16:40:02 +00:00
parent 60931a5a58
commit c3f79373e8
4 changed files with 24 additions and 1 deletions

View file

@ -733,6 +733,9 @@ Test cases
compare equal, the test will fail with the explanation given by *msg*, or
:const:`None`.
.. versionchanged:: 2.7
Objects that compare equal are automatically almost equal.
.. deprecated:: 2.7
:meth:`failUnlessAlmostEqual`.
@ -749,6 +752,9 @@ Test cases
compare equal, the test will fail with the explanation given by *msg*, or
:const:`None`.
.. versionchanged:: 2.7
Objects that compare equal automatically fail.
.. deprecated:: 2.7
:meth:`failIfAlmostEqual`.

View file

@ -505,6 +505,10 @@ changes, or look through the Subversion logs for all the details.
differences. :meth:`assertDictContainsSubset` checks whether
all of the key/value pairs in *first* are found in *second*.
* :meth:`assertAlmostEqual` and :meth:`assertNotAlmostEqual` short-circuit
(automatically pass or fail without checking decimal places) if the objects
are equal.
* A new hook, :meth:`addTypeEqualityFunc` takes a type object and a
function. The :meth:`assertEqual` method will use the function
when both of the objects being compared are of the specified type.

View file

@ -2989,6 +2989,11 @@ class Test_Assertions(TestCase):
self.assertRaises(self.failureException,
self.assertNotAlmostEqual, 0, .1+.1j, places=0)
self.assertAlmostEqual(float('inf'), float('inf'))
self.assertRaises(self.failureException, self.assertNotAlmostEqual,
float('inf'), float('inf'))
def test_assertRaises(self):
def _raise(e):
raise e

View file

@ -457,7 +457,13 @@ class TestCase(object):
Note that decimal places (from zero) are usually not the same
as significant digits (measured from the most signficant digit).
If the two objects compare equal then they will automatically
compare almost equal.
"""
if first == second:
# shortcut for ite
return
if round(abs(second-first), places) != 0:
standardMsg = '%r != %r within %r places' % (first, second, places)
msg = self._formatMessage(msg, standardMsg)
@ -470,8 +476,10 @@ class TestCase(object):
Note that decimal places (from zero) are usually not the same
as significant digits (measured from the most signficant digit).
Objects that are equal automatically fail.
"""
if round(abs(second-first), places) == 0:
if (first == second) or round(abs(second-first), places) == 0:
standardMsg = '%r == %r within %r places' % (first, second, places)
msg = self._formatMessage(msg, standardMsg)
raise self.failureException(msg)