10a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom test.test_support import run_unittest
20a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom test.test_math import parse_testfile, test_file
30a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport unittest
40a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport cmath, math
50a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom cmath import phase, polar, rect, pi
60a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
70a8c90248264a8b26970b4473770bcc3df8515fJosh GaoINF = float('inf')
80a8c90248264a8b26970b4473770bcc3df8515fJosh GaoNAN = float('nan')
90a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
100a8c90248264a8b26970b4473770bcc3df8515fJosh Gaocomplex_zeros = [complex(x, y) for x in [0.0, -0.0] for y in [0.0, -0.0]]
110a8c90248264a8b26970b4473770bcc3df8515fJosh Gaocomplex_infinities = [complex(x, y) for x, y in [
120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (INF, 0.0),  # 1st quadrant
130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (INF, 2.3),
140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (INF, INF),
150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (2.3, INF),
160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (0.0, INF),
170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (-0.0, INF), # 2nd quadrant
180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (-2.3, INF),
190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (-INF, INF),
200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (-INF, 2.3),
210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (-INF, 0.0),
220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (-INF, -0.0), # 3rd quadrant
230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (-INF, -2.3),
240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (-INF, -INF),
250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (-2.3, -INF),
260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (-0.0, -INF),
270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (0.0, -INF), # 4th quadrant
280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (2.3, -INF),
290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (INF, -INF),
300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (INF, -2.3),
310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (INF, -0.0)
320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        ]]
330a8c90248264a8b26970b4473770bcc3df8515fJosh Gaocomplex_nans = [complex(x, y) for x, y in [
340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (NAN, -INF),
350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (NAN, -2.3),
360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (NAN, -0.0),
370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (NAN, 0.0),
380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (NAN, 2.3),
390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (NAN, INF),
400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (-INF, NAN),
410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (-2.3, NAN),
420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (-0.0, NAN),
430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (0.0, NAN),
440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (2.3, NAN),
450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        (INF, NAN)
460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        ]]
470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
480a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass CMathTests(unittest.TestCase):
490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    # list of all functions in cmath
500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    test_functions = [getattr(cmath, fname) for fname in [
510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh',
520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            'cos', 'cosh', 'exp', 'log', 'log10', 'sin', 'sinh',
530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            'sqrt', 'tan', 'tanh']]
540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    # test first and second arguments independently for 2-argument log
550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    test_functions.append(lambda x : cmath.log(x, 1729. + 0j))
560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    test_functions.append(lambda x : cmath.log(14.-27j, x))
570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def setUp(self):
590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.test_values = open(test_file)
600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def tearDown(self):
620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.test_values.close()
630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def rAssertAlmostEqual(self, a, b, rel_err = 2e-15, abs_err = 5e-323,
650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                           msg=None):
660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        """Fail if the two floating-point numbers are not almost equal.
670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        Determine whether floating-point values a and b are equal to within
690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        a (small) rounding error.  The default values for rel_err and
700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        abs_err are chosen to be suitable for platforms where a float is
710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        represented by an IEEE 754 double.  They allow an error of between
720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        9 and 19 ulps.
730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        """
740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # special values testing
760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if math.isnan(a):
770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if math.isnan(b):
780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                return
790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.fail(msg or '{!r} should be nan'.format(b))
800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if math.isinf(a):
820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if a == b:
830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                return
840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.fail(msg or 'finite result where infinity expected: '
850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                      'expected {!r}, got {!r}'.format(a, b))
860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # if both a and b are zero, check whether they have the same sign
880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # (in theory there are examples where it would be legitimate for a
890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # and b to have opposite signs; in practice these hardly ever
900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # occur).
910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if not a and not b:
920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if math.copysign(1., a) != math.copysign(1., b):
930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                self.fail(msg or 'zero has wrong sign: expected {!r}, '
940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                          'got {!r}'.format(a, b))
950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # if a-b overflows, or b is infinite, return False.  Again, in
970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # theory there are examples where a is within a few ulps of the
980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # max representable float, and then b could legitimately be
990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # infinite.  In practice these examples are rare.
1000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        try:
1010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            absolute_error = abs(b-a)
1020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        except OverflowError:
1030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            pass
1040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        else:
1050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            # test passes if either the absolute error or the relative
1060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            # error is sufficiently small.  The defaults amount to an
1070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            # error of between 9 ulps and 19 ulps on an IEEE-754 compliant
1080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            # machine.
1090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if absolute_error <= max(abs_err, rel_err * abs(a)):
1100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                return
1110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.fail(msg or
1120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                  '{!r} and {!r} are not sufficiently close'.format(a, b))
1130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_constants(self):
1150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        e_expected = 2.71828182845904523536
1160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        pi_expected = 3.14159265358979323846
1170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(cmath.pi, pi_expected, places=9,
1180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            msg="cmath.pi is {}; should be {}".format(cmath.pi, pi_expected))
1190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(cmath.e, e_expected, places=9,
1200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            msg="cmath.e is {}; should be {}".format(cmath.e, e_expected))
1210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_user_object(self):
1230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # Test automatic calling of __complex__ and __float__ by cmath
1240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # functions
1250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # some random values to use as test values; we avoid values
1270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # for which any of the functions in cmath is undefined
1280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # (i.e. 0., 1., -1., 1j, -1j) or would cause overflow
1290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        cx_arg = 4.419414439 + 1.497100113j
1300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        flt_arg = -6.131677725
1310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # a variety of non-complex numbers, used to check that
1330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # non-complex return values from __complex__ give an error
1340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        non_complexes = ["not complex", 1, 5L, 2., None,
1350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                         object(), NotImplemented]
1360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # Now we introduce a variety of classes whose instances might
1380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # end up being passed to the cmath functions
1390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # usual case: new-style class implementing __complex__
1410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        class MyComplex(object):
1420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __init__(self, value):
1430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                self.value = value
1440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __complex__(self):
1450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                return self.value
1460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # old-style class implementing __complex__
1480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        class MyComplexOS:
1490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __init__(self, value):
1500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                self.value = value
1510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __complex__(self):
1520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                return self.value
1530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # classes for which __complex__ raises an exception
1550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        class SomeException(Exception):
1560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            pass
1570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        class MyComplexException(object):
1580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __complex__(self):
1590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                raise SomeException
1600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        class MyComplexExceptionOS:
1610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __complex__(self):
1620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                raise SomeException
1630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # some classes not providing __float__ or __complex__
1650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        class NeitherComplexNorFloat(object):
1660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            pass
1670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        class NeitherComplexNorFloatOS:
1680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            pass
1690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        class MyInt(object):
1700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __int__(self): return 2
1710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __long__(self): return 2L
1720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __index__(self): return 2
1730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        class MyIntOS:
1740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __int__(self): return 2
1750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __long__(self): return 2L
1760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __index__(self): return 2
1770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # other possible combinations of __float__ and __complex__
1790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # that should work
1800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        class FloatAndComplex(object):
1810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __float__(self):
1820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                return flt_arg
1830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __complex__(self):
1840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                return cx_arg
1850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        class FloatAndComplexOS:
1860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __float__(self):
1870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                return flt_arg
1880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __complex__(self):
1890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                return cx_arg
1900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        class JustFloat(object):
1910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __float__(self):
1920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                return flt_arg
1930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        class JustFloatOS:
1940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __float__(self):
1950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                return flt_arg
1960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        for f in self.test_functions:
1980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            # usual usage
1990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertEqual(f(MyComplex(cx_arg)), f(cx_arg))
2000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertEqual(f(MyComplexOS(cx_arg)), f(cx_arg))
2010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            # other combinations of __float__ and __complex__
2020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertEqual(f(FloatAndComplex()), f(cx_arg))
2030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertEqual(f(FloatAndComplexOS()), f(cx_arg))
2040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertEqual(f(JustFloat()), f(flt_arg))
2050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertEqual(f(JustFloatOS()), f(flt_arg))
2060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            # TypeError should be raised for classes not providing
2070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            # either __complex__ or __float__, even if they provide
2080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            # __int__, __long__ or __index__.  An old-style class
2090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            # currently raises AttributeError instead of a TypeError;
2100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            # this could be considered a bug.
2110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertRaises(TypeError, f, NeitherComplexNorFloat())
2120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertRaises(TypeError, f, MyInt())
2130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertRaises(Exception, f, NeitherComplexNorFloatOS())
2140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertRaises(Exception, f, MyIntOS())
2150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            # non-complex return value from __complex__ -> TypeError
2160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            for bad_complex in non_complexes:
2170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                self.assertRaises(TypeError, f, MyComplex(bad_complex))
2180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                self.assertRaises(TypeError, f, MyComplexOS(bad_complex))
2190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            # exceptions in __complex__ should be propagated correctly
2200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertRaises(SomeException, f, MyComplexException())
2210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertRaises(SomeException, f, MyComplexExceptionOS())
2220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_input_type(self):
2240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # ints and longs should be acceptable inputs to all cmath
2250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # functions, by virtue of providing a __float__ method
2260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        for f in self.test_functions:
2270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            for arg in [2, 2L, 2.]:
2280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                self.assertEqual(f(arg), f(arg.__float__()))
2290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # but strings should give a TypeError
2310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        for f in self.test_functions:
2320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            for arg in ["a", "long_string", "0", "1j", ""]:
2330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                self.assertRaises(TypeError, f, arg)
2340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_cmath_matches_math(self):
2360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # check that corresponding cmath and math functions are equal
2370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # for floats in the appropriate range
2380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # test_values in (0, 1)
2400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        test_values = [0.01, 0.1, 0.2, 0.5, 0.9, 0.99]
2410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # test_values for functions defined on [-1., 1.]
2430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        unit_interval = test_values + [-x for x in test_values] + \
2440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            [0., 1., -1.]
2450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # test_values for log, log10, sqrt
2470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        positive = test_values + [1.] + [1./x for x in test_values]
2480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        nonnegative = [0.] + positive
2490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # test_values for functions defined on the whole real line
2510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        real_line = [0.] + positive + [-x for x in positive]
2520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        test_functions = {
2540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            'acos' : unit_interval,
2550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            'asin' : unit_interval,
2560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            'atan' : real_line,
2570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            'cos' : real_line,
2580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            'cosh' : real_line,
2590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            'exp' : real_line,
2600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            'log' : positive,
2610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            'log10' : positive,
2620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            'sin' : real_line,
2630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            'sinh' : real_line,
2640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            'sqrt' : nonnegative,
2650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            'tan' : real_line,
2660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            'tanh' : real_line}
2670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        for fn, values in test_functions.items():
2690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            float_fn = getattr(math, fn)
2700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            complex_fn = getattr(cmath, fn)
2710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            for v in values:
2720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                z = complex_fn(v)
2730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                self.rAssertAlmostEqual(float_fn(v), z.real)
2740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                self.assertEqual(0., z.imag)
2750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # test two-argument version of log with various bases
2770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        for base in [0.5, 2., 10.]:
2780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            for v in positive:
2790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                z = cmath.log(v, base)
2800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                self.rAssertAlmostEqual(math.log(v, base), z.real)
2810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                self.assertEqual(0., z.imag)
2820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_specific_values(self):
2840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if not float.__getformat__("double").startswith("IEEE"):
2850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            return
2860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        def rect_complex(z):
2880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            """Wrapped version of rect that accepts a complex number instead of
2890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            two float arguments."""
2900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            return cmath.rect(z.real, z.imag)
2910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        def polar_complex(z):
2930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            """Wrapped version of polar that returns a complex number instead of
2940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            two floats."""
2950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            return complex(*polar(z))
2960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        for id, fn, ar, ai, er, ei, flags in parse_testfile(test_file):
2980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            arg = complex(ar, ai)
2990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            expected = complex(er, ei)
3000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if fn == 'rect':
3010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                function = rect_complex
3020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            elif fn == 'polar':
3030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                function = polar_complex
3040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            else:
3050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                function = getattr(cmath, fn)
3060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if 'divide-by-zero' in flags or 'invalid' in flags:
3070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                try:
3080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                    actual = function(arg)
3090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                except ValueError:
3100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                    continue
3110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                else:
3120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                    self.fail('ValueError not raised in test '
3130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                          '{}: {}(complex({!r}, {!r}))'.format(id, fn, ar, ai))
3140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if 'overflow' in flags:
3160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                try:
3170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                    actual = function(arg)
3180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                except OverflowError:
3190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                    continue
3200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                else:
3210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                    self.fail('OverflowError not raised in test '
3220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                          '{}: {}(complex({!r}, {!r}))'.format(id, fn, ar, ai))
3230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            actual = function(arg)
3250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if 'ignore-real-sign' in flags:
3270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                actual = complex(abs(actual.real), actual.imag)
3280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                expected = complex(abs(expected.real), expected.imag)
3290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if 'ignore-imag-sign' in flags:
3300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                actual = complex(actual.real, abs(actual.imag))
3310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                expected = complex(expected.real, abs(expected.imag))
3320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            # for the real part of the log function, we allow an
3340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            # absolute error of up to 2e-15.
3350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if fn in ('log', 'log10'):
3360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                real_abs_err = 2e-15
3370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            else:
3380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                real_abs_err = 5e-323
3390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            error_message = (
3410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                '{}: {}(complex({!r}, {!r}))\n'
3420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                'Expected: complex({!r}, {!r})\n'
3430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                'Received: complex({!r}, {!r})\n'
3440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                'Received value insufficiently close to expected value.'
3450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                ).format(id, fn, ar, ai,
3460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                     expected.real, expected.imag,
3470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                     actual.real, actual.imag)
3480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.rAssertAlmostEqual(expected.real, actual.real,
3490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                                        abs_err=real_abs_err,
3500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                                        msg=error_message)
3510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.rAssertAlmostEqual(expected.imag, actual.imag,
3520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                                        msg=error_message)
3530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def assertCISEqual(self, a, b):
3550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eps = 1E-7
3560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if abs(a[0] - b[0]) > eps or abs(a[1] - b[1]) > eps:
3570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.fail((a ,b))
3580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_polar(self):
3600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertCISEqual(polar(0), (0., 0.))
3610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertCISEqual(polar(1.), (1., 0.))
3620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertCISEqual(polar(-1.), (1., pi))
3630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertCISEqual(polar(1j), (1., pi/2))
3640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertCISEqual(polar(-1j), (1., -pi/2))
3650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_phase(self):
3670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(0), 0.)
3680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(1.), 0.)
3690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(-1.), pi)
3700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(-1.+1E-300j), pi)
3710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(-1.-1E-300j), -pi)
3720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(1j), pi/2)
3730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(-1j), -pi/2)
3740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # zeros
3760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(phase(complex(0.0, 0.0)), 0.0)
3770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(phase(complex(0.0, -0.0)), -0.0)
3780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(phase(complex(-0.0, 0.0)), pi)
3790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(phase(complex(-0.0, -0.0)), -pi)
3800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # infinities
3820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(complex(-INF, -0.0)), -pi)
3830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(complex(-INF, -2.3)), -pi)
3840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(complex(-INF, -INF)), -0.75*pi)
3850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(complex(-2.3, -INF)), -pi/2)
3860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(complex(-0.0, -INF)), -pi/2)
3870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(complex(0.0, -INF)), -pi/2)
3880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(complex(2.3, -INF)), -pi/2)
3890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(complex(INF, -INF)), -pi/4)
3900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(phase(complex(INF, -2.3)), -0.0)
3910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(phase(complex(INF, -0.0)), -0.0)
3920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(phase(complex(INF, 0.0)), 0.0)
3930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(phase(complex(INF, 2.3)), 0.0)
3940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(complex(INF, INF)), pi/4)
3950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(complex(2.3, INF)), pi/2)
3960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(complex(0.0, INF)), pi/2)
3970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(complex(-0.0, INF)), pi/2)
3980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(complex(-2.3, INF)), pi/2)
3990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(complex(-INF, INF)), 0.75*pi)
4000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(complex(-INF, 2.3)), pi)
4010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertAlmostEqual(phase(complex(-INF, 0.0)), pi)
4020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
4030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # real or imaginary part NaN
4040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        for z in complex_nans:
4050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertTrue(math.isnan(phase(z)))
4060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
4070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_abs(self):
4080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # zeros
4090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        for z in complex_zeros:
4100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertEqual(abs(z), 0.0)
4110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
4120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # infinities
4130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        for z in complex_infinities:
4140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertEqual(abs(z), INF)
4150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
4160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # real or imaginary part NaN
4170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(abs(complex(NAN, -INF)), INF)
4180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(math.isnan(abs(complex(NAN, -2.3))))
4190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(math.isnan(abs(complex(NAN, -0.0))))
4200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(math.isnan(abs(complex(NAN, 0.0))))
4210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(math.isnan(abs(complex(NAN, 2.3))))
4220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(abs(complex(NAN, INF)), INF)
4230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(abs(complex(-INF, NAN)), INF)
4240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(math.isnan(abs(complex(-2.3, NAN))))
4250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(math.isnan(abs(complex(-0.0, NAN))))
4260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(math.isnan(abs(complex(0.0, NAN))))
4270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(math.isnan(abs(complex(2.3, NAN))))
4280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(abs(complex(INF, NAN)), INF)
4290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(math.isnan(abs(complex(NAN, NAN))))
4300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
4310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # result overflows
4320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if float.__getformat__("double").startswith("IEEE"):
4330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertRaises(OverflowError, abs, complex(1.4e308, 1.4e308))
4340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
4350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def assertCEqual(self, a, b):
4360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eps = 1E-7
4370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if abs(a.real - b[0]) > eps or abs(a.imag - b[1]) > eps:
4380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.fail((a ,b))
4390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
4400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_rect(self):
4410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertCEqual(rect(0, 0), (0, 0))
4420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertCEqual(rect(1, 0), (1., 0))
4430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertCEqual(rect(1, -pi), (-1., 0))
4440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertCEqual(rect(1, pi/2), (0, 1.))
4450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertCEqual(rect(1, -pi/2), (0, -1.))
4460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
4470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_isnan(self):
4480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertFalse(cmath.isnan(1))
4490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertFalse(cmath.isnan(1j))
4500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertFalse(cmath.isnan(INF))
4510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(cmath.isnan(NAN))
4520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(cmath.isnan(complex(NAN, 0)))
4530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(cmath.isnan(complex(0, NAN)))
4540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(cmath.isnan(complex(NAN, NAN)))
4550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(cmath.isnan(complex(NAN, INF)))
4560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(cmath.isnan(complex(INF, NAN)))
4570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
4580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_isinf(self):
4590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertFalse(cmath.isinf(1))
4600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertFalse(cmath.isinf(1j))
4610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertFalse(cmath.isinf(NAN))
4620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(cmath.isinf(INF))
4630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(cmath.isinf(complex(INF, 0)))
4640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(cmath.isinf(complex(0, INF)))
4650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(cmath.isinf(complex(INF, INF)))
4660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(cmath.isinf(complex(NAN, INF)))
4670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(cmath.isinf(complex(INF, NAN)))
4680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
4690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
4700a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef test_main():
4710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    run_unittest(CMathTests)
4720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
4730a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoif __name__ == "__main__":
4740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    test_main()
475