From c3f79373e89cfe926b6e1f9e2f73dada1cbfff8e Mon Sep 17 00:00:00 2001 From: Michael Foord Date: Sun, 13 Sep 2009 16:40:02 +0000 Subject: [PATCH] Objects that compare equal automatically pass or fail assertAlmostEqual and assertNotAlmostEqual tests on unittest.TestCase. Issue 6567. --- Doc/library/unittest.rst | 6 ++++++ Doc/whatsnew/2.7.rst | 4 ++++ Lib/test/test_unittest.py | 5 +++++ Lib/unittest/case.py | 10 +++++++++- 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index a2d4478a02..61c4308b0a 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -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`. diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst index 9a3b3e67ac..6089d33f54 100644 --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -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. diff --git a/Lib/test/test_unittest.py b/Lib/test/test_unittest.py index 5c3921dfd9..2fab7de979 100644 --- a/Lib/test/test_unittest.py +++ b/Lib/test/test_unittest.py @@ -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 diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index d52bc8d850..cac28421bf 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -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) -- 2.40.0