blob: badb234bb303b60198b3e6338f91f41e5c3e799b [file] [log] [blame]
Florent Xicluna41fe6152010-04-02 18:52:12 +00001import unittest
Miss Islington (bot)256d97c2021-07-26 12:29:52 -07002import sys
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003from test import support
Brett Cannona721aba2016-09-09 14:57:09 -07004from test.test_grammar import (VALID_UNDERSCORE_LITERALS,
5 INVALID_UNDERSCORE_LITERALS)
Walter Dörwald5edd7852003-06-18 14:26:18 +00006
Tim Peters0f336042001-03-18 08:21:57 +00007from random import random
Mark Dickinsonad476da2009-04-23 19:14:16 +00008from math import atan2, isnan, copysign
Mark Dickinsonf673f0c2010-03-13 09:48:39 +00009import operator
Tim Peters0f336042001-03-18 08:21:57 +000010
Christian Heimesa156e092008-02-16 07:38:31 +000011INF = float("inf")
12NAN = float("nan")
Walter Dörwald5edd7852003-06-18 14:26:18 +000013# These tests ensure that complex math does the right thing
Fred Drake68773e72001-12-13 19:57:53 +000014
Serhiy Storchakae2ec0b22020-10-09 14:14:37 +030015ZERO_DIVISION = (
16 (1+1j, 0+0j),
17 (1+1j, 0.0),
18 (1+1j, 0),
19 (1.0, 0+0j),
20 (1, 0+0j),
21)
22
Walter Dörwald5edd7852003-06-18 14:26:18 +000023class ComplexTest(unittest.TestCase):
Tim Peters0f336042001-03-18 08:21:57 +000024
Walter Dörwald5edd7852003-06-18 14:26:18 +000025 def assertAlmostEqual(self, a, b):
26 if isinstance(a, complex):
27 if isinstance(b, complex):
28 unittest.TestCase.assertAlmostEqual(self, a.real, b.real)
29 unittest.TestCase.assertAlmostEqual(self, a.imag, b.imag)
30 else:
31 unittest.TestCase.assertAlmostEqual(self, a.real, b)
32 unittest.TestCase.assertAlmostEqual(self, a.imag, 0.)
33 else:
34 if isinstance(b, complex):
35 unittest.TestCase.assertAlmostEqual(self, a, b.real)
36 unittest.TestCase.assertAlmostEqual(self, 0., b.imag)
37 else:
38 unittest.TestCase.assertAlmostEqual(self, a, b)
Tim Peters0f336042001-03-18 08:21:57 +000039
Walter Dörwald5edd7852003-06-18 14:26:18 +000040 def assertCloseAbs(self, x, y, eps=1e-9):
Antoine Pitrou9086f922014-10-10 23:49:32 +020041 """Return true iff floats x and y "are close"."""
Walter Dörwald5edd7852003-06-18 14:26:18 +000042 # put the one with larger magnitude second
43 if abs(x) > abs(y):
44 x, y = y, x
45 if y == 0:
46 return abs(x) < eps
47 if x == 0:
48 return abs(y) < eps
49 # check that relative difference < eps
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000050 self.assertTrue(abs((x-y)/y) < eps)
Tim Petersc5b235c2001-09-06 23:00:21 +000051
Mark Dickinsonad476da2009-04-23 19:14:16 +000052 def assertFloatsAreIdentical(self, x, y):
53 """assert that floats x and y are identical, in the sense that:
54 (1) both x and y are nans, or
55 (2) both x and y are infinities, with the same sign, or
56 (3) both x and y are zeros, with the same sign, or
57 (4) x and y are both finite and nonzero, and x == y
58
59 """
60 msg = 'floats {!r} and {!r} are not identical'
61
62 if isnan(x) or isnan(y):
63 if isnan(x) and isnan(y):
64 return
65 elif x == y:
66 if x != 0.0:
67 return
68 # both zero; check that signs match
69 elif copysign(1.0, x) == copysign(1.0, y):
70 return
71 else:
72 msg += ': zeros have different signs'
73 self.fail(msg.format(x, y))
74
Walter Dörwald5edd7852003-06-18 14:26:18 +000075 def assertClose(self, x, y, eps=1e-9):
Antoine Pitrou9086f922014-10-10 23:49:32 +020076 """Return true iff complexes x and y "are close"."""
Walter Dörwald5edd7852003-06-18 14:26:18 +000077 self.assertCloseAbs(x.real, y.real, eps)
78 self.assertCloseAbs(x.imag, y.imag, eps)
Tim Peters0f336042001-03-18 08:21:57 +000079
Walter Dörwald5edd7852003-06-18 14:26:18 +000080 def check_div(self, x, y):
81 """Compute complex z=x*y, and check that z/x==y and z/y==x."""
82 z = x * y
83 if x != 0:
84 q = z / x
85 self.assertClose(q, y)
Walter Dörwaldb27cca62003-08-05 15:34:34 +000086 q = z.__truediv__(x)
87 self.assertClose(q, y)
Walter Dörwald5edd7852003-06-18 14:26:18 +000088 if y != 0:
89 q = z / y
90 self.assertClose(q, x)
Walter Dörwaldb27cca62003-08-05 15:34:34 +000091 q = z.__truediv__(y)
92 self.assertClose(q, x)
Tim Peters0f336042001-03-18 08:21:57 +000093
Neal Norwitzbcc0db82006-03-24 08:14:36 +000094 def test_truediv(self):
Guido van Rossum805365e2007-05-07 22:24:25 +000095 simple_real = [float(i) for i in range(-5, 6)]
Walter Dörwald5edd7852003-06-18 14:26:18 +000096 simple_complex = [complex(x, y) for x in simple_real for y in simple_real]
97 for x in simple_complex:
98 for y in simple_complex:
99 self.check_div(x, y)
Tim Peters0f336042001-03-18 08:21:57 +0000100
Walter Dörwald5edd7852003-06-18 14:26:18 +0000101 # A naive complex division algorithm (such as in 2.0) is very prone to
102 # nonsense errors for these (overflows and underflows).
103 self.check_div(complex(1e200, 1e200), 1+0j)
104 self.check_div(complex(1e-200, 1e-200), 1+0j)
Tim Peters0f336042001-03-18 08:21:57 +0000105
Walter Dörwald5edd7852003-06-18 14:26:18 +0000106 # Just for fun.
Guido van Rossum805365e2007-05-07 22:24:25 +0000107 for i in range(100):
Walter Dörwald5edd7852003-06-18 14:26:18 +0000108 self.check_div(complex(random(), random()),
109 complex(random(), random()))
Neal Norwitzfc37af82001-12-29 01:02:21 +0000110
Walter Dörwald5edd7852003-06-18 14:26:18 +0000111 self.assertAlmostEqual(complex.__truediv__(2+0j, 1+1j), 1-1j)
Neal Norwitz5a0f0102001-12-29 14:31:46 +0000112
Antoine Pitrou9086f922014-10-10 23:49:32 +0200113 for denom_real, denom_imag in [(0, NAN), (NAN, 0), (NAN, NAN)]:
114 z = complex(0, 0) / complex(denom_real, denom_imag)
115 self.assertTrue(isnan(z.real))
116 self.assertTrue(isnan(z.imag))
117
Serhiy Storchakae2ec0b22020-10-09 14:14:37 +0300118 def test_truediv_zero_division(self):
119 for a, b in ZERO_DIVISION:
120 with self.assertRaises(ZeroDivisionError):
121 a / b
122
Walter Dörwald5edd7852003-06-18 14:26:18 +0000123 def test_floordiv(self):
Serhiy Storchakae2ec0b22020-10-09 14:14:37 +0300124 with self.assertRaises(TypeError):
125 (1+1j) // (1+0j)
126 with self.assertRaises(TypeError):
127 (1+1j) // 1.0
128 with self.assertRaises(TypeError):
129 (1+1j) // 1
130 with self.assertRaises(TypeError):
131 1.0 // (1+0j)
132 with self.assertRaises(TypeError):
133 1 // (1+0j)
134
135 def test_floordiv_zero_division(self):
136 for a, b in ZERO_DIVISION:
137 with self.assertRaises(TypeError):
138 a // b
Neal Norwitzfc37af82001-12-29 01:02:21 +0000139
Walter Dörwald5edd7852003-06-18 14:26:18 +0000140 def test_richcompare(self):
Mark Dickinsoncc6a9822010-05-21 14:55:26 +0000141 self.assertIs(complex.__eq__(1+1j, 1<<10000), False)
Mark Dickinsonf673f0c2010-03-13 09:48:39 +0000142 self.assertIs(complex.__lt__(1+1j, None), NotImplemented)
Walter Dörwald5edd7852003-06-18 14:26:18 +0000143 self.assertIs(complex.__eq__(1+1j, 1+1j), True)
144 self.assertIs(complex.__eq__(1+1j, 2+2j), False)
145 self.assertIs(complex.__ne__(1+1j, 1+1j), False)
146 self.assertIs(complex.__ne__(1+1j, 2+2j), True)
Mark Dickinsoncc6a9822010-05-21 14:55:26 +0000147 for i in range(1, 100):
148 f = i / 100.0
149 self.assertIs(complex.__eq__(f+0j, f), True)
150 self.assertIs(complex.__ne__(f+0j, f), False)
151 self.assertIs(complex.__eq__(complex(f, f), f), False)
152 self.assertIs(complex.__ne__(complex(f, f), f), True)
Mark Dickinsonf673f0c2010-03-13 09:48:39 +0000153 self.assertIs(complex.__lt__(1+1j, 2+2j), NotImplemented)
154 self.assertIs(complex.__le__(1+1j, 2+2j), NotImplemented)
155 self.assertIs(complex.__gt__(1+1j, 2+2j), NotImplemented)
156 self.assertIs(complex.__ge__(1+1j, 2+2j), NotImplemented)
157 self.assertRaises(TypeError, operator.lt, 1+1j, 2+2j)
158 self.assertRaises(TypeError, operator.le, 1+1j, 2+2j)
159 self.assertRaises(TypeError, operator.gt, 1+1j, 2+2j)
160 self.assertRaises(TypeError, operator.ge, 1+1j, 2+2j)
161 self.assertIs(operator.eq(1+1j, 1+1j), True)
162 self.assertIs(operator.eq(1+1j, 2+2j), False)
163 self.assertIs(operator.ne(1+1j, 1+1j), False)
164 self.assertIs(operator.ne(1+1j, 2+2j), True)
Tim Peters0f336042001-03-18 08:21:57 +0000165
Mark Dickinsoncc6a9822010-05-21 14:55:26 +0000166 def test_richcompare_boundaries(self):
167 def check(n, deltas, is_equal, imag = 0.0):
168 for delta in deltas:
169 i = n + delta
170 z = complex(i, imag)
171 self.assertIs(complex.__eq__(z, i), is_equal(delta))
172 self.assertIs(complex.__ne__(z, i), not is_equal(delta))
173 # For IEEE-754 doubles the following should hold:
174 # x in [2 ** (52 + i), 2 ** (53 + i + 1)] -> x mod 2 ** i == 0
175 # where the interval is representable, of course.
176 for i in range(1, 10):
177 pow = 52 + i
178 mult = 2 ** i
179 check(2 ** pow, range(1, 101), lambda delta: delta % mult == 0)
180 check(2 ** pow, range(1, 101), lambda delta: False, float(i))
181 check(2 ** 53, range(-100, 0), lambda delta: True)
182
Walter Dörwald5edd7852003-06-18 14:26:18 +0000183 def test_mod(self):
Guido van Rossum9648d622007-08-03 20:40:44 +0000184 # % is no longer supported on complex numbers
Serhiy Storchakae2ec0b22020-10-09 14:14:37 +0300185 with self.assertRaises(TypeError):
186 (1+1j) % (1+0j)
187 with self.assertRaises(TypeError):
188 (1+1j) % 1.0
189 with self.assertRaises(TypeError):
190 (1+1j) % 1
191 with self.assertRaises(TypeError):
192 1.0 % (1+0j)
193 with self.assertRaises(TypeError):
194 1 % (1+0j)
195
196 def test_mod_zero_division(self):
197 for a, b in ZERO_DIVISION:
198 with self.assertRaises(TypeError):
199 a % b
Walter Dörwaldf393fc62003-07-15 18:47:27 +0000200
Walter Dörwald5edd7852003-06-18 14:26:18 +0000201 def test_divmod(self):
Guido van Rossum9648d622007-08-03 20:40:44 +0000202 self.assertRaises(TypeError, divmod, 1+1j, 1+0j)
Serhiy Storchakae2ec0b22020-10-09 14:14:37 +0300203 self.assertRaises(TypeError, divmod, 1+1j, 1.0)
204 self.assertRaises(TypeError, divmod, 1+1j, 1)
205 self.assertRaises(TypeError, divmod, 1.0, 1+0j)
206 self.assertRaises(TypeError, divmod, 1, 1+0j)
207
208 def test_divmod_zero_division(self):
209 for a, b in ZERO_DIVISION:
210 self.assertRaises(TypeError, divmod, a, b)
Walter Dörwald5edd7852003-06-18 14:26:18 +0000211
212 def test_pow(self):
213 self.assertAlmostEqual(pow(1+1j, 0+0j), 1.0)
214 self.assertAlmostEqual(pow(0+0j, 2+0j), 0.0)
215 self.assertRaises(ZeroDivisionError, pow, 0+0j, 1j)
216 self.assertAlmostEqual(pow(1j, -1), 1/1j)
217 self.assertAlmostEqual(pow(1j, 200), 1)
218 self.assertRaises(ValueError, pow, 1+1j, 1+1j, 1+1j)
Serhiy Storchakae2ec0b22020-10-09 14:14:37 +0300219 self.assertRaises(OverflowError, pow, 1e200+1j, 1e200+1j)
Walter Dörwald5edd7852003-06-18 14:26:18 +0000220
Walter Dörwaldf393fc62003-07-15 18:47:27 +0000221 a = 3.33+4.43j
222 self.assertEqual(a ** 0j, 1)
223 self.assertEqual(a ** 0.+0.j, 1)
224
225 self.assertEqual(3j ** 0j, 1)
226 self.assertEqual(3j ** 0, 1)
227
228 try:
229 0j ** a
230 except ZeroDivisionError:
231 pass
232 else:
233 self.fail("should fail 0.0 to negative or complex power")
234
235 try:
236 0j ** (3-2j)
237 except ZeroDivisionError:
238 pass
239 else:
240 self.fail("should fail 0.0 to negative or complex power")
241
242 # The following is used to exercise certain code paths
243 self.assertEqual(a ** 105, a ** 105)
244 self.assertEqual(a ** -105, a ** -105)
245 self.assertEqual(a ** -30, a ** -30)
246
247 self.assertEqual(0.0j ** 0, 1)
248
249 b = 5.1+2.3j
250 self.assertRaises(ValueError, pow, a, b, 0)
251
Miss Islington (bot)256d97c2021-07-26 12:29:52 -0700252 # Check some boundary conditions; some of these used to invoke
253 # undefined behaviour (https://bugs.python.org/issue44698). We're
254 # not actually checking the results of these operations, just making
255 # sure they don't crash (for example when using clang's
256 # UndefinedBehaviourSanitizer).
257 values = (sys.maxsize, sys.maxsize+1, sys.maxsize-1,
258 -sys.maxsize, -sys.maxsize+1, -sys.maxsize+1)
259 for real in values:
260 for imag in values:
261 with self.subTest(real=real, imag=imag):
262 c = complex(real, imag)
263 try:
264 c ** real
265 except OverflowError:
266 pass
267 try:
268 c ** c
269 except OverflowError:
270 pass
271
Walter Dörwald5edd7852003-06-18 14:26:18 +0000272 def test_boolcontext(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000273 for i in range(100):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000274 self.assertTrue(complex(random() + 1e-6, random() + 1e-6))
275 self.assertTrue(not complex(0.0, 0.0))
Walter Dörwald5edd7852003-06-18 14:26:18 +0000276
277 def test_conjugate(self):
278 self.assertClose(complex(5.3, 9.8).conjugate(), 5.3-9.8j)
279
280 def test_constructor(self):
281 class OS:
282 def __init__(self, value): self.value = value
283 def __complex__(self): return self.value
284 class NS(object):
285 def __init__(self, value): self.value = value
286 def __complex__(self): return self.value
287 self.assertEqual(complex(OS(1+10j)), 1+10j)
288 self.assertEqual(complex(NS(1+10j)), 1+10j)
289 self.assertRaises(TypeError, complex, OS(None))
290 self.assertRaises(TypeError, complex, NS(None))
Alexander Belopolsky942af5a2010-12-04 03:38:46 +0000291 self.assertRaises(TypeError, complex, {})
Mark Dickinsond20fb822012-11-14 17:08:31 +0000292 self.assertRaises(TypeError, complex, NS(1.5))
293 self.assertRaises(TypeError, complex, NS(1))
Walter Dörwald5edd7852003-06-18 14:26:18 +0000294
295 self.assertAlmostEqual(complex("1+10j"), 1+10j)
296 self.assertAlmostEqual(complex(10), 10+0j)
297 self.assertAlmostEqual(complex(10.0), 10+0j)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000298 self.assertAlmostEqual(complex(10), 10+0j)
Walter Dörwald5edd7852003-06-18 14:26:18 +0000299 self.assertAlmostEqual(complex(10+0j), 10+0j)
300 self.assertAlmostEqual(complex(1,10), 1+10j)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000301 self.assertAlmostEqual(complex(1,10), 1+10j)
Walter Dörwald5edd7852003-06-18 14:26:18 +0000302 self.assertAlmostEqual(complex(1,10.0), 1+10j)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000303 self.assertAlmostEqual(complex(1,10), 1+10j)
304 self.assertAlmostEqual(complex(1,10), 1+10j)
305 self.assertAlmostEqual(complex(1,10.0), 1+10j)
Walter Dörwald5edd7852003-06-18 14:26:18 +0000306 self.assertAlmostEqual(complex(1.0,10), 1+10j)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000307 self.assertAlmostEqual(complex(1.0,10), 1+10j)
Walter Dörwald5edd7852003-06-18 14:26:18 +0000308 self.assertAlmostEqual(complex(1.0,10.0), 1+10j)
309 self.assertAlmostEqual(complex(3.14+0j), 3.14+0j)
310 self.assertAlmostEqual(complex(3.14), 3.14+0j)
311 self.assertAlmostEqual(complex(314), 314.0+0j)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000312 self.assertAlmostEqual(complex(314), 314.0+0j)
Walter Dörwald5edd7852003-06-18 14:26:18 +0000313 self.assertAlmostEqual(complex(3.14+0j, 0j), 3.14+0j)
314 self.assertAlmostEqual(complex(3.14, 0.0), 3.14+0j)
315 self.assertAlmostEqual(complex(314, 0), 314.0+0j)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000316 self.assertAlmostEqual(complex(314, 0), 314.0+0j)
Walter Dörwald5edd7852003-06-18 14:26:18 +0000317 self.assertAlmostEqual(complex(0j, 3.14j), -3.14+0j)
318 self.assertAlmostEqual(complex(0.0, 3.14j), -3.14+0j)
319 self.assertAlmostEqual(complex(0j, 3.14), 3.14j)
320 self.assertAlmostEqual(complex(0.0, 3.14), 3.14j)
321 self.assertAlmostEqual(complex("1"), 1+0j)
322 self.assertAlmostEqual(complex("1j"), 1j)
323 self.assertAlmostEqual(complex(), 0)
324 self.assertAlmostEqual(complex("-1"), -1)
325 self.assertAlmostEqual(complex("+1"), +1)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000326 self.assertAlmostEqual(complex("(1+2j)"), 1+2j)
327 self.assertAlmostEqual(complex("(1.3+2.2j)"), 1.3+2.2j)
Mark Dickinsonad476da2009-04-23 19:14:16 +0000328 self.assertAlmostEqual(complex("3.14+1J"), 3.14+1j)
329 self.assertAlmostEqual(complex(" ( +3.14-6J )"), 3.14-6j)
Mark Dickinson6649fa42009-04-24 13:25:20 +0000330 self.assertAlmostEqual(complex(" ( +3.14-J )"), 3.14-1j)
331 self.assertAlmostEqual(complex(" ( +3.14+j )"), 3.14+1j)
332 self.assertAlmostEqual(complex("J"), 1j)
333 self.assertAlmostEqual(complex("( j )"), 1j)
334 self.assertAlmostEqual(complex("+J"), 1j)
335 self.assertAlmostEqual(complex("( -j)"), -1j)
336 self.assertAlmostEqual(complex('1e-500'), 0.0 + 0.0j)
337 self.assertAlmostEqual(complex('-1e-500j'), 0.0 - 0.0j)
338 self.assertAlmostEqual(complex('-1e-500+1e-500j'), -0.0 + 0.0j)
Walter Dörwald5edd7852003-06-18 14:26:18 +0000339
340 class complex2(complex): pass
341 self.assertAlmostEqual(complex(complex2(1+1j)), 1+1j)
342 self.assertAlmostEqual(complex(real=17, imag=23), 17+23j)
343 self.assertAlmostEqual(complex(real=17+23j), 17+23j)
344 self.assertAlmostEqual(complex(real=17+23j, imag=23), 17+46j)
345 self.assertAlmostEqual(complex(real=1+2j, imag=3+4j), -3+5j)
346
Christian Heimes69a79632007-11-28 10:04:30 +0000347 # check that the sign of a zero in the real or imaginary part
348 # is preserved when constructing from two floats. (These checks
349 # are harmless on systems without support for signed zeros.)
350 def split_zeros(x):
351 """Function that produces different results for 0. and -0."""
352 return atan2(x, -1.)
353
354 self.assertEqual(split_zeros(complex(1., 0.).imag), split_zeros(0.))
355 self.assertEqual(split_zeros(complex(1., -0.).imag), split_zeros(-0.))
356 self.assertEqual(split_zeros(complex(0., 1.).real), split_zeros(0.))
357 self.assertEqual(split_zeros(complex(-0., 1.).real), split_zeros(-0.))
358
Walter Dörwald5edd7852003-06-18 14:26:18 +0000359 c = 3.14 + 1j
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000360 self.assertTrue(complex(c) is c)
Walter Dörwald5edd7852003-06-18 14:26:18 +0000361 del c
362
363 self.assertRaises(TypeError, complex, "1", "1")
364 self.assertRaises(TypeError, complex, 1, "1")
365
Walter Dörwald5edd7852003-06-18 14:26:18 +0000366 # SF bug 543840: complex(string) accepts strings with \0
367 # Fixed in 2.3.
368 self.assertRaises(ValueError, complex, '1+1j\0j')
369
370 self.assertRaises(TypeError, int, 5+3j)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000371 self.assertRaises(TypeError, int, 5+3j)
Walter Dörwald5edd7852003-06-18 14:26:18 +0000372 self.assertRaises(TypeError, float, 5+3j)
373 self.assertRaises(ValueError, complex, "")
374 self.assertRaises(TypeError, complex, None)
Ezio Melottia5b95992013-11-07 19:18:34 +0200375 self.assertRaisesRegex(TypeError, "not 'NoneType'", complex, None)
Walter Dörwald5edd7852003-06-18 14:26:18 +0000376 self.assertRaises(ValueError, complex, "\0")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000377 self.assertRaises(ValueError, complex, "3\09")
Walter Dörwald5edd7852003-06-18 14:26:18 +0000378 self.assertRaises(TypeError, complex, "1", "2")
379 self.assertRaises(TypeError, complex, "1", 42)
380 self.assertRaises(TypeError, complex, 1, "2")
381 self.assertRaises(ValueError, complex, "1+")
382 self.assertRaises(ValueError, complex, "1+1j+1j")
383 self.assertRaises(ValueError, complex, "--")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000384 self.assertRaises(ValueError, complex, "(1+2j")
385 self.assertRaises(ValueError, complex, "1+2j)")
386 self.assertRaises(ValueError, complex, "1+(2j)")
387 self.assertRaises(ValueError, complex, "(1+2j)123")
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000388 self.assertRaises(ValueError, complex, "x")
Mark Dickinsonad476da2009-04-23 19:14:16 +0000389 self.assertRaises(ValueError, complex, "1j+2")
390 self.assertRaises(ValueError, complex, "1e1ej")
391 self.assertRaises(ValueError, complex, "1e++1ej")
392 self.assertRaises(ValueError, complex, ")1+2j(")
Mark Dickinson613f8e52016-09-24 15:26:36 +0100393 self.assertRaisesRegex(
394 TypeError,
395 "first argument must be a string or a number, not 'dict'",
396 complex, {1:2}, 1)
397 self.assertRaisesRegex(
398 TypeError,
399 "second argument must be a number, not 'dict'",
400 complex, 1, {1:2})
Mark Dickinson6649fa42009-04-24 13:25:20 +0000401 # the following three are accepted by Python 2.6
402 self.assertRaises(ValueError, complex, "1..1j")
403 self.assertRaises(ValueError, complex, "1.11.1j")
404 self.assertRaises(ValueError, complex, "1e1.1j")
Walter Dörwald5edd7852003-06-18 14:26:18 +0000405
Mark Dickinsonf9724882009-10-26 21:51:18 +0000406 # check that complex accepts long unicode strings
407 self.assertEqual(type(complex("1"*500)), complex)
Alexander Belopolsky942af5a2010-12-04 03:38:46 +0000408 # check whitespace processing
409 self.assertEqual(complex('\N{EM SPACE}(\N{EN SPACE}1+1j ) '), 1+1j)
INADA Naoki16dfca42018-07-14 12:06:43 +0900410 # Invalid unicode string
411 # See bpo-34087
412 self.assertRaises(ValueError, complex, '\u3053\u3093\u306b\u3061\u306f')
Mark Dickinsonf9724882009-10-26 21:51:18 +0000413
Walter Dörwald5edd7852003-06-18 14:26:18 +0000414 class EvilExc(Exception):
Tim Peters478c1052003-06-29 05:46:54 +0000415 pass
Walter Dörwald5edd7852003-06-18 14:26:18 +0000416
417 class evilcomplex:
418 def __complex__(self):
419 raise EvilExc
420
421 self.assertRaises(EvilExc, complex, evilcomplex())
422
423 class float2:
424 def __init__(self, value):
425 self.value = value
426 def __float__(self):
427 return self.value
428
429 self.assertAlmostEqual(complex(float2(42.)), 42)
430 self.assertAlmostEqual(complex(real=float2(17.), imag=float2(23.)), 17+23j)
431 self.assertRaises(TypeError, complex, float2(None))
432
Serhiy Storchakabdbad712019-06-02 00:05:48 +0300433 class MyIndex:
434 def __init__(self, value):
435 self.value = value
436 def __index__(self):
437 return self.value
438
439 self.assertAlmostEqual(complex(MyIndex(42)), 42.0+0.0j)
440 self.assertAlmostEqual(complex(123, MyIndex(42)), 123.0+42.0j)
441 self.assertRaises(OverflowError, complex, MyIndex(2**2000))
442 self.assertRaises(OverflowError, complex, 123, MyIndex(2**2000))
443
444 class MyInt:
445 def __int__(self):
446 return 42
447
448 self.assertRaises(TypeError, complex, MyInt())
449 self.assertRaises(TypeError, complex, 123, MyInt())
450
Brett Cannonc3647ac2005-04-26 03:45:26 +0000451 class complex0(complex):
452 """Test usage of __complex__() when inheriting from 'complex'"""
453 def __complex__(self):
454 return 42j
455
456 class complex1(complex):
457 """Test usage of __complex__() with a __new__() method"""
458 def __new__(self, value=0j):
459 return complex.__new__(self, 2*value)
460 def __complex__(self):
461 return self
462
463 class complex2(complex):
464 """Make sure that __complex__() calls fail if anything other than a
465 complex is returned"""
466 def __complex__(self):
467 return None
468
Serhiy Storchaka671079e2017-03-24 21:28:43 +0200469 self.assertEqual(complex(complex0(1j)), 42j)
470 with self.assertWarns(DeprecationWarning):
471 self.assertEqual(complex(complex1(1j)), 2j)
Brett Cannonc3647ac2005-04-26 03:45:26 +0000472 self.assertRaises(TypeError, complex, complex2(1j))
473
Mark Dickinson112ec382017-02-20 20:28:15 +0000474 @support.requires_IEEE_754
475 def test_constructor_special_numbers(self):
476 class complex2(complex):
477 pass
478 for x in 0.0, -0.0, INF, -INF, NAN:
479 for y in 0.0, -0.0, INF, -INF, NAN:
480 with self.subTest(x=x, y=y):
481 z = complex(x, y)
482 self.assertFloatsAreIdentical(z.real, x)
483 self.assertFloatsAreIdentical(z.imag, y)
484 z = complex2(x, y)
485 self.assertIs(type(z), complex2)
486 self.assertFloatsAreIdentical(z.real, x)
487 self.assertFloatsAreIdentical(z.imag, y)
488 z = complex(complex2(x, y))
489 self.assertIs(type(z), complex)
490 self.assertFloatsAreIdentical(z.real, x)
491 self.assertFloatsAreIdentical(z.imag, y)
492 z = complex2(complex(x, y))
493 self.assertIs(type(z), complex2)
494 self.assertFloatsAreIdentical(z.real, x)
495 self.assertFloatsAreIdentical(z.imag, y)
496
Brett Cannona721aba2016-09-09 14:57:09 -0700497 def test_underscores(self):
498 # check underscores
499 for lit in VALID_UNDERSCORE_LITERALS:
500 if not any(ch in lit for ch in 'xXoObB'):
501 self.assertEqual(complex(lit), eval(lit))
502 self.assertEqual(complex(lit), complex(lit.replace('_', '')))
503 for lit in INVALID_UNDERSCORE_LITERALS:
504 if lit in ('0_7', '09_99'): # octals are not recognized here
505 continue
506 if not any(ch in lit for ch in 'xXoObB'):
507 self.assertRaises(ValueError, complex, lit)
508
Walter Dörwald5edd7852003-06-18 14:26:18 +0000509 def test_hash(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000510 for x in range(-30, 30):
Walter Dörwald5edd7852003-06-18 14:26:18 +0000511 self.assertEqual(hash(x), hash(complex(x, 0)))
512 x /= 3.0 # now check against floating point
513 self.assertEqual(hash(x), hash(complex(x, 0.)))
514
515 def test_abs(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000516 nums = [complex(x/3., y/7.) for x in range(-9,9) for y in range(-9,9)]
Walter Dörwald5edd7852003-06-18 14:26:18 +0000517 for num in nums:
518 self.assertAlmostEqual((num.real**2 + num.imag**2) ** 0.5, abs(num))
519
Eric Smith70099a12010-12-04 13:27:34 +0000520 def test_repr_str(self):
521 def test(v, expected, test_fn=self.assertEqual):
522 test_fn(repr(v), expected)
523 test_fn(str(v), expected)
Walter Dörwald5edd7852003-06-18 14:26:18 +0000524
Eric Smith70099a12010-12-04 13:27:34 +0000525 test(1+6j, '(1+6j)')
526 test(1-6j, '(1-6j)')
527
528 test(-(1+0j), '(-1+-0j)', test_fn=self.assertNotEqual)
529
530 test(complex(1., INF), "(1+infj)")
531 test(complex(1., -INF), "(1-infj)")
532 test(complex(INF, 1), "(inf+1j)")
533 test(complex(-INF, INF), "(-inf+infj)")
534 test(complex(NAN, 1), "(nan+1j)")
535 test(complex(1, NAN), "(1+nanj)")
536 test(complex(NAN, NAN), "(nan+nanj)")
537
538 test(complex(0, INF), "infj")
539 test(complex(0, -INF), "-infj")
540 test(complex(0, NAN), "nanj")
Georg Brandl9e281072005-09-17 07:51:15 +0000541
Guido van Rossumd8faa362007-04-27 19:54:29 +0000542 self.assertEqual(1-6j,complex(repr(1-6j)))
543 self.assertEqual(1+6j,complex(repr(1+6j)))
544 self.assertEqual(-6j,complex(repr(-6j)))
545 self.assertEqual(6j,complex(repr(6j)))
546
Eric Smith1ed77f32010-12-04 15:26:13 +0000547 @support.requires_IEEE_754
548 def test_negative_zero_repr_str(self):
549 def test(v, expected, test_fn=self.assertEqual):
550 test_fn(repr(v), expected)
551 test_fn(str(v), expected)
552
553 test(complex(0., 1.), "1j")
554 test(complex(-0., 1.), "(-0+1j)")
555 test(complex(0., -1.), "-1j")
556 test(complex(-0., -1.), "(-0-1j)")
557
558 test(complex(0., 0.), "0j")
559 test(complex(0., -0.), "-0j")
560 test(complex(-0., 0.), "(-0+0j)")
561 test(complex(-0., -0.), "(-0-0j)")
562
Walter Dörwald5edd7852003-06-18 14:26:18 +0000563 def test_neg(self):
564 self.assertEqual(-(1+6j), -1-6j)
565
Georg Brandl0c77a822008-06-10 16:37:50 +0000566 def test_getnewargs(self):
567 self.assertEqual((1+2j).__getnewargs__(), (1.0, 2.0))
568 self.assertEqual((1-2j).__getnewargs__(), (1.0, -2.0))
569 self.assertEqual((2j).__getnewargs__(), (0.0, 2.0))
570 self.assertEqual((-0j).__getnewargs__(), (0.0, -0.0))
571 self.assertEqual(complex(0, INF).__getnewargs__(), (0.0, INF))
572 self.assertEqual(complex(INF, 0).__getnewargs__(), (INF, 0.0))
573
Eric Smith3ab08ca2010-12-04 15:17:38 +0000574 @support.requires_IEEE_754
575 def test_plus_minus_0j(self):
576 # test that -0j and 0j literals are not identified
577 z1, z2 = 0j, -0j
578 self.assertEqual(atan2(z1.imag, -1.), atan2(0., -1.))
579 self.assertEqual(atan2(z2.imag, -1.), atan2(-0., -1.))
Christian Heimes400adb02008-02-01 08:12:03 +0000580
Eric Smith3ab08ca2010-12-04 15:17:38 +0000581 @support.requires_IEEE_754
Mark Dickinson50b79a82010-06-30 11:13:36 +0000582 def test_negated_imaginary_literal(self):
583 z0 = -0j
584 z1 = -7j
585 z2 = -1e1000j
586 # Note: In versions of Python < 3.2, a negated imaginary literal
587 # accidentally ended up with real part 0.0 instead of -0.0, thanks to a
588 # modification during CST -> AST translation (see issue #9011). That's
589 # fixed in Python 3.2.
590 self.assertFloatsAreIdentical(z0.real, -0.0)
591 self.assertFloatsAreIdentical(z0.imag, -0.0)
592 self.assertFloatsAreIdentical(z1.real, -0.0)
593 self.assertFloatsAreIdentical(z1.imag, -7.0)
594 self.assertFloatsAreIdentical(z2.real, -0.0)
595 self.assertFloatsAreIdentical(z2.imag, -INF)
596
Eric Smith3ab08ca2010-12-04 15:17:38 +0000597 @support.requires_IEEE_754
Mark Dickinson6b1e43b2009-05-20 18:41:04 +0000598 def test_overflow(self):
599 self.assertEqual(complex("1e500"), complex(INF, 0.0))
600 self.assertEqual(complex("-1e500j"), complex(0.0, -INF))
601 self.assertEqual(complex("-1e500+1.8e308j"), complex(-INF, INF))
602
Eric Smith3ab08ca2010-12-04 15:17:38 +0000603 @support.requires_IEEE_754
Mark Dickinsonad476da2009-04-23 19:14:16 +0000604 def test_repr_roundtrip(self):
Mark Dickinsonde8a7102009-04-25 10:11:40 +0000605 vals = [0.0, 1e-500, 1e-315, 1e-200, 0.0123, 3.1415, 1e50, INF, NAN]
Mark Dickinsonad476da2009-04-23 19:14:16 +0000606 vals += [-v for v in vals]
Mark Dickinsonde8a7102009-04-25 10:11:40 +0000607
608 # complex(repr(z)) should recover z exactly, even for complex
609 # numbers involving an infinity, nan, or negative zero
Mark Dickinsonad476da2009-04-23 19:14:16 +0000610 for x in vals:
611 for y in vals:
612 z = complex(x, y)
613 roundtrip = complex(repr(z))
614 self.assertFloatsAreIdentical(z.real, roundtrip.real)
615 self.assertFloatsAreIdentical(z.imag, roundtrip.imag)
616
Mark Dickinsonde8a7102009-04-25 10:11:40 +0000617 # if we predefine some constants, then eval(repr(z)) should
618 # also work, except that it might change the sign of zeros
619 inf, nan = float('inf'), float('nan')
620 infj, nanj = complex(0.0, inf), complex(0.0, nan)
621 for x in vals:
622 for y in vals:
623 z = complex(x, y)
624 roundtrip = eval(repr(z))
625 # adding 0.0 has no effect beside changing -0.0 to 0.0
626 self.assertFloatsAreIdentical(0.0 + z.real,
627 0.0 + roundtrip.real)
628 self.assertFloatsAreIdentical(0.0 + z.imag,
629 0.0 + roundtrip.imag)
630
Eric Smith58a42242009-04-30 01:00:33 +0000631 def test_format(self):
632 # empty format string is same as str()
633 self.assertEqual(format(1+3j, ''), str(1+3j))
634 self.assertEqual(format(1.5+3.5j, ''), str(1.5+3.5j))
635 self.assertEqual(format(3j, ''), str(3j))
636 self.assertEqual(format(3.2j, ''), str(3.2j))
637 self.assertEqual(format(3+0j, ''), str(3+0j))
638 self.assertEqual(format(3.2+0j, ''), str(3.2+0j))
Mark Dickinsonde8a7102009-04-25 10:11:40 +0000639
Eric Smith63376222009-05-05 14:04:18 +0000640 # empty presentation type should still be analogous to str,
641 # even when format string is nonempty (issue #5920).
642 self.assertEqual(format(3.2+0j, '-'), str(3.2+0j))
643 self.assertEqual(format(3.2+0j, '<'), str(3.2+0j))
644 z = 4/7. - 100j/7.
645 self.assertEqual(format(z, ''), str(z))
646 self.assertEqual(format(z, '-'), str(z))
647 self.assertEqual(format(z, '<'), str(z))
648 self.assertEqual(format(z, '10'), str(z))
Mark Dickinson5b65df72010-08-01 10:41:49 +0000649 z = complex(0.0, 3.0)
650 self.assertEqual(format(z, ''), str(z))
651 self.assertEqual(format(z, '-'), str(z))
652 self.assertEqual(format(z, '<'), str(z))
653 self.assertEqual(format(z, '2'), str(z))
654 z = complex(-0.0, 2.0)
655 self.assertEqual(format(z, ''), str(z))
656 self.assertEqual(format(z, '-'), str(z))
657 self.assertEqual(format(z, '<'), str(z))
658 self.assertEqual(format(z, '3'), str(z))
Eric Smith63376222009-05-05 14:04:18 +0000659
Eric Smith58a42242009-04-30 01:00:33 +0000660 self.assertEqual(format(1+3j, 'g'), '1+3j')
661 self.assertEqual(format(3j, 'g'), '0+3j')
662 self.assertEqual(format(1.5+3.5j, 'g'), '1.5+3.5j')
663
664 self.assertEqual(format(1.5+3.5j, '+g'), '+1.5+3.5j')
665 self.assertEqual(format(1.5-3.5j, '+g'), '+1.5-3.5j')
666 self.assertEqual(format(1.5-3.5j, '-g'), '1.5-3.5j')
667 self.assertEqual(format(1.5+3.5j, ' g'), ' 1.5+3.5j')
668 self.assertEqual(format(1.5-3.5j, ' g'), ' 1.5-3.5j')
669 self.assertEqual(format(-1.5+3.5j, ' g'), '-1.5+3.5j')
670 self.assertEqual(format(-1.5-3.5j, ' g'), '-1.5-3.5j')
671
672 self.assertEqual(format(-1.5-3.5e-20j, 'g'), '-1.5-3.5e-20j')
673 self.assertEqual(format(-1.5-3.5j, 'f'), '-1.500000-3.500000j')
674 self.assertEqual(format(-1.5-3.5j, 'F'), '-1.500000-3.500000j')
675 self.assertEqual(format(-1.5-3.5j, 'e'), '-1.500000e+00-3.500000e+00j')
676 self.assertEqual(format(-1.5-3.5j, '.2e'), '-1.50e+00-3.50e+00j')
677 self.assertEqual(format(-1.5-3.5j, '.2E'), '-1.50E+00-3.50E+00j')
678 self.assertEqual(format(-1.5e10-3.5e5j, '.2G'), '-1.5E+10-3.5E+05j')
679
680 self.assertEqual(format(1.5+3j, '<20g'), '1.5+3j ')
681 self.assertEqual(format(1.5+3j, '*<20g'), '1.5+3j**************')
682 self.assertEqual(format(1.5+3j, '>20g'), ' 1.5+3j')
683 self.assertEqual(format(1.5+3j, '^20g'), ' 1.5+3j ')
684 self.assertEqual(format(1.5+3j, '<20'), '(1.5+3j) ')
685 self.assertEqual(format(1.5+3j, '>20'), ' (1.5+3j)')
686 self.assertEqual(format(1.5+3j, '^20'), ' (1.5+3j) ')
687 self.assertEqual(format(1.123-3.123j, '^20.2'), ' (1.1-3.1j) ')
688
Eric Smith4e260c52010-02-22 18:54:44 +0000689 self.assertEqual(format(1.5+3j, '20.2f'), ' 1.50+3.00j')
690 self.assertEqual(format(1.5+3j, '>20.2f'), ' 1.50+3.00j')
Eric Smith58a42242009-04-30 01:00:33 +0000691 self.assertEqual(format(1.5+3j, '<20.2f'), '1.50+3.00j ')
692 self.assertEqual(format(1.5e20+3j, '<20.2f'), '150000000000000000000.00+3.00j')
693 self.assertEqual(format(1.5e20+3j, '>40.2f'), ' 150000000000000000000.00+3.00j')
694 self.assertEqual(format(1.5e20+3j, '^40,.2f'), ' 150,000,000,000,000,000,000.00+3.00j ')
695 self.assertEqual(format(1.5e21+3j, '^40,.2f'), ' 1,500,000,000,000,000,000,000.00+3.00j ')
696 self.assertEqual(format(1.5e21+3000j, ',.2f'), '1,500,000,000,000,000,000,000.00+3,000.00j')
697
Eric Smith984bb582010-11-25 16:08:06 +0000698 # Issue 7094: Alternate formatting (specified by #)
699 self.assertEqual(format(1+1j, '.0e'), '1e+00+1e+00j')
700 self.assertEqual(format(1+1j, '#.0e'), '1.e+00+1.e+00j')
701 self.assertEqual(format(1+1j, '.0f'), '1+1j')
702 self.assertEqual(format(1+1j, '#.0f'), '1.+1.j')
703 self.assertEqual(format(1.1+1.1j, 'g'), '1.1+1.1j')
704 self.assertEqual(format(1.1+1.1j, '#g'), '1.10000+1.10000j')
705
706 # Alternate doesn't make a difference for these, they format the same with or without it
707 self.assertEqual(format(1+1j, '.1e'), '1.0e+00+1.0e+00j')
708 self.assertEqual(format(1+1j, '#.1e'), '1.0e+00+1.0e+00j')
709 self.assertEqual(format(1+1j, '.1f'), '1.0+1.0j')
710 self.assertEqual(format(1+1j, '#.1f'), '1.0+1.0j')
711
712 # Misc. other alternate tests
713 self.assertEqual(format((-1.5+0.5j), '#f'), '-1.500000+0.500000j')
714 self.assertEqual(format((-1.5+0.5j), '#.0f'), '-2.+0.j')
715 self.assertEqual(format((-1.5+0.5j), '#e'), '-1.500000e+00+5.000000e-01j')
716 self.assertEqual(format((-1.5+0.5j), '#.0e'), '-2.e+00+5.e-01j')
717 self.assertEqual(format((-1.5+0.5j), '#g'), '-1.50000+0.500000j')
718 self.assertEqual(format((-1.5+0.5j), '.0g'), '-2+0.5j')
719 self.assertEqual(format((-1.5+0.5j), '#.0g'), '-2.+0.5j')
Eric Smith58a42242009-04-30 01:00:33 +0000720
721 # zero padding is invalid
722 self.assertRaises(ValueError, (1.5+0.5j).__format__, '010f')
723
724 # '=' alignment is invalid
725 self.assertRaises(ValueError, (1.5+3j).__format__, '=20')
726
727 # integer presentation types are an error
728 for t in 'bcdoxX':
729 self.assertRaises(ValueError, (1.5+0.5j).__format__, t)
730
731 # make sure everything works in ''.format()
732 self.assertEqual('*{0:.3f}*'.format(3.14159+2.71828j), '*3.142+2.718j*')
Mark Dickinsonad476da2009-04-23 19:14:16 +0000733
Eric Smith741191f2009-05-06 13:08:15 +0000734 # issue 3382
735 self.assertEqual(format(complex(NAN, NAN), 'f'), 'nan+nanj')
736 self.assertEqual(format(complex(1, NAN), 'f'), '1.000000+nanj')
737 self.assertEqual(format(complex(NAN, 1), 'f'), 'nan+1.000000j')
738 self.assertEqual(format(complex(NAN, -1), 'f'), 'nan-1.000000j')
739 self.assertEqual(format(complex(NAN, NAN), 'F'), 'NAN+NANj')
740 self.assertEqual(format(complex(1, NAN), 'F'), '1.000000+NANj')
741 self.assertEqual(format(complex(NAN, 1), 'F'), 'NAN+1.000000j')
742 self.assertEqual(format(complex(NAN, -1), 'F'), 'NAN-1.000000j')
743 self.assertEqual(format(complex(INF, INF), 'f'), 'inf+infj')
744 self.assertEqual(format(complex(1, INF), 'f'), '1.000000+infj')
745 self.assertEqual(format(complex(INF, 1), 'f'), 'inf+1.000000j')
746 self.assertEqual(format(complex(INF, -1), 'f'), 'inf-1.000000j')
747 self.assertEqual(format(complex(INF, INF), 'F'), 'INF+INFj')
748 self.assertEqual(format(complex(1, INF), 'F'), '1.000000+INFj')
749 self.assertEqual(format(complex(INF, 1), 'F'), 'INF+1.000000j')
750 self.assertEqual(format(complex(INF, -1), 'F'), 'INF-1.000000j')
751
Walter Dörwald5edd7852003-06-18 14:26:18 +0000752def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000753 support.run_unittest(ComplexTest)
Walter Dörwald5edd7852003-06-18 14:26:18 +0000754
755if __name__ == "__main__":
756 test_main()