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