1edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport unittest
2edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepfrom test import test_support
3edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
4edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepfrom random import random
5edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepfrom math import atan2, isnan, copysign
6edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
7edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepINF = float("inf")
8edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepNAN = float("nan")
9edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep# These tests ensure that complex math does the right thing
10edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
11edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass ComplexTest(unittest.TestCase):
12edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
13edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def assertAlmostEqual(self, a, b):
14edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        if isinstance(a, complex):
15edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            if isinstance(b, complex):
16edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                unittest.TestCase.assertAlmostEqual(self, a.real, b.real)
17edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                unittest.TestCase.assertAlmostEqual(self, a.imag, b.imag)
18edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            else:
19edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                unittest.TestCase.assertAlmostEqual(self, a.real, b)
20edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                unittest.TestCase.assertAlmostEqual(self, a.imag, 0.)
21edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        else:
22edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            if isinstance(b, complex):
23edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                unittest.TestCase.assertAlmostEqual(self, a, b.real)
24edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                unittest.TestCase.assertAlmostEqual(self, 0., b.imag)
25edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            else:
26edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                unittest.TestCase.assertAlmostEqual(self, a, b)
27edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
28edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def assertCloseAbs(self, x, y, eps=1e-9):
29edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        """Return true iff floats x and y "are close\""""
30edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # put the one with larger magnitude second
31edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        if abs(x) > abs(y):
32edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            x, y = y, x
33edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        if y == 0:
34edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            return abs(x) < eps
35edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        if x == 0:
36edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            return abs(y) < eps
37edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # check that relative difference < eps
38edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(abs((x-y)/y) < eps)
39edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
40edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def assertFloatsAreIdentical(self, x, y):
41edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        """assert that floats x and y are identical, in the sense that:
42edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        (1) both x and y are nans, or
43edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        (2) both x and y are infinities, with the same sign, or
44edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        (3) both x and y are zeros, with the same sign, or
45edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        (4) x and y are both finite and nonzero, and x == y
46edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
47edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        """
48edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        msg = 'floats {!r} and {!r} are not identical'
49edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
50edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        if isnan(x) or isnan(y):
51edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            if isnan(x) and isnan(y):
52edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return
53edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        elif x == y:
54edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            if x != 0.0:
55edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return
56edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            # both zero; check that signs match
57edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            elif copysign(1.0, x) == copysign(1.0, y):
58edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return
59edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            else:
60edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                msg += ': zeros have different signs'
61edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.fail(msg.format(x, y))
62edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
63edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def assertClose(self, x, y, eps=1e-9):
64edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        """Return true iff complexes x and y "are close\""""
65edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertCloseAbs(x.real, y.real, eps)
66edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertCloseAbs(x.imag, y.imag, eps)
67edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
68edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def check_div(self, x, y):
69edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        """Compute complex z=x*y, and check that z/x==y and z/y==x."""
70edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        z = x * y
71edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        if x != 0:
72edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            q = z / x
73edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertClose(q, y)
74edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            q = z.__div__(x)
75edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertClose(q, y)
76edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            q = z.__truediv__(x)
77edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertClose(q, y)
78edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        if y != 0:
79edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            q = z / y
80edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertClose(q, x)
81edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            q = z.__div__(y)
82edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertClose(q, x)
83edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            q = z.__truediv__(y)
84edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertClose(q, x)
85edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
86edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_div(self):
87edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        simple_real = [float(i) for i in xrange(-5, 6)]
88edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        simple_complex = [complex(x, y) for x in simple_real for y in simple_real]
89edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        for x in simple_complex:
90edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            for y in simple_complex:
91edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                self.check_div(x, y)
92edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
93edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # A naive complex division algorithm (such as in 2.0) is very prone to
94edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # nonsense errors for these (overflows and underflows).
95edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.check_div(complex(1e200, 1e200), 1+0j)
96edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.check_div(complex(1e-200, 1e-200), 1+0j)
97edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
98edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # Just for fun.
99edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        for i in xrange(100):
100edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.check_div(complex(random(), random()),
101edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                           complex(random(), random()))
102edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
103edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ZeroDivisionError, complex.__div__, 1+1j, 0+0j)
104edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # FIXME: The following currently crashes on Alpha
105edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # self.assertRaises(OverflowError, pow, 1e200+1j, 1e200+1j)
106edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
107edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_truediv(self):
108edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex.__truediv__(2+0j, 1+1j), 1-1j)
109edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ZeroDivisionError, complex.__truediv__, 1+1j, 0+0j)
110edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
111edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_floordiv(self):
112edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex.__floordiv__(3+0j, 1.5+0j), 2)
113edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ZeroDivisionError, complex.__floordiv__, 3+0j, 0+0j)
114edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
115edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_coerce(self):
116edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(OverflowError, complex.__coerce__, 1+1j, 1L<<10000)
117edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
118edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_no_implicit_coerce(self):
119edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # Python 2.7 removed implicit coercion from the complex type
120edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        class A(object):
121edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __coerce__(self, other):
122edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                raise RuntimeError
123edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            __hash__ = None
124edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __cmp__(self, other):
125edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return -1
126edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
127edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        a = A()
128edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, lambda: a + 2.0j)
129edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(a < 2.0j)
130edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
131edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_richcompare(self):
132edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(complex.__eq__(1+1j, 1L<<10000), False)
133edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(complex.__lt__(1+1j, None), NotImplemented)
134edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertIs(complex.__eq__(1+1j, 1+1j), True)
135edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertIs(complex.__eq__(1+1j, 2+2j), False)
136edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertIs(complex.__ne__(1+1j, 1+1j), False)
137edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertIs(complex.__ne__(1+1j, 2+2j), True)
138edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, complex.__lt__, 1+1j, 2+2j)
139edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, complex.__le__, 1+1j, 2+2j)
140edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, complex.__gt__, 1+1j, 2+2j)
141edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, complex.__ge__, 1+1j, 2+2j)
142edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
143edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_richcompare_boundaries(self):
144edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        def check(n, deltas, is_equal, imag = 0.0):
145edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            for delta in deltas:
146edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                i = n + delta
147edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                z = complex(i, imag)
148edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                self.assertIs(complex.__eq__(z, i), is_equal(delta))
149edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                self.assertIs(complex.__ne__(z, i), not is_equal(delta))
150edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # For IEEE-754 doubles the following should hold:
151edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        #    x in [2 ** (52 + i), 2 ** (53 + i + 1)] -> x mod 2 ** i == 0
152edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # where the interval is representable, of course.
153edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        for i in range(1, 10):
154edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            pow = 52 + i
155edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            mult = 2 ** i
156edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            check(2 ** pow, range(1, 101), lambda delta: delta % mult == 0)
157edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            check(2 ** pow, range(1, 101), lambda delta: False, float(i))
158edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        check(2 ** 53, range(-100, 0), lambda delta: True)
159edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
160edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_mod(self):
161edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ZeroDivisionError, (1+1j).__mod__, 0+0j)
162edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
163edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        a = 3.33+4.43j
164edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        try:
165edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            a % 0
166edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        except ZeroDivisionError:
167edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            pass
168edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        else:
169edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.fail("modulo parama can't be 0")
170edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
171edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_divmod(self):
172edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ZeroDivisionError, divmod, 1+1j, 0+0j)
173edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
174edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_pow(self):
175edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(pow(1+1j, 0+0j), 1.0)
176edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(pow(0+0j, 2+0j), 0.0)
177edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ZeroDivisionError, pow, 0+0j, 1j)
178edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(pow(1j, -1), 1/1j)
179edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(pow(1j, 200), 1)
180edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, pow, 1+1j, 1+1j, 1+1j)
181edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
182edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        a = 3.33+4.43j
183edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(a ** 0j, 1)
184edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(a ** 0.+0.j, 1)
185edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
186edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(3j ** 0j, 1)
187edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(3j ** 0, 1)
188edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
189edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        try:
190edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            0j ** a
191edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        except ZeroDivisionError:
192edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            pass
193edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        else:
194edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.fail("should fail 0.0 to negative or complex power")
195edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
196edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        try:
197edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            0j ** (3-2j)
198edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        except ZeroDivisionError:
199edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            pass
200edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        else:
201edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.fail("should fail 0.0 to negative or complex power")
202edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
203edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # The following is used to exercise certain code paths
204edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(a ** 105, a ** 105)
205edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(a ** -105, a ** -105)
206edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(a ** -30, a ** -30)
207edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
208edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(0.0j ** 0, 1)
209edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
210edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        b = 5.1+2.3j
211edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, pow, a, b, 0)
212edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
213edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_boolcontext(self):
214edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        for i in xrange(100):
215edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertTrue(complex(random() + 1e-6, random() + 1e-6))
216edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(not complex(0.0, 0.0))
217edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
218edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_conjugate(self):
219edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertClose(complex(5.3, 9.8).conjugate(), 5.3-9.8j)
220edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
221edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_constructor(self):
222edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        class OS:
223edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __init__(self, value): self.value = value
224edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __complex__(self): return self.value
225edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        class NS(object):
226edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __init__(self, value): self.value = value
227edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __complex__(self): return self.value
228edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(complex(OS(1+10j)), 1+10j)
229edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(complex(NS(1+10j)), 1+10j)
230edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, complex, OS(None))
231edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, complex, NS(None))
232edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
233edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex("1+10j"), 1+10j)
234edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(10), 10+0j)
235edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(10.0), 10+0j)
236edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(10L), 10+0j)
237edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(10+0j), 10+0j)
238edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(1,10), 1+10j)
239edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(1,10L), 1+10j)
240edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(1,10.0), 1+10j)
241edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(1L,10), 1+10j)
242edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(1L,10L), 1+10j)
243edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(1L,10.0), 1+10j)
244edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(1.0,10), 1+10j)
245edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(1.0,10L), 1+10j)
246edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(1.0,10.0), 1+10j)
247edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(3.14+0j), 3.14+0j)
248edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(3.14), 3.14+0j)
249edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(314), 314.0+0j)
250edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(314L), 314.0+0j)
251edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(3.14+0j, 0j), 3.14+0j)
252edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(3.14, 0.0), 3.14+0j)
253edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(314, 0), 314.0+0j)
254edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(314L, 0L), 314.0+0j)
255edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(0j, 3.14j), -3.14+0j)
256edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(0.0, 3.14j), -3.14+0j)
257edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(0j, 3.14), 3.14j)
258edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(0.0, 3.14), 3.14j)
259edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex("1"), 1+0j)
260edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex("1j"), 1j)
261edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(),  0)
262edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex("-1"), -1)
263edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex("+1"), +1)
264edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex("(1+2j)"), 1+2j)
265edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex("(1.3+2.2j)"), 1.3+2.2j)
266edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex("3.14+1J"), 3.14+1j)
267edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(" ( +3.14-6J )"), 3.14-6j)
268edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(" ( +3.14-J )"), 3.14-1j)
269edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(" ( +3.14+j )"), 3.14+1j)
270edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex("J"), 1j)
271edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex("( j )"), 1j)
272edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex("+J"), 1j)
273edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex("( -j)"), -1j)
274edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex('1e-500'), 0.0 + 0.0j)
275edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex('-1e-500j'), 0.0 - 0.0j)
276edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex('-1e-500+1e-500j'), -0.0 + 0.0j)
277edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
278edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        class complex2(complex): pass
279edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(complex2(1+1j)), 1+1j)
280edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(real=17, imag=23), 17+23j)
281edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(real=17+23j), 17+23j)
282edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(real=17+23j, imag=23), 17+46j)
283edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(real=1+2j, imag=3+4j), -3+5j)
284edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
285edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # check that the sign of a zero in the real or imaginary part
286edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # is preserved when constructing from two floats.  (These checks
287edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # are harmless on systems without support for signed zeros.)
288edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        def split_zeros(x):
289edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            """Function that produces different results for 0. and -0."""
290edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            return atan2(x, -1.)
291edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
292edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(split_zeros(complex(1., 0.).imag), split_zeros(0.))
293edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(split_zeros(complex(1., -0.).imag), split_zeros(-0.))
294edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(split_zeros(complex(0., 1.).real), split_zeros(0.))
295edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(split_zeros(complex(-0., 1.).real), split_zeros(-0.))
296edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
297edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        c = 3.14 + 1j
298edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(complex(c) is c)
299edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        del c
300edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
301edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, complex, "1", "1")
302edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, complex, 1, "1")
303edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
304edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        if test_support.have_unicode:
305edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertEqual(complex(unicode("  3.14+J  ")), 3.14+1j)
306edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
307edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # SF bug 543840:  complex(string) accepts strings with \0
308edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # Fixed in 2.3.
309edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, complex, '1+1j\0j')
310edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
311edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, int, 5+3j)
312edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, long, 5+3j)
313edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, float, 5+3j)
314edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, complex, "")
315edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, complex, None)
316edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, complex, "\0")
317edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, complex, "3\09")
318edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, complex, "1", "2")
319edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, complex, "1", 42)
320edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, complex, 1, "2")
321edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, complex, "1+")
322edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, complex, "1+1j+1j")
323edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, complex, "--")
324edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, complex, "(1+2j")
325edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, complex, "1+2j)")
326edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, complex, "1+(2j)")
327edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, complex, "(1+2j)123")
328edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        if test_support.have_unicode:
329edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertRaises(ValueError, complex, unicode("x"))
330edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, complex, "1j+2")
331edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, complex, "1e1ej")
332edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, complex, "1e++1ej")
333edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, complex, ")1+2j(")
334edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # the following three are accepted by Python 2.6
335edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, complex, "1..1j")
336edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, complex, "1.11.1j")
337edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, complex, "1e1.1j")
338edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
339edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        if test_support.have_unicode:
340edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            # check that complex accepts long unicode strings
341edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertEqual(type(complex(unicode("1"*500))), complex)
342edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
343edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        class EvilExc(Exception):
344edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            pass
345edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
346edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        class evilcomplex:
347edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __complex__(self):
348edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                raise EvilExc
349edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
350edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(EvilExc, complex, evilcomplex())
351edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
352edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        class float2:
353edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __init__(self, value):
354edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                self.value = value
355edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __float__(self):
356edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return self.value
357edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
358edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(float2(42.)), 42)
359edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(real=float2(17.), imag=float2(23.)), 17+23j)
360edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, complex, float2(None))
361edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
362edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        class complex0(complex):
363edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            """Test usage of __complex__() when inheriting from 'complex'"""
364edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __complex__(self):
365edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return 42j
366edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
367edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        class complex1(complex):
368edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            """Test usage of __complex__() with a __new__() method"""
369edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __new__(self, value=0j):
370edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return complex.__new__(self, 2*value)
371edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __complex__(self):
372edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return self
373edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
374edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        class complex2(complex):
375edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            """Make sure that __complex__() calls fail if anything other than a
376edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            complex is returned"""
377edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __complex__(self):
378edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return None
379edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
380edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(complex0(1j)), 42j)
381edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(complex(complex1(1j)), 2j)
382edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, complex, complex2(1j))
383edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
384edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_subclass(self):
385edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        class xcomplex(complex):
386edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __add__(self,other):
387edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return xcomplex(complex(self) + other)
388edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            __radd__ = __add__
389edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
390edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __sub__(self,other):
391edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return xcomplex(complex(self) + other)
392edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            __rsub__ = __sub__
393edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
394edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __mul__(self,other):
395edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return xcomplex(complex(self) * other)
396edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            __rmul__ = __mul__
397edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
398edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __div__(self,other):
399edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return xcomplex(complex(self) / other)
400edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
401edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __rdiv__(self,other):
402edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return xcomplex(other / complex(self))
403edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
404edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            __truediv__ = __div__
405edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            __rtruediv__ = __rdiv__
406edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
407edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __floordiv__(self,other):
408edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return xcomplex(complex(self) // other)
409edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
410edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __rfloordiv__(self,other):
411edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return xcomplex(other // complex(self))
412edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
413edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __pow__(self,other):
414edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return xcomplex(complex(self) ** other)
415edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
416edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __rpow__(self,other):
417edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return xcomplex(other ** complex(self) )
418edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
419edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __mod__(self,other):
420edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return xcomplex(complex(self) % other)
421edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
422edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            def __rmod__(self,other):
423edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                return xcomplex(other % complex(self))
424edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
425edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        infix_binops = ('+', '-', '*', '**', '%', '//', '/')
426edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        xcomplex_values = (xcomplex(1), xcomplex(123.0),
427edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                           xcomplex(-10+2j), xcomplex(3+187j),
428edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                           xcomplex(3-78j))
429edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        test_values = (1, 123.0, 10-19j, xcomplex(1+2j),
430edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                       xcomplex(1+87j), xcomplex(10+90j))
431edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
432edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        for op in infix_binops:
433edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            for x in xcomplex_values:
434edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                for y in test_values:
435edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                    a = 'x %s y' % op
436edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                    b = 'y %s x' % op
437edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                    self.assertTrue(type(eval(a)) is type(eval(b)) is xcomplex)
438edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
439edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_hash(self):
440edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        for x in xrange(-30, 30):
441edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertEqual(hash(x), hash(complex(x, 0)))
442edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            x /= 3.0    # now check against floating point
443edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertEqual(hash(x), hash(complex(x, 0.)))
444edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
445edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_abs(self):
446edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        nums = [complex(x/3., y/7.) for x in xrange(-9,9) for y in xrange(-9,9)]
447edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        for num in nums:
448edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertAlmostEqual((num.real**2 + num.imag**2)  ** 0.5, abs(num))
449edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
450edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_repr(self):
451edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(repr(1+6j), '(1+6j)')
452edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(repr(1-6j), '(1-6j)')
453edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
454edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertNotEqual(repr(-(1+0j)), '(-1+-0j)')
455edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
456edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(1-6j,complex(repr(1-6j)))
457edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(1+6j,complex(repr(1+6j)))
458edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(-6j,complex(repr(-6j)))
459edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(6j,complex(repr(6j)))
460edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
461edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(repr(complex(1., INF)), "(1+infj)")
462edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(repr(complex(1., -INF)), "(1-infj)")
463edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(repr(complex(INF, 1)), "(inf+1j)")
464edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(repr(complex(-INF, INF)), "(-inf+infj)")
465edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(repr(complex(NAN, 1)), "(nan+1j)")
466edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(repr(complex(1, NAN)), "(1+nanj)")
467edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(repr(complex(NAN, NAN)), "(nan+nanj)")
468edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
469edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(repr(complex(0, INF)), "infj")
470edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(repr(complex(0, -INF)), "-infj")
471edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(repr(complex(0, NAN)), "nanj")
472edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
473edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_neg(self):
474edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(-(1+6j), -1-6j)
475edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
476edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_file(self):
477edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        a = 3.33+4.43j
478edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        b = 5.1+2.3j
479edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
480edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        fo = None
481edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        try:
482edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            fo = open(test_support.TESTFN, "wb")
483edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            print >>fo, a, b
484edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            fo.close()
485edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            fo = open(test_support.TESTFN, "rb")
486edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertEqual(fo.read(), "%s %s\n" % (a, b))
487edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        finally:
488edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            if (fo is not None) and (not fo.closed):
489edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                fo.close()
490edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            test_support.unlink(test_support.TESTFN)
491edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
492edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_getnewargs(self):
493edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((1+2j).__getnewargs__(), (1.0, 2.0))
494edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((1-2j).__getnewargs__(), (1.0, -2.0))
495edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((2j).__getnewargs__(), (0.0, 2.0))
496edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((-0j).__getnewargs__(), (0.0, -0.0))
497edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(complex(0, INF).__getnewargs__(), (0.0, INF))
498edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(complex(INF, 0).__getnewargs__(), (INF, 0.0))
499edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
500edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    if float.__getformat__("double").startswith("IEEE"):
501edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        def test_plus_minus_0j(self):
502edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            # test that -0j and 0j literals are not identified
503edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            z1, z2 = 0j, -0j
504edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertEqual(atan2(z1.imag, -1.), atan2(0., -1.))
505edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertEqual(atan2(z2.imag, -1.), atan2(-0., -1.))
506edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
507edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    @unittest.skipUnless(float.__getformat__("double").startswith("IEEE"),
508edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                         "test requires IEEE 754 doubles")
509edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_overflow(self):
510edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(complex("1e500"), complex(INF, 0.0))
511edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(complex("-1e500j"), complex(0.0, -INF))
512edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(complex("-1e500+1.8e308j"), complex(-INF, INF))
513edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
514edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    @unittest.skipUnless(float.__getformat__("double").startswith("IEEE"),
515edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                         "test requires IEEE 754 doubles")
516edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_repr_roundtrip(self):
517edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        vals = [0.0, 1e-500, 1e-315, 1e-200, 0.0123, 3.1415, 1e50, INF, NAN]
518edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        vals += [-v for v in vals]
519edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
520edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # complex(repr(z)) should recover z exactly, even for complex
521edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # numbers involving an infinity, nan, or negative zero
522edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        for x in vals:
523edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            for y in vals:
524edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                z = complex(x, y)
525edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                roundtrip = complex(repr(z))
526edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                self.assertFloatsAreIdentical(z.real, roundtrip.real)
527edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                self.assertFloatsAreIdentical(z.imag, roundtrip.imag)
528edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
529edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # if we predefine some constants, then eval(repr(z)) should
530edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # also work, except that it might change the sign of zeros
531edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        inf, nan = float('inf'), float('nan')
532edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        infj, nanj = complex(0.0, inf), complex(0.0, nan)
533edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        for x in vals:
534edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            for y in vals:
535edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                z = complex(x, y)
536edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                roundtrip = eval(repr(z))
537edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                # adding 0.0 has no effect beside changing -0.0 to 0.0
538edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                self.assertFloatsAreIdentical(0.0 + z.real,
539edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                                              0.0 + roundtrip.real)
540edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                self.assertFloatsAreIdentical(0.0 + z.imag,
541edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                                              0.0 + roundtrip.imag)
542edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
543edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_format(self):
544edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # empty format string is same as str()
545edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1+3j, ''), str(1+3j))
546edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5+3.5j, ''), str(1.5+3.5j))
547edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(3j, ''), str(3j))
548edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(3.2j, ''), str(3.2j))
549edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(3+0j, ''), str(3+0j))
550edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(3.2+0j, ''), str(3.2+0j))
551edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
552edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # empty presentation type should still be analogous to str,
553edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # even when format string is nonempty (issue #5920).
554edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(3.2+0j, '-'), str(3.2+0j))
555edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(3.2+0j, '<'), str(3.2+0j))
556edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        z = 4/7. - 100j/7.
557edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(z, ''), str(z))
558edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(z, '-'), str(z))
559edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(z, '<'), str(z))
560edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(z, '10'), str(z))
561edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        z = complex(0.0, 3.0)
562edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(z, ''), str(z))
563edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(z, '-'), str(z))
564edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(z, '<'), str(z))
565edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(z, '2'), str(z))
566edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        z = complex(-0.0, 2.0)
567edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(z, ''), str(z))
568edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(z, '-'), str(z))
569edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(z, '<'), str(z))
570edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(z, '3'), str(z))
571edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
572edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1+3j, 'g'), '1+3j')
573edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(3j, 'g'), '0+3j')
574edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5+3.5j, 'g'), '1.5+3.5j')
575edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
576edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5+3.5j, '+g'), '+1.5+3.5j')
577edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5-3.5j, '+g'), '+1.5-3.5j')
578edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5-3.5j, '-g'), '1.5-3.5j')
579edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5+3.5j, ' g'), ' 1.5+3.5j')
580edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5-3.5j, ' g'), ' 1.5-3.5j')
581edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(-1.5+3.5j, ' g'), '-1.5+3.5j')
582edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(-1.5-3.5j, ' g'), '-1.5-3.5j')
583edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
584edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(-1.5-3.5e-20j, 'g'), '-1.5-3.5e-20j')
585edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(-1.5-3.5j, 'f'), '-1.500000-3.500000j')
586edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(-1.5-3.5j, 'F'), '-1.500000-3.500000j')
587edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(-1.5-3.5j, 'e'), '-1.500000e+00-3.500000e+00j')
588edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(-1.5-3.5j, '.2e'), '-1.50e+00-3.50e+00j')
589edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(-1.5-3.5j, '.2E'), '-1.50E+00-3.50E+00j')
590edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(-1.5e10-3.5e5j, '.2G'), '-1.5E+10-3.5E+05j')
591edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
592edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5+3j, '<20g'),  '1.5+3j              ')
593edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5+3j, '*<20g'), '1.5+3j**************')
594edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5+3j, '>20g'),  '              1.5+3j')
595edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5+3j, '^20g'),  '       1.5+3j       ')
596edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5+3j, '<20'),   '(1.5+3j)            ')
597edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5+3j, '>20'),   '            (1.5+3j)')
598edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5+3j, '^20'),   '      (1.5+3j)      ')
599edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.123-3.123j, '^20.2'), '     (1.1-3.1j)     ')
600edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
601edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5+3j, '20.2f'), '          1.50+3.00j')
602edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5+3j, '>20.2f'), '          1.50+3.00j')
603edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5+3j, '<20.2f'), '1.50+3.00j          ')
604edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5e20+3j, '<20.2f'), '150000000000000000000.00+3.00j')
605edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5e20+3j, '>40.2f'), '          150000000000000000000.00+3.00j')
606edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5e20+3j, '^40,.2f'), '  150,000,000,000,000,000,000.00+3.00j  ')
607edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5e21+3j, '^40,.2f'), ' 1,500,000,000,000,000,000,000.00+3.00j ')
608edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(format(1.5e21+3000j, ',.2f'), '1,500,000,000,000,000,000,000.00+3,000.00j')
609edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
610edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # alternate is invalid
611edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, (1.5+0.5j).__format__, '#f')
612edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
613edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # zero padding is invalid
614edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, (1.5+0.5j).__format__, '010f')
615edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
616edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # '=' alignment is invalid
617edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, (1.5+3j).__format__, '=20')
618edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
619edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # integer presentation types are an error
620edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        for t in 'bcdoxX':
621edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertRaises(ValueError, (1.5+0.5j).__format__, t)
622edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
623edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # make sure everything works in ''.format()
624edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual('*{0:.3f}*'.format(3.14159+2.71828j), '*3.142+2.718j*')
625edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
626edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # issue 3382: 'f' and 'F' with inf's and nan's
627edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual('{0:f}'.format(INF+0j), 'inf+0.000000j')
628edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual('{0:F}'.format(INF+0j), 'INF+0.000000j')
629edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual('{0:f}'.format(-INF+0j), '-inf+0.000000j')
630edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual('{0:F}'.format(-INF+0j), '-INF+0.000000j')
631edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual('{0:f}'.format(complex(INF, INF)), 'inf+infj')
632edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual('{0:F}'.format(complex(INF, INF)), 'INF+INFj')
633edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual('{0:f}'.format(complex(INF, -INF)), 'inf-infj')
634edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual('{0:F}'.format(complex(INF, -INF)), 'INF-INFj')
635edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual('{0:f}'.format(complex(-INF, INF)), '-inf+infj')
636edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual('{0:F}'.format(complex(-INF, INF)), '-INF+INFj')
637edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual('{0:f}'.format(complex(-INF, -INF)), '-inf-infj')
638edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual('{0:F}'.format(complex(-INF, -INF)), '-INF-INFj')
639edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
640edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual('{0:f}'.format(complex(NAN, 0)), 'nan+0.000000j')
641edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual('{0:F}'.format(complex(NAN, 0)), 'NAN+0.000000j')
642edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual('{0:f}'.format(complex(NAN, NAN)), 'nan+nanj')
643edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual('{0:F}'.format(complex(NAN, NAN)), 'NAN+NANj')
644edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
645edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepdef test_main():
646edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    with test_support.check_warnings(("complex divmod.., // and % are "
647edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                                      "deprecated", DeprecationWarning)):
648edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        test_support.run_unittest(ComplexTest)
649edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
650edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepif __name__ == "__main__":
651edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    test_main()
652