14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test.test_support import run_unittest
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test.test_math import parse_testfile, test_file
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport cmath, math
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom cmath import phase, polar, rect, pi
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
74adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoINF = float('inf')
84adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoNAN = float('nan')
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocomplex_zeros = [complex(x, y) for x in [0.0, -0.0] for y in [0.0, -0.0]]
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocomplex_infinities = [complex(x, y) for x, y in [
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (INF, 0.0),  # 1st quadrant
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (INF, 2.3),
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (INF, INF),
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (2.3, INF),
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (0.0, INF),
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (-0.0, INF), # 2nd quadrant
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (-2.3, INF),
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (-INF, INF),
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (-INF, 2.3),
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (-INF, 0.0),
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (-INF, -0.0), # 3rd quadrant
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (-INF, -2.3),
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (-INF, -INF),
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (-2.3, -INF),
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (-0.0, -INF),
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (0.0, -INF), # 4th quadrant
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (2.3, -INF),
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (INF, -INF),
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (INF, -2.3),
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (INF, -0.0)
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ]]
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocomplex_nans = [complex(x, y) for x, y in [
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (NAN, -INF),
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (NAN, -2.3),
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (NAN, -0.0),
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (NAN, 0.0),
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (NAN, 2.3),
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (NAN, INF),
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (-INF, NAN),
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (-2.3, NAN),
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (-0.0, NAN),
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (0.0, NAN),
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (2.3, NAN),
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (INF, NAN)
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ]]
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass CMathTests(unittest.TestCase):
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # list of all functions in cmath
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_functions = [getattr(cmath, fname) for fname in [
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh',
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'cos', 'cosh', 'exp', 'log', 'log10', 'sin', 'sinh',
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'sqrt', 'tan', 'tanh']]
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # test first and second arguments independently for 2-argument log
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_functions.append(lambda x : cmath.log(x, 1729. + 0j))
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_functions.append(lambda x : cmath.log(14.-27j, x))
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def setUp(self):
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.test_values = open(test_file)
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def tearDown(self):
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.test_values.close()
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def rAssertAlmostEqual(self, a, b, rel_err = 2e-15, abs_err = 5e-323,
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                           msg=None):
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Fail if the two floating-point numbers are not almost equal.
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Determine whether floating-point values a and b are equal to within
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a (small) rounding error.  The default values for rel_err and
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        abs_err are chosen to be suitable for platforms where a float is
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        represented by an IEEE 754 double.  They allow an error of between
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        9 and 19 ulps.
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # special values testing
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if math.isnan(a):
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if math.isnan(b):
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail(msg or '{!r} should be nan'.format(b))
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if math.isinf(a):
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if a == b:
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail(msg or 'finite result where infinity expected: '
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      'expected {!r}, got {!r}'.format(a, b))
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # if both a and b are zero, check whether they have the same sign
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # (in theory there are examples where it would be legitimate for a
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # and b to have opposite signs; in practice these hardly ever
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # occur).
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not a and not b:
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if math.copysign(1., a) != math.copysign(1., b):
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.fail(msg or 'zero has wrong sign: expected {!r}, '
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          'got {!r}'.format(a, b))
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # if a-b overflows, or b is infinite, return False.  Again, in
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # theory there are examples where a is within a few ulps of the
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # max representable float, and then b could legitimately be
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # infinite.  In practice these examples are rare.
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            absolute_error = abs(b-a)
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except OverflowError:
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # test passes if either the absolute error or the relative
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # error is sufficiently small.  The defaults amount to an
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # error of between 9 ulps and 19 ulps on an IEEE-754 compliant
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # machine.
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if absolute_error <= max(abs_err, rel_err * abs(a)):
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.fail(msg or
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                  '{!r} and {!r} are not sufficiently close'.format(a, b))
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_constants(self):
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e_expected = 2.71828182845904523536
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pi_expected = 3.14159265358979323846
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(cmath.pi, pi_expected, places=9,
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            msg="cmath.pi is {}; should be {}".format(cmath.pi, pi_expected))
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(cmath.e, e_expected, places=9,
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            msg="cmath.e is {}; should be {}".format(cmath.e, e_expected))
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_user_object(self):
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test automatic calling of __complex__ and __float__ by cmath
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # functions
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # some random values to use as test values; we avoid values
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # for which any of the functions in cmath is undefined
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # (i.e. 0., 1., -1., 1j, -1j) or would cause overflow
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cx_arg = 4.419414439 + 1.497100113j
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        flt_arg = -6.131677725
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # a variety of non-complex numbers, used to check that
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # non-complex return values from __complex__ give an error
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        non_complexes = ["not complex", 1, 5L, 2., None,
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         object(), NotImplemented]
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Now we introduce a variety of classes whose instances might
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # end up being passed to the cmath functions
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # usual case: new-style class implementing __complex__
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class MyComplex(object):
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __init__(self, value):
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.value = value
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __complex__(self):
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return self.value
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # old-style class implementing __complex__
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class MyComplexOS:
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __init__(self, value):
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.value = value
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __complex__(self):
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return self.value
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # classes for which __complex__ raises an exception
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class SomeException(Exception):
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class MyComplexException(object):
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __complex__(self):
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise SomeException
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class MyComplexExceptionOS:
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __complex__(self):
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise SomeException
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # some classes not providing __float__ or __complex__
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class NeitherComplexNorFloat(object):
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class NeitherComplexNorFloatOS:
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class MyInt(object):
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __int__(self): return 2
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __long__(self): return 2L
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __index__(self): return 2
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class MyIntOS:
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __int__(self): return 2
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __long__(self): return 2L
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __index__(self): return 2
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # other possible combinations of __float__ and __complex__
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # that should work
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class FloatAndComplex(object):
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __float__(self):
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return flt_arg
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __complex__(self):
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return cx_arg
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class FloatAndComplexOS:
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __float__(self):
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return flt_arg
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __complex__(self):
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return cx_arg
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class JustFloat(object):
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __float__(self):
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return flt_arg
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class JustFloatOS:
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __float__(self):
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return flt_arg
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for f in self.test_functions:
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # usual usage
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(f(MyComplex(cx_arg)), f(cx_arg))
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(f(MyComplexOS(cx_arg)), f(cx_arg))
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # other combinations of __float__ and __complex__
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(f(FloatAndComplex()), f(cx_arg))
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(f(FloatAndComplexOS()), f(cx_arg))
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(f(JustFloat()), f(flt_arg))
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(f(JustFloatOS()), f(flt_arg))
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # TypeError should be raised for classes not providing
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # either __complex__ or __float__, even if they provide
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # __int__, __long__ or __index__.  An old-style class
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # currently raises AttributeError instead of a TypeError;
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # this could be considered a bug.
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(TypeError, f, NeitherComplexNorFloat())
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(TypeError, f, MyInt())
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(Exception, f, NeitherComplexNorFloatOS())
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(Exception, f, MyIntOS())
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # non-complex return value from __complex__ -> TypeError
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for bad_complex in non_complexes:
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertRaises(TypeError, f, MyComplex(bad_complex))
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertRaises(TypeError, f, MyComplexOS(bad_complex))
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # exceptions in __complex__ should be propagated correctly
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(SomeException, f, MyComplexException())
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(SomeException, f, MyComplexExceptionOS())
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_input_type(self):
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # ints and longs should be acceptable inputs to all cmath
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # functions, by virtue of providing a __float__ method
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for f in self.test_functions:
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for arg in [2, 2L, 2.]:
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertEqual(f(arg), f(arg.__float__()))
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # but strings should give a TypeError
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for f in self.test_functions:
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for arg in ["a", "long_string", "0", "1j", ""]:
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertRaises(TypeError, f, arg)
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_cmath_matches_math(self):
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # check that corresponding cmath and math functions are equal
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # for floats in the appropriate range
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # test_values in (0, 1)
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        test_values = [0.01, 0.1, 0.2, 0.5, 0.9, 0.99]
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # test_values for functions defined on [-1., 1.]
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        unit_interval = test_values + [-x for x in test_values] + \
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            [0., 1., -1.]
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # test_values for log, log10, sqrt
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positive = test_values + [1.] + [1./x for x in test_values]
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        nonnegative = [0.] + positive
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # test_values for functions defined on the whole real line
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        real_line = [0.] + positive + [-x for x in positive]
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        test_functions = {
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'acos' : unit_interval,
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'asin' : unit_interval,
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'atan' : real_line,
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'cos' : real_line,
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'cosh' : real_line,
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'exp' : real_line,
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'log' : positive,
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'log10' : positive,
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'sin' : real_line,
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'sinh' : real_line,
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'sqrt' : nonnegative,
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'tan' : real_line,
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'tanh' : real_line}
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for fn, values in test_functions.items():
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            float_fn = getattr(math, fn)
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            complex_fn = getattr(cmath, fn)
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for v in values:
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                z = complex_fn(v)
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.rAssertAlmostEqual(float_fn(v), z.real)
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertEqual(0., z.imag)
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # test two-argument version of log with various bases
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for base in [0.5, 2., 10.]:
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for v in positive:
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                z = cmath.log(v, base)
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.rAssertAlmostEqual(math.log(v, base), z.real)
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertEqual(0., z.imag)
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_specific_values(self):
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not float.__getformat__("double").startswith("IEEE"):
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def rect_complex(z):
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            """Wrapped version of rect that accepts a complex number instead of
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            two float arguments."""
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return cmath.rect(z.real, z.imag)
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def polar_complex(z):
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            """Wrapped version of polar that returns a complex number instead of
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            two floats."""
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return complex(*polar(z))
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for id, fn, ar, ai, er, ei, flags in parse_testfile(test_file):
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            arg = complex(ar, ai)
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            expected = complex(er, ei)
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if fn == 'rect':
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                function = rect_complex
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            elif fn == 'polar':
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                function = polar_complex
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                function = getattr(cmath, fn)
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if 'divide-by-zero' in flags or 'invalid' in flags:
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                try:
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    actual = function(arg)
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                except ValueError:
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    continue
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.fail('ValueError not raised in test '
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          '{}: {}(complex({!r}, {!r}))'.format(id, fn, ar, ai))
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if 'overflow' in flags:
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                try:
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    actual = function(arg)
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                except OverflowError:
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    continue
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.fail('OverflowError not raised in test '
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          '{}: {}(complex({!r}, {!r}))'.format(id, fn, ar, ai))
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            actual = function(arg)
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if 'ignore-real-sign' in flags:
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                actual = complex(abs(actual.real), actual.imag)
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                expected = complex(abs(expected.real), expected.imag)
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if 'ignore-imag-sign' in flags:
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                actual = complex(actual.real, abs(actual.imag))
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                expected = complex(expected.real, abs(expected.imag))
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # for the real part of the log function, we allow an
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # absolute error of up to 2e-15.
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if fn in ('log', 'log10'):
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                real_abs_err = 2e-15
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                real_abs_err = 5e-323
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            error_message = (
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                '{}: {}(complex({!r}, {!r}))\n'
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                'Expected: complex({!r}, {!r})\n'
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                'Received: complex({!r}, {!r})\n'
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                'Received value insufficiently close to expected value.'
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                ).format(id, fn, ar, ai,
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                     expected.real, expected.imag,
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                     actual.real, actual.imag)
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.rAssertAlmostEqual(expected.real, actual.real,
3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                        abs_err=real_abs_err,
3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                        msg=error_message)
3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.rAssertAlmostEqual(expected.imag, actual.imag,
3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                        msg=error_message)
3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertCISEqual(self, a, b):
3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eps = 1E-7
3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if abs(a[0] - b[0]) > eps or abs(a[1] - b[1]) > eps:
3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail((a ,b))
3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_polar(self):
3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCISEqual(polar(0), (0., 0.))
3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCISEqual(polar(1.), (1., 0.))
3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCISEqual(polar(-1.), (1., pi))
3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCISEqual(polar(1j), (1., pi/2))
3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCISEqual(polar(-1j), (1., -pi/2))
3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_phase(self):
3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(0), 0.)
3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(1.), 0.)
3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(-1.), pi)
3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(-1.+1E-300j), pi)
3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(-1.-1E-300j), -pi)
3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(1j), pi/2)
3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(-1j), -pi/2)
3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # zeros
3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(phase(complex(0.0, 0.0)), 0.0)
3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(phase(complex(0.0, -0.0)), -0.0)
3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(phase(complex(-0.0, 0.0)), pi)
3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(phase(complex(-0.0, -0.0)), -pi)
3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # infinities
3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(complex(-INF, -0.0)), -pi)
3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(complex(-INF, -2.3)), -pi)
3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(complex(-INF, -INF)), -0.75*pi)
3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(complex(-2.3, -INF)), -pi/2)
3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(complex(-0.0, -INF)), -pi/2)
3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(complex(0.0, -INF)), -pi/2)
3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(complex(2.3, -INF)), -pi/2)
3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(complex(INF, -INF)), -pi/4)
3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(phase(complex(INF, -2.3)), -0.0)
3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(phase(complex(INF, -0.0)), -0.0)
3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(phase(complex(INF, 0.0)), 0.0)
3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(phase(complex(INF, 2.3)), 0.0)
3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(complex(INF, INF)), pi/4)
3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(complex(2.3, INF)), pi/2)
3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(complex(0.0, INF)), pi/2)
3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(complex(-0.0, INF)), pi/2)
3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(complex(-2.3, INF)), pi/2)
3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(complex(-INF, INF)), 0.75*pi)
4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(complex(-INF, 2.3)), pi)
4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(phase(complex(-INF, 0.0)), pi)
4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # real or imaginary part NaN
4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for z in complex_nans:
4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(math.isnan(phase(z)))
4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_abs(self):
4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # zeros
4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for z in complex_zeros:
4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(abs(z), 0.0)
4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # infinities
4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for z in complex_infinities:
4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(abs(z), INF)
4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # real or imaginary part NaN
4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(abs(complex(NAN, -INF)), INF)
4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(abs(complex(NAN, -2.3))))
4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(abs(complex(NAN, -0.0))))
4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(abs(complex(NAN, 0.0))))
4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(abs(complex(NAN, 2.3))))
4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(abs(complex(NAN, INF)), INF)
4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(abs(complex(-INF, NAN)), INF)
4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(abs(complex(-2.3, NAN))))
4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(abs(complex(-0.0, NAN))))
4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(abs(complex(0.0, NAN))))
4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(abs(complex(2.3, NAN))))
4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(abs(complex(INF, NAN)), INF)
4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(abs(complex(NAN, NAN))))
4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # result overflows
4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if float.__getformat__("double").startswith("IEEE"):
4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(OverflowError, abs, complex(1.4e308, 1.4e308))
4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertCEqual(self, a, b):
4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eps = 1E-7
4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if abs(a.real - b[0]) > eps or abs(a.imag - b[1]) > eps:
4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail((a ,b))
4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_rect(self):
4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCEqual(rect(0, 0), (0, 0))
4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCEqual(rect(1, 0), (1., 0))
4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCEqual(rect(1, -pi), (-1., 0))
4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCEqual(rect(1, pi/2), (0, 1.))
4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCEqual(rect(1, -pi/2), (0, -1.))
4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_isnan(self):
4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(cmath.isnan(1))
4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(cmath.isnan(1j))
4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(cmath.isnan(INF))
4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cmath.isnan(NAN))
4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cmath.isnan(complex(NAN, 0)))
4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cmath.isnan(complex(0, NAN)))
4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cmath.isnan(complex(NAN, NAN)))
4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cmath.isnan(complex(NAN, INF)))
4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cmath.isnan(complex(INF, NAN)))
4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_isinf(self):
4594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(cmath.isinf(1))
4604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(cmath.isinf(1j))
4614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(cmath.isinf(NAN))
4624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cmath.isinf(INF))
4634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cmath.isinf(complex(INF, 0)))
4644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cmath.isinf(complex(0, INF)))
4654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cmath.isinf(complex(INF, INF)))
4664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cmath.isinf(complex(NAN, INF)))
4674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cmath.isinf(complex(INF, NAN)))
4684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main():
4714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    run_unittest(CMathTests)
4724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__":
4744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_main()
475