blob: 92285b2af78ca0a7d5e78abb1846671f3f6184f6 [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.
Mark Dickinsonbd792642009-03-18 20:06:12 +000018SHIFT = sys.int_info.bits_per_digit
Guido van Rossum4365cab1998-08-13 14:20:17 +000019BASE = 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
Mark Dickinsonbd792642009-03-18 20:06:12 +0000123 # specific numbers chosen to exercise corner cases of the
124 # current long division implementation
125
126 # 30-bit cases involving a quotient digit estimate of BASE+1
127 self.check_division(1231948412290879395966702881,
128 1147341367131428698)
129 self.check_division(815427756481275430342312021515587883,
130 707270836069027745)
131 self.check_division(627976073697012820849443363563599041,
132 643588798496057020)
133 self.check_division(1115141373653752303710932756325578065,
134 1038556335171453937726882627)
135 # 30-bit cases that require the post-subtraction correction step
136 self.check_division(922498905405436751940989320930368494,
137 949985870686786135626943396)
138 self.check_division(768235853328091167204009652174031844,
139 1091555541180371554426545266)
140
141 # 15-bit cases involving a quotient digit estimate of BASE+1
142 self.check_division(20172188947443, 615611397)
143 self.check_division(1020908530270155025, 950795710)
144 self.check_division(128589565723112408, 736393718)
145 self.check_division(609919780285761575, 18613274546784)
146 # 15-bit cases that require the post-subtraction correction step
147 self.check_division(710031681576388032, 26769404391308)
148 self.check_division(1933622614268221, 30212853348836)
149
150
151
Walter Dörwalda0021592005-06-13 21:44:48 +0000152 def test_karatsuba(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000153 digits = list(range(1, 5)) + list(range(KARATSUBA_CUTOFF,
154 KARATSUBA_CUTOFF + 10))
Walter Dörwalda0021592005-06-13 21:44:48 +0000155 digits.extend([KARATSUBA_CUTOFF * 10, KARATSUBA_CUTOFF * 100])
Guido van Rossum4365cab1998-08-13 14:20:17 +0000156
Walter Dörwalda0021592005-06-13 21:44:48 +0000157 bits = [digit * SHIFT for digit in digits]
Guido van Rossum4365cab1998-08-13 14:20:17 +0000158
Walter Dörwalda0021592005-06-13 21:44:48 +0000159 # Test products of long strings of 1 bits -- (2**x-1)*(2**y-1) ==
160 # 2**(x+y) - 2**x - 2**y + 1, so the proper result is easy to check.
161 for abits in bits:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000162 a = (1 << abits) - 1
Walter Dörwalda0021592005-06-13 21:44:48 +0000163 for bbits in bits:
164 if bbits < abits:
165 continue
Guido van Rossume2a383d2007-01-15 16:59:06 +0000166 b = (1 << bbits) - 1
Walter Dörwalda0021592005-06-13 21:44:48 +0000167 x = a * b
Guido van Rossume2a383d2007-01-15 16:59:06 +0000168 y = ((1 << (abits + bbits)) -
169 (1 << abits) -
170 (1 << bbits) +
Walter Dörwalda0021592005-06-13 21:44:48 +0000171 1)
172 self.assertEqual(x, y,
173 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 +0000174
Walter Dörwalda0021592005-06-13 21:44:48 +0000175 def check_bitop_identities_1(self, x):
176 eq = self.assertEqual
177 eq(x & 0, 0, Frm("x & 0 != 0 for x=%r", x))
178 eq(x | 0, x, Frm("x | 0 != x for x=%r", x))
179 eq(x ^ 0, x, Frm("x ^ 0 != x for x=%r", x))
180 eq(x & -1, x, Frm("x & -1 != x for x=%r", x))
181 eq(x | -1, -1, Frm("x | -1 != -1 for x=%r", x))
182 eq(x ^ -1, ~x, Frm("x ^ -1 != ~x for x=%r", x))
183 eq(x, ~~x, Frm("x != ~~x for x=%r", x))
184 eq(x & x, x, Frm("x & x != x for x=%r", x))
185 eq(x | x, x, Frm("x | x != x for x=%r", x))
186 eq(x ^ x, 0, Frm("x ^ x != 0 for x=%r", x))
187 eq(x & ~x, 0, Frm("x & ~x != 0 for x=%r", x))
188 eq(x | ~x, -1, Frm("x | ~x != -1 for x=%r", x))
189 eq(x ^ ~x, -1, Frm("x ^ ~x != -1 for x=%r", x))
190 eq(-x, 1 + ~x, Frm("not -x == 1 + ~x for x=%r", x))
191 eq(-x, ~(x-1), Frm("not -x == ~(x-1) forx =%r", x))
Guido van Rossum805365e2007-05-07 22:24:25 +0000192 for n in range(2*SHIFT):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000193 p2 = 2 ** n
Walter Dörwalda0021592005-06-13 21:44:48 +0000194 eq(x << n >> n, x,
195 Frm("x << n >> n != x for x=%r, n=%r", (x, n)))
196 eq(x // p2, x >> n,
197 Frm("x // p2 != x >> n for x=%r n=%r p2=%r", (x, n, p2)))
198 eq(x * p2, x << n,
199 Frm("x * p2 != x << n for x=%r n=%r p2=%r", (x, n, p2)))
200 eq(x & -p2, x >> n << n,
201 Frm("not x & -p2 == x >> n << n for x=%r n=%r p2=%r", (x, n, p2)))
202 eq(x & -p2, x & ~(p2 - 1),
203 Frm("not x & -p2 == x & ~(p2 - 1) for x=%r n=%r p2=%r", (x, n, p2)))
Tim Peters7f270ba2002-08-13 21:06:55 +0000204
Walter Dörwalda0021592005-06-13 21:44:48 +0000205 def check_bitop_identities_2(self, x, y):
206 eq = self.assertEqual
207 eq(x & y, y & x, Frm("x & y != y & x for x=%r, y=%r", (x, y)))
208 eq(x | y, y | x, Frm("x | y != y | x for x=%r, y=%r", (x, y)))
209 eq(x ^ y, y ^ x, Frm("x ^ y != y ^ x for x=%r, y=%r", (x, y)))
210 eq(x ^ y ^ x, y, Frm("x ^ y ^ x != y for x=%r, y=%r", (x, y)))
211 eq(x & y, ~(~x | ~y), Frm("x & y != ~(~x | ~y) for x=%r, y=%r", (x, y)))
212 eq(x | y, ~(~x & ~y), Frm("x | y != ~(~x & ~y) for x=%r, y=%r", (x, y)))
213 eq(x ^ y, (x | y) & ~(x & y),
214 Frm("x ^ y != (x | y) & ~(x & y) for x=%r, y=%r", (x, y)))
215 eq(x ^ y, (x & ~y) | (~x & y),
216 Frm("x ^ y == (x & ~y) | (~x & y) for x=%r, y=%r", (x, y)))
217 eq(x ^ y, (x | y) & (~x | ~y),
218 Frm("x ^ y == (x | y) & (~x | ~y) for x=%r, y=%r", (x, y)))
Tim Peters7f270ba2002-08-13 21:06:55 +0000219
Walter Dörwalda0021592005-06-13 21:44:48 +0000220 def check_bitop_identities_3(self, x, y, z):
221 eq = self.assertEqual
222 eq((x & y) & z, x & (y & z),
223 Frm("(x & y) & z != x & (y & z) for x=%r, y=%r, z=%r", (x, y, z)))
224 eq((x | y) | z, x | (y | z),
225 Frm("(x | y) | z != x | (y | z) for x=%r, y=%r, z=%r", (x, y, z)))
226 eq((x ^ y) ^ z, x ^ (y ^ z),
227 Frm("(x ^ y) ^ z != x ^ (y ^ z) for x=%r, y=%r, z=%r", (x, y, z)))
228 eq(x & (y | z), (x & y) | (x & z),
229 Frm("x & (y | z) != (x & y) | (x & z) for x=%r, y=%r, z=%r", (x, y, z)))
230 eq(x | (y & z), (x | y) & (x | z),
231 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 +0000232
Walter Dörwalda0021592005-06-13 21:44:48 +0000233 def test_bitop_identities(self):
234 for x in special:
235 self.check_bitop_identities_1(x)
Guido van Rossum805365e2007-05-07 22:24:25 +0000236 digits = range(1, MAXDIGITS+1)
Walter Dörwalda0021592005-06-13 21:44:48 +0000237 for lenx in digits:
238 x = self.getran(lenx)
239 self.check_bitop_identities_1(x)
240 for leny in digits:
241 y = self.getran(leny)
242 self.check_bitop_identities_2(x, y)
243 self.check_bitop_identities_3(x, y, self.getran((lenx + leny)//2))
Guido van Rossum4365cab1998-08-13 14:20:17 +0000244
Walter Dörwalda0021592005-06-13 21:44:48 +0000245 def slow_format(self, x, base):
Walter Dörwalda0021592005-06-13 21:44:48 +0000246 digits = []
247 sign = 0
248 if x < 0:
249 sign, x = 1, -x
250 while x:
251 x, r = divmod(x, base)
252 digits.append(int(r))
253 digits.reverse()
254 digits = digits or [0]
255 return '-'[:sign] + \
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000256 {2: '0b', 8: '0o', 10: '', 16: '0x'}[base] + \
Guido van Rossumd2dbecb2006-08-18 16:29:54 +0000257 "".join(map(lambda i: "0123456789abcdef"[i], digits))
Guido van Rossum4365cab1998-08-13 14:20:17 +0000258
Walter Dörwalda0021592005-06-13 21:44:48 +0000259 def check_format_1(self, x):
260 for base, mapper in (8, oct), (10, repr), (16, hex):
261 got = mapper(x)
262 expected = self.slow_format(x, base)
263 msg = Frm("%s returned %r but expected %r for %r",
264 mapper.__name__, got, expected, x)
265 self.assertEqual(got, expected, msg)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000266 self.assertEqual(int(got, 0), x, Frm('long("%s", 0) != %r', got, x))
Walter Dörwalda0021592005-06-13 21:44:48 +0000267 # str() has to be checked a little differently since there's no
268 # trailing "L"
269 got = str(x)
Guido van Rossumd2dbecb2006-08-18 16:29:54 +0000270 expected = self.slow_format(x, 10)
Walter Dörwalda0021592005-06-13 21:44:48 +0000271 msg = Frm("%s returned %r but expected %r for %r",
272 mapper.__name__, got, expected, x)
273 self.assertEqual(got, expected, msg)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000274
Walter Dörwalda0021592005-06-13 21:44:48 +0000275 def test_format(self):
276 for x in special:
277 self.check_format_1(x)
Guido van Rossum805365e2007-05-07 22:24:25 +0000278 for i in range(10):
279 for lenx in range(1, MAXDIGITS+1):
Walter Dörwalda0021592005-06-13 21:44:48 +0000280 x = self.getran(lenx)
281 self.check_format_1(x)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000282
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000283 def test_long(self):
284 self.assertEqual(int(314), 314)
285 self.assertEqual(int(3.14), 3)
286 self.assertEqual(int(314), 314)
287 # Check that conversion from float truncates towards zero
288 self.assertEqual(int(-3.14), -3)
289 self.assertEqual(int(3.9), 3)
290 self.assertEqual(int(-3.9), -3)
291 self.assertEqual(int(3.5), 3)
292 self.assertEqual(int(-3.5), -3)
293 self.assertEqual(int("-3"), -3)
294 # Different base:
295 self.assertEqual(int("10",16), 16)
296 # Check conversions from string (same test set as for int(), and then some)
297 LL = [
298 ('1' + '0'*20, 10**20),
299 ('1' + '0'*100, 10**100)
300 ]
301 L2 = L[:]
302 for s, v in L2 + LL:
303 for sign in "", "+", "-":
304 for prefix in "", " ", "\t", " \t\t ":
305 ss = prefix + sign + s
306 vv = v
307 if sign == "-" and v is not ValueError:
308 vv = -v
309 try:
310 self.assertEqual(int(ss), int(vv))
311 except ValueError:
312 pass
313
314 self.assertRaises(ValueError, int, '123\0')
315 self.assertRaises(ValueError, int, '53', 40)
Mark Dickinson9ffc0202009-01-20 20:45:53 +0000316 # trailing L should no longer be accepted...
317 self.assertRaises(ValueError, int, '123L')
318 self.assertRaises(ValueError, int, '123l')
319 self.assertRaises(ValueError, int, '0L')
320 self.assertRaises(ValueError, int, '-37L')
321 self.assertRaises(ValueError, int, '0x32L', 16)
322 self.assertRaises(ValueError, int, '1L', 21)
323 # ... but it's just a normal digit if base >= 22
324 self.assertEqual(int('1L', 22), 43)
325
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000326 self.assertRaises(TypeError, int, 1, 12)
327
328 # SF patch #1638879: embedded NULs were not detected with
329 # explicit base
330 self.assertRaises(ValueError, int, '123\0', 10)
331 self.assertRaises(ValueError, int, '123\x00 245', 20)
332
333 self.assertEqual(int('100000000000000000000000000000000', 2),
334 4294967296)
335 self.assertEqual(int('102002022201221111211', 3), 4294967296)
336 self.assertEqual(int('10000000000000000', 4), 4294967296)
337 self.assertEqual(int('32244002423141', 5), 4294967296)
338 self.assertEqual(int('1550104015504', 6), 4294967296)
339 self.assertEqual(int('211301422354', 7), 4294967296)
340 self.assertEqual(int('40000000000', 8), 4294967296)
341 self.assertEqual(int('12068657454', 9), 4294967296)
342 self.assertEqual(int('4294967296', 10), 4294967296)
343 self.assertEqual(int('1904440554', 11), 4294967296)
344 self.assertEqual(int('9ba461594', 12), 4294967296)
345 self.assertEqual(int('535a79889', 13), 4294967296)
346 self.assertEqual(int('2ca5b7464', 14), 4294967296)
347 self.assertEqual(int('1a20dcd81', 15), 4294967296)
348 self.assertEqual(int('100000000', 16), 4294967296)
349 self.assertEqual(int('a7ffda91', 17), 4294967296)
350 self.assertEqual(int('704he7g4', 18), 4294967296)
351 self.assertEqual(int('4f5aff66', 19), 4294967296)
352 self.assertEqual(int('3723ai4g', 20), 4294967296)
353 self.assertEqual(int('281d55i4', 21), 4294967296)
354 self.assertEqual(int('1fj8b184', 22), 4294967296)
355 self.assertEqual(int('1606k7ic', 23), 4294967296)
356 self.assertEqual(int('mb994ag', 24), 4294967296)
357 self.assertEqual(int('hek2mgl', 25), 4294967296)
358 self.assertEqual(int('dnchbnm', 26), 4294967296)
359 self.assertEqual(int('b28jpdm', 27), 4294967296)
360 self.assertEqual(int('8pfgih4', 28), 4294967296)
361 self.assertEqual(int('76beigg', 29), 4294967296)
362 self.assertEqual(int('5qmcpqg', 30), 4294967296)
363 self.assertEqual(int('4q0jto4', 31), 4294967296)
364 self.assertEqual(int('4000000', 32), 4294967296)
365 self.assertEqual(int('3aokq94', 33), 4294967296)
366 self.assertEqual(int('2qhxjli', 34), 4294967296)
367 self.assertEqual(int('2br45qb', 35), 4294967296)
368 self.assertEqual(int('1z141z4', 36), 4294967296)
369
370 self.assertEqual(int('100000000000000000000000000000001', 2),
371 4294967297)
372 self.assertEqual(int('102002022201221111212', 3), 4294967297)
373 self.assertEqual(int('10000000000000001', 4), 4294967297)
374 self.assertEqual(int('32244002423142', 5), 4294967297)
375 self.assertEqual(int('1550104015505', 6), 4294967297)
376 self.assertEqual(int('211301422355', 7), 4294967297)
377 self.assertEqual(int('40000000001', 8), 4294967297)
378 self.assertEqual(int('12068657455', 9), 4294967297)
379 self.assertEqual(int('4294967297', 10), 4294967297)
380 self.assertEqual(int('1904440555', 11), 4294967297)
381 self.assertEqual(int('9ba461595', 12), 4294967297)
382 self.assertEqual(int('535a7988a', 13), 4294967297)
383 self.assertEqual(int('2ca5b7465', 14), 4294967297)
384 self.assertEqual(int('1a20dcd82', 15), 4294967297)
385 self.assertEqual(int('100000001', 16), 4294967297)
386 self.assertEqual(int('a7ffda92', 17), 4294967297)
387 self.assertEqual(int('704he7g5', 18), 4294967297)
388 self.assertEqual(int('4f5aff67', 19), 4294967297)
389 self.assertEqual(int('3723ai4h', 20), 4294967297)
390 self.assertEqual(int('281d55i5', 21), 4294967297)
391 self.assertEqual(int('1fj8b185', 22), 4294967297)
392 self.assertEqual(int('1606k7id', 23), 4294967297)
393 self.assertEqual(int('mb994ah', 24), 4294967297)
394 self.assertEqual(int('hek2mgm', 25), 4294967297)
395 self.assertEqual(int('dnchbnn', 26), 4294967297)
396 self.assertEqual(int('b28jpdn', 27), 4294967297)
397 self.assertEqual(int('8pfgih5', 28), 4294967297)
398 self.assertEqual(int('76beigh', 29), 4294967297)
399 self.assertEqual(int('5qmcpqh', 30), 4294967297)
400 self.assertEqual(int('4q0jto5', 31), 4294967297)
401 self.assertEqual(int('4000001', 32), 4294967297)
402 self.assertEqual(int('3aokq95', 33), 4294967297)
403 self.assertEqual(int('2qhxjlj', 34), 4294967297)
404 self.assertEqual(int('2br45qc', 35), 4294967297)
405 self.assertEqual(int('1z141z5', 36), 4294967297)
406
407
408 def test_conversion(self):
Mark Dickinsone5e298f2009-01-12 20:49:19 +0000409 # Test __int__()
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000410 class ClassicMissingMethods:
411 pass
412 self.assertRaises(TypeError, int, ClassicMissingMethods())
413
414 class MissingMethods(object):
415 pass
416 self.assertRaises(TypeError, int, MissingMethods())
417
418 class Foo0:
419 def __int__(self):
420 return 42
421
422 class Foo1(object):
423 def __int__(self):
424 return 42
425
426 class Foo2(int):
427 def __int__(self):
428 return 42
429
430 class Foo3(int):
431 def __int__(self):
432 return self
433
434 class Foo4(int):
435 def __int__(self):
436 return 42
437
438 class Foo5(int):
439 def __int__(self):
440 return 42.
441
442 self.assertEqual(int(Foo0()), 42)
443 self.assertEqual(int(Foo1()), 42)
444 self.assertEqual(int(Foo2()), 42)
445 self.assertEqual(int(Foo3()), 0)
446 self.assertEqual(int(Foo4()), 42)
447 self.assertRaises(TypeError, int, Foo5())
448
449 class Classic:
450 pass
451 for base in (object, Classic):
Mark Dickinsone5e298f2009-01-12 20:49:19 +0000452 class IntOverridesTrunc(base):
453 def __int__(self):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000454 return 42
455 def __trunc__(self):
456 return -12
Mark Dickinsone5e298f2009-01-12 20:49:19 +0000457 self.assertEqual(int(IntOverridesTrunc()), 42)
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000458
459 class JustTrunc(base):
460 def __trunc__(self):
461 return 42
462 self.assertEqual(int(JustTrunc()), 42)
463
Mark Dickinsone5e298f2009-01-12 20:49:19 +0000464 class JustLong(base):
465 # test that __long__ no longer used in 3.x
466 def __long__(self):
467 return 42
468 self.assertRaises(TypeError, int, JustLong())
469
470 class LongTrunc(base):
471 # __long__ should be ignored in 3.x
472 def __long__(self):
473 return 42
474 def __trunc__(self):
475 return 1729
476 self.assertEqual(int(LongTrunc()), 1729)
477
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000478 for trunc_result_base in (object, Classic):
479 class Integral(trunc_result_base):
480 def __int__(self):
481 return 42
482
483 class TruncReturnsNonLong(base):
484 def __trunc__(self):
485 return Integral()
486 self.assertEqual(int(TruncReturnsNonLong()), 42)
487
488 class NonIntegral(trunc_result_base):
489 def __trunc__(self):
490 # Check that we avoid infinite recursion.
491 return NonIntegral()
492
493 class TruncReturnsNonIntegral(base):
494 def __trunc__(self):
495 return NonIntegral()
496 try:
497 int(TruncReturnsNonIntegral())
498 except TypeError as e:
499 self.assertEquals(str(e),
500 "__trunc__ returned non-Integral"
501 " (type NonIntegral)")
502 else:
503 self.fail("Failed to raise TypeError with %s" %
504 ((base, trunc_result_base),))
505
Walter Dörwalda0021592005-06-13 21:44:48 +0000506 def test_misc(self):
Guido van Rossum4365cab1998-08-13 14:20:17 +0000507
Walter Dörwalda0021592005-06-13 21:44:48 +0000508 # check the extremes in int<->long conversion
Christian Heimesa37d4c62007-12-04 23:02:19 +0000509 hugepos = sys.maxsize
Walter Dörwalda0021592005-06-13 21:44:48 +0000510 hugeneg = -hugepos - 1
Guido van Rossume2a383d2007-01-15 16:59:06 +0000511 hugepos_aslong = int(hugepos)
512 hugeneg_aslong = int(hugeneg)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000513 self.assertEqual(hugepos, hugepos_aslong, "long(sys.maxsize) != sys.maxsize")
Walter Dörwalda0021592005-06-13 21:44:48 +0000514 self.assertEqual(hugeneg, hugeneg_aslong,
Christian Heimesa37d4c62007-12-04 23:02:19 +0000515 "long(-sys.maxsize-1) != -sys.maxsize-1")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000516
Walter Dörwalda0021592005-06-13 21:44:48 +0000517 # long -> int should not fail for hugepos_aslong or hugeneg_aslong
Thomas Wouters89f507f2006-12-13 04:49:30 +0000518 x = int(hugepos_aslong)
Walter Dörwalda0021592005-06-13 21:44:48 +0000519 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000520 self.assertEqual(x, hugepos,
Christian Heimesa37d4c62007-12-04 23:02:19 +0000521 "converting sys.maxsize to long and back to int fails")
Walter Dörwalda0021592005-06-13 21:44:48 +0000522 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000523 self.fail("int(long(sys.maxsize)) overflowed!")
Thomas Wouters89f507f2006-12-13 04:49:30 +0000524 if not isinstance(x, int):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000525 raise TestFailed("int(long(sys.maxsize)) should have returned int")
Thomas Wouters89f507f2006-12-13 04:49:30 +0000526 x = int(hugeneg_aslong)
Walter Dörwalda0021592005-06-13 21:44:48 +0000527 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000528 self.assertEqual(x, hugeneg,
Christian Heimesa37d4c62007-12-04 23:02:19 +0000529 "converting -sys.maxsize-1 to long and back to int fails")
Walter Dörwalda0021592005-06-13 21:44:48 +0000530 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000531 self.fail("int(long(-sys.maxsize-1)) overflowed!")
Thomas Wouters89f507f2006-12-13 04:49:30 +0000532 if not isinstance(x, int):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000533 raise TestFailed("int(long(-sys.maxsize-1)) should have "
Thomas Wouters89f507f2006-12-13 04:49:30 +0000534 "returned int")
Walter Dörwalda0021592005-06-13 21:44:48 +0000535 # but long -> int should overflow for hugepos+1 and hugeneg-1
536 x = hugepos_aslong + 1
537 try:
538 y = int(x)
539 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000540 self.fail("int(long(sys.maxsize) + 1) mustn't overflow")
Guido van Rossume2a383d2007-01-15 16:59:06 +0000541 self.assert_(isinstance(y, int),
Christian Heimesa37d4c62007-12-04 23:02:19 +0000542 "int(long(sys.maxsize) + 1) should have returned long")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000543
Walter Dörwalda0021592005-06-13 21:44:48 +0000544 x = hugeneg_aslong - 1
545 try:
546 y = int(x)
547 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000548 self.fail("int(long(-sys.maxsize-1) - 1) mustn't overflow")
Guido van Rossume2a383d2007-01-15 16:59:06 +0000549 self.assert_(isinstance(y, int),
Christian Heimesa37d4c62007-12-04 23:02:19 +0000550 "int(long(-sys.maxsize-1) - 1) should have returned long")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000551
Guido van Rossume2a383d2007-01-15 16:59:06 +0000552 class long2(int):
Walter Dörwalda0021592005-06-13 21:44:48 +0000553 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +0000554 x = long2(1<<100)
Walter Dörwaldf1715402002-11-19 20:49:15 +0000555 y = int(x)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000556 self.assert_(type(y) is int,
Walter Dörwalda0021592005-06-13 21:44:48 +0000557 "overflowing int conversion must return long not long subtype")
Guido van Rossum4581a0c1998-10-02 01:19:48 +0000558
Tim Peters26c7fa32001-08-23 22:56:21 +0000559# ----------------------------------- tests of auto int->long conversion
560
Walter Dörwalda0021592005-06-13 21:44:48 +0000561 def test_auto_overflow(self):
562 import math, sys
Tim Peters26c7fa32001-08-23 22:56:21 +0000563
Christian Heimesa37d4c62007-12-04 23:02:19 +0000564 special = [0, 1, 2, 3, sys.maxsize-1, sys.maxsize, sys.maxsize+1]
565 sqrt = int(math.sqrt(sys.maxsize))
Walter Dörwalda0021592005-06-13 21:44:48 +0000566 special.extend([sqrt-1, sqrt, sqrt+1])
567 special.extend([-i for i in special])
Tim Peters26c7fa32001-08-23 22:56:21 +0000568
Walter Dörwalda0021592005-06-13 21:44:48 +0000569 def checkit(*args):
570 # Heavy use of nested scopes here!
571 self.assertEqual(got, expected,
572 Frm("for %r expected %r got %r", args, expected, got))
Tim Peters26c7fa32001-08-23 22:56:21 +0000573
Walter Dörwalda0021592005-06-13 21:44:48 +0000574 for x in special:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000575 longx = int(x)
Tim Peters26c7fa32001-08-23 22:56:21 +0000576
Walter Dörwalda0021592005-06-13 21:44:48 +0000577 expected = -longx
578 got = -x
579 checkit('-', x)
Tim Peters26c7fa32001-08-23 22:56:21 +0000580
Walter Dörwalda0021592005-06-13 21:44:48 +0000581 for y in special:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000582 longy = int(y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000583
Walter Dörwalda0021592005-06-13 21:44:48 +0000584 expected = longx + longy
585 got = x + y
586 checkit(x, '+', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000587
Walter Dörwalda0021592005-06-13 21:44:48 +0000588 expected = longx - longy
589 got = x - y
590 checkit(x, '-', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000591
Walter Dörwalda0021592005-06-13 21:44:48 +0000592 expected = longx * longy
593 got = x * y
594 checkit(x, '*', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000595
Walter Dörwalda0021592005-06-13 21:44:48 +0000596 if y:
597 expected = longx / longy
598 got = x / y
599 checkit(x, '/', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000600
Walter Dörwalda0021592005-06-13 21:44:48 +0000601 expected = longx // longy
602 got = x // y
603 checkit(x, '//', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000604
Walter Dörwalda0021592005-06-13 21:44:48 +0000605 expected = divmod(longx, longy)
606 got = divmod(longx, longy)
607 checkit(x, 'divmod', y)
Tim Petersa3653092001-08-23 23:02:57 +0000608
Walter Dörwalda0021592005-06-13 21:44:48 +0000609 if abs(y) < 5 and not (x == 0 and y < 0):
610 expected = longx ** longy
611 got = x ** y
612 checkit(x, '**', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000613
Walter Dörwalda0021592005-06-13 21:44:48 +0000614 for z in special:
615 if z != 0 :
616 if y >= 0:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000617 expected = pow(longx, longy, int(z))
Walter Dörwalda0021592005-06-13 21:44:48 +0000618 got = pow(x, y, z)
619 checkit('pow', x, y, '%', z)
Tim Peters32f453e2001-09-03 08:35:41 +0000620 else:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000621 self.assertRaises(TypeError, pow,longx, longy, int(z))
Tim Peters26c7fa32001-08-23 22:56:21 +0000622
Walter Dörwalda0021592005-06-13 21:44:48 +0000623 def test_float_overflow(self):
624 import math
Tim Peters9fffa3e2001-09-04 05:14:19 +0000625
Walter Dörwalda0021592005-06-13 21:44:48 +0000626 for x in -2.0, -1.0, 0.0, 1.0, 2.0:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000627 self.assertEqual(float(int(x)), x)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000628
Walter Dörwalda0021592005-06-13 21:44:48 +0000629 shuge = '12345' * 120
Guido van Rossume2a383d2007-01-15 16:59:06 +0000630 huge = 1 << 30000
Walter Dörwalda0021592005-06-13 21:44:48 +0000631 mhuge = -huge
632 namespace = {'huge': huge, 'mhuge': mhuge, 'shuge': shuge, 'math': math}
633 for test in ["float(huge)", "float(mhuge)",
634 "complex(huge)", "complex(mhuge)",
635 "complex(huge, 1)", "complex(mhuge, 1)",
636 "complex(1, huge)", "complex(1, mhuge)",
637 "1. + huge", "huge + 1.", "1. + mhuge", "mhuge + 1.",
638 "1. - huge", "huge - 1.", "1. - mhuge", "mhuge - 1.",
639 "1. * huge", "huge * 1.", "1. * mhuge", "mhuge * 1.",
640 "1. // huge", "huge // 1.", "1. // mhuge", "mhuge // 1.",
641 "1. / huge", "huge / 1.", "1. / mhuge", "mhuge / 1.",
642 "1. ** huge", "huge ** 1.", "1. ** mhuge", "mhuge ** 1.",
643 "math.sin(huge)", "math.sin(mhuge)",
644 "math.sqrt(huge)", "math.sqrt(mhuge)", # should do better
Guido van Rossum28bbe422007-08-24 03:46:30 +0000645 # math.floor() of an int returns an int now
646 ##"math.floor(huge)", "math.floor(mhuge)",
647 ]:
Tim Peters9fffa3e2001-09-04 05:14:19 +0000648
Walter Dörwalda0021592005-06-13 21:44:48 +0000649 self.assertRaises(OverflowError, eval, test, namespace)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000650
Walter Dörwalda0021592005-06-13 21:44:48 +0000651 # XXX Perhaps float(shuge) can raise OverflowError on some box?
652 # The comparison should not.
653 self.assertNotEqual(float(shuge), int(shuge),
654 "float(shuge) should not equal int(shuge)")
Tim Peters83e7ccc2001-09-04 06:37:28 +0000655
Walter Dörwalda0021592005-06-13 21:44:48 +0000656 def test_logs(self):
657 import math
Tim Peters78526162001-09-05 00:53:45 +0000658
Walter Dörwalda0021592005-06-13 21:44:48 +0000659 LOG10E = math.log10(math.e)
Tim Peters307fa782004-09-23 08:06:40 +0000660
Guido van Rossum805365e2007-05-07 22:24:25 +0000661 for exp in list(range(10)) + [100, 1000, 10000]:
Walter Dörwalda0021592005-06-13 21:44:48 +0000662 value = 10 ** exp
663 log10 = math.log10(value)
664 self.assertAlmostEqual(log10, exp)
Tim Peters78526162001-09-05 00:53:45 +0000665
Walter Dörwalda0021592005-06-13 21:44:48 +0000666 # log10(value) == exp, so log(value) == log10(value)/log10(e) ==
667 # exp/LOG10E
668 expected = exp / LOG10E
669 log = math.log(value)
670 self.assertAlmostEqual(log, expected)
Tim Peters78526162001-09-05 00:53:45 +0000671
Guido van Rossume2a383d2007-01-15 16:59:06 +0000672 for bad in -(1 << 10000), -2, 0:
Walter Dörwalda0021592005-06-13 21:44:48 +0000673 self.assertRaises(ValueError, math.log, bad)
674 self.assertRaises(ValueError, math.log10, bad)
Tim Peters78526162001-09-05 00:53:45 +0000675
Walter Dörwalda0021592005-06-13 21:44:48 +0000676 def test_mixed_compares(self):
677 eq = self.assertEqual
678 import math
Tim Peters78526162001-09-05 00:53:45 +0000679
Walter Dörwalda0021592005-06-13 21:44:48 +0000680 # We're mostly concerned with that mixing floats and longs does the
681 # right stuff, even when longs are too large to fit in a float.
682 # The safest way to check the results is to use an entirely different
683 # method, which we do here via a skeletal rational class (which
684 # represents all Python ints, longs and floats exactly).
685 class Rat:
686 def __init__(self, value):
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000687 if isinstance(value, int):
Walter Dörwalda0021592005-06-13 21:44:48 +0000688 self.n = value
689 self.d = 1
690 elif isinstance(value, float):
691 # Convert to exact rational equivalent.
692 f, e = math.frexp(abs(value))
693 assert f == 0 or 0.5 <= f < 1.0
694 # |value| = f * 2**e exactly
Tim Peters78526162001-09-05 00:53:45 +0000695
Walter Dörwalda0021592005-06-13 21:44:48 +0000696 # Suck up CHUNK bits at a time; 28 is enough so that we suck
697 # up all bits in 2 iterations for all known binary double-
698 # precision formats, and small enough to fit in an int.
699 CHUNK = 28
700 top = 0
701 # invariant: |value| = (top + f) * 2**e exactly
702 while f:
703 f = math.ldexp(f, CHUNK)
704 digit = int(f)
705 assert digit >> CHUNK == 0
706 top = (top << CHUNK) | digit
707 f -= digit
708 assert 0.0 <= f < 1.0
709 e -= CHUNK
Tim Peters78526162001-09-05 00:53:45 +0000710
Walter Dörwalda0021592005-06-13 21:44:48 +0000711 # Now |value| = top * 2**e exactly.
712 if e >= 0:
713 n = top << e
714 d = 1
715 else:
716 n = top
717 d = 1 << -e
718 if value < 0:
719 n = -n
720 self.n = n
721 self.d = d
722 assert float(n) / float(d) == value
Tim Peters307fa782004-09-23 08:06:40 +0000723 else:
Walter Dörwalda0021592005-06-13 21:44:48 +0000724 raise TypeError("can't deal with %r" % val)
Tim Peters307fa782004-09-23 08:06:40 +0000725
Benjamin Peterson60192082008-10-16 19:34:46 +0000726 def _cmp__(self, other):
Walter Dörwalda0021592005-06-13 21:44:48 +0000727 if not isinstance(other, Rat):
728 other = Rat(other)
Mark Dickinsona56c4672009-01-27 18:17:45 +0000729 x, y = self.n * other.d, self.d * other.n
730 return (x > y) - (x < y)
Benjamin Peterson60192082008-10-16 19:34:46 +0000731 def __eq__(self, other):
732 return self._cmp__(other) == 0
733 def __ne__(self, other):
734 return self._cmp__(other) != 0
735 def __ge__(self, other):
736 return self._cmp__(other) >= 0
737 def __gt__(self, other):
738 return self._cmp__(other) > 0
739 def __le__(self, other):
740 return self._cmp__(other) <= 0
741 def __lt__(self, other):
742 return self._cmp__(other) < 0
Tim Peters307fa782004-09-23 08:06:40 +0000743
Walter Dörwalda0021592005-06-13 21:44:48 +0000744 cases = [0, 0.001, 0.99, 1.0, 1.5, 1e20, 1e200]
745 # 2**48 is an important boundary in the internals. 2**53 is an
746 # important boundary for IEEE double precision.
747 for t in 2.0**48, 2.0**50, 2.0**53:
748 cases.extend([t - 1.0, t - 0.3, t, t + 0.3, t + 1.0,
Guido van Rossume2a383d2007-01-15 16:59:06 +0000749 int(t-1), int(t), int(t+1)])
Christian Heimesa37d4c62007-12-04 23:02:19 +0000750 cases.extend([0, 1, 2, sys.maxsize, float(sys.maxsize)])
Walter Dörwalda0021592005-06-13 21:44:48 +0000751 # 1L<<20000 should exceed all double formats. long(1e200) is to
752 # check that we get equality with 1e200 above.
Guido van Rossume2a383d2007-01-15 16:59:06 +0000753 t = int(1e200)
754 cases.extend([0, 1, 2, 1 << 20000, t-1, t, t+1])
Walter Dörwalda0021592005-06-13 21:44:48 +0000755 cases.extend([-x for x in cases])
756 for x in cases:
757 Rx = Rat(x)
758 for y in cases:
759 Ry = Rat(y)
Mark Dickinsona56c4672009-01-27 18:17:45 +0000760 Rcmp = (Rx > Ry) - (Rx < Ry)
761 xycmp = (x > y) - (x < y)
Walter Dörwalda0021592005-06-13 21:44:48 +0000762 eq(Rcmp, xycmp, Frm("%r %r %d %d", x, y, Rcmp, xycmp))
763 eq(x == y, Rcmp == 0, Frm("%r == %r %d", x, y, Rcmp))
764 eq(x != y, Rcmp != 0, Frm("%r != %r %d", x, y, Rcmp))
765 eq(x < y, Rcmp < 0, Frm("%r < %r %d", x, y, Rcmp))
766 eq(x <= y, Rcmp <= 0, Frm("%r <= %r %d", x, y, Rcmp))
767 eq(x > y, Rcmp > 0, Frm("%r > %r %d", x, y, Rcmp))
768 eq(x >= y, Rcmp >= 0, Frm("%r >= %r %d", x, y, Rcmp))
Tim Peters307fa782004-09-23 08:06:40 +0000769
Eric Smith0dd1b632008-02-11 17:55:01 +0000770 def test__format__(self):
Eric Smith8c663262007-08-25 02:26:07 +0000771 self.assertEqual(format(123456789, 'd'), '123456789')
772 self.assertEqual(format(123456789, 'd'), '123456789')
773
Eric Smith185e30c2007-08-30 22:23:08 +0000774 # sign and aligning are interdependent
775 self.assertEqual(format(1, "-"), '1')
776 self.assertEqual(format(-1, "-"), '-1')
777 self.assertEqual(format(1, "-3"), ' 1')
778 self.assertEqual(format(-1, "-3"), ' -1')
779 self.assertEqual(format(1, "+3"), ' +1')
780 self.assertEqual(format(-1, "+3"), ' -1')
781 self.assertEqual(format(1, " 3"), ' 1')
782 self.assertEqual(format(-1, " 3"), ' -1')
783 self.assertEqual(format(1, " "), ' 1')
784 self.assertEqual(format(-1, " "), '-1')
785
Eric Smith8c663262007-08-25 02:26:07 +0000786 # hex
787 self.assertEqual(format(3, "x"), "3")
788 self.assertEqual(format(3, "X"), "3")
789 self.assertEqual(format(1234, "x"), "4d2")
790 self.assertEqual(format(-1234, "x"), "-4d2")
791 self.assertEqual(format(1234, "8x"), " 4d2")
Eric Smith185e30c2007-08-30 22:23:08 +0000792 self.assertEqual(format(-1234, "8x"), " -4d2")
Eric Smith8c663262007-08-25 02:26:07 +0000793 self.assertEqual(format(1234, "x"), "4d2")
794 self.assertEqual(format(-1234, "x"), "-4d2")
795 self.assertEqual(format(-3, "x"), "-3")
796 self.assertEqual(format(-3, "X"), "-3")
797 self.assertEqual(format(int('be', 16), "x"), "be")
798 self.assertEqual(format(int('be', 16), "X"), "BE")
799 self.assertEqual(format(-int('be', 16), "x"), "-be")
800 self.assertEqual(format(-int('be', 16), "X"), "-BE")
801
802 # octal
803 self.assertEqual(format(3, "b"), "11")
804 self.assertEqual(format(-3, "b"), "-11")
805 self.assertEqual(format(1234, "b"), "10011010010")
806 self.assertEqual(format(-1234, "b"), "-10011010010")
807 self.assertEqual(format(1234, "-b"), "10011010010")
808 self.assertEqual(format(-1234, "-b"), "-10011010010")
809 self.assertEqual(format(1234, " b"), " 10011010010")
810 self.assertEqual(format(-1234, " b"), "-10011010010")
811 self.assertEqual(format(1234, "+b"), "+10011010010")
812 self.assertEqual(format(-1234, "+b"), "-10011010010")
813
Eric Smith8c663262007-08-25 02:26:07 +0000814 # make sure these are errors
815 self.assertRaises(ValueError, format, 3, "1.3") # precision disallowed
Eric Smith8c663262007-08-25 02:26:07 +0000816 self.assertRaises(ValueError, format, 3, "+c") # sign not allowed
817 # with 'c'
Eric Smithfa767ef2008-01-28 10:59:27 +0000818
819 # ensure that only int and float type specifiers work
Eric Smith7b69c6c2008-01-27 21:07:59 +0000820 for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] +
821 [chr(x) for x in range(ord('A'), ord('Z')+1)]):
Eric Smithfa767ef2008-01-28 10:59:27 +0000822 if not format_spec in 'bcdoxXeEfFgGn%':
Eric Smith7b69c6c2008-01-27 21:07:59 +0000823 self.assertRaises(ValueError, format, 0, format_spec)
824 self.assertRaises(ValueError, format, 1, format_spec)
825 self.assertRaises(ValueError, format, -1, format_spec)
826 self.assertRaises(ValueError, format, 2**100, format_spec)
827 self.assertRaises(ValueError, format, -(2**100), format_spec)
828
Eric Smithfa767ef2008-01-28 10:59:27 +0000829 # ensure that float type specifiers work; format converts
830 # the int to a float
Eric Smith5807c412008-05-11 21:00:57 +0000831 for format_spec in 'eEfFgG%':
Eric Smithfa767ef2008-01-28 10:59:27 +0000832 for value in [0, 1, -1, 100, -100, 1234567890, -1234567890]:
833 self.assertEqual(format(value, format_spec),
834 format(float(value), format_spec))
Eric Smith8c663262007-08-25 02:26:07 +0000835
Christian Heimesa34706f2008-01-04 03:06:10 +0000836 def test_nan_inf(self):
Christian Heimes1aa7b302008-01-04 03:22:53 +0000837 self.assertRaises(OverflowError, int, float('inf'))
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000838 self.assertRaises(OverflowError, int, float('-inf'))
839 self.assertRaises(ValueError, int, float('nan'))
Christian Heimesa34706f2008-01-04 03:06:10 +0000840
Benjamin Peterson875d4c02008-07-13 17:44:16 +0000841 def test_true_division(self):
842 huge = 1 << 40000
843 mhuge = -huge
844 self.assertEqual(huge / huge, 1.0)
845 self.assertEqual(mhuge / mhuge, 1.0)
846 self.assertEqual(huge / mhuge, -1.0)
847 self.assertEqual(mhuge / huge, -1.0)
848 self.assertEqual(1 / huge, 0.0)
849 self.assertEqual(1 / huge, 0.0)
850 self.assertEqual(1 / mhuge, 0.0)
851 self.assertEqual(1 / mhuge, 0.0)
852 self.assertEqual((666 * huge + (huge >> 1)) / huge, 666.5)
853 self.assertEqual((666 * mhuge + (mhuge >> 1)) / mhuge, 666.5)
854 self.assertEqual((666 * huge + (huge >> 1)) / mhuge, -666.5)
855 self.assertEqual((666 * mhuge + (mhuge >> 1)) / huge, -666.5)
856 self.assertEqual(huge / (huge << 1), 0.5)
857 self.assertEqual((1000000 * huge) / huge, 1000000)
858
859 namespace = {'huge': huge, 'mhuge': mhuge}
860
861 for overflow in ["float(huge)", "float(mhuge)",
862 "huge / 1", "huge / 2", "huge / -1", "huge / -2",
863 "mhuge / 100", "mhuge / 200"]:
864 self.assertRaises(OverflowError, eval, overflow, namespace)
865
866 for underflow in ["1 / huge", "2 / huge", "-1 / huge", "-2 / huge",
867 "100 / mhuge", "200 / mhuge"]:
868 result = eval(underflow, namespace)
869 self.assertEqual(result, 0.0,
870 "expected underflow to 0 from %r" % underflow)
871
872 for zero in ["huge / 0", "mhuge / 0"]:
873 self.assertRaises(ZeroDivisionError, eval, zero, namespace)
874
875
Facundo Batista6e6f59b2008-07-24 18:57:11 +0000876 def test_small_ints(self):
877 for i in range(-5, 257):
878 self.assertTrue(i is i + 0)
879 self.assertTrue(i is i * 1)
880 self.assertTrue(i is i - 0)
881 self.assertTrue(i is i // 1)
882 self.assertTrue(i is i & -1)
883 self.assertTrue(i is i | 0)
884 self.assertTrue(i is i ^ 0)
885 self.assertTrue(i is ~~i)
886 self.assertTrue(i is i**1)
887 self.assertTrue(i is int(str(i)))
888 self.assertTrue(i is i<<2>>2, str(i))
889 # corner cases
890 i = 1 << 70
891 self.assertTrue(i - i is 0)
892 self.assertTrue(0 * i is 0)
893
Mark Dickinson54bc1ec2008-12-17 16:19:07 +0000894 def test_bit_length(self):
895 tiny = 1e-10
896 for x in range(-65000, 65000):
897 k = x.bit_length()
898 # Check equivalence with Python version
899 self.assertEqual(k, len(bin(x).lstrip('-0b')))
900 # Behaviour as specified in the docs
901 if x != 0:
902 self.assert_(2**(k-1) <= abs(x) < 2**k)
903 else:
904 self.assertEqual(k, 0)
905 # Alternative definition: x.bit_length() == 1 + floor(log_2(x))
906 if x != 0:
907 # When x is an exact power of 2, numeric errors can
908 # cause floor(log(x)/log(2)) to be one too small; for
909 # small x this can be fixed by adding a small quantity
910 # to the quotient before taking the floor.
911 self.assertEqual(k, 1 + math.floor(
912 math.log(abs(x))/math.log(2) + tiny))
913
914 self.assertEqual((0).bit_length(), 0)
915 self.assertEqual((1).bit_length(), 1)
916 self.assertEqual((-1).bit_length(), 1)
917 self.assertEqual((2).bit_length(), 2)
918 self.assertEqual((-2).bit_length(), 2)
919 for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64, 234]:
920 a = 2**i
921 self.assertEqual((a-1).bit_length(), i)
922 self.assertEqual((1-a).bit_length(), i)
923 self.assertEqual((a).bit_length(), i+1)
924 self.assertEqual((-a).bit_length(), i+1)
925 self.assertEqual((a+1).bit_length(), i+1)
926 self.assertEqual((-a-1).bit_length(), i+1)
927
Mark Dickinson1124e712009-01-28 21:25:58 +0000928 def test_round(self):
929 # check round-half-even algorithm. For round to nearest ten;
930 # rounding map is invariant under adding multiples of 20
931 test_dict = {0:0, 1:0, 2:0, 3:0, 4:0, 5:0,
932 6:10, 7:10, 8:10, 9:10, 10:10, 11:10, 12:10, 13:10, 14:10,
933 15:20, 16:20, 17:20, 18:20, 19:20}
934 for offset in range(-520, 520, 20):
935 for k, v in test_dict.items():
936 got = round(k+offset, -1)
937 expected = v+offset
938 self.assertEqual(got, expected)
939 self.assert_(type(got) is int)
940
941 # larger second argument
942 self.assertEqual(round(-150, -2), -200)
943 self.assertEqual(round(-149, -2), -100)
944 self.assertEqual(round(-51, -2), -100)
945 self.assertEqual(round(-50, -2), 0)
946 self.assertEqual(round(-49, -2), 0)
947 self.assertEqual(round(-1, -2), 0)
948 self.assertEqual(round(0, -2), 0)
949 self.assertEqual(round(1, -2), 0)
950 self.assertEqual(round(49, -2), 0)
951 self.assertEqual(round(50, -2), 0)
952 self.assertEqual(round(51, -2), 100)
953 self.assertEqual(round(149, -2), 100)
954 self.assertEqual(round(150, -2), 200)
955 self.assertEqual(round(250, -2), 200)
956 self.assertEqual(round(251, -2), 300)
957 self.assertEqual(round(172500, -3), 172000)
958 self.assertEqual(round(173500, -3), 174000)
959 self.assertEqual(round(31415926535, -1), 31415926540)
960 self.assertEqual(round(31415926535, -2), 31415926500)
961 self.assertEqual(round(31415926535, -3), 31415927000)
962 self.assertEqual(round(31415926535, -4), 31415930000)
963 self.assertEqual(round(31415926535, -5), 31415900000)
964 self.assertEqual(round(31415926535, -6), 31416000000)
965 self.assertEqual(round(31415926535, -7), 31420000000)
966 self.assertEqual(round(31415926535, -8), 31400000000)
967 self.assertEqual(round(31415926535, -9), 31000000000)
968 self.assertEqual(round(31415926535, -10), 30000000000)
969 self.assertEqual(round(31415926535, -11), 0)
970 self.assertEqual(round(31415926535, -12), 0)
971 self.assertEqual(round(31415926535, -999), 0)
972
973 # should get correct results even for huge inputs
974 for k in range(10, 100):
975 got = round(10**k + 324678, -3)
976 expect = 10**k + 325000
977 self.assertEqual(got, expect)
978 self.assert_(type(got) is int)
979
980 # nonnegative second argument: round(x, n) should just return x
981 for n in range(5):
982 for i in range(100):
983 x = random.randrange(-10000, 10000)
984 got = round(x, n)
985 self.assertEqual(got, x)
986 self.assert_(type(got) is int)
987 for huge_n in 2**31-1, 2**31, 2**63-1, 2**63, 2**100, 10**100:
988 self.assertEqual(round(8979323, huge_n), 8979323)
989
990 # omitted second argument
991 for i in range(100):
992 x = random.randrange(-10000, 10000)
993 got = round(x)
994 self.assertEqual(got, x)
995 self.assert_(type(got) is int)
996
997 # bad second argument
998 bad_exponents = ('brian', 2.0, 0j, None)
999 for e in bad_exponents:
1000 self.assertRaises(TypeError, round, 3, e)
1001
1002
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00001003
Walter Dörwalda0021592005-06-13 21:44:48 +00001004def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001005 support.run_unittest(LongTest)
Tim Peters307fa782004-09-23 08:06:40 +00001006
Walter Dörwalda0021592005-06-13 21:44:48 +00001007if __name__ == "__main__":
1008 test_main()