blob: 53d3e6b9b127a696a060ce4444c175f6f306e15d [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
Mark Dickinsonc6300392009-04-20 21:38:00 +0000623 @unittest.skipUnless(float.__getformat__("double").startswith("IEEE"),
624 "test requires IEEE 754 doubles")
625 def test_float_conversion(self):
626 import sys
627 DBL_MAX = sys.float_info.max
628 DBL_MAX_EXP = sys.float_info.max_exp
629 DBL_MANT_DIG = sys.float_info.mant_dig
630
631 exact_values = [0, 1, 2,
632 2**53-3,
633 2**53-2,
634 2**53-1,
635 2**53,
636 2**53+2,
637 2**54-4,
638 2**54-2,
639 2**54,
640 2**54+4]
641 for x in exact_values:
642 self.assertEqual(float(x), x)
643 self.assertEqual(float(-x), -x)
644
645 # test round-half-even
646 for x, y in [(1, 0), (2, 2), (3, 4), (4, 4), (5, 4), (6, 6), (7, 8)]:
647 for p in range(15):
648 self.assertEqual(int(float(2**p*(2**53+x))), 2**p*(2**53+y))
649
650 for x, y in [(0, 0), (1, 0), (2, 0), (3, 4), (4, 4), (5, 4), (6, 8),
651 (7, 8), (8, 8), (9, 8), (10, 8), (11, 12), (12, 12),
652 (13, 12), (14, 16), (15, 16)]:
653 for p in range(15):
654 self.assertEqual(int(float(2**p*(2**54+x))), 2**p*(2**54+y))
655
656 # behaviour near extremes of floating-point range
657 int_dbl_max = int(DBL_MAX)
658 top_power = 2**DBL_MAX_EXP
659 halfway = (int_dbl_max + top_power)//2
660 self.assertEqual(float(int_dbl_max), DBL_MAX)
661 self.assertEqual(float(int_dbl_max+1), DBL_MAX)
662 self.assertEqual(float(halfway-1), DBL_MAX)
663 self.assertRaises(OverflowError, float, halfway)
664 self.assertEqual(float(1-halfway), -DBL_MAX)
665 self.assertRaises(OverflowError, float, -halfway)
666 self.assertRaises(OverflowError, float, top_power-1)
667 self.assertRaises(OverflowError, float, top_power)
668 self.assertRaises(OverflowError, float, top_power+1)
669 self.assertRaises(OverflowError, float, 2*top_power-1)
670 self.assertRaises(OverflowError, float, 2*top_power)
671 self.assertRaises(OverflowError, float, top_power*top_power)
672
673 for p in range(100):
674 x = 2**p * (2**53 + 1) + 1
675 y = 2**p * (2**53 + 2)
676 self.assertEqual(int(float(x)), y)
677
678 x = 2**p * (2**53 + 1)
679 y = 2**p * 2**53
680 self.assertEqual(int(float(x)), y)
681
Walter Dörwalda0021592005-06-13 21:44:48 +0000682 def test_float_overflow(self):
683 import math
Tim Peters9fffa3e2001-09-04 05:14:19 +0000684
Walter Dörwalda0021592005-06-13 21:44:48 +0000685 for x in -2.0, -1.0, 0.0, 1.0, 2.0:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000686 self.assertEqual(float(int(x)), x)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000687
Walter Dörwalda0021592005-06-13 21:44:48 +0000688 shuge = '12345' * 120
Guido van Rossume2a383d2007-01-15 16:59:06 +0000689 huge = 1 << 30000
Walter Dörwalda0021592005-06-13 21:44:48 +0000690 mhuge = -huge
691 namespace = {'huge': huge, 'mhuge': mhuge, 'shuge': shuge, 'math': math}
692 for test in ["float(huge)", "float(mhuge)",
693 "complex(huge)", "complex(mhuge)",
694 "complex(huge, 1)", "complex(mhuge, 1)",
695 "complex(1, huge)", "complex(1, mhuge)",
696 "1. + huge", "huge + 1.", "1. + mhuge", "mhuge + 1.",
697 "1. - huge", "huge - 1.", "1. - mhuge", "mhuge - 1.",
698 "1. * huge", "huge * 1.", "1. * mhuge", "mhuge * 1.",
699 "1. // huge", "huge // 1.", "1. // mhuge", "mhuge // 1.",
700 "1. / huge", "huge / 1.", "1. / mhuge", "mhuge / 1.",
701 "1. ** huge", "huge ** 1.", "1. ** mhuge", "mhuge ** 1.",
702 "math.sin(huge)", "math.sin(mhuge)",
703 "math.sqrt(huge)", "math.sqrt(mhuge)", # should do better
Guido van Rossum28bbe422007-08-24 03:46:30 +0000704 # math.floor() of an int returns an int now
705 ##"math.floor(huge)", "math.floor(mhuge)",
706 ]:
Tim Peters9fffa3e2001-09-04 05:14:19 +0000707
Walter Dörwalda0021592005-06-13 21:44:48 +0000708 self.assertRaises(OverflowError, eval, test, namespace)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000709
Walter Dörwalda0021592005-06-13 21:44:48 +0000710 # XXX Perhaps float(shuge) can raise OverflowError on some box?
711 # The comparison should not.
712 self.assertNotEqual(float(shuge), int(shuge),
713 "float(shuge) should not equal int(shuge)")
Tim Peters83e7ccc2001-09-04 06:37:28 +0000714
Walter Dörwalda0021592005-06-13 21:44:48 +0000715 def test_logs(self):
716 import math
Tim Peters78526162001-09-05 00:53:45 +0000717
Walter Dörwalda0021592005-06-13 21:44:48 +0000718 LOG10E = math.log10(math.e)
Tim Peters307fa782004-09-23 08:06:40 +0000719
Guido van Rossum805365e2007-05-07 22:24:25 +0000720 for exp in list(range(10)) + [100, 1000, 10000]:
Walter Dörwalda0021592005-06-13 21:44:48 +0000721 value = 10 ** exp
722 log10 = math.log10(value)
723 self.assertAlmostEqual(log10, exp)
Tim Peters78526162001-09-05 00:53:45 +0000724
Walter Dörwalda0021592005-06-13 21:44:48 +0000725 # log10(value) == exp, so log(value) == log10(value)/log10(e) ==
726 # exp/LOG10E
727 expected = exp / LOG10E
728 log = math.log(value)
729 self.assertAlmostEqual(log, expected)
Tim Peters78526162001-09-05 00:53:45 +0000730
Guido van Rossume2a383d2007-01-15 16:59:06 +0000731 for bad in -(1 << 10000), -2, 0:
Walter Dörwalda0021592005-06-13 21:44:48 +0000732 self.assertRaises(ValueError, math.log, bad)
733 self.assertRaises(ValueError, math.log10, bad)
Tim Peters78526162001-09-05 00:53:45 +0000734
Walter Dörwalda0021592005-06-13 21:44:48 +0000735 def test_mixed_compares(self):
736 eq = self.assertEqual
737 import math
Tim Peters78526162001-09-05 00:53:45 +0000738
Walter Dörwalda0021592005-06-13 21:44:48 +0000739 # We're mostly concerned with that mixing floats and longs does the
740 # right stuff, even when longs are too large to fit in a float.
741 # The safest way to check the results is to use an entirely different
742 # method, which we do here via a skeletal rational class (which
743 # represents all Python ints, longs and floats exactly).
744 class Rat:
745 def __init__(self, value):
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000746 if isinstance(value, int):
Walter Dörwalda0021592005-06-13 21:44:48 +0000747 self.n = value
748 self.d = 1
749 elif isinstance(value, float):
750 # Convert to exact rational equivalent.
751 f, e = math.frexp(abs(value))
752 assert f == 0 or 0.5 <= f < 1.0
753 # |value| = f * 2**e exactly
Tim Peters78526162001-09-05 00:53:45 +0000754
Walter Dörwalda0021592005-06-13 21:44:48 +0000755 # Suck up CHUNK bits at a time; 28 is enough so that we suck
756 # up all bits in 2 iterations for all known binary double-
757 # precision formats, and small enough to fit in an int.
758 CHUNK = 28
759 top = 0
760 # invariant: |value| = (top + f) * 2**e exactly
761 while f:
762 f = math.ldexp(f, CHUNK)
763 digit = int(f)
764 assert digit >> CHUNK == 0
765 top = (top << CHUNK) | digit
766 f -= digit
767 assert 0.0 <= f < 1.0
768 e -= CHUNK
Tim Peters78526162001-09-05 00:53:45 +0000769
Walter Dörwalda0021592005-06-13 21:44:48 +0000770 # Now |value| = top * 2**e exactly.
771 if e >= 0:
772 n = top << e
773 d = 1
774 else:
775 n = top
776 d = 1 << -e
777 if value < 0:
778 n = -n
779 self.n = n
780 self.d = d
781 assert float(n) / float(d) == value
Tim Peters307fa782004-09-23 08:06:40 +0000782 else:
Walter Dörwalda0021592005-06-13 21:44:48 +0000783 raise TypeError("can't deal with %r" % val)
Tim Peters307fa782004-09-23 08:06:40 +0000784
Benjamin Peterson60192082008-10-16 19:34:46 +0000785 def _cmp__(self, other):
Walter Dörwalda0021592005-06-13 21:44:48 +0000786 if not isinstance(other, Rat):
787 other = Rat(other)
Mark Dickinsona56c4672009-01-27 18:17:45 +0000788 x, y = self.n * other.d, self.d * other.n
789 return (x > y) - (x < y)
Benjamin Peterson60192082008-10-16 19:34:46 +0000790 def __eq__(self, other):
791 return self._cmp__(other) == 0
792 def __ne__(self, other):
793 return self._cmp__(other) != 0
794 def __ge__(self, other):
795 return self._cmp__(other) >= 0
796 def __gt__(self, other):
797 return self._cmp__(other) > 0
798 def __le__(self, other):
799 return self._cmp__(other) <= 0
800 def __lt__(self, other):
801 return self._cmp__(other) < 0
Tim Peters307fa782004-09-23 08:06:40 +0000802
Walter Dörwalda0021592005-06-13 21:44:48 +0000803 cases = [0, 0.001, 0.99, 1.0, 1.5, 1e20, 1e200]
804 # 2**48 is an important boundary in the internals. 2**53 is an
805 # important boundary for IEEE double precision.
806 for t in 2.0**48, 2.0**50, 2.0**53:
807 cases.extend([t - 1.0, t - 0.3, t, t + 0.3, t + 1.0,
Guido van Rossume2a383d2007-01-15 16:59:06 +0000808 int(t-1), int(t), int(t+1)])
Christian Heimesa37d4c62007-12-04 23:02:19 +0000809 cases.extend([0, 1, 2, sys.maxsize, float(sys.maxsize)])
Walter Dörwalda0021592005-06-13 21:44:48 +0000810 # 1L<<20000 should exceed all double formats. long(1e200) is to
811 # check that we get equality with 1e200 above.
Guido van Rossume2a383d2007-01-15 16:59:06 +0000812 t = int(1e200)
813 cases.extend([0, 1, 2, 1 << 20000, t-1, t, t+1])
Walter Dörwalda0021592005-06-13 21:44:48 +0000814 cases.extend([-x for x in cases])
815 for x in cases:
816 Rx = Rat(x)
817 for y in cases:
818 Ry = Rat(y)
Mark Dickinsona56c4672009-01-27 18:17:45 +0000819 Rcmp = (Rx > Ry) - (Rx < Ry)
820 xycmp = (x > y) - (x < y)
Walter Dörwalda0021592005-06-13 21:44:48 +0000821 eq(Rcmp, xycmp, Frm("%r %r %d %d", x, y, Rcmp, xycmp))
822 eq(x == y, Rcmp == 0, Frm("%r == %r %d", x, y, Rcmp))
823 eq(x != y, Rcmp != 0, Frm("%r != %r %d", x, y, Rcmp))
824 eq(x < y, Rcmp < 0, Frm("%r < %r %d", x, y, Rcmp))
825 eq(x <= y, Rcmp <= 0, Frm("%r <= %r %d", x, y, Rcmp))
826 eq(x > y, Rcmp > 0, Frm("%r > %r %d", x, y, Rcmp))
827 eq(x >= y, Rcmp >= 0, Frm("%r >= %r %d", x, y, Rcmp))
Tim Peters307fa782004-09-23 08:06:40 +0000828
Eric Smith0dd1b632008-02-11 17:55:01 +0000829 def test__format__(self):
Eric Smith8c663262007-08-25 02:26:07 +0000830 self.assertEqual(format(123456789, 'd'), '123456789')
831 self.assertEqual(format(123456789, 'd'), '123456789')
832
Eric Smith185e30c2007-08-30 22:23:08 +0000833 # sign and aligning are interdependent
834 self.assertEqual(format(1, "-"), '1')
835 self.assertEqual(format(-1, "-"), '-1')
836 self.assertEqual(format(1, "-3"), ' 1')
837 self.assertEqual(format(-1, "-3"), ' -1')
838 self.assertEqual(format(1, "+3"), ' +1')
839 self.assertEqual(format(-1, "+3"), ' -1')
840 self.assertEqual(format(1, " 3"), ' 1')
841 self.assertEqual(format(-1, " 3"), ' -1')
842 self.assertEqual(format(1, " "), ' 1')
843 self.assertEqual(format(-1, " "), '-1')
844
Eric Smith8c663262007-08-25 02:26:07 +0000845 # hex
846 self.assertEqual(format(3, "x"), "3")
847 self.assertEqual(format(3, "X"), "3")
848 self.assertEqual(format(1234, "x"), "4d2")
849 self.assertEqual(format(-1234, "x"), "-4d2")
850 self.assertEqual(format(1234, "8x"), " 4d2")
Eric Smith185e30c2007-08-30 22:23:08 +0000851 self.assertEqual(format(-1234, "8x"), " -4d2")
Eric Smith8c663262007-08-25 02:26:07 +0000852 self.assertEqual(format(1234, "x"), "4d2")
853 self.assertEqual(format(-1234, "x"), "-4d2")
854 self.assertEqual(format(-3, "x"), "-3")
855 self.assertEqual(format(-3, "X"), "-3")
856 self.assertEqual(format(int('be', 16), "x"), "be")
857 self.assertEqual(format(int('be', 16), "X"), "BE")
858 self.assertEqual(format(-int('be', 16), "x"), "-be")
859 self.assertEqual(format(-int('be', 16), "X"), "-BE")
860
861 # octal
862 self.assertEqual(format(3, "b"), "11")
863 self.assertEqual(format(-3, "b"), "-11")
864 self.assertEqual(format(1234, "b"), "10011010010")
865 self.assertEqual(format(-1234, "b"), "-10011010010")
866 self.assertEqual(format(1234, "-b"), "10011010010")
867 self.assertEqual(format(-1234, "-b"), "-10011010010")
868 self.assertEqual(format(1234, " b"), " 10011010010")
869 self.assertEqual(format(-1234, " b"), "-10011010010")
870 self.assertEqual(format(1234, "+b"), "+10011010010")
871 self.assertEqual(format(-1234, "+b"), "-10011010010")
872
Eric Smith8c663262007-08-25 02:26:07 +0000873 # make sure these are errors
874 self.assertRaises(ValueError, format, 3, "1.3") # precision disallowed
Eric Smith8c663262007-08-25 02:26:07 +0000875 self.assertRaises(ValueError, format, 3, "+c") # sign not allowed
876 # with 'c'
Eric Smithfa767ef2008-01-28 10:59:27 +0000877
878 # ensure that only int and float type specifiers work
Eric Smith7b69c6c2008-01-27 21:07:59 +0000879 for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] +
880 [chr(x) for x in range(ord('A'), ord('Z')+1)]):
Eric Smithfa767ef2008-01-28 10:59:27 +0000881 if not format_spec in 'bcdoxXeEfFgGn%':
Eric Smith7b69c6c2008-01-27 21:07:59 +0000882 self.assertRaises(ValueError, format, 0, format_spec)
883 self.assertRaises(ValueError, format, 1, format_spec)
884 self.assertRaises(ValueError, format, -1, format_spec)
885 self.assertRaises(ValueError, format, 2**100, format_spec)
886 self.assertRaises(ValueError, format, -(2**100), format_spec)
887
Eric Smithfa767ef2008-01-28 10:59:27 +0000888 # ensure that float type specifiers work; format converts
889 # the int to a float
Eric Smith5807c412008-05-11 21:00:57 +0000890 for format_spec in 'eEfFgG%':
Eric Smithfa767ef2008-01-28 10:59:27 +0000891 for value in [0, 1, -1, 100, -100, 1234567890, -1234567890]:
892 self.assertEqual(format(value, format_spec),
893 format(float(value), format_spec))
Eric Smith8c663262007-08-25 02:26:07 +0000894
Christian Heimesa34706f2008-01-04 03:06:10 +0000895 def test_nan_inf(self):
Christian Heimes1aa7b302008-01-04 03:22:53 +0000896 self.assertRaises(OverflowError, int, float('inf'))
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000897 self.assertRaises(OverflowError, int, float('-inf'))
898 self.assertRaises(ValueError, int, float('nan'))
Christian Heimesa34706f2008-01-04 03:06:10 +0000899
Benjamin Peterson875d4c02008-07-13 17:44:16 +0000900 def test_true_division(self):
901 huge = 1 << 40000
902 mhuge = -huge
903 self.assertEqual(huge / huge, 1.0)
904 self.assertEqual(mhuge / mhuge, 1.0)
905 self.assertEqual(huge / mhuge, -1.0)
906 self.assertEqual(mhuge / huge, -1.0)
907 self.assertEqual(1 / huge, 0.0)
908 self.assertEqual(1 / huge, 0.0)
909 self.assertEqual(1 / mhuge, 0.0)
910 self.assertEqual(1 / mhuge, 0.0)
911 self.assertEqual((666 * huge + (huge >> 1)) / huge, 666.5)
912 self.assertEqual((666 * mhuge + (mhuge >> 1)) / mhuge, 666.5)
913 self.assertEqual((666 * huge + (huge >> 1)) / mhuge, -666.5)
914 self.assertEqual((666 * mhuge + (mhuge >> 1)) / huge, -666.5)
915 self.assertEqual(huge / (huge << 1), 0.5)
916 self.assertEqual((1000000 * huge) / huge, 1000000)
917
918 namespace = {'huge': huge, 'mhuge': mhuge}
919
920 for overflow in ["float(huge)", "float(mhuge)",
921 "huge / 1", "huge / 2", "huge / -1", "huge / -2",
922 "mhuge / 100", "mhuge / 200"]:
923 self.assertRaises(OverflowError, eval, overflow, namespace)
924
925 for underflow in ["1 / huge", "2 / huge", "-1 / huge", "-2 / huge",
926 "100 / mhuge", "200 / mhuge"]:
927 result = eval(underflow, namespace)
928 self.assertEqual(result, 0.0,
929 "expected underflow to 0 from %r" % underflow)
930
931 for zero in ["huge / 0", "mhuge / 0"]:
932 self.assertRaises(ZeroDivisionError, eval, zero, namespace)
933
934
Facundo Batista6e6f59b2008-07-24 18:57:11 +0000935 def test_small_ints(self):
936 for i in range(-5, 257):
937 self.assertTrue(i is i + 0)
938 self.assertTrue(i is i * 1)
939 self.assertTrue(i is i - 0)
940 self.assertTrue(i is i // 1)
941 self.assertTrue(i is i & -1)
942 self.assertTrue(i is i | 0)
943 self.assertTrue(i is i ^ 0)
944 self.assertTrue(i is ~~i)
945 self.assertTrue(i is i**1)
946 self.assertTrue(i is int(str(i)))
947 self.assertTrue(i is i<<2>>2, str(i))
948 # corner cases
949 i = 1 << 70
950 self.assertTrue(i - i is 0)
951 self.assertTrue(0 * i is 0)
952
Mark Dickinson54bc1ec2008-12-17 16:19:07 +0000953 def test_bit_length(self):
954 tiny = 1e-10
955 for x in range(-65000, 65000):
956 k = x.bit_length()
957 # Check equivalence with Python version
958 self.assertEqual(k, len(bin(x).lstrip('-0b')))
959 # Behaviour as specified in the docs
960 if x != 0:
961 self.assert_(2**(k-1) <= abs(x) < 2**k)
962 else:
963 self.assertEqual(k, 0)
964 # Alternative definition: x.bit_length() == 1 + floor(log_2(x))
965 if x != 0:
966 # When x is an exact power of 2, numeric errors can
967 # cause floor(log(x)/log(2)) to be one too small; for
968 # small x this can be fixed by adding a small quantity
969 # to the quotient before taking the floor.
970 self.assertEqual(k, 1 + math.floor(
971 math.log(abs(x))/math.log(2) + tiny))
972
973 self.assertEqual((0).bit_length(), 0)
974 self.assertEqual((1).bit_length(), 1)
975 self.assertEqual((-1).bit_length(), 1)
976 self.assertEqual((2).bit_length(), 2)
977 self.assertEqual((-2).bit_length(), 2)
978 for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64, 234]:
979 a = 2**i
980 self.assertEqual((a-1).bit_length(), i)
981 self.assertEqual((1-a).bit_length(), i)
982 self.assertEqual((a).bit_length(), i+1)
983 self.assertEqual((-a).bit_length(), i+1)
984 self.assertEqual((a+1).bit_length(), i+1)
985 self.assertEqual((-a-1).bit_length(), i+1)
986
Mark Dickinson1124e712009-01-28 21:25:58 +0000987 def test_round(self):
988 # check round-half-even algorithm. For round to nearest ten;
989 # rounding map is invariant under adding multiples of 20
990 test_dict = {0:0, 1:0, 2:0, 3:0, 4:0, 5:0,
991 6:10, 7:10, 8:10, 9:10, 10:10, 11:10, 12:10, 13:10, 14:10,
992 15:20, 16:20, 17:20, 18:20, 19:20}
993 for offset in range(-520, 520, 20):
994 for k, v in test_dict.items():
995 got = round(k+offset, -1)
996 expected = v+offset
997 self.assertEqual(got, expected)
998 self.assert_(type(got) is int)
999
1000 # larger second argument
1001 self.assertEqual(round(-150, -2), -200)
1002 self.assertEqual(round(-149, -2), -100)
1003 self.assertEqual(round(-51, -2), -100)
1004 self.assertEqual(round(-50, -2), 0)
1005 self.assertEqual(round(-49, -2), 0)
1006 self.assertEqual(round(-1, -2), 0)
1007 self.assertEqual(round(0, -2), 0)
1008 self.assertEqual(round(1, -2), 0)
1009 self.assertEqual(round(49, -2), 0)
1010 self.assertEqual(round(50, -2), 0)
1011 self.assertEqual(round(51, -2), 100)
1012 self.assertEqual(round(149, -2), 100)
1013 self.assertEqual(round(150, -2), 200)
1014 self.assertEqual(round(250, -2), 200)
1015 self.assertEqual(round(251, -2), 300)
1016 self.assertEqual(round(172500, -3), 172000)
1017 self.assertEqual(round(173500, -3), 174000)
1018 self.assertEqual(round(31415926535, -1), 31415926540)
1019 self.assertEqual(round(31415926535, -2), 31415926500)
1020 self.assertEqual(round(31415926535, -3), 31415927000)
1021 self.assertEqual(round(31415926535, -4), 31415930000)
1022 self.assertEqual(round(31415926535, -5), 31415900000)
1023 self.assertEqual(round(31415926535, -6), 31416000000)
1024 self.assertEqual(round(31415926535, -7), 31420000000)
1025 self.assertEqual(round(31415926535, -8), 31400000000)
1026 self.assertEqual(round(31415926535, -9), 31000000000)
1027 self.assertEqual(round(31415926535, -10), 30000000000)
1028 self.assertEqual(round(31415926535, -11), 0)
1029 self.assertEqual(round(31415926535, -12), 0)
1030 self.assertEqual(round(31415926535, -999), 0)
1031
1032 # should get correct results even for huge inputs
1033 for k in range(10, 100):
1034 got = round(10**k + 324678, -3)
1035 expect = 10**k + 325000
1036 self.assertEqual(got, expect)
1037 self.assert_(type(got) is int)
1038
1039 # nonnegative second argument: round(x, n) should just return x
1040 for n in range(5):
1041 for i in range(100):
1042 x = random.randrange(-10000, 10000)
1043 got = round(x, n)
1044 self.assertEqual(got, x)
1045 self.assert_(type(got) is int)
1046 for huge_n in 2**31-1, 2**31, 2**63-1, 2**63, 2**100, 10**100:
1047 self.assertEqual(round(8979323, huge_n), 8979323)
1048
1049 # omitted second argument
1050 for i in range(100):
1051 x = random.randrange(-10000, 10000)
1052 got = round(x)
1053 self.assertEqual(got, x)
1054 self.assert_(type(got) is int)
1055
1056 # bad second argument
1057 bad_exponents = ('brian', 2.0, 0j, None)
1058 for e in bad_exponents:
1059 self.assertRaises(TypeError, round, 3, e)
1060
1061
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00001062
Walter Dörwalda0021592005-06-13 21:44:48 +00001063def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001064 support.run_unittest(LongTest)
Tim Peters307fa782004-09-23 08:06:40 +00001065
Walter Dörwalda0021592005-06-13 21:44:48 +00001066if __name__ == "__main__":
1067 test_main()