blob: c1f8b5cbad8731d5602e06a2643cdb5d597e06de [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)
Mark Dickinson9ffc0202009-01-20 20:45:53 +0000287 # trailing L should no longer be accepted...
288 self.assertRaises(ValueError, int, '123L')
289 self.assertRaises(ValueError, int, '123l')
290 self.assertRaises(ValueError, int, '0L')
291 self.assertRaises(ValueError, int, '-37L')
292 self.assertRaises(ValueError, int, '0x32L', 16)
293 self.assertRaises(ValueError, int, '1L', 21)
294 # ... but it's just a normal digit if base >= 22
295 self.assertEqual(int('1L', 22), 43)
296
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000297 self.assertRaises(TypeError, int, 1, 12)
298
299 # SF patch #1638879: embedded NULs were not detected with
300 # explicit base
301 self.assertRaises(ValueError, int, '123\0', 10)
302 self.assertRaises(ValueError, int, '123\x00 245', 20)
303
304 self.assertEqual(int('100000000000000000000000000000000', 2),
305 4294967296)
306 self.assertEqual(int('102002022201221111211', 3), 4294967296)
307 self.assertEqual(int('10000000000000000', 4), 4294967296)
308 self.assertEqual(int('32244002423141', 5), 4294967296)
309 self.assertEqual(int('1550104015504', 6), 4294967296)
310 self.assertEqual(int('211301422354', 7), 4294967296)
311 self.assertEqual(int('40000000000', 8), 4294967296)
312 self.assertEqual(int('12068657454', 9), 4294967296)
313 self.assertEqual(int('4294967296', 10), 4294967296)
314 self.assertEqual(int('1904440554', 11), 4294967296)
315 self.assertEqual(int('9ba461594', 12), 4294967296)
316 self.assertEqual(int('535a79889', 13), 4294967296)
317 self.assertEqual(int('2ca5b7464', 14), 4294967296)
318 self.assertEqual(int('1a20dcd81', 15), 4294967296)
319 self.assertEqual(int('100000000', 16), 4294967296)
320 self.assertEqual(int('a7ffda91', 17), 4294967296)
321 self.assertEqual(int('704he7g4', 18), 4294967296)
322 self.assertEqual(int('4f5aff66', 19), 4294967296)
323 self.assertEqual(int('3723ai4g', 20), 4294967296)
324 self.assertEqual(int('281d55i4', 21), 4294967296)
325 self.assertEqual(int('1fj8b184', 22), 4294967296)
326 self.assertEqual(int('1606k7ic', 23), 4294967296)
327 self.assertEqual(int('mb994ag', 24), 4294967296)
328 self.assertEqual(int('hek2mgl', 25), 4294967296)
329 self.assertEqual(int('dnchbnm', 26), 4294967296)
330 self.assertEqual(int('b28jpdm', 27), 4294967296)
331 self.assertEqual(int('8pfgih4', 28), 4294967296)
332 self.assertEqual(int('76beigg', 29), 4294967296)
333 self.assertEqual(int('5qmcpqg', 30), 4294967296)
334 self.assertEqual(int('4q0jto4', 31), 4294967296)
335 self.assertEqual(int('4000000', 32), 4294967296)
336 self.assertEqual(int('3aokq94', 33), 4294967296)
337 self.assertEqual(int('2qhxjli', 34), 4294967296)
338 self.assertEqual(int('2br45qb', 35), 4294967296)
339 self.assertEqual(int('1z141z4', 36), 4294967296)
340
341 self.assertEqual(int('100000000000000000000000000000001', 2),
342 4294967297)
343 self.assertEqual(int('102002022201221111212', 3), 4294967297)
344 self.assertEqual(int('10000000000000001', 4), 4294967297)
345 self.assertEqual(int('32244002423142', 5), 4294967297)
346 self.assertEqual(int('1550104015505', 6), 4294967297)
347 self.assertEqual(int('211301422355', 7), 4294967297)
348 self.assertEqual(int('40000000001', 8), 4294967297)
349 self.assertEqual(int('12068657455', 9), 4294967297)
350 self.assertEqual(int('4294967297', 10), 4294967297)
351 self.assertEqual(int('1904440555', 11), 4294967297)
352 self.assertEqual(int('9ba461595', 12), 4294967297)
353 self.assertEqual(int('535a7988a', 13), 4294967297)
354 self.assertEqual(int('2ca5b7465', 14), 4294967297)
355 self.assertEqual(int('1a20dcd82', 15), 4294967297)
356 self.assertEqual(int('100000001', 16), 4294967297)
357 self.assertEqual(int('a7ffda92', 17), 4294967297)
358 self.assertEqual(int('704he7g5', 18), 4294967297)
359 self.assertEqual(int('4f5aff67', 19), 4294967297)
360 self.assertEqual(int('3723ai4h', 20), 4294967297)
361 self.assertEqual(int('281d55i5', 21), 4294967297)
362 self.assertEqual(int('1fj8b185', 22), 4294967297)
363 self.assertEqual(int('1606k7id', 23), 4294967297)
364 self.assertEqual(int('mb994ah', 24), 4294967297)
365 self.assertEqual(int('hek2mgm', 25), 4294967297)
366 self.assertEqual(int('dnchbnn', 26), 4294967297)
367 self.assertEqual(int('b28jpdn', 27), 4294967297)
368 self.assertEqual(int('8pfgih5', 28), 4294967297)
369 self.assertEqual(int('76beigh', 29), 4294967297)
370 self.assertEqual(int('5qmcpqh', 30), 4294967297)
371 self.assertEqual(int('4q0jto5', 31), 4294967297)
372 self.assertEqual(int('4000001', 32), 4294967297)
373 self.assertEqual(int('3aokq95', 33), 4294967297)
374 self.assertEqual(int('2qhxjlj', 34), 4294967297)
375 self.assertEqual(int('2br45qc', 35), 4294967297)
376 self.assertEqual(int('1z141z5', 36), 4294967297)
377
378
379 def test_conversion(self):
Mark Dickinsone5e298f2009-01-12 20:49:19 +0000380 # Test __int__()
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000381 class ClassicMissingMethods:
382 pass
383 self.assertRaises(TypeError, int, ClassicMissingMethods())
384
385 class MissingMethods(object):
386 pass
387 self.assertRaises(TypeError, int, MissingMethods())
388
389 class Foo0:
390 def __int__(self):
391 return 42
392
393 class Foo1(object):
394 def __int__(self):
395 return 42
396
397 class Foo2(int):
398 def __int__(self):
399 return 42
400
401 class Foo3(int):
402 def __int__(self):
403 return self
404
405 class Foo4(int):
406 def __int__(self):
407 return 42
408
409 class Foo5(int):
410 def __int__(self):
411 return 42.
412
413 self.assertEqual(int(Foo0()), 42)
414 self.assertEqual(int(Foo1()), 42)
415 self.assertEqual(int(Foo2()), 42)
416 self.assertEqual(int(Foo3()), 0)
417 self.assertEqual(int(Foo4()), 42)
418 self.assertRaises(TypeError, int, Foo5())
419
420 class Classic:
421 pass
422 for base in (object, Classic):
Mark Dickinsone5e298f2009-01-12 20:49:19 +0000423 class IntOverridesTrunc(base):
424 def __int__(self):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000425 return 42
426 def __trunc__(self):
427 return -12
Mark Dickinsone5e298f2009-01-12 20:49:19 +0000428 self.assertEqual(int(IntOverridesTrunc()), 42)
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000429
430 class JustTrunc(base):
431 def __trunc__(self):
432 return 42
433 self.assertEqual(int(JustTrunc()), 42)
434
Mark Dickinsone5e298f2009-01-12 20:49:19 +0000435 class JustLong(base):
436 # test that __long__ no longer used in 3.x
437 def __long__(self):
438 return 42
439 self.assertRaises(TypeError, int, JustLong())
440
441 class LongTrunc(base):
442 # __long__ should be ignored in 3.x
443 def __long__(self):
444 return 42
445 def __trunc__(self):
446 return 1729
447 self.assertEqual(int(LongTrunc()), 1729)
448
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000449 for trunc_result_base in (object, Classic):
450 class Integral(trunc_result_base):
451 def __int__(self):
452 return 42
453
454 class TruncReturnsNonLong(base):
455 def __trunc__(self):
456 return Integral()
457 self.assertEqual(int(TruncReturnsNonLong()), 42)
458
459 class NonIntegral(trunc_result_base):
460 def __trunc__(self):
461 # Check that we avoid infinite recursion.
462 return NonIntegral()
463
464 class TruncReturnsNonIntegral(base):
465 def __trunc__(self):
466 return NonIntegral()
467 try:
468 int(TruncReturnsNonIntegral())
469 except TypeError as e:
470 self.assertEquals(str(e),
471 "__trunc__ returned non-Integral"
472 " (type NonIntegral)")
473 else:
474 self.fail("Failed to raise TypeError with %s" %
475 ((base, trunc_result_base),))
476
Walter Dörwalda0021592005-06-13 21:44:48 +0000477 def test_misc(self):
Guido van Rossum4365cab1998-08-13 14:20:17 +0000478
Walter Dörwalda0021592005-06-13 21:44:48 +0000479 # check the extremes in int<->long conversion
Christian Heimesa37d4c62007-12-04 23:02:19 +0000480 hugepos = sys.maxsize
Walter Dörwalda0021592005-06-13 21:44:48 +0000481 hugeneg = -hugepos - 1
Guido van Rossume2a383d2007-01-15 16:59:06 +0000482 hugepos_aslong = int(hugepos)
483 hugeneg_aslong = int(hugeneg)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000484 self.assertEqual(hugepos, hugepos_aslong, "long(sys.maxsize) != sys.maxsize")
Walter Dörwalda0021592005-06-13 21:44:48 +0000485 self.assertEqual(hugeneg, hugeneg_aslong,
Christian Heimesa37d4c62007-12-04 23:02:19 +0000486 "long(-sys.maxsize-1) != -sys.maxsize-1")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000487
Walter Dörwalda0021592005-06-13 21:44:48 +0000488 # long -> int should not fail for hugepos_aslong or hugeneg_aslong
Thomas Wouters89f507f2006-12-13 04:49:30 +0000489 x = int(hugepos_aslong)
Walter Dörwalda0021592005-06-13 21:44:48 +0000490 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000491 self.assertEqual(x, hugepos,
Christian Heimesa37d4c62007-12-04 23:02:19 +0000492 "converting sys.maxsize to long and back to int fails")
Walter Dörwalda0021592005-06-13 21:44:48 +0000493 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000494 self.fail("int(long(sys.maxsize)) overflowed!")
Thomas Wouters89f507f2006-12-13 04:49:30 +0000495 if not isinstance(x, int):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000496 raise TestFailed("int(long(sys.maxsize)) should have returned int")
Thomas Wouters89f507f2006-12-13 04:49:30 +0000497 x = int(hugeneg_aslong)
Walter Dörwalda0021592005-06-13 21:44:48 +0000498 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000499 self.assertEqual(x, hugeneg,
Christian Heimesa37d4c62007-12-04 23:02:19 +0000500 "converting -sys.maxsize-1 to long and back to int fails")
Walter Dörwalda0021592005-06-13 21:44:48 +0000501 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000502 self.fail("int(long(-sys.maxsize-1)) overflowed!")
Thomas Wouters89f507f2006-12-13 04:49:30 +0000503 if not isinstance(x, int):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000504 raise TestFailed("int(long(-sys.maxsize-1)) should have "
Thomas Wouters89f507f2006-12-13 04:49:30 +0000505 "returned int")
Walter Dörwalda0021592005-06-13 21:44:48 +0000506 # but long -> int should overflow for hugepos+1 and hugeneg-1
507 x = hugepos_aslong + 1
508 try:
509 y = int(x)
510 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000511 self.fail("int(long(sys.maxsize) + 1) mustn't overflow")
Guido van Rossume2a383d2007-01-15 16:59:06 +0000512 self.assert_(isinstance(y, int),
Christian Heimesa37d4c62007-12-04 23:02:19 +0000513 "int(long(sys.maxsize) + 1) should have returned long")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000514
Walter Dörwalda0021592005-06-13 21:44:48 +0000515 x = hugeneg_aslong - 1
516 try:
517 y = int(x)
518 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000519 self.fail("int(long(-sys.maxsize-1) - 1) mustn't overflow")
Guido van Rossume2a383d2007-01-15 16:59:06 +0000520 self.assert_(isinstance(y, int),
Christian Heimesa37d4c62007-12-04 23:02:19 +0000521 "int(long(-sys.maxsize-1) - 1) should have returned long")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000522
Guido van Rossume2a383d2007-01-15 16:59:06 +0000523 class long2(int):
Walter Dörwalda0021592005-06-13 21:44:48 +0000524 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +0000525 x = long2(1<<100)
Walter Dörwaldf1715402002-11-19 20:49:15 +0000526 y = int(x)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000527 self.assert_(type(y) is int,
Walter Dörwalda0021592005-06-13 21:44:48 +0000528 "overflowing int conversion must return long not long subtype")
Guido van Rossum4581a0c1998-10-02 01:19:48 +0000529
Tim Peters26c7fa32001-08-23 22:56:21 +0000530# ----------------------------------- tests of auto int->long conversion
531
Walter Dörwalda0021592005-06-13 21:44:48 +0000532 def test_auto_overflow(self):
533 import math, sys
Tim Peters26c7fa32001-08-23 22:56:21 +0000534
Christian Heimesa37d4c62007-12-04 23:02:19 +0000535 special = [0, 1, 2, 3, sys.maxsize-1, sys.maxsize, sys.maxsize+1]
536 sqrt = int(math.sqrt(sys.maxsize))
Walter Dörwalda0021592005-06-13 21:44:48 +0000537 special.extend([sqrt-1, sqrt, sqrt+1])
538 special.extend([-i for i in special])
Tim Peters26c7fa32001-08-23 22:56:21 +0000539
Walter Dörwalda0021592005-06-13 21:44:48 +0000540 def checkit(*args):
541 # Heavy use of nested scopes here!
542 self.assertEqual(got, expected,
543 Frm("for %r expected %r got %r", args, expected, got))
Tim Peters26c7fa32001-08-23 22:56:21 +0000544
Walter Dörwalda0021592005-06-13 21:44:48 +0000545 for x in special:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000546 longx = int(x)
Tim Peters26c7fa32001-08-23 22:56:21 +0000547
Walter Dörwalda0021592005-06-13 21:44:48 +0000548 expected = -longx
549 got = -x
550 checkit('-', x)
Tim Peters26c7fa32001-08-23 22:56:21 +0000551
Walter Dörwalda0021592005-06-13 21:44:48 +0000552 for y in special:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000553 longy = int(y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000554
Walter Dörwalda0021592005-06-13 21:44:48 +0000555 expected = longx + longy
556 got = x + y
557 checkit(x, '+', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000558
Walter Dörwalda0021592005-06-13 21:44:48 +0000559 expected = longx - longy
560 got = x - y
561 checkit(x, '-', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000562
Walter Dörwalda0021592005-06-13 21:44:48 +0000563 expected = longx * longy
564 got = x * y
565 checkit(x, '*', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000566
Walter Dörwalda0021592005-06-13 21:44:48 +0000567 if y:
568 expected = longx / longy
569 got = x / y
570 checkit(x, '/', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000571
Walter Dörwalda0021592005-06-13 21:44:48 +0000572 expected = longx // longy
573 got = x // y
574 checkit(x, '//', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000575
Walter Dörwalda0021592005-06-13 21:44:48 +0000576 expected = divmod(longx, longy)
577 got = divmod(longx, longy)
578 checkit(x, 'divmod', y)
Tim Petersa3653092001-08-23 23:02:57 +0000579
Walter Dörwalda0021592005-06-13 21:44:48 +0000580 if abs(y) < 5 and not (x == 0 and y < 0):
581 expected = longx ** longy
582 got = x ** y
583 checkit(x, '**', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000584
Walter Dörwalda0021592005-06-13 21:44:48 +0000585 for z in special:
586 if z != 0 :
587 if y >= 0:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000588 expected = pow(longx, longy, int(z))
Walter Dörwalda0021592005-06-13 21:44:48 +0000589 got = pow(x, y, z)
590 checkit('pow', x, y, '%', z)
Tim Peters32f453e2001-09-03 08:35:41 +0000591 else:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000592 self.assertRaises(TypeError, pow,longx, longy, int(z))
Tim Peters26c7fa32001-08-23 22:56:21 +0000593
Walter Dörwalda0021592005-06-13 21:44:48 +0000594 def test_float_overflow(self):
595 import math
Tim Peters9fffa3e2001-09-04 05:14:19 +0000596
Walter Dörwalda0021592005-06-13 21:44:48 +0000597 for x in -2.0, -1.0, 0.0, 1.0, 2.0:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000598 self.assertEqual(float(int(x)), x)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000599
Walter Dörwalda0021592005-06-13 21:44:48 +0000600 shuge = '12345' * 120
Guido van Rossume2a383d2007-01-15 16:59:06 +0000601 huge = 1 << 30000
Walter Dörwalda0021592005-06-13 21:44:48 +0000602 mhuge = -huge
603 namespace = {'huge': huge, 'mhuge': mhuge, 'shuge': shuge, 'math': math}
604 for test in ["float(huge)", "float(mhuge)",
605 "complex(huge)", "complex(mhuge)",
606 "complex(huge, 1)", "complex(mhuge, 1)",
607 "complex(1, huge)", "complex(1, mhuge)",
608 "1. + huge", "huge + 1.", "1. + mhuge", "mhuge + 1.",
609 "1. - huge", "huge - 1.", "1. - mhuge", "mhuge - 1.",
610 "1. * huge", "huge * 1.", "1. * mhuge", "mhuge * 1.",
611 "1. // huge", "huge // 1.", "1. // mhuge", "mhuge // 1.",
612 "1. / huge", "huge / 1.", "1. / mhuge", "mhuge / 1.",
613 "1. ** huge", "huge ** 1.", "1. ** mhuge", "mhuge ** 1.",
614 "math.sin(huge)", "math.sin(mhuge)",
615 "math.sqrt(huge)", "math.sqrt(mhuge)", # should do better
Guido van Rossum28bbe422007-08-24 03:46:30 +0000616 # math.floor() of an int returns an int now
617 ##"math.floor(huge)", "math.floor(mhuge)",
618 ]:
Tim Peters9fffa3e2001-09-04 05:14:19 +0000619
Walter Dörwalda0021592005-06-13 21:44:48 +0000620 self.assertRaises(OverflowError, eval, test, namespace)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000621
Walter Dörwalda0021592005-06-13 21:44:48 +0000622 # XXX Perhaps float(shuge) can raise OverflowError on some box?
623 # The comparison should not.
624 self.assertNotEqual(float(shuge), int(shuge),
625 "float(shuge) should not equal int(shuge)")
Tim Peters83e7ccc2001-09-04 06:37:28 +0000626
Walter Dörwalda0021592005-06-13 21:44:48 +0000627 def test_logs(self):
628 import math
Tim Peters78526162001-09-05 00:53:45 +0000629
Walter Dörwalda0021592005-06-13 21:44:48 +0000630 LOG10E = math.log10(math.e)
Tim Peters307fa782004-09-23 08:06:40 +0000631
Guido van Rossum805365e2007-05-07 22:24:25 +0000632 for exp in list(range(10)) + [100, 1000, 10000]:
Walter Dörwalda0021592005-06-13 21:44:48 +0000633 value = 10 ** exp
634 log10 = math.log10(value)
635 self.assertAlmostEqual(log10, exp)
Tim Peters78526162001-09-05 00:53:45 +0000636
Walter Dörwalda0021592005-06-13 21:44:48 +0000637 # log10(value) == exp, so log(value) == log10(value)/log10(e) ==
638 # exp/LOG10E
639 expected = exp / LOG10E
640 log = math.log(value)
641 self.assertAlmostEqual(log, expected)
Tim Peters78526162001-09-05 00:53:45 +0000642
Guido van Rossume2a383d2007-01-15 16:59:06 +0000643 for bad in -(1 << 10000), -2, 0:
Walter Dörwalda0021592005-06-13 21:44:48 +0000644 self.assertRaises(ValueError, math.log, bad)
645 self.assertRaises(ValueError, math.log10, bad)
Tim Peters78526162001-09-05 00:53:45 +0000646
Walter Dörwalda0021592005-06-13 21:44:48 +0000647 def test_mixed_compares(self):
648 eq = self.assertEqual
649 import math
Tim Peters78526162001-09-05 00:53:45 +0000650
Walter Dörwalda0021592005-06-13 21:44:48 +0000651 # We're mostly concerned with that mixing floats and longs does the
652 # right stuff, even when longs are too large to fit in a float.
653 # The safest way to check the results is to use an entirely different
654 # method, which we do here via a skeletal rational class (which
655 # represents all Python ints, longs and floats exactly).
656 class Rat:
657 def __init__(self, value):
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000658 if isinstance(value, int):
Walter Dörwalda0021592005-06-13 21:44:48 +0000659 self.n = value
660 self.d = 1
661 elif isinstance(value, float):
662 # Convert to exact rational equivalent.
663 f, e = math.frexp(abs(value))
664 assert f == 0 or 0.5 <= f < 1.0
665 # |value| = f * 2**e exactly
Tim Peters78526162001-09-05 00:53:45 +0000666
Walter Dörwalda0021592005-06-13 21:44:48 +0000667 # Suck up CHUNK bits at a time; 28 is enough so that we suck
668 # up all bits in 2 iterations for all known binary double-
669 # precision formats, and small enough to fit in an int.
670 CHUNK = 28
671 top = 0
672 # invariant: |value| = (top + f) * 2**e exactly
673 while f:
674 f = math.ldexp(f, CHUNK)
675 digit = int(f)
676 assert digit >> CHUNK == 0
677 top = (top << CHUNK) | digit
678 f -= digit
679 assert 0.0 <= f < 1.0
680 e -= CHUNK
Tim Peters78526162001-09-05 00:53:45 +0000681
Walter Dörwalda0021592005-06-13 21:44:48 +0000682 # Now |value| = top * 2**e exactly.
683 if e >= 0:
684 n = top << e
685 d = 1
686 else:
687 n = top
688 d = 1 << -e
689 if value < 0:
690 n = -n
691 self.n = n
692 self.d = d
693 assert float(n) / float(d) == value
Tim Peters307fa782004-09-23 08:06:40 +0000694 else:
Walter Dörwalda0021592005-06-13 21:44:48 +0000695 raise TypeError("can't deal with %r" % val)
Tim Peters307fa782004-09-23 08:06:40 +0000696
Benjamin Peterson60192082008-10-16 19:34:46 +0000697 def _cmp__(self, other):
Walter Dörwalda0021592005-06-13 21:44:48 +0000698 if not isinstance(other, Rat):
699 other = Rat(other)
700 return cmp(self.n * other.d, self.d * other.n)
Benjamin Peterson60192082008-10-16 19:34:46 +0000701 def __eq__(self, other):
702 return self._cmp__(other) == 0
703 def __ne__(self, other):
704 return self._cmp__(other) != 0
705 def __ge__(self, other):
706 return self._cmp__(other) >= 0
707 def __gt__(self, other):
708 return self._cmp__(other) > 0
709 def __le__(self, other):
710 return self._cmp__(other) <= 0
711 def __lt__(self, other):
712 return self._cmp__(other) < 0
Tim Peters307fa782004-09-23 08:06:40 +0000713
Walter Dörwalda0021592005-06-13 21:44:48 +0000714 cases = [0, 0.001, 0.99, 1.0, 1.5, 1e20, 1e200]
715 # 2**48 is an important boundary in the internals. 2**53 is an
716 # important boundary for IEEE double precision.
717 for t in 2.0**48, 2.0**50, 2.0**53:
718 cases.extend([t - 1.0, t - 0.3, t, t + 0.3, t + 1.0,
Guido van Rossume2a383d2007-01-15 16:59:06 +0000719 int(t-1), int(t), int(t+1)])
Christian Heimesa37d4c62007-12-04 23:02:19 +0000720 cases.extend([0, 1, 2, sys.maxsize, float(sys.maxsize)])
Walter Dörwalda0021592005-06-13 21:44:48 +0000721 # 1L<<20000 should exceed all double formats. long(1e200) is to
722 # check that we get equality with 1e200 above.
Guido van Rossume2a383d2007-01-15 16:59:06 +0000723 t = int(1e200)
724 cases.extend([0, 1, 2, 1 << 20000, t-1, t, t+1])
Walter Dörwalda0021592005-06-13 21:44:48 +0000725 cases.extend([-x for x in cases])
726 for x in cases:
727 Rx = Rat(x)
728 for y in cases:
729 Ry = Rat(y)
730 Rcmp = cmp(Rx, Ry)
731 xycmp = cmp(x, y)
732 eq(Rcmp, xycmp, Frm("%r %r %d %d", x, y, Rcmp, xycmp))
733 eq(x == y, Rcmp == 0, Frm("%r == %r %d", x, y, Rcmp))
734 eq(x != y, Rcmp != 0, Frm("%r != %r %d", x, y, Rcmp))
735 eq(x < y, Rcmp < 0, Frm("%r < %r %d", x, y, Rcmp))
736 eq(x <= y, Rcmp <= 0, Frm("%r <= %r %d", x, y, Rcmp))
737 eq(x > y, Rcmp > 0, Frm("%r > %r %d", x, y, Rcmp))
738 eq(x >= y, Rcmp >= 0, Frm("%r >= %r %d", x, y, Rcmp))
Tim Peters307fa782004-09-23 08:06:40 +0000739
Eric Smith0dd1b632008-02-11 17:55:01 +0000740 def test__format__(self):
Eric Smith8c663262007-08-25 02:26:07 +0000741 self.assertEqual(format(123456789, 'd'), '123456789')
742 self.assertEqual(format(123456789, 'd'), '123456789')
743
Eric Smith185e30c2007-08-30 22:23:08 +0000744 # sign and aligning are interdependent
745 self.assertEqual(format(1, "-"), '1')
746 self.assertEqual(format(-1, "-"), '-1')
747 self.assertEqual(format(1, "-3"), ' 1')
748 self.assertEqual(format(-1, "-3"), ' -1')
749 self.assertEqual(format(1, "+3"), ' +1')
750 self.assertEqual(format(-1, "+3"), ' -1')
751 self.assertEqual(format(1, " 3"), ' 1')
752 self.assertEqual(format(-1, " 3"), ' -1')
753 self.assertEqual(format(1, " "), ' 1')
754 self.assertEqual(format(-1, " "), '-1')
755
Eric Smith8c663262007-08-25 02:26:07 +0000756 # hex
757 self.assertEqual(format(3, "x"), "3")
758 self.assertEqual(format(3, "X"), "3")
759 self.assertEqual(format(1234, "x"), "4d2")
760 self.assertEqual(format(-1234, "x"), "-4d2")
761 self.assertEqual(format(1234, "8x"), " 4d2")
Eric Smith185e30c2007-08-30 22:23:08 +0000762 self.assertEqual(format(-1234, "8x"), " -4d2")
Eric Smith8c663262007-08-25 02:26:07 +0000763 self.assertEqual(format(1234, "x"), "4d2")
764 self.assertEqual(format(-1234, "x"), "-4d2")
765 self.assertEqual(format(-3, "x"), "-3")
766 self.assertEqual(format(-3, "X"), "-3")
767 self.assertEqual(format(int('be', 16), "x"), "be")
768 self.assertEqual(format(int('be', 16), "X"), "BE")
769 self.assertEqual(format(-int('be', 16), "x"), "-be")
770 self.assertEqual(format(-int('be', 16), "X"), "-BE")
771
772 # octal
773 self.assertEqual(format(3, "b"), "11")
774 self.assertEqual(format(-3, "b"), "-11")
775 self.assertEqual(format(1234, "b"), "10011010010")
776 self.assertEqual(format(-1234, "b"), "-10011010010")
777 self.assertEqual(format(1234, "-b"), "10011010010")
778 self.assertEqual(format(-1234, "-b"), "-10011010010")
779 self.assertEqual(format(1234, " b"), " 10011010010")
780 self.assertEqual(format(-1234, " b"), "-10011010010")
781 self.assertEqual(format(1234, "+b"), "+10011010010")
782 self.assertEqual(format(-1234, "+b"), "-10011010010")
783
Eric Smith8c663262007-08-25 02:26:07 +0000784 # make sure these are errors
785 self.assertRaises(ValueError, format, 3, "1.3") # precision disallowed
Eric Smith8c663262007-08-25 02:26:07 +0000786 self.assertRaises(ValueError, format, 3, "+c") # sign not allowed
787 # with 'c'
Eric Smithfa767ef2008-01-28 10:59:27 +0000788
789 # ensure that only int and float type specifiers work
Eric Smith7b69c6c2008-01-27 21:07:59 +0000790 for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] +
791 [chr(x) for x in range(ord('A'), ord('Z')+1)]):
Eric Smithfa767ef2008-01-28 10:59:27 +0000792 if not format_spec in 'bcdoxXeEfFgGn%':
Eric Smith7b69c6c2008-01-27 21:07:59 +0000793 self.assertRaises(ValueError, format, 0, format_spec)
794 self.assertRaises(ValueError, format, 1, format_spec)
795 self.assertRaises(ValueError, format, -1, format_spec)
796 self.assertRaises(ValueError, format, 2**100, format_spec)
797 self.assertRaises(ValueError, format, -(2**100), format_spec)
798
Eric Smithfa767ef2008-01-28 10:59:27 +0000799 # ensure that float type specifiers work; format converts
800 # the int to a float
Eric Smith5807c412008-05-11 21:00:57 +0000801 for format_spec in 'eEfFgG%':
Eric Smithfa767ef2008-01-28 10:59:27 +0000802 for value in [0, 1, -1, 100, -100, 1234567890, -1234567890]:
803 self.assertEqual(format(value, format_spec),
804 format(float(value), format_spec))
Eric Smith8c663262007-08-25 02:26:07 +0000805
Christian Heimesa34706f2008-01-04 03:06:10 +0000806 def test_nan_inf(self):
Christian Heimes1aa7b302008-01-04 03:22:53 +0000807 self.assertRaises(OverflowError, int, float('inf'))
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000808 self.assertRaises(OverflowError, int, float('-inf'))
809 self.assertRaises(ValueError, int, float('nan'))
Christian Heimesa34706f2008-01-04 03:06:10 +0000810
Benjamin Peterson875d4c02008-07-13 17:44:16 +0000811 def test_true_division(self):
812 huge = 1 << 40000
813 mhuge = -huge
814 self.assertEqual(huge / huge, 1.0)
815 self.assertEqual(mhuge / mhuge, 1.0)
816 self.assertEqual(huge / mhuge, -1.0)
817 self.assertEqual(mhuge / huge, -1.0)
818 self.assertEqual(1 / huge, 0.0)
819 self.assertEqual(1 / huge, 0.0)
820 self.assertEqual(1 / mhuge, 0.0)
821 self.assertEqual(1 / mhuge, 0.0)
822 self.assertEqual((666 * huge + (huge >> 1)) / huge, 666.5)
823 self.assertEqual((666 * mhuge + (mhuge >> 1)) / mhuge, 666.5)
824 self.assertEqual((666 * huge + (huge >> 1)) / mhuge, -666.5)
825 self.assertEqual((666 * mhuge + (mhuge >> 1)) / huge, -666.5)
826 self.assertEqual(huge / (huge << 1), 0.5)
827 self.assertEqual((1000000 * huge) / huge, 1000000)
828
829 namespace = {'huge': huge, 'mhuge': mhuge}
830
831 for overflow in ["float(huge)", "float(mhuge)",
832 "huge / 1", "huge / 2", "huge / -1", "huge / -2",
833 "mhuge / 100", "mhuge / 200"]:
834 self.assertRaises(OverflowError, eval, overflow, namespace)
835
836 for underflow in ["1 / huge", "2 / huge", "-1 / huge", "-2 / huge",
837 "100 / mhuge", "200 / mhuge"]:
838 result = eval(underflow, namespace)
839 self.assertEqual(result, 0.0,
840 "expected underflow to 0 from %r" % underflow)
841
842 for zero in ["huge / 0", "mhuge / 0"]:
843 self.assertRaises(ZeroDivisionError, eval, zero, namespace)
844
845
Facundo Batista6e6f59b2008-07-24 18:57:11 +0000846 def test_small_ints(self):
847 for i in range(-5, 257):
848 self.assertTrue(i is i + 0)
849 self.assertTrue(i is i * 1)
850 self.assertTrue(i is i - 0)
851 self.assertTrue(i is i // 1)
852 self.assertTrue(i is i & -1)
853 self.assertTrue(i is i | 0)
854 self.assertTrue(i is i ^ 0)
855 self.assertTrue(i is ~~i)
856 self.assertTrue(i is i**1)
857 self.assertTrue(i is int(str(i)))
858 self.assertTrue(i is i<<2>>2, str(i))
859 # corner cases
860 i = 1 << 70
861 self.assertTrue(i - i is 0)
862 self.assertTrue(0 * i is 0)
863
Mark Dickinson54bc1ec2008-12-17 16:19:07 +0000864 def test_bit_length(self):
865 tiny = 1e-10
866 for x in range(-65000, 65000):
867 k = x.bit_length()
868 # Check equivalence with Python version
869 self.assertEqual(k, len(bin(x).lstrip('-0b')))
870 # Behaviour as specified in the docs
871 if x != 0:
872 self.assert_(2**(k-1) <= abs(x) < 2**k)
873 else:
874 self.assertEqual(k, 0)
875 # Alternative definition: x.bit_length() == 1 + floor(log_2(x))
876 if x != 0:
877 # When x is an exact power of 2, numeric errors can
878 # cause floor(log(x)/log(2)) to be one too small; for
879 # small x this can be fixed by adding a small quantity
880 # to the quotient before taking the floor.
881 self.assertEqual(k, 1 + math.floor(
882 math.log(abs(x))/math.log(2) + tiny))
883
884 self.assertEqual((0).bit_length(), 0)
885 self.assertEqual((1).bit_length(), 1)
886 self.assertEqual((-1).bit_length(), 1)
887 self.assertEqual((2).bit_length(), 2)
888 self.assertEqual((-2).bit_length(), 2)
889 for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64, 234]:
890 a = 2**i
891 self.assertEqual((a-1).bit_length(), i)
892 self.assertEqual((1-a).bit_length(), i)
893 self.assertEqual((a).bit_length(), i+1)
894 self.assertEqual((-a).bit_length(), i+1)
895 self.assertEqual((a+1).bit_length(), i+1)
896 self.assertEqual((-a-1).bit_length(), i+1)
897
898
Walter Dörwalda0021592005-06-13 21:44:48 +0000899def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000900 support.run_unittest(LongTest)
Tim Peters307fa782004-09-23 08:06:40 +0000901
Walter Dörwalda0021592005-06-13 21:44:48 +0000902if __name__ == "__main__":
903 test_main()