blob: ed8c886cb36066dd21ec73c93c37a59a2d417a19 [file] [log] [blame]
Walter Dörwalda0021592005-06-13 21:44:48 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003import sys
Walter Dörwalda0021592005-06-13 21:44:48 +00004
5import random
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00006import math
Walter Dörwalda0021592005-06-13 21:44:48 +00007
8# Used for lazy formatting of failure messages
9class Frm(object):
10 def __init__(self, format, *args):
11 self.format = format
12 self.args = args
13
14 def __str__(self):
15 return self.format % self.args
Guido van Rossum4365cab1998-08-13 14:20:17 +000016
17# SHIFT should match the value in longintrepr.h for best testing.
18SHIFT = 15
19BASE = 2 ** SHIFT
20MASK = BASE - 1
Tim Petersdaec9612004-08-30 23:18:23 +000021KARATSUBA_CUTOFF = 70 # from longobject.c
Guido van Rossum4365cab1998-08-13 14:20:17 +000022
23# Max number of base BASE digits to use in test cases. Doubling
Tim Peters28b0e2a2002-08-13 02:17:11 +000024# this will more than double the runtime.
25MAXDIGITS = 15
Guido van Rossum4365cab1998-08-13 14:20:17 +000026
Guido van Rossum4581a0c1998-10-02 01:19:48 +000027# build some special values
Guido van Rossumc1f779c2007-07-03 08:25:58 +000028special = [0, 1, 2, BASE, BASE >> 1, 0x5555555555555555, 0xaaaaaaaaaaaaaaaa]
Guido van Rossum4581a0c1998-10-02 01:19:48 +000029# some solid strings of one bits
Guido van Rossume2a383d2007-01-15 16:59:06 +000030p2 = 4 # 0 and 1 already added
Guido van Rossum4581a0c1998-10-02 01:19:48 +000031for i in range(2*SHIFT):
32 special.append(p2 - 1)
33 p2 = p2 << 1
34del p2
35# add complements & negations
Guido van Rossumc1f779c2007-07-03 08:25:58 +000036special += [~x for x in special] + [-x for x in special]
Guido van Rossum4581a0c1998-10-02 01:19:48 +000037
Christian Heimes81ee3ef2008-05-04 22:42:01 +000038L = [
39 ('0', 0),
40 ('1', 1),
41 ('9', 9),
42 ('10', 10),
43 ('99', 99),
44 ('100', 100),
45 ('314', 314),
46 (' 314', 314),
47 ('314 ', 314),
48 (' \t\t 314 \t\t ', 314),
49 (repr(sys.maxsize), sys.maxsize),
50 (' 1x', ValueError),
51 (' 1 ', 1),
52 (' 1\02 ', ValueError),
53 ('', ValueError),
54 (' ', ValueError),
55 (' \t\t ', ValueError)
56]
57
Guido van Rossum4365cab1998-08-13 14:20:17 +000058
Walter Dörwalda0021592005-06-13 21:44:48 +000059class LongTest(unittest.TestCase):
Guido van Rossum4365cab1998-08-13 14:20:17 +000060
Walter Dörwalda0021592005-06-13 21:44:48 +000061 # Get quasi-random long consisting of ndigits digits (in base BASE).
62 # quasi == the most-significant digit will not be 0, and the number
63 # is constructed to contain long strings of 0 and 1 bits. These are
64 # more likely than random bits to provoke digit-boundary errors.
65 # The sign of the number is also random.
Guido van Rossum4365cab1998-08-13 14:20:17 +000066
Walter Dörwalda0021592005-06-13 21:44:48 +000067 def getran(self, ndigits):
68 self.assert_(ndigits > 0)
69 nbits_hi = ndigits * SHIFT
70 nbits_lo = nbits_hi - SHIFT + 1
Guido van Rossume2a383d2007-01-15 16:59:06 +000071 answer = 0
Walter Dörwalda0021592005-06-13 21:44:48 +000072 nbits = 0
73 r = int(random.random() * (SHIFT * 2)) | 1 # force 1 bits to start
74 while nbits < nbits_lo:
75 bits = (r >> 1) + 1
76 bits = min(bits, nbits_hi - nbits)
77 self.assert_(1 <= bits <= SHIFT)
78 nbits = nbits + bits
79 answer = answer << bits
80 if r & 1:
81 answer = answer | ((1 << bits) - 1)
82 r = int(random.random() * (SHIFT * 2))
83 self.assert_(nbits_lo <= nbits <= nbits_hi)
84 if random.random() < 0.5:
85 answer = -answer
86 return answer
Guido van Rossum4581a0c1998-10-02 01:19:48 +000087
Walter Dörwalda0021592005-06-13 21:44:48 +000088 # Get random long consisting of ndigits random digits (relative to base
89 # BASE). The sign bit is also random.
Guido van Rossum4581a0c1998-10-02 01:19:48 +000090
Walter Dörwalda0021592005-06-13 21:44:48 +000091 def getran2(ndigits):
Guido van Rossume2a383d2007-01-15 16:59:06 +000092 answer = 0
Guido van Rossum805365e2007-05-07 22:24:25 +000093 for i in range(ndigits):
Walter Dörwalda0021592005-06-13 21:44:48 +000094 answer = (answer << SHIFT) | random.randint(0, MASK)
95 if random.random() < 0.5:
96 answer = -answer
97 return answer
Guido van Rossum4365cab1998-08-13 14:20:17 +000098
Walter Dörwalda0021592005-06-13 21:44:48 +000099 def check_division(self, x, y):
100 eq = self.assertEqual
101 q, r = divmod(x, y)
102 q2, r2 = x//y, x%y
103 pab, pba = x*y, y*x
104 eq(pab, pba, Frm("multiplication does not commute for %r and %r", x, y))
105 eq(q, q2, Frm("divmod returns different quotient than / for %r and %r", x, y))
106 eq(r, r2, Frm("divmod returns different mod than %% for %r and %r", x, y))
107 eq(x, q*y + r, Frm("x != q*y + r after divmod on x=%r, y=%r", x, y))
108 if y > 0:
109 self.assert_(0 <= r < y, Frm("bad mod from divmod on %r and %r", x, y))
110 else:
111 self.assert_(y < r <= 0, Frm("bad mod from divmod on %r and %r", x, y))
Guido van Rossum4365cab1998-08-13 14:20:17 +0000112
Walter Dörwalda0021592005-06-13 21:44:48 +0000113 def test_division(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000114 digits = list(range(1, MAXDIGITS+1)) + list(range(KARATSUBA_CUTOFF,
115 KARATSUBA_CUTOFF + 14))
Walter Dörwalda0021592005-06-13 21:44:48 +0000116 digits.append(KARATSUBA_CUTOFF * 3)
117 for lenx in digits:
118 x = self.getran(lenx)
119 for leny in digits:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000120 y = self.getran(leny) or 1
Walter Dörwalda0021592005-06-13 21:44:48 +0000121 self.check_division(x, y)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000122
Walter Dörwalda0021592005-06-13 21:44:48 +0000123 def test_karatsuba(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000124 digits = list(range(1, 5)) + list(range(KARATSUBA_CUTOFF,
125 KARATSUBA_CUTOFF + 10))
Walter Dörwalda0021592005-06-13 21:44:48 +0000126 digits.extend([KARATSUBA_CUTOFF * 10, KARATSUBA_CUTOFF * 100])
Guido van Rossum4365cab1998-08-13 14:20:17 +0000127
Walter Dörwalda0021592005-06-13 21:44:48 +0000128 bits = [digit * SHIFT for digit in digits]
Guido van Rossum4365cab1998-08-13 14:20:17 +0000129
Walter Dörwalda0021592005-06-13 21:44:48 +0000130 # Test products of long strings of 1 bits -- (2**x-1)*(2**y-1) ==
131 # 2**(x+y) - 2**x - 2**y + 1, so the proper result is easy to check.
132 for abits in bits:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000133 a = (1 << abits) - 1
Walter Dörwalda0021592005-06-13 21:44:48 +0000134 for bbits in bits:
135 if bbits < abits:
136 continue
Guido van Rossume2a383d2007-01-15 16:59:06 +0000137 b = (1 << bbits) - 1
Walter Dörwalda0021592005-06-13 21:44:48 +0000138 x = a * b
Guido van Rossume2a383d2007-01-15 16:59:06 +0000139 y = ((1 << (abits + bbits)) -
140 (1 << abits) -
141 (1 << bbits) +
Walter Dörwalda0021592005-06-13 21:44:48 +0000142 1)
143 self.assertEqual(x, y,
144 Frm("bad result for a*b: a=%r, b=%r, x=%r, y=%r", a, b, x, y))
Tim Peters7f270ba2002-08-13 21:06:55 +0000145
Walter Dörwalda0021592005-06-13 21:44:48 +0000146 def check_bitop_identities_1(self, x):
147 eq = self.assertEqual
148 eq(x & 0, 0, Frm("x & 0 != 0 for x=%r", x))
149 eq(x | 0, x, Frm("x | 0 != x for x=%r", x))
150 eq(x ^ 0, x, Frm("x ^ 0 != x for x=%r", x))
151 eq(x & -1, x, Frm("x & -1 != x for x=%r", x))
152 eq(x | -1, -1, Frm("x | -1 != -1 for x=%r", x))
153 eq(x ^ -1, ~x, Frm("x ^ -1 != ~x for x=%r", x))
154 eq(x, ~~x, Frm("x != ~~x for x=%r", x))
155 eq(x & x, x, Frm("x & x != x for x=%r", x))
156 eq(x | x, x, Frm("x | x != x for x=%r", x))
157 eq(x ^ x, 0, Frm("x ^ x != 0 for x=%r", x))
158 eq(x & ~x, 0, Frm("x & ~x != 0 for x=%r", x))
159 eq(x | ~x, -1, Frm("x | ~x != -1 for x=%r", x))
160 eq(x ^ ~x, -1, Frm("x ^ ~x != -1 for x=%r", x))
161 eq(-x, 1 + ~x, Frm("not -x == 1 + ~x for x=%r", x))
162 eq(-x, ~(x-1), Frm("not -x == ~(x-1) forx =%r", x))
Guido van Rossum805365e2007-05-07 22:24:25 +0000163 for n in range(2*SHIFT):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000164 p2 = 2 ** n
Walter Dörwalda0021592005-06-13 21:44:48 +0000165 eq(x << n >> n, x,
166 Frm("x << n >> n != x for x=%r, n=%r", (x, n)))
167 eq(x // p2, x >> n,
168 Frm("x // p2 != x >> n for x=%r n=%r p2=%r", (x, n, p2)))
169 eq(x * p2, x << n,
170 Frm("x * p2 != x << n for x=%r n=%r p2=%r", (x, n, p2)))
171 eq(x & -p2, x >> n << n,
172 Frm("not x & -p2 == x >> n << n for x=%r n=%r p2=%r", (x, n, p2)))
173 eq(x & -p2, x & ~(p2 - 1),
174 Frm("not x & -p2 == x & ~(p2 - 1) for x=%r n=%r p2=%r", (x, n, p2)))
Tim Peters7f270ba2002-08-13 21:06:55 +0000175
Walter Dörwalda0021592005-06-13 21:44:48 +0000176 def check_bitop_identities_2(self, x, y):
177 eq = self.assertEqual
178 eq(x & y, y & x, Frm("x & y != y & x for x=%r, y=%r", (x, y)))
179 eq(x | y, y | x, Frm("x | y != y | x for x=%r, y=%r", (x, y)))
180 eq(x ^ y, y ^ x, Frm("x ^ y != y ^ x for x=%r, y=%r", (x, y)))
181 eq(x ^ y ^ x, y, Frm("x ^ y ^ x != y for x=%r, y=%r", (x, y)))
182 eq(x & y, ~(~x | ~y), Frm("x & y != ~(~x | ~y) for x=%r, y=%r", (x, y)))
183 eq(x | y, ~(~x & ~y), Frm("x | y != ~(~x & ~y) for x=%r, y=%r", (x, y)))
184 eq(x ^ y, (x | y) & ~(x & y),
185 Frm("x ^ y != (x | y) & ~(x & y) for x=%r, y=%r", (x, y)))
186 eq(x ^ y, (x & ~y) | (~x & y),
187 Frm("x ^ y == (x & ~y) | (~x & y) for x=%r, y=%r", (x, y)))
188 eq(x ^ y, (x | y) & (~x | ~y),
189 Frm("x ^ y == (x | y) & (~x | ~y) for x=%r, y=%r", (x, y)))
Tim Peters7f270ba2002-08-13 21:06:55 +0000190
Walter Dörwalda0021592005-06-13 21:44:48 +0000191 def check_bitop_identities_3(self, x, y, z):
192 eq = self.assertEqual
193 eq((x & y) & z, x & (y & z),
194 Frm("(x & y) & z != x & (y & z) for x=%r, y=%r, z=%r", (x, y, z)))
195 eq((x | y) | z, x | (y | z),
196 Frm("(x | y) | z != x | (y | z) for x=%r, y=%r, z=%r", (x, y, z)))
197 eq((x ^ y) ^ z, x ^ (y ^ z),
198 Frm("(x ^ y) ^ z != x ^ (y ^ z) for x=%r, y=%r, z=%r", (x, y, z)))
199 eq(x & (y | z), (x & y) | (x & z),
200 Frm("x & (y | z) != (x & y) | (x & z) for x=%r, y=%r, z=%r", (x, y, z)))
201 eq(x | (y & z), (x | y) & (x | z),
202 Frm("x | (y & z) != (x | y) & (x | z) for x=%r, y=%r, z=%r", (x, y, z)))
Tim Peters7f270ba2002-08-13 21:06:55 +0000203
Walter Dörwalda0021592005-06-13 21:44:48 +0000204 def test_bitop_identities(self):
205 for x in special:
206 self.check_bitop_identities_1(x)
Guido van Rossum805365e2007-05-07 22:24:25 +0000207 digits = range(1, MAXDIGITS+1)
Walter Dörwalda0021592005-06-13 21:44:48 +0000208 for lenx in digits:
209 x = self.getran(lenx)
210 self.check_bitop_identities_1(x)
211 for leny in digits:
212 y = self.getran(leny)
213 self.check_bitop_identities_2(x, y)
214 self.check_bitop_identities_3(x, y, self.getran((lenx + leny)//2))
Guido van Rossum4365cab1998-08-13 14:20:17 +0000215
Walter Dörwalda0021592005-06-13 21:44:48 +0000216 def slow_format(self, x, base):
Walter Dörwalda0021592005-06-13 21:44:48 +0000217 digits = []
218 sign = 0
219 if x < 0:
220 sign, x = 1, -x
221 while x:
222 x, r = divmod(x, base)
223 digits.append(int(r))
224 digits.reverse()
225 digits = digits or [0]
226 return '-'[:sign] + \
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000227 {2: '0b', 8: '0o', 10: '', 16: '0x'}[base] + \
Guido van Rossumd2dbecb2006-08-18 16:29:54 +0000228 "".join(map(lambda i: "0123456789abcdef"[i], digits))
Guido van Rossum4365cab1998-08-13 14:20:17 +0000229
Walter Dörwalda0021592005-06-13 21:44:48 +0000230 def check_format_1(self, x):
231 for base, mapper in (8, oct), (10, repr), (16, hex):
232 got = mapper(x)
233 expected = self.slow_format(x, base)
234 msg = Frm("%s returned %r but expected %r for %r",
235 mapper.__name__, got, expected, x)
236 self.assertEqual(got, expected, msg)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000237 self.assertEqual(int(got, 0), x, Frm('long("%s", 0) != %r', got, x))
Walter Dörwalda0021592005-06-13 21:44:48 +0000238 # str() has to be checked a little differently since there's no
239 # trailing "L"
240 got = str(x)
Guido van Rossumd2dbecb2006-08-18 16:29:54 +0000241 expected = self.slow_format(x, 10)
Walter Dörwalda0021592005-06-13 21:44:48 +0000242 msg = Frm("%s returned %r but expected %r for %r",
243 mapper.__name__, got, expected, x)
244 self.assertEqual(got, expected, msg)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000245
Walter Dörwalda0021592005-06-13 21:44:48 +0000246 def test_format(self):
247 for x in special:
248 self.check_format_1(x)
Guido van Rossum805365e2007-05-07 22:24:25 +0000249 for i in range(10):
250 for lenx in range(1, MAXDIGITS+1):
Walter Dörwalda0021592005-06-13 21:44:48 +0000251 x = self.getran(lenx)
252 self.check_format_1(x)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000253
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000254 def test_long(self):
255 self.assertEqual(int(314), 314)
256 self.assertEqual(int(3.14), 3)
257 self.assertEqual(int(314), 314)
258 # Check that conversion from float truncates towards zero
259 self.assertEqual(int(-3.14), -3)
260 self.assertEqual(int(3.9), 3)
261 self.assertEqual(int(-3.9), -3)
262 self.assertEqual(int(3.5), 3)
263 self.assertEqual(int(-3.5), -3)
264 self.assertEqual(int("-3"), -3)
265 # Different base:
266 self.assertEqual(int("10",16), 16)
267 # Check conversions from string (same test set as for int(), and then some)
268 LL = [
269 ('1' + '0'*20, 10**20),
270 ('1' + '0'*100, 10**100)
271 ]
272 L2 = L[:]
273 for s, v in L2 + LL:
274 for sign in "", "+", "-":
275 for prefix in "", " ", "\t", " \t\t ":
276 ss = prefix + sign + s
277 vv = v
278 if sign == "-" and v is not ValueError:
279 vv = -v
280 try:
281 self.assertEqual(int(ss), int(vv))
282 except ValueError:
283 pass
284
285 self.assertRaises(ValueError, int, '123\0')
286 self.assertRaises(ValueError, int, '53', 40)
287 self.assertRaises(TypeError, int, 1, 12)
288
289 # SF patch #1638879: embedded NULs were not detected with
290 # explicit base
291 self.assertRaises(ValueError, int, '123\0', 10)
292 self.assertRaises(ValueError, int, '123\x00 245', 20)
293
294 self.assertEqual(int('100000000000000000000000000000000', 2),
295 4294967296)
296 self.assertEqual(int('102002022201221111211', 3), 4294967296)
297 self.assertEqual(int('10000000000000000', 4), 4294967296)
298 self.assertEqual(int('32244002423141', 5), 4294967296)
299 self.assertEqual(int('1550104015504', 6), 4294967296)
300 self.assertEqual(int('211301422354', 7), 4294967296)
301 self.assertEqual(int('40000000000', 8), 4294967296)
302 self.assertEqual(int('12068657454', 9), 4294967296)
303 self.assertEqual(int('4294967296', 10), 4294967296)
304 self.assertEqual(int('1904440554', 11), 4294967296)
305 self.assertEqual(int('9ba461594', 12), 4294967296)
306 self.assertEqual(int('535a79889', 13), 4294967296)
307 self.assertEqual(int('2ca5b7464', 14), 4294967296)
308 self.assertEqual(int('1a20dcd81', 15), 4294967296)
309 self.assertEqual(int('100000000', 16), 4294967296)
310 self.assertEqual(int('a7ffda91', 17), 4294967296)
311 self.assertEqual(int('704he7g4', 18), 4294967296)
312 self.assertEqual(int('4f5aff66', 19), 4294967296)
313 self.assertEqual(int('3723ai4g', 20), 4294967296)
314 self.assertEqual(int('281d55i4', 21), 4294967296)
315 self.assertEqual(int('1fj8b184', 22), 4294967296)
316 self.assertEqual(int('1606k7ic', 23), 4294967296)
317 self.assertEqual(int('mb994ag', 24), 4294967296)
318 self.assertEqual(int('hek2mgl', 25), 4294967296)
319 self.assertEqual(int('dnchbnm', 26), 4294967296)
320 self.assertEqual(int('b28jpdm', 27), 4294967296)
321 self.assertEqual(int('8pfgih4', 28), 4294967296)
322 self.assertEqual(int('76beigg', 29), 4294967296)
323 self.assertEqual(int('5qmcpqg', 30), 4294967296)
324 self.assertEqual(int('4q0jto4', 31), 4294967296)
325 self.assertEqual(int('4000000', 32), 4294967296)
326 self.assertEqual(int('3aokq94', 33), 4294967296)
327 self.assertEqual(int('2qhxjli', 34), 4294967296)
328 self.assertEqual(int('2br45qb', 35), 4294967296)
329 self.assertEqual(int('1z141z4', 36), 4294967296)
330
331 self.assertEqual(int('100000000000000000000000000000001', 2),
332 4294967297)
333 self.assertEqual(int('102002022201221111212', 3), 4294967297)
334 self.assertEqual(int('10000000000000001', 4), 4294967297)
335 self.assertEqual(int('32244002423142', 5), 4294967297)
336 self.assertEqual(int('1550104015505', 6), 4294967297)
337 self.assertEqual(int('211301422355', 7), 4294967297)
338 self.assertEqual(int('40000000001', 8), 4294967297)
339 self.assertEqual(int('12068657455', 9), 4294967297)
340 self.assertEqual(int('4294967297', 10), 4294967297)
341 self.assertEqual(int('1904440555', 11), 4294967297)
342 self.assertEqual(int('9ba461595', 12), 4294967297)
343 self.assertEqual(int('535a7988a', 13), 4294967297)
344 self.assertEqual(int('2ca5b7465', 14), 4294967297)
345 self.assertEqual(int('1a20dcd82', 15), 4294967297)
346 self.assertEqual(int('100000001', 16), 4294967297)
347 self.assertEqual(int('a7ffda92', 17), 4294967297)
348 self.assertEqual(int('704he7g5', 18), 4294967297)
349 self.assertEqual(int('4f5aff67', 19), 4294967297)
350 self.assertEqual(int('3723ai4h', 20), 4294967297)
351 self.assertEqual(int('281d55i5', 21), 4294967297)
352 self.assertEqual(int('1fj8b185', 22), 4294967297)
353 self.assertEqual(int('1606k7id', 23), 4294967297)
354 self.assertEqual(int('mb994ah', 24), 4294967297)
355 self.assertEqual(int('hek2mgm', 25), 4294967297)
356 self.assertEqual(int('dnchbnn', 26), 4294967297)
357 self.assertEqual(int('b28jpdn', 27), 4294967297)
358 self.assertEqual(int('8pfgih5', 28), 4294967297)
359 self.assertEqual(int('76beigh', 29), 4294967297)
360 self.assertEqual(int('5qmcpqh', 30), 4294967297)
361 self.assertEqual(int('4q0jto5', 31), 4294967297)
362 self.assertEqual(int('4000001', 32), 4294967297)
363 self.assertEqual(int('3aokq95', 33), 4294967297)
364 self.assertEqual(int('2qhxjlj', 34), 4294967297)
365 self.assertEqual(int('2br45qc', 35), 4294967297)
366 self.assertEqual(int('1z141z5', 36), 4294967297)
367
368
369 def test_conversion(self):
Mark Dickinsone5e298f2009-01-12 20:49:19 +0000370 # Test __int__()
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000371 class ClassicMissingMethods:
372 pass
373 self.assertRaises(TypeError, int, ClassicMissingMethods())
374
375 class MissingMethods(object):
376 pass
377 self.assertRaises(TypeError, int, MissingMethods())
378
379 class Foo0:
380 def __int__(self):
381 return 42
382
383 class Foo1(object):
384 def __int__(self):
385 return 42
386
387 class Foo2(int):
388 def __int__(self):
389 return 42
390
391 class Foo3(int):
392 def __int__(self):
393 return self
394
395 class Foo4(int):
396 def __int__(self):
397 return 42
398
399 class Foo5(int):
400 def __int__(self):
401 return 42.
402
403 self.assertEqual(int(Foo0()), 42)
404 self.assertEqual(int(Foo1()), 42)
405 self.assertEqual(int(Foo2()), 42)
406 self.assertEqual(int(Foo3()), 0)
407 self.assertEqual(int(Foo4()), 42)
408 self.assertRaises(TypeError, int, Foo5())
409
410 class Classic:
411 pass
412 for base in (object, Classic):
Mark Dickinsone5e298f2009-01-12 20:49:19 +0000413 class IntOverridesTrunc(base):
414 def __int__(self):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000415 return 42
416 def __trunc__(self):
417 return -12
Mark Dickinsone5e298f2009-01-12 20:49:19 +0000418 self.assertEqual(int(IntOverridesTrunc()), 42)
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000419
420 class JustTrunc(base):
421 def __trunc__(self):
422 return 42
423 self.assertEqual(int(JustTrunc()), 42)
424
Mark Dickinsone5e298f2009-01-12 20:49:19 +0000425 class JustLong(base):
426 # test that __long__ no longer used in 3.x
427 def __long__(self):
428 return 42
429 self.assertRaises(TypeError, int, JustLong())
430
431 class LongTrunc(base):
432 # __long__ should be ignored in 3.x
433 def __long__(self):
434 return 42
435 def __trunc__(self):
436 return 1729
437 self.assertEqual(int(LongTrunc()), 1729)
438
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000439 for trunc_result_base in (object, Classic):
440 class Integral(trunc_result_base):
441 def __int__(self):
442 return 42
443
444 class TruncReturnsNonLong(base):
445 def __trunc__(self):
446 return Integral()
447 self.assertEqual(int(TruncReturnsNonLong()), 42)
448
449 class NonIntegral(trunc_result_base):
450 def __trunc__(self):
451 # Check that we avoid infinite recursion.
452 return NonIntegral()
453
454 class TruncReturnsNonIntegral(base):
455 def __trunc__(self):
456 return NonIntegral()
457 try:
458 int(TruncReturnsNonIntegral())
459 except TypeError as e:
460 self.assertEquals(str(e),
461 "__trunc__ returned non-Integral"
462 " (type NonIntegral)")
463 else:
464 self.fail("Failed to raise TypeError with %s" %
465 ((base, trunc_result_base),))
466
Walter Dörwalda0021592005-06-13 21:44:48 +0000467 def test_misc(self):
Guido van Rossum4365cab1998-08-13 14:20:17 +0000468
Walter Dörwalda0021592005-06-13 21:44:48 +0000469 # check the extremes in int<->long conversion
Christian Heimesa37d4c62007-12-04 23:02:19 +0000470 hugepos = sys.maxsize
Walter Dörwalda0021592005-06-13 21:44:48 +0000471 hugeneg = -hugepos - 1
Guido van Rossume2a383d2007-01-15 16:59:06 +0000472 hugepos_aslong = int(hugepos)
473 hugeneg_aslong = int(hugeneg)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000474 self.assertEqual(hugepos, hugepos_aslong, "long(sys.maxsize) != sys.maxsize")
Walter Dörwalda0021592005-06-13 21:44:48 +0000475 self.assertEqual(hugeneg, hugeneg_aslong,
Christian Heimesa37d4c62007-12-04 23:02:19 +0000476 "long(-sys.maxsize-1) != -sys.maxsize-1")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000477
Walter Dörwalda0021592005-06-13 21:44:48 +0000478 # long -> int should not fail for hugepos_aslong or hugeneg_aslong
Thomas Wouters89f507f2006-12-13 04:49:30 +0000479 x = int(hugepos_aslong)
Walter Dörwalda0021592005-06-13 21:44:48 +0000480 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000481 self.assertEqual(x, hugepos,
Christian Heimesa37d4c62007-12-04 23:02:19 +0000482 "converting sys.maxsize to long and back to int fails")
Walter Dörwalda0021592005-06-13 21:44:48 +0000483 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000484 self.fail("int(long(sys.maxsize)) overflowed!")
Thomas Wouters89f507f2006-12-13 04:49:30 +0000485 if not isinstance(x, int):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000486 raise TestFailed("int(long(sys.maxsize)) should have returned int")
Thomas Wouters89f507f2006-12-13 04:49:30 +0000487 x = int(hugeneg_aslong)
Walter Dörwalda0021592005-06-13 21:44:48 +0000488 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000489 self.assertEqual(x, hugeneg,
Christian Heimesa37d4c62007-12-04 23:02:19 +0000490 "converting -sys.maxsize-1 to long and back to int fails")
Walter Dörwalda0021592005-06-13 21:44:48 +0000491 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000492 self.fail("int(long(-sys.maxsize-1)) overflowed!")
Thomas Wouters89f507f2006-12-13 04:49:30 +0000493 if not isinstance(x, int):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000494 raise TestFailed("int(long(-sys.maxsize-1)) should have "
Thomas Wouters89f507f2006-12-13 04:49:30 +0000495 "returned int")
Walter Dörwalda0021592005-06-13 21:44:48 +0000496 # but long -> int should overflow for hugepos+1 and hugeneg-1
497 x = hugepos_aslong + 1
498 try:
499 y = int(x)
500 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000501 self.fail("int(long(sys.maxsize) + 1) mustn't overflow")
Guido van Rossume2a383d2007-01-15 16:59:06 +0000502 self.assert_(isinstance(y, int),
Christian Heimesa37d4c62007-12-04 23:02:19 +0000503 "int(long(sys.maxsize) + 1) should have returned long")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000504
Walter Dörwalda0021592005-06-13 21:44:48 +0000505 x = hugeneg_aslong - 1
506 try:
507 y = int(x)
508 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000509 self.fail("int(long(-sys.maxsize-1) - 1) mustn't overflow")
Guido van Rossume2a383d2007-01-15 16:59:06 +0000510 self.assert_(isinstance(y, int),
Christian Heimesa37d4c62007-12-04 23:02:19 +0000511 "int(long(-sys.maxsize-1) - 1) should have returned long")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000512
Guido van Rossume2a383d2007-01-15 16:59:06 +0000513 class long2(int):
Walter Dörwalda0021592005-06-13 21:44:48 +0000514 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +0000515 x = long2(1<<100)
Walter Dörwaldf1715402002-11-19 20:49:15 +0000516 y = int(x)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000517 self.assert_(type(y) is int,
Walter Dörwalda0021592005-06-13 21:44:48 +0000518 "overflowing int conversion must return long not long subtype")
Guido van Rossum4581a0c1998-10-02 01:19:48 +0000519
Tim Peters26c7fa32001-08-23 22:56:21 +0000520# ----------------------------------- tests of auto int->long conversion
521
Walter Dörwalda0021592005-06-13 21:44:48 +0000522 def test_auto_overflow(self):
523 import math, sys
Tim Peters26c7fa32001-08-23 22:56:21 +0000524
Christian Heimesa37d4c62007-12-04 23:02:19 +0000525 special = [0, 1, 2, 3, sys.maxsize-1, sys.maxsize, sys.maxsize+1]
526 sqrt = int(math.sqrt(sys.maxsize))
Walter Dörwalda0021592005-06-13 21:44:48 +0000527 special.extend([sqrt-1, sqrt, sqrt+1])
528 special.extend([-i for i in special])
Tim Peters26c7fa32001-08-23 22:56:21 +0000529
Walter Dörwalda0021592005-06-13 21:44:48 +0000530 def checkit(*args):
531 # Heavy use of nested scopes here!
532 self.assertEqual(got, expected,
533 Frm("for %r expected %r got %r", args, expected, got))
Tim Peters26c7fa32001-08-23 22:56:21 +0000534
Walter Dörwalda0021592005-06-13 21:44:48 +0000535 for x in special:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000536 longx = int(x)
Tim Peters26c7fa32001-08-23 22:56:21 +0000537
Walter Dörwalda0021592005-06-13 21:44:48 +0000538 expected = -longx
539 got = -x
540 checkit('-', x)
Tim Peters26c7fa32001-08-23 22:56:21 +0000541
Walter Dörwalda0021592005-06-13 21:44:48 +0000542 for y in special:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000543 longy = int(y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000544
Walter Dörwalda0021592005-06-13 21:44:48 +0000545 expected = longx + longy
546 got = x + y
547 checkit(x, '+', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000548
Walter Dörwalda0021592005-06-13 21:44:48 +0000549 expected = longx - longy
550 got = x - y
551 checkit(x, '-', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000552
Walter Dörwalda0021592005-06-13 21:44:48 +0000553 expected = longx * longy
554 got = x * y
555 checkit(x, '*', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000556
Walter Dörwalda0021592005-06-13 21:44:48 +0000557 if y:
558 expected = longx / longy
559 got = x / y
560 checkit(x, '/', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000561
Walter Dörwalda0021592005-06-13 21:44:48 +0000562 expected = longx // longy
563 got = x // y
564 checkit(x, '//', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000565
Walter Dörwalda0021592005-06-13 21:44:48 +0000566 expected = divmod(longx, longy)
567 got = divmod(longx, longy)
568 checkit(x, 'divmod', y)
Tim Petersa3653092001-08-23 23:02:57 +0000569
Walter Dörwalda0021592005-06-13 21:44:48 +0000570 if abs(y) < 5 and not (x == 0 and y < 0):
571 expected = longx ** longy
572 got = x ** y
573 checkit(x, '**', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000574
Walter Dörwalda0021592005-06-13 21:44:48 +0000575 for z in special:
576 if z != 0 :
577 if y >= 0:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000578 expected = pow(longx, longy, int(z))
Walter Dörwalda0021592005-06-13 21:44:48 +0000579 got = pow(x, y, z)
580 checkit('pow', x, y, '%', z)
Tim Peters32f453e2001-09-03 08:35:41 +0000581 else:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000582 self.assertRaises(TypeError, pow,longx, longy, int(z))
Tim Peters26c7fa32001-08-23 22:56:21 +0000583
Walter Dörwalda0021592005-06-13 21:44:48 +0000584 def test_float_overflow(self):
585 import math
Tim Peters9fffa3e2001-09-04 05:14:19 +0000586
Walter Dörwalda0021592005-06-13 21:44:48 +0000587 for x in -2.0, -1.0, 0.0, 1.0, 2.0:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000588 self.assertEqual(float(int(x)), x)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000589
Walter Dörwalda0021592005-06-13 21:44:48 +0000590 shuge = '12345' * 120
Guido van Rossume2a383d2007-01-15 16:59:06 +0000591 huge = 1 << 30000
Walter Dörwalda0021592005-06-13 21:44:48 +0000592 mhuge = -huge
593 namespace = {'huge': huge, 'mhuge': mhuge, 'shuge': shuge, 'math': math}
594 for test in ["float(huge)", "float(mhuge)",
595 "complex(huge)", "complex(mhuge)",
596 "complex(huge, 1)", "complex(mhuge, 1)",
597 "complex(1, huge)", "complex(1, mhuge)",
598 "1. + huge", "huge + 1.", "1. + mhuge", "mhuge + 1.",
599 "1. - huge", "huge - 1.", "1. - mhuge", "mhuge - 1.",
600 "1. * huge", "huge * 1.", "1. * mhuge", "mhuge * 1.",
601 "1. // huge", "huge // 1.", "1. // mhuge", "mhuge // 1.",
602 "1. / huge", "huge / 1.", "1. / mhuge", "mhuge / 1.",
603 "1. ** huge", "huge ** 1.", "1. ** mhuge", "mhuge ** 1.",
604 "math.sin(huge)", "math.sin(mhuge)",
605 "math.sqrt(huge)", "math.sqrt(mhuge)", # should do better
Guido van Rossum28bbe422007-08-24 03:46:30 +0000606 # math.floor() of an int returns an int now
607 ##"math.floor(huge)", "math.floor(mhuge)",
608 ]:
Tim Peters9fffa3e2001-09-04 05:14:19 +0000609
Walter Dörwalda0021592005-06-13 21:44:48 +0000610 self.assertRaises(OverflowError, eval, test, namespace)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000611
Walter Dörwalda0021592005-06-13 21:44:48 +0000612 # XXX Perhaps float(shuge) can raise OverflowError on some box?
613 # The comparison should not.
614 self.assertNotEqual(float(shuge), int(shuge),
615 "float(shuge) should not equal int(shuge)")
Tim Peters83e7ccc2001-09-04 06:37:28 +0000616
Walter Dörwalda0021592005-06-13 21:44:48 +0000617 def test_logs(self):
618 import math
Tim Peters78526162001-09-05 00:53:45 +0000619
Walter Dörwalda0021592005-06-13 21:44:48 +0000620 LOG10E = math.log10(math.e)
Tim Peters307fa782004-09-23 08:06:40 +0000621
Guido van Rossum805365e2007-05-07 22:24:25 +0000622 for exp in list(range(10)) + [100, 1000, 10000]:
Walter Dörwalda0021592005-06-13 21:44:48 +0000623 value = 10 ** exp
624 log10 = math.log10(value)
625 self.assertAlmostEqual(log10, exp)
Tim Peters78526162001-09-05 00:53:45 +0000626
Walter Dörwalda0021592005-06-13 21:44:48 +0000627 # log10(value) == exp, so log(value) == log10(value)/log10(e) ==
628 # exp/LOG10E
629 expected = exp / LOG10E
630 log = math.log(value)
631 self.assertAlmostEqual(log, expected)
Tim Peters78526162001-09-05 00:53:45 +0000632
Guido van Rossume2a383d2007-01-15 16:59:06 +0000633 for bad in -(1 << 10000), -2, 0:
Walter Dörwalda0021592005-06-13 21:44:48 +0000634 self.assertRaises(ValueError, math.log, bad)
635 self.assertRaises(ValueError, math.log10, bad)
Tim Peters78526162001-09-05 00:53:45 +0000636
Walter Dörwalda0021592005-06-13 21:44:48 +0000637 def test_mixed_compares(self):
638 eq = self.assertEqual
639 import math
Tim Peters78526162001-09-05 00:53:45 +0000640
Walter Dörwalda0021592005-06-13 21:44:48 +0000641 # We're mostly concerned with that mixing floats and longs does the
642 # right stuff, even when longs are too large to fit in a float.
643 # The safest way to check the results is to use an entirely different
644 # method, which we do here via a skeletal rational class (which
645 # represents all Python ints, longs and floats exactly).
646 class Rat:
647 def __init__(self, value):
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000648 if isinstance(value, int):
Walter Dörwalda0021592005-06-13 21:44:48 +0000649 self.n = value
650 self.d = 1
651 elif isinstance(value, float):
652 # Convert to exact rational equivalent.
653 f, e = math.frexp(abs(value))
654 assert f == 0 or 0.5 <= f < 1.0
655 # |value| = f * 2**e exactly
Tim Peters78526162001-09-05 00:53:45 +0000656
Walter Dörwalda0021592005-06-13 21:44:48 +0000657 # Suck up CHUNK bits at a time; 28 is enough so that we suck
658 # up all bits in 2 iterations for all known binary double-
659 # precision formats, and small enough to fit in an int.
660 CHUNK = 28
661 top = 0
662 # invariant: |value| = (top + f) * 2**e exactly
663 while f:
664 f = math.ldexp(f, CHUNK)
665 digit = int(f)
666 assert digit >> CHUNK == 0
667 top = (top << CHUNK) | digit
668 f -= digit
669 assert 0.0 <= f < 1.0
670 e -= CHUNK
Tim Peters78526162001-09-05 00:53:45 +0000671
Walter Dörwalda0021592005-06-13 21:44:48 +0000672 # Now |value| = top * 2**e exactly.
673 if e >= 0:
674 n = top << e
675 d = 1
676 else:
677 n = top
678 d = 1 << -e
679 if value < 0:
680 n = -n
681 self.n = n
682 self.d = d
683 assert float(n) / float(d) == value
Tim Peters307fa782004-09-23 08:06:40 +0000684 else:
Walter Dörwalda0021592005-06-13 21:44:48 +0000685 raise TypeError("can't deal with %r" % val)
Tim Peters307fa782004-09-23 08:06:40 +0000686
Benjamin Peterson60192082008-10-16 19:34:46 +0000687 def _cmp__(self, other):
Walter Dörwalda0021592005-06-13 21:44:48 +0000688 if not isinstance(other, Rat):
689 other = Rat(other)
690 return cmp(self.n * other.d, self.d * other.n)
Benjamin Peterson60192082008-10-16 19:34:46 +0000691 def __eq__(self, other):
692 return self._cmp__(other) == 0
693 def __ne__(self, other):
694 return self._cmp__(other) != 0
695 def __ge__(self, other):
696 return self._cmp__(other) >= 0
697 def __gt__(self, other):
698 return self._cmp__(other) > 0
699 def __le__(self, other):
700 return self._cmp__(other) <= 0
701 def __lt__(self, other):
702 return self._cmp__(other) < 0
Tim Peters307fa782004-09-23 08:06:40 +0000703
Walter Dörwalda0021592005-06-13 21:44:48 +0000704 cases = [0, 0.001, 0.99, 1.0, 1.5, 1e20, 1e200]
705 # 2**48 is an important boundary in the internals. 2**53 is an
706 # important boundary for IEEE double precision.
707 for t in 2.0**48, 2.0**50, 2.0**53:
708 cases.extend([t - 1.0, t - 0.3, t, t + 0.3, t + 1.0,
Guido van Rossume2a383d2007-01-15 16:59:06 +0000709 int(t-1), int(t), int(t+1)])
Christian Heimesa37d4c62007-12-04 23:02:19 +0000710 cases.extend([0, 1, 2, sys.maxsize, float(sys.maxsize)])
Walter Dörwalda0021592005-06-13 21:44:48 +0000711 # 1L<<20000 should exceed all double formats. long(1e200) is to
712 # check that we get equality with 1e200 above.
Guido van Rossume2a383d2007-01-15 16:59:06 +0000713 t = int(1e200)
714 cases.extend([0, 1, 2, 1 << 20000, t-1, t, t+1])
Walter Dörwalda0021592005-06-13 21:44:48 +0000715 cases.extend([-x for x in cases])
716 for x in cases:
717 Rx = Rat(x)
718 for y in cases:
719 Ry = Rat(y)
720 Rcmp = cmp(Rx, Ry)
721 xycmp = cmp(x, y)
722 eq(Rcmp, xycmp, Frm("%r %r %d %d", x, y, Rcmp, xycmp))
723 eq(x == y, Rcmp == 0, Frm("%r == %r %d", x, y, Rcmp))
724 eq(x != y, Rcmp != 0, Frm("%r != %r %d", x, y, Rcmp))
725 eq(x < y, Rcmp < 0, Frm("%r < %r %d", x, y, Rcmp))
726 eq(x <= y, Rcmp <= 0, Frm("%r <= %r %d", x, y, Rcmp))
727 eq(x > y, Rcmp > 0, Frm("%r > %r %d", x, y, Rcmp))
728 eq(x >= y, Rcmp >= 0, Frm("%r >= %r %d", x, y, Rcmp))
Tim Peters307fa782004-09-23 08:06:40 +0000729
Eric Smith0dd1b632008-02-11 17:55:01 +0000730 def test__format__(self):
Eric Smith8c663262007-08-25 02:26:07 +0000731 self.assertEqual(format(123456789, 'd'), '123456789')
732 self.assertEqual(format(123456789, 'd'), '123456789')
733
Eric Smith185e30c2007-08-30 22:23:08 +0000734 # sign and aligning are interdependent
735 self.assertEqual(format(1, "-"), '1')
736 self.assertEqual(format(-1, "-"), '-1')
737 self.assertEqual(format(1, "-3"), ' 1')
738 self.assertEqual(format(-1, "-3"), ' -1')
739 self.assertEqual(format(1, "+3"), ' +1')
740 self.assertEqual(format(-1, "+3"), ' -1')
741 self.assertEqual(format(1, " 3"), ' 1')
742 self.assertEqual(format(-1, " 3"), ' -1')
743 self.assertEqual(format(1, " "), ' 1')
744 self.assertEqual(format(-1, " "), '-1')
745
Eric Smith8c663262007-08-25 02:26:07 +0000746 # hex
747 self.assertEqual(format(3, "x"), "3")
748 self.assertEqual(format(3, "X"), "3")
749 self.assertEqual(format(1234, "x"), "4d2")
750 self.assertEqual(format(-1234, "x"), "-4d2")
751 self.assertEqual(format(1234, "8x"), " 4d2")
Eric Smith185e30c2007-08-30 22:23:08 +0000752 self.assertEqual(format(-1234, "8x"), " -4d2")
Eric Smith8c663262007-08-25 02:26:07 +0000753 self.assertEqual(format(1234, "x"), "4d2")
754 self.assertEqual(format(-1234, "x"), "-4d2")
755 self.assertEqual(format(-3, "x"), "-3")
756 self.assertEqual(format(-3, "X"), "-3")
757 self.assertEqual(format(int('be', 16), "x"), "be")
758 self.assertEqual(format(int('be', 16), "X"), "BE")
759 self.assertEqual(format(-int('be', 16), "x"), "-be")
760 self.assertEqual(format(-int('be', 16), "X"), "-BE")
761
762 # octal
763 self.assertEqual(format(3, "b"), "11")
764 self.assertEqual(format(-3, "b"), "-11")
765 self.assertEqual(format(1234, "b"), "10011010010")
766 self.assertEqual(format(-1234, "b"), "-10011010010")
767 self.assertEqual(format(1234, "-b"), "10011010010")
768 self.assertEqual(format(-1234, "-b"), "-10011010010")
769 self.assertEqual(format(1234, " b"), " 10011010010")
770 self.assertEqual(format(-1234, " b"), "-10011010010")
771 self.assertEqual(format(1234, "+b"), "+10011010010")
772 self.assertEqual(format(-1234, "+b"), "-10011010010")
773
Eric Smith8c663262007-08-25 02:26:07 +0000774 # make sure these are errors
775 self.assertRaises(ValueError, format, 3, "1.3") # precision disallowed
Eric Smith8c663262007-08-25 02:26:07 +0000776 self.assertRaises(ValueError, format, 3, "+c") # sign not allowed
777 # with 'c'
Eric Smithfa767ef2008-01-28 10:59:27 +0000778
779 # ensure that only int and float type specifiers work
Eric Smith7b69c6c2008-01-27 21:07:59 +0000780 for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] +
781 [chr(x) for x in range(ord('A'), ord('Z')+1)]):
Eric Smithfa767ef2008-01-28 10:59:27 +0000782 if not format_spec in 'bcdoxXeEfFgGn%':
Eric Smith7b69c6c2008-01-27 21:07:59 +0000783 self.assertRaises(ValueError, format, 0, format_spec)
784 self.assertRaises(ValueError, format, 1, format_spec)
785 self.assertRaises(ValueError, format, -1, format_spec)
786 self.assertRaises(ValueError, format, 2**100, format_spec)
787 self.assertRaises(ValueError, format, -(2**100), format_spec)
788
Eric Smithfa767ef2008-01-28 10:59:27 +0000789 # ensure that float type specifiers work; format converts
790 # the int to a float
Eric Smith5807c412008-05-11 21:00:57 +0000791 for format_spec in 'eEfFgG%':
Eric Smithfa767ef2008-01-28 10:59:27 +0000792 for value in [0, 1, -1, 100, -100, 1234567890, -1234567890]:
793 self.assertEqual(format(value, format_spec),
794 format(float(value), format_spec))
Eric Smith8c663262007-08-25 02:26:07 +0000795
Christian Heimesa34706f2008-01-04 03:06:10 +0000796 def test_nan_inf(self):
Christian Heimes1aa7b302008-01-04 03:22:53 +0000797 self.assertRaises(OverflowError, int, float('inf'))
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000798 self.assertRaises(OverflowError, int, float('-inf'))
799 self.assertRaises(ValueError, int, float('nan'))
Christian Heimesa34706f2008-01-04 03:06:10 +0000800
Benjamin Peterson875d4c02008-07-13 17:44:16 +0000801 def test_true_division(self):
802 huge = 1 << 40000
803 mhuge = -huge
804 self.assertEqual(huge / huge, 1.0)
805 self.assertEqual(mhuge / mhuge, 1.0)
806 self.assertEqual(huge / mhuge, -1.0)
807 self.assertEqual(mhuge / huge, -1.0)
808 self.assertEqual(1 / huge, 0.0)
809 self.assertEqual(1 / huge, 0.0)
810 self.assertEqual(1 / mhuge, 0.0)
811 self.assertEqual(1 / mhuge, 0.0)
812 self.assertEqual((666 * huge + (huge >> 1)) / huge, 666.5)
813 self.assertEqual((666 * mhuge + (mhuge >> 1)) / mhuge, 666.5)
814 self.assertEqual((666 * huge + (huge >> 1)) / mhuge, -666.5)
815 self.assertEqual((666 * mhuge + (mhuge >> 1)) / huge, -666.5)
816 self.assertEqual(huge / (huge << 1), 0.5)
817 self.assertEqual((1000000 * huge) / huge, 1000000)
818
819 namespace = {'huge': huge, 'mhuge': mhuge}
820
821 for overflow in ["float(huge)", "float(mhuge)",
822 "huge / 1", "huge / 2", "huge / -1", "huge / -2",
823 "mhuge / 100", "mhuge / 200"]:
824 self.assertRaises(OverflowError, eval, overflow, namespace)
825
826 for underflow in ["1 / huge", "2 / huge", "-1 / huge", "-2 / huge",
827 "100 / mhuge", "200 / mhuge"]:
828 result = eval(underflow, namespace)
829 self.assertEqual(result, 0.0,
830 "expected underflow to 0 from %r" % underflow)
831
832 for zero in ["huge / 0", "mhuge / 0"]:
833 self.assertRaises(ZeroDivisionError, eval, zero, namespace)
834
835
Facundo Batista6e6f59b2008-07-24 18:57:11 +0000836 def test_small_ints(self):
837 for i in range(-5, 257):
838 self.assertTrue(i is i + 0)
839 self.assertTrue(i is i * 1)
840 self.assertTrue(i is i - 0)
841 self.assertTrue(i is i // 1)
842 self.assertTrue(i is i & -1)
843 self.assertTrue(i is i | 0)
844 self.assertTrue(i is i ^ 0)
845 self.assertTrue(i is ~~i)
846 self.assertTrue(i is i**1)
847 self.assertTrue(i is int(str(i)))
848 self.assertTrue(i is i<<2>>2, str(i))
849 # corner cases
850 i = 1 << 70
851 self.assertTrue(i - i is 0)
852 self.assertTrue(0 * i is 0)
853
Mark Dickinson54bc1ec2008-12-17 16:19:07 +0000854 def test_bit_length(self):
855 tiny = 1e-10
856 for x in range(-65000, 65000):
857 k = x.bit_length()
858 # Check equivalence with Python version
859 self.assertEqual(k, len(bin(x).lstrip('-0b')))
860 # Behaviour as specified in the docs
861 if x != 0:
862 self.assert_(2**(k-1) <= abs(x) < 2**k)
863 else:
864 self.assertEqual(k, 0)
865 # Alternative definition: x.bit_length() == 1 + floor(log_2(x))
866 if x != 0:
867 # When x is an exact power of 2, numeric errors can
868 # cause floor(log(x)/log(2)) to be one too small; for
869 # small x this can be fixed by adding a small quantity
870 # to the quotient before taking the floor.
871 self.assertEqual(k, 1 + math.floor(
872 math.log(abs(x))/math.log(2) + tiny))
873
874 self.assertEqual((0).bit_length(), 0)
875 self.assertEqual((1).bit_length(), 1)
876 self.assertEqual((-1).bit_length(), 1)
877 self.assertEqual((2).bit_length(), 2)
878 self.assertEqual((-2).bit_length(), 2)
879 for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64, 234]:
880 a = 2**i
881 self.assertEqual((a-1).bit_length(), i)
882 self.assertEqual((1-a).bit_length(), i)
883 self.assertEqual((a).bit_length(), i+1)
884 self.assertEqual((-a).bit_length(), i+1)
885 self.assertEqual((a+1).bit_length(), i+1)
886 self.assertEqual((-a-1).bit_length(), i+1)
887
888
Walter Dörwalda0021592005-06-13 21:44:48 +0000889def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000890 support.run_unittest(LongTest)
Tim Peters307fa782004-09-23 08:06:40 +0000891
Walter Dörwalda0021592005-06-13 21:44:48 +0000892if __name__ == "__main__":
893 test_main()