]> granicus.if.org Git - python/commitdiff
Update assertComplexIdentical to handle nans correctly.
authorMark Dickinson <dickinsm@gmail.com>
Sun, 7 Nov 2010 15:31:41 +0000 (15:31 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Sun, 7 Nov 2010 15:31:41 +0000 (15:31 +0000)
Lib/test/test_cmath.py

index e3cf03e1add2320f15f92fb4d58ffdcf89a257ac..15f635f56245cb6984205a9e9809dfbe544b9187 100644 (file)
@@ -62,11 +62,38 @@ class CMathTests(unittest.TestCase):
     def tearDown(self):
         self.test_values.close()
 
-    def assertComplexIdentical(self, a, b):
-        """Fail if two complex numbers value or sign is different."""
-        self.assertEqual(a, b)
-        self.assertEqual(math.copysign(1., a.real), math.copysign(1., b.real))
-        self.assertEqual(math.copysign(1., a.imag), math.copysign(1., b.imag))
+    def assertFloatIdentical(self, x, y):
+        """Fail unless floats x and y are identical, in the sense that:
+        (1) both x and y are nans, or
+        (2) both x and y are infinities, with the same sign, or
+        (3) both x and y are zeros, with the same sign, or
+        (4) x and y are both finite and nonzero, and x == y
+
+        """
+        msg = 'floats {!r} and {!r} are not identical'
+
+        if math.isnan(x) or math.isnan(y):
+            if math.isnan(x) and math.isnan(y):
+                return
+        elif x == y:
+            if x != 0.0:
+                return
+            # both zero; check that signs match
+            elif math.copysign(1.0, x) == math.copysign(1.0, y):
+                return
+            else:
+                msg += ': zeros have different signs'
+        self.fail(msg.format(x, y))
+
+    def assertComplexIdentical(self, x, y):
+        """Fail unless complex numbers x and y have equal values and signs.
+
+        In particular, if x and y both have real (or imaginary) part
+        zero, but the zeros have different signs, this test will fail.
+
+        """
+        self.assertFloatIdentical(x.real, y.real)
+        self.assertFloatIdentical(x.imag, y.imag)
 
     def rAssertAlmostEqual(self, a, b, rel_err = 2e-15, abs_err = 5e-323,
                            msg=None):