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