blob: cbd0b2b46eefc1a36f4d6f882500f28bc60fa32b [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):
370 # Test __long__()
371 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):
413 class LongOverridesTrunc(base):
414 def __long__(self):
415 return 42
416 def __trunc__(self):
417 return -12
418 self.assertEqual(int(LongOverridesTrunc()), 42)
419
420 class JustTrunc(base):
421 def __trunc__(self):
422 return 42
423 self.assertEqual(int(JustTrunc()), 42)
424
425 for trunc_result_base in (object, Classic):
426 class Integral(trunc_result_base):
427 def __int__(self):
428 return 42
429
430 class TruncReturnsNonLong(base):
431 def __trunc__(self):
432 return Integral()
433 self.assertEqual(int(TruncReturnsNonLong()), 42)
434
435 class NonIntegral(trunc_result_base):
436 def __trunc__(self):
437 # Check that we avoid infinite recursion.
438 return NonIntegral()
439
440 class TruncReturnsNonIntegral(base):
441 def __trunc__(self):
442 return NonIntegral()
443 try:
444 int(TruncReturnsNonIntegral())
445 except TypeError as e:
446 self.assertEquals(str(e),
447 "__trunc__ returned non-Integral"
448 " (type NonIntegral)")
449 else:
450 self.fail("Failed to raise TypeError with %s" %
451 ((base, trunc_result_base),))
452
Walter Dörwalda0021592005-06-13 21:44:48 +0000453 def test_misc(self):
Guido van Rossum4365cab1998-08-13 14:20:17 +0000454
Walter Dörwalda0021592005-06-13 21:44:48 +0000455 # check the extremes in int<->long conversion
Christian Heimesa37d4c62007-12-04 23:02:19 +0000456 hugepos = sys.maxsize
Walter Dörwalda0021592005-06-13 21:44:48 +0000457 hugeneg = -hugepos - 1
Guido van Rossume2a383d2007-01-15 16:59:06 +0000458 hugepos_aslong = int(hugepos)
459 hugeneg_aslong = int(hugeneg)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000460 self.assertEqual(hugepos, hugepos_aslong, "long(sys.maxsize) != sys.maxsize")
Walter Dörwalda0021592005-06-13 21:44:48 +0000461 self.assertEqual(hugeneg, hugeneg_aslong,
Christian Heimesa37d4c62007-12-04 23:02:19 +0000462 "long(-sys.maxsize-1) != -sys.maxsize-1")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000463
Walter Dörwalda0021592005-06-13 21:44:48 +0000464 # long -> int should not fail for hugepos_aslong or hugeneg_aslong
Thomas Wouters89f507f2006-12-13 04:49:30 +0000465 x = int(hugepos_aslong)
Walter Dörwalda0021592005-06-13 21:44:48 +0000466 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000467 self.assertEqual(x, hugepos,
Christian Heimesa37d4c62007-12-04 23:02:19 +0000468 "converting sys.maxsize to long and back to int fails")
Walter Dörwalda0021592005-06-13 21:44:48 +0000469 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000470 self.fail("int(long(sys.maxsize)) overflowed!")
Thomas Wouters89f507f2006-12-13 04:49:30 +0000471 if not isinstance(x, int):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000472 raise TestFailed("int(long(sys.maxsize)) should have returned int")
Thomas Wouters89f507f2006-12-13 04:49:30 +0000473 x = int(hugeneg_aslong)
Walter Dörwalda0021592005-06-13 21:44:48 +0000474 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000475 self.assertEqual(x, hugeneg,
Christian Heimesa37d4c62007-12-04 23:02:19 +0000476 "converting -sys.maxsize-1 to long and back to int fails")
Walter Dörwalda0021592005-06-13 21:44:48 +0000477 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000478 self.fail("int(long(-sys.maxsize-1)) overflowed!")
Thomas Wouters89f507f2006-12-13 04:49:30 +0000479 if not isinstance(x, int):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000480 raise TestFailed("int(long(-sys.maxsize-1)) should have "
Thomas Wouters89f507f2006-12-13 04:49:30 +0000481 "returned int")
Walter Dörwalda0021592005-06-13 21:44:48 +0000482 # but long -> int should overflow for hugepos+1 and hugeneg-1
483 x = hugepos_aslong + 1
484 try:
485 y = int(x)
486 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000487 self.fail("int(long(sys.maxsize) + 1) mustn't overflow")
Guido van Rossume2a383d2007-01-15 16:59:06 +0000488 self.assert_(isinstance(y, int),
Christian Heimesa37d4c62007-12-04 23:02:19 +0000489 "int(long(sys.maxsize) + 1) should have returned long")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000490
Walter Dörwalda0021592005-06-13 21:44:48 +0000491 x = hugeneg_aslong - 1
492 try:
493 y = int(x)
494 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000495 self.fail("int(long(-sys.maxsize-1) - 1) mustn't overflow")
Guido van Rossume2a383d2007-01-15 16:59:06 +0000496 self.assert_(isinstance(y, int),
Christian Heimesa37d4c62007-12-04 23:02:19 +0000497 "int(long(-sys.maxsize-1) - 1) should have returned long")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000498
Guido van Rossume2a383d2007-01-15 16:59:06 +0000499 class long2(int):
Walter Dörwalda0021592005-06-13 21:44:48 +0000500 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +0000501 x = long2(1<<100)
Walter Dörwaldf1715402002-11-19 20:49:15 +0000502 y = int(x)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000503 self.assert_(type(y) is int,
Walter Dörwalda0021592005-06-13 21:44:48 +0000504 "overflowing int conversion must return long not long subtype")
Guido van Rossum4581a0c1998-10-02 01:19:48 +0000505
Tim Peters26c7fa32001-08-23 22:56:21 +0000506# ----------------------------------- tests of auto int->long conversion
507
Walter Dörwalda0021592005-06-13 21:44:48 +0000508 def test_auto_overflow(self):
509 import math, sys
Tim Peters26c7fa32001-08-23 22:56:21 +0000510
Christian Heimesa37d4c62007-12-04 23:02:19 +0000511 special = [0, 1, 2, 3, sys.maxsize-1, sys.maxsize, sys.maxsize+1]
512 sqrt = int(math.sqrt(sys.maxsize))
Walter Dörwalda0021592005-06-13 21:44:48 +0000513 special.extend([sqrt-1, sqrt, sqrt+1])
514 special.extend([-i for i in special])
Tim Peters26c7fa32001-08-23 22:56:21 +0000515
Walter Dörwalda0021592005-06-13 21:44:48 +0000516 def checkit(*args):
517 # Heavy use of nested scopes here!
518 self.assertEqual(got, expected,
519 Frm("for %r expected %r got %r", args, expected, got))
Tim Peters26c7fa32001-08-23 22:56:21 +0000520
Walter Dörwalda0021592005-06-13 21:44:48 +0000521 for x in special:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000522 longx = int(x)
Tim Peters26c7fa32001-08-23 22:56:21 +0000523
Walter Dörwalda0021592005-06-13 21:44:48 +0000524 expected = -longx
525 got = -x
526 checkit('-', x)
Tim Peters26c7fa32001-08-23 22:56:21 +0000527
Walter Dörwalda0021592005-06-13 21:44:48 +0000528 for y in special:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000529 longy = int(y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000530
Walter Dörwalda0021592005-06-13 21:44:48 +0000531 expected = longx + longy
532 got = x + y
533 checkit(x, '+', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000534
Walter Dörwalda0021592005-06-13 21:44:48 +0000535 expected = longx - longy
536 got = x - y
537 checkit(x, '-', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000538
Walter Dörwalda0021592005-06-13 21:44:48 +0000539 expected = longx * longy
540 got = x * y
541 checkit(x, '*', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000542
Walter Dörwalda0021592005-06-13 21:44:48 +0000543 if y:
544 expected = longx / longy
545 got = x / y
546 checkit(x, '/', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000547
Walter Dörwalda0021592005-06-13 21:44:48 +0000548 expected = longx // longy
549 got = x // y
550 checkit(x, '//', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000551
Walter Dörwalda0021592005-06-13 21:44:48 +0000552 expected = divmod(longx, longy)
553 got = divmod(longx, longy)
554 checkit(x, 'divmod', y)
Tim Petersa3653092001-08-23 23:02:57 +0000555
Walter Dörwalda0021592005-06-13 21:44:48 +0000556 if abs(y) < 5 and not (x == 0 and y < 0):
557 expected = longx ** longy
558 got = x ** y
559 checkit(x, '**', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000560
Walter Dörwalda0021592005-06-13 21:44:48 +0000561 for z in special:
562 if z != 0 :
563 if y >= 0:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000564 expected = pow(longx, longy, int(z))
Walter Dörwalda0021592005-06-13 21:44:48 +0000565 got = pow(x, y, z)
566 checkit('pow', x, y, '%', z)
Tim Peters32f453e2001-09-03 08:35:41 +0000567 else:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000568 self.assertRaises(TypeError, pow,longx, longy, int(z))
Tim Peters26c7fa32001-08-23 22:56:21 +0000569
Walter Dörwalda0021592005-06-13 21:44:48 +0000570 def test_float_overflow(self):
571 import math
Tim Peters9fffa3e2001-09-04 05:14:19 +0000572
Walter Dörwalda0021592005-06-13 21:44:48 +0000573 for x in -2.0, -1.0, 0.0, 1.0, 2.0:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000574 self.assertEqual(float(int(x)), x)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000575
Walter Dörwalda0021592005-06-13 21:44:48 +0000576 shuge = '12345' * 120
Guido van Rossume2a383d2007-01-15 16:59:06 +0000577 huge = 1 << 30000
Walter Dörwalda0021592005-06-13 21:44:48 +0000578 mhuge = -huge
579 namespace = {'huge': huge, 'mhuge': mhuge, 'shuge': shuge, 'math': math}
580 for test in ["float(huge)", "float(mhuge)",
581 "complex(huge)", "complex(mhuge)",
582 "complex(huge, 1)", "complex(mhuge, 1)",
583 "complex(1, huge)", "complex(1, mhuge)",
584 "1. + huge", "huge + 1.", "1. + mhuge", "mhuge + 1.",
585 "1. - huge", "huge - 1.", "1. - mhuge", "mhuge - 1.",
586 "1. * huge", "huge * 1.", "1. * mhuge", "mhuge * 1.",
587 "1. // huge", "huge // 1.", "1. // mhuge", "mhuge // 1.",
588 "1. / huge", "huge / 1.", "1. / mhuge", "mhuge / 1.",
589 "1. ** huge", "huge ** 1.", "1. ** mhuge", "mhuge ** 1.",
590 "math.sin(huge)", "math.sin(mhuge)",
591 "math.sqrt(huge)", "math.sqrt(mhuge)", # should do better
Guido van Rossum28bbe422007-08-24 03:46:30 +0000592 # math.floor() of an int returns an int now
593 ##"math.floor(huge)", "math.floor(mhuge)",
594 ]:
Tim Peters9fffa3e2001-09-04 05:14:19 +0000595
Walter Dörwalda0021592005-06-13 21:44:48 +0000596 self.assertRaises(OverflowError, eval, test, namespace)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000597
Walter Dörwalda0021592005-06-13 21:44:48 +0000598 # XXX Perhaps float(shuge) can raise OverflowError on some box?
599 # The comparison should not.
600 self.assertNotEqual(float(shuge), int(shuge),
601 "float(shuge) should not equal int(shuge)")
Tim Peters83e7ccc2001-09-04 06:37:28 +0000602
Walter Dörwalda0021592005-06-13 21:44:48 +0000603 def test_logs(self):
604 import math
Tim Peters78526162001-09-05 00:53:45 +0000605
Walter Dörwalda0021592005-06-13 21:44:48 +0000606 LOG10E = math.log10(math.e)
Tim Peters307fa782004-09-23 08:06:40 +0000607
Guido van Rossum805365e2007-05-07 22:24:25 +0000608 for exp in list(range(10)) + [100, 1000, 10000]:
Walter Dörwalda0021592005-06-13 21:44:48 +0000609 value = 10 ** exp
610 log10 = math.log10(value)
611 self.assertAlmostEqual(log10, exp)
Tim Peters78526162001-09-05 00:53:45 +0000612
Walter Dörwalda0021592005-06-13 21:44:48 +0000613 # log10(value) == exp, so log(value) == log10(value)/log10(e) ==
614 # exp/LOG10E
615 expected = exp / LOG10E
616 log = math.log(value)
617 self.assertAlmostEqual(log, expected)
Tim Peters78526162001-09-05 00:53:45 +0000618
Guido van Rossume2a383d2007-01-15 16:59:06 +0000619 for bad in -(1 << 10000), -2, 0:
Walter Dörwalda0021592005-06-13 21:44:48 +0000620 self.assertRaises(ValueError, math.log, bad)
621 self.assertRaises(ValueError, math.log10, bad)
Tim Peters78526162001-09-05 00:53:45 +0000622
Walter Dörwalda0021592005-06-13 21:44:48 +0000623 def test_mixed_compares(self):
624 eq = self.assertEqual
625 import math
Tim Peters78526162001-09-05 00:53:45 +0000626
Walter Dörwalda0021592005-06-13 21:44:48 +0000627 # We're mostly concerned with that mixing floats and longs does the
628 # right stuff, even when longs are too large to fit in a float.
629 # The safest way to check the results is to use an entirely different
630 # method, which we do here via a skeletal rational class (which
631 # represents all Python ints, longs and floats exactly).
632 class Rat:
633 def __init__(self, value):
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000634 if isinstance(value, int):
Walter Dörwalda0021592005-06-13 21:44:48 +0000635 self.n = value
636 self.d = 1
637 elif isinstance(value, float):
638 # Convert to exact rational equivalent.
639 f, e = math.frexp(abs(value))
640 assert f == 0 or 0.5 <= f < 1.0
641 # |value| = f * 2**e exactly
Tim Peters78526162001-09-05 00:53:45 +0000642
Walter Dörwalda0021592005-06-13 21:44:48 +0000643 # Suck up CHUNK bits at a time; 28 is enough so that we suck
644 # up all bits in 2 iterations for all known binary double-
645 # precision formats, and small enough to fit in an int.
646 CHUNK = 28
647 top = 0
648 # invariant: |value| = (top + f) * 2**e exactly
649 while f:
650 f = math.ldexp(f, CHUNK)
651 digit = int(f)
652 assert digit >> CHUNK == 0
653 top = (top << CHUNK) | digit
654 f -= digit
655 assert 0.0 <= f < 1.0
656 e -= CHUNK
Tim Peters78526162001-09-05 00:53:45 +0000657
Walter Dörwalda0021592005-06-13 21:44:48 +0000658 # Now |value| = top * 2**e exactly.
659 if e >= 0:
660 n = top << e
661 d = 1
662 else:
663 n = top
664 d = 1 << -e
665 if value < 0:
666 n = -n
667 self.n = n
668 self.d = d
669 assert float(n) / float(d) == value
Tim Peters307fa782004-09-23 08:06:40 +0000670 else:
Walter Dörwalda0021592005-06-13 21:44:48 +0000671 raise TypeError("can't deal with %r" % val)
Tim Peters307fa782004-09-23 08:06:40 +0000672
Benjamin Peterson60192082008-10-16 19:34:46 +0000673 def _cmp__(self, other):
Walter Dörwalda0021592005-06-13 21:44:48 +0000674 if not isinstance(other, Rat):
675 other = Rat(other)
676 return cmp(self.n * other.d, self.d * other.n)
Benjamin Peterson60192082008-10-16 19:34:46 +0000677 def __eq__(self, other):
678 return self._cmp__(other) == 0
679 def __ne__(self, other):
680 return self._cmp__(other) != 0
681 def __ge__(self, other):
682 return self._cmp__(other) >= 0
683 def __gt__(self, other):
684 return self._cmp__(other) > 0
685 def __le__(self, other):
686 return self._cmp__(other) <= 0
687 def __lt__(self, other):
688 return self._cmp__(other) < 0
Tim Peters307fa782004-09-23 08:06:40 +0000689
Walter Dörwalda0021592005-06-13 21:44:48 +0000690 cases = [0, 0.001, 0.99, 1.0, 1.5, 1e20, 1e200]
691 # 2**48 is an important boundary in the internals. 2**53 is an
692 # important boundary for IEEE double precision.
693 for t in 2.0**48, 2.0**50, 2.0**53:
694 cases.extend([t - 1.0, t - 0.3, t, t + 0.3, t + 1.0,
Guido van Rossume2a383d2007-01-15 16:59:06 +0000695 int(t-1), int(t), int(t+1)])
Christian Heimesa37d4c62007-12-04 23:02:19 +0000696 cases.extend([0, 1, 2, sys.maxsize, float(sys.maxsize)])
Walter Dörwalda0021592005-06-13 21:44:48 +0000697 # 1L<<20000 should exceed all double formats. long(1e200) is to
698 # check that we get equality with 1e200 above.
Guido van Rossume2a383d2007-01-15 16:59:06 +0000699 t = int(1e200)
700 cases.extend([0, 1, 2, 1 << 20000, t-1, t, t+1])
Walter Dörwalda0021592005-06-13 21:44:48 +0000701 cases.extend([-x for x in cases])
702 for x in cases:
703 Rx = Rat(x)
704 for y in cases:
705 Ry = Rat(y)
706 Rcmp = cmp(Rx, Ry)
707 xycmp = cmp(x, y)
708 eq(Rcmp, xycmp, Frm("%r %r %d %d", x, y, Rcmp, xycmp))
709 eq(x == y, Rcmp == 0, Frm("%r == %r %d", x, y, Rcmp))
710 eq(x != y, Rcmp != 0, Frm("%r != %r %d", x, y, Rcmp))
711 eq(x < y, Rcmp < 0, Frm("%r < %r %d", x, y, Rcmp))
712 eq(x <= y, Rcmp <= 0, Frm("%r <= %r %d", x, y, Rcmp))
713 eq(x > y, Rcmp > 0, Frm("%r > %r %d", x, y, Rcmp))
714 eq(x >= y, Rcmp >= 0, Frm("%r >= %r %d", x, y, Rcmp))
Tim Peters307fa782004-09-23 08:06:40 +0000715
Eric Smith0dd1b632008-02-11 17:55:01 +0000716 def test__format__(self):
Eric Smith8c663262007-08-25 02:26:07 +0000717 self.assertEqual(format(123456789, 'd'), '123456789')
718 self.assertEqual(format(123456789, 'd'), '123456789')
719
Eric Smith185e30c2007-08-30 22:23:08 +0000720 # sign and aligning are interdependent
721 self.assertEqual(format(1, "-"), '1')
722 self.assertEqual(format(-1, "-"), '-1')
723 self.assertEqual(format(1, "-3"), ' 1')
724 self.assertEqual(format(-1, "-3"), ' -1')
725 self.assertEqual(format(1, "+3"), ' +1')
726 self.assertEqual(format(-1, "+3"), ' -1')
727 self.assertEqual(format(1, " 3"), ' 1')
728 self.assertEqual(format(-1, " 3"), ' -1')
729 self.assertEqual(format(1, " "), ' 1')
730 self.assertEqual(format(-1, " "), '-1')
731
Eric Smith8c663262007-08-25 02:26:07 +0000732 # hex
733 self.assertEqual(format(3, "x"), "3")
734 self.assertEqual(format(3, "X"), "3")
735 self.assertEqual(format(1234, "x"), "4d2")
736 self.assertEqual(format(-1234, "x"), "-4d2")
737 self.assertEqual(format(1234, "8x"), " 4d2")
Eric Smith185e30c2007-08-30 22:23:08 +0000738 self.assertEqual(format(-1234, "8x"), " -4d2")
Eric Smith8c663262007-08-25 02:26:07 +0000739 self.assertEqual(format(1234, "x"), "4d2")
740 self.assertEqual(format(-1234, "x"), "-4d2")
741 self.assertEqual(format(-3, "x"), "-3")
742 self.assertEqual(format(-3, "X"), "-3")
743 self.assertEqual(format(int('be', 16), "x"), "be")
744 self.assertEqual(format(int('be', 16), "X"), "BE")
745 self.assertEqual(format(-int('be', 16), "x"), "-be")
746 self.assertEqual(format(-int('be', 16), "X"), "-BE")
747
748 # octal
749 self.assertEqual(format(3, "b"), "11")
750 self.assertEqual(format(-3, "b"), "-11")
751 self.assertEqual(format(1234, "b"), "10011010010")
752 self.assertEqual(format(-1234, "b"), "-10011010010")
753 self.assertEqual(format(1234, "-b"), "10011010010")
754 self.assertEqual(format(-1234, "-b"), "-10011010010")
755 self.assertEqual(format(1234, " b"), " 10011010010")
756 self.assertEqual(format(-1234, " b"), "-10011010010")
757 self.assertEqual(format(1234, "+b"), "+10011010010")
758 self.assertEqual(format(-1234, "+b"), "-10011010010")
759
Eric Smith8c663262007-08-25 02:26:07 +0000760 # make sure these are errors
761 self.assertRaises(ValueError, format, 3, "1.3") # precision disallowed
Eric Smith8c663262007-08-25 02:26:07 +0000762 self.assertRaises(ValueError, format, 3, "+c") # sign not allowed
763 # with 'c'
Eric Smithfa767ef2008-01-28 10:59:27 +0000764
765 # ensure that only int and float type specifiers work
Eric Smith7b69c6c2008-01-27 21:07:59 +0000766 for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] +
767 [chr(x) for x in range(ord('A'), ord('Z')+1)]):
Eric Smithfa767ef2008-01-28 10:59:27 +0000768 if not format_spec in 'bcdoxXeEfFgGn%':
Eric Smith7b69c6c2008-01-27 21:07:59 +0000769 self.assertRaises(ValueError, format, 0, format_spec)
770 self.assertRaises(ValueError, format, 1, format_spec)
771 self.assertRaises(ValueError, format, -1, format_spec)
772 self.assertRaises(ValueError, format, 2**100, format_spec)
773 self.assertRaises(ValueError, format, -(2**100), format_spec)
774
Eric Smithfa767ef2008-01-28 10:59:27 +0000775 # ensure that float type specifiers work; format converts
776 # the int to a float
Eric Smith5807c412008-05-11 21:00:57 +0000777 for format_spec in 'eEfFgG%':
Eric Smithfa767ef2008-01-28 10:59:27 +0000778 for value in [0, 1, -1, 100, -100, 1234567890, -1234567890]:
779 self.assertEqual(format(value, format_spec),
780 format(float(value), format_spec))
Eric Smith8c663262007-08-25 02:26:07 +0000781
Christian Heimesa34706f2008-01-04 03:06:10 +0000782 def test_nan_inf(self):
Christian Heimes1aa7b302008-01-04 03:22:53 +0000783 self.assertRaises(OverflowError, int, float('inf'))
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000784 self.assertRaises(OverflowError, int, float('-inf'))
785 self.assertRaises(ValueError, int, float('nan'))
Christian Heimesa34706f2008-01-04 03:06:10 +0000786
Benjamin Peterson875d4c02008-07-13 17:44:16 +0000787 def test_true_division(self):
788 huge = 1 << 40000
789 mhuge = -huge
790 self.assertEqual(huge / huge, 1.0)
791 self.assertEqual(mhuge / mhuge, 1.0)
792 self.assertEqual(huge / mhuge, -1.0)
793 self.assertEqual(mhuge / huge, -1.0)
794 self.assertEqual(1 / huge, 0.0)
795 self.assertEqual(1 / huge, 0.0)
796 self.assertEqual(1 / mhuge, 0.0)
797 self.assertEqual(1 / mhuge, 0.0)
798 self.assertEqual((666 * huge + (huge >> 1)) / huge, 666.5)
799 self.assertEqual((666 * mhuge + (mhuge >> 1)) / mhuge, 666.5)
800 self.assertEqual((666 * huge + (huge >> 1)) / mhuge, -666.5)
801 self.assertEqual((666 * mhuge + (mhuge >> 1)) / huge, -666.5)
802 self.assertEqual(huge / (huge << 1), 0.5)
803 self.assertEqual((1000000 * huge) / huge, 1000000)
804
805 namespace = {'huge': huge, 'mhuge': mhuge}
806
807 for overflow in ["float(huge)", "float(mhuge)",
808 "huge / 1", "huge / 2", "huge / -1", "huge / -2",
809 "mhuge / 100", "mhuge / 200"]:
810 self.assertRaises(OverflowError, eval, overflow, namespace)
811
812 for underflow in ["1 / huge", "2 / huge", "-1 / huge", "-2 / huge",
813 "100 / mhuge", "200 / mhuge"]:
814 result = eval(underflow, namespace)
815 self.assertEqual(result, 0.0,
816 "expected underflow to 0 from %r" % underflow)
817
818 for zero in ["huge / 0", "mhuge / 0"]:
819 self.assertRaises(ZeroDivisionError, eval, zero, namespace)
820
821
Facundo Batista6e6f59b2008-07-24 18:57:11 +0000822 def test_small_ints(self):
823 for i in range(-5, 257):
824 self.assertTrue(i is i + 0)
825 self.assertTrue(i is i * 1)
826 self.assertTrue(i is i - 0)
827 self.assertTrue(i is i // 1)
828 self.assertTrue(i is i & -1)
829 self.assertTrue(i is i | 0)
830 self.assertTrue(i is i ^ 0)
831 self.assertTrue(i is ~~i)
832 self.assertTrue(i is i**1)
833 self.assertTrue(i is int(str(i)))
834 self.assertTrue(i is i<<2>>2, str(i))
835 # corner cases
836 i = 1 << 70
837 self.assertTrue(i - i is 0)
838 self.assertTrue(0 * i is 0)
839
Mark Dickinson54bc1ec2008-12-17 16:19:07 +0000840 def test_bit_length(self):
841 tiny = 1e-10
842 for x in range(-65000, 65000):
843 k = x.bit_length()
844 # Check equivalence with Python version
845 self.assertEqual(k, len(bin(x).lstrip('-0b')))
846 # Behaviour as specified in the docs
847 if x != 0:
848 self.assert_(2**(k-1) <= abs(x) < 2**k)
849 else:
850 self.assertEqual(k, 0)
851 # Alternative definition: x.bit_length() == 1 + floor(log_2(x))
852 if x != 0:
853 # When x is an exact power of 2, numeric errors can
854 # cause floor(log(x)/log(2)) to be one too small; for
855 # small x this can be fixed by adding a small quantity
856 # to the quotient before taking the floor.
857 self.assertEqual(k, 1 + math.floor(
858 math.log(abs(x))/math.log(2) + tiny))
859
860 self.assertEqual((0).bit_length(), 0)
861 self.assertEqual((1).bit_length(), 1)
862 self.assertEqual((-1).bit_length(), 1)
863 self.assertEqual((2).bit_length(), 2)
864 self.assertEqual((-2).bit_length(), 2)
865 for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64, 234]:
866 a = 2**i
867 self.assertEqual((a-1).bit_length(), i)
868 self.assertEqual((1-a).bit_length(), i)
869 self.assertEqual((a).bit_length(), i+1)
870 self.assertEqual((-a).bit_length(), i+1)
871 self.assertEqual((a+1).bit_length(), i+1)
872 self.assertEqual((-a-1).bit_length(), i+1)
873
874
Walter Dörwalda0021592005-06-13 21:44:48 +0000875def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000876 support.run_unittest(LongTest)
Tim Peters307fa782004-09-23 08:06:40 +0000877
Walter Dörwalda0021592005-06-13 21:44:48 +0000878if __name__ == "__main__":
879 test_main()