# [Python-checkins] r86301 - python/branches/py3k/Lib/test/test_cmath.py

mark.dickinson python-checkins at python.org
Sun Nov 7 16:31:41 CET 2010

Author: mark.dickinson
Date: Sun Nov  7 16:31:41 2010
New Revision: 86301

Log:
Update assertComplexIdentical to handle nans correctly.

Modified:
python/branches/py3k/Lib/test/test_cmath.py

Modified: python/branches/py3k/Lib/test/test_cmath.py
==============================================================================
--- python/branches/py3k/Lib/test/test_cmath.py	(original)
+++ python/branches/py3k/Lib/test/test_cmath.py	Sun Nov  7 16:31:41 2010
@@ -62,11 +62,38 @@
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):