blob: 6788cedd809decb74e3b96199056e1b2de176034 [file] [log] [blame]
Walter Dörwalda0021592005-06-13 21:44:48 +00001import unittest
Benjamin Peterson979395b2008-05-03 21:35:18 +00002import sys
Walter Dörwalda0021592005-06-13 21:44:48 +00003
4import random
Mark Dickinson1a707982008-12-17 16:14:37 +00005import math
Walter Dörwalda0021592005-06-13 21:44:48 +00006
Chris Jerdonek6f70fe82012-12-27 12:53:29 -08007from test import test_int, test_support
8
Walter Dörwalda0021592005-06-13 21:44:48 +00009# Used for lazy formatting of failure messages
10class Frm(object):
11 def __init__(self, format, *args):
12 self.format = format
13 self.args = args
14
15 def __str__(self):
16 return self.format % self.args
Guido van Rossum4365cab1998-08-13 14:20:17 +000017
18# SHIFT should match the value in longintrepr.h for best testing.
Mark Dickinsonefc82f72009-03-20 15:51:55 +000019SHIFT = sys.long_info.bits_per_digit
Guido van Rossum4365cab1998-08-13 14:20:17 +000020BASE = 2 ** SHIFT
21MASK = BASE - 1
Tim Petersdaec9612004-08-30 23:18:23 +000022KARATSUBA_CUTOFF = 70 # from longobject.c
Guido van Rossum4365cab1998-08-13 14:20:17 +000023
24# Max number of base BASE digits to use in test cases. Doubling
Tim Peters28b0e2a2002-08-13 02:17:11 +000025# this will more than double the runtime.
26MAXDIGITS = 15
Guido van Rossum4365cab1998-08-13 14:20:17 +000027
Guido van Rossum4581a0c1998-10-02 01:19:48 +000028# build some special values
29special = map(long, [0, 1, 2, BASE, BASE >> 1])
30special.append(0x5555555555555555L)
31special.append(0xaaaaaaaaaaaaaaaaL)
32# some solid strings of one bits
33p2 = 4L # 0 and 1 already added
34for i in range(2*SHIFT):
35 special.append(p2 - 1)
36 p2 = p2 << 1
37del p2
38# add complements & negations
39special = special + map(lambda x: ~x, special) + \
40 map(lambda x: -x, special)
41
Benjamin Peterson979395b2008-05-03 21:35:18 +000042L = [
43 ('0', 0),
44 ('1', 1),
45 ('9', 9),
46 ('10', 10),
47 ('99', 99),
48 ('100', 100),
49 ('314', 314),
50 (' 314', 314),
51 ('314 ', 314),
52 (' \t\t 314 \t\t ', 314),
53 (repr(sys.maxint), sys.maxint),
54 (' 1x', ValueError),
55 (' 1 ', 1),
56 (' 1\02 ', ValueError),
57 ('', ValueError),
58 (' ', ValueError),
59 (' \t\t ', ValueError)
60]
61if test_support.have_unicode:
62 L += [
63 (unicode('0'), 0),
64 (unicode('1'), 1),
65 (unicode('9'), 9),
66 (unicode('10'), 10),
67 (unicode('99'), 99),
68 (unicode('100'), 100),
69 (unicode('314'), 314),
70 (unicode(' 314'), 314),
71 (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
72 (unicode(' \t\t 314 \t\t '), 314),
73 (unicode(' 1x'), ValueError),
74 (unicode(' 1 '), 1),
75 (unicode(' 1\02 '), ValueError),
76 (unicode(''), ValueError),
77 (unicode(' '), ValueError),
78 (unicode(' \t\t '), ValueError),
79 (unichr(0x200), ValueError),
80]
81
Serhiy Storchaka8d30ad72015-11-25 15:55:54 +020082class LongSubclass(long):
83 pass
84
85class OtherLongSubclass(long):
86 pass
87
Chris Jerdonek6f70fe82012-12-27 12:53:29 -080088class LongTest(test_int.IntLongCommonTests, unittest.TestCase):
Guido van Rossum4365cab1998-08-13 14:20:17 +000089
Chris Jerdonek6f70fe82012-12-27 12:53:29 -080090 ntype = long
Guido van Rossum4365cab1998-08-13 14:20:17 +000091
Walter Dörwalda0021592005-06-13 21:44:48 +000092 # Get quasi-random long consisting of ndigits digits (in base BASE).
93 # quasi == the most-significant digit will not be 0, and the number
94 # is constructed to contain long strings of 0 and 1 bits. These are
95 # more likely than random bits to provoke digit-boundary errors.
96 # The sign of the number is also random.
Guido van Rossum4365cab1998-08-13 14:20:17 +000097
Walter Dörwalda0021592005-06-13 21:44:48 +000098 def getran(self, ndigits):
Serhiy Storchaka708a5ea2014-02-08 14:28:20 +020099 self.assertGreater(ndigits, 0)
Walter Dörwalda0021592005-06-13 21:44:48 +0000100 nbits_hi = ndigits * SHIFT
101 nbits_lo = nbits_hi - SHIFT + 1
102 answer = 0L
103 nbits = 0
104 r = int(random.random() * (SHIFT * 2)) | 1 # force 1 bits to start
105 while nbits < nbits_lo:
106 bits = (r >> 1) + 1
107 bits = min(bits, nbits_hi - nbits)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000108 self.assertTrue(1 <= bits <= SHIFT)
Walter Dörwalda0021592005-06-13 21:44:48 +0000109 nbits = nbits + bits
110 answer = answer << bits
111 if r & 1:
112 answer = answer | ((1 << bits) - 1)
113 r = int(random.random() * (SHIFT * 2))
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000114 self.assertTrue(nbits_lo <= nbits <= nbits_hi)
Walter Dörwalda0021592005-06-13 21:44:48 +0000115 if random.random() < 0.5:
116 answer = -answer
117 return answer
Guido van Rossum4581a0c1998-10-02 01:19:48 +0000118
Walter Dörwalda0021592005-06-13 21:44:48 +0000119 # Get random long consisting of ndigits random digits (relative to base
120 # BASE). The sign bit is also random.
Guido van Rossum4581a0c1998-10-02 01:19:48 +0000121
Walter Dörwalda0021592005-06-13 21:44:48 +0000122 def getran2(ndigits):
123 answer = 0L
124 for i in xrange(ndigits):
125 answer = (answer << SHIFT) | random.randint(0, MASK)
126 if random.random() < 0.5:
127 answer = -answer
128 return answer
Guido van Rossum4365cab1998-08-13 14:20:17 +0000129
Walter Dörwalda0021592005-06-13 21:44:48 +0000130 def check_division(self, x, y):
131 eq = self.assertEqual
132 q, r = divmod(x, y)
133 q2, r2 = x//y, x%y
134 pab, pba = x*y, y*x
135 eq(pab, pba, Frm("multiplication does not commute for %r and %r", x, y))
136 eq(q, q2, Frm("divmod returns different quotient than / for %r and %r", x, y))
137 eq(r, r2, Frm("divmod returns different mod than %% for %r and %r", x, y))
138 eq(x, q*y + r, Frm("x != q*y + r after divmod on x=%r, y=%r", x, y))
139 if y > 0:
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000140 self.assertTrue(0 <= r < y, Frm("bad mod from divmod on %r and %r", x, y))
Walter Dörwalda0021592005-06-13 21:44:48 +0000141 else:
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000142 self.assertTrue(y < r <= 0, Frm("bad mod from divmod on %r and %r", x, y))
Guido van Rossum4365cab1998-08-13 14:20:17 +0000143
Walter Dörwalda0021592005-06-13 21:44:48 +0000144 def test_division(self):
145 digits = range(1, MAXDIGITS+1) + range(KARATSUBA_CUTOFF,
146 KARATSUBA_CUTOFF + 14)
147 digits.append(KARATSUBA_CUTOFF * 3)
148 for lenx in digits:
149 x = self.getran(lenx)
150 for leny in digits:
151 y = self.getran(leny) or 1L
152 self.check_division(x, y)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000153
Mark Dickinsonefc82f72009-03-20 15:51:55 +0000154 # specific numbers chosen to exercise corner cases of the
155 # current long division implementation
156
157 # 30-bit cases involving a quotient digit estimate of BASE+1
158 self.check_division(1231948412290879395966702881L,
159 1147341367131428698L)
160 self.check_division(815427756481275430342312021515587883L,
161 707270836069027745L)
162 self.check_division(627976073697012820849443363563599041L,
163 643588798496057020L)
164 self.check_division(1115141373653752303710932756325578065L,
165 1038556335171453937726882627L)
166 # 30-bit cases that require the post-subtraction correction step
167 self.check_division(922498905405436751940989320930368494L,
168 949985870686786135626943396L)
169 self.check_division(768235853328091167204009652174031844L,
170 1091555541180371554426545266L)
171
172 # 15-bit cases involving a quotient digit estimate of BASE+1
173 self.check_division(20172188947443L, 615611397L)
174 self.check_division(1020908530270155025L, 950795710L)
175 self.check_division(128589565723112408L, 736393718L)
176 self.check_division(609919780285761575L, 18613274546784L)
177 # 15-bit cases that require the post-subtraction correction step
178 self.check_division(710031681576388032L, 26769404391308L)
179 self.check_division(1933622614268221L, 30212853348836L)
180
181
182
Walter Dörwalda0021592005-06-13 21:44:48 +0000183 def test_karatsuba(self):
184 digits = range(1, 5) + range(KARATSUBA_CUTOFF, KARATSUBA_CUTOFF + 10)
185 digits.extend([KARATSUBA_CUTOFF * 10, KARATSUBA_CUTOFF * 100])
Guido van Rossum4365cab1998-08-13 14:20:17 +0000186
Walter Dörwalda0021592005-06-13 21:44:48 +0000187 bits = [digit * SHIFT for digit in digits]
Guido van Rossum4365cab1998-08-13 14:20:17 +0000188
Walter Dörwalda0021592005-06-13 21:44:48 +0000189 # Test products of long strings of 1 bits -- (2**x-1)*(2**y-1) ==
190 # 2**(x+y) - 2**x - 2**y + 1, so the proper result is easy to check.
191 for abits in bits:
192 a = (1L << abits) - 1
193 for bbits in bits:
194 if bbits < abits:
195 continue
196 b = (1L << bbits) - 1
197 x = a * b
198 y = ((1L << (abits + bbits)) -
199 (1L << abits) -
200 (1L << bbits) +
201 1)
202 self.assertEqual(x, y,
203 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 +0000204
Mark Dickinson02c0c0b2016-08-29 19:38:12 +0100205 def test_lshift_of_zero(self):
206 self.assertEqual(0L << 0, 0)
207 self.assertEqual(0L << 10, 0)
208 with self.assertRaises(ValueError):
209 0L << -1
210
211 @test_support.cpython_only
212 def test_huge_lshift_of_zero(self):
213 # Shouldn't try to allocate memory for a huge shift. See issue #27870.
214 # Other implementations may have a different boundary for overflow,
215 # or not raise at all.
216 self.assertEqual(0L << sys.maxsize, 0)
217 with self.assertRaises(OverflowError):
218 0L << (sys.maxsize + 1)
219
Walter Dörwalda0021592005-06-13 21:44:48 +0000220 def check_bitop_identities_1(self, x):
221 eq = self.assertEqual
222 eq(x & 0, 0, Frm("x & 0 != 0 for x=%r", x))
223 eq(x | 0, x, Frm("x | 0 != x for x=%r", x))
224 eq(x ^ 0, x, Frm("x ^ 0 != x for x=%r", x))
225 eq(x & -1, x, Frm("x & -1 != x for x=%r", x))
226 eq(x | -1, -1, Frm("x | -1 != -1 for x=%r", x))
227 eq(x ^ -1, ~x, Frm("x ^ -1 != ~x for x=%r", x))
228 eq(x, ~~x, Frm("x != ~~x for x=%r", x))
229 eq(x & x, x, Frm("x & x != x for x=%r", x))
230 eq(x | x, x, Frm("x | x != x for x=%r", x))
231 eq(x ^ x, 0, Frm("x ^ x != 0 for x=%r", x))
232 eq(x & ~x, 0, Frm("x & ~x != 0 for x=%r", x))
233 eq(x | ~x, -1, Frm("x | ~x != -1 for x=%r", x))
234 eq(x ^ ~x, -1, Frm("x ^ ~x != -1 for x=%r", x))
235 eq(-x, 1 + ~x, Frm("not -x == 1 + ~x for x=%r", x))
236 eq(-x, ~(x-1), Frm("not -x == ~(x-1) forx =%r", x))
237 for n in xrange(2*SHIFT):
238 p2 = 2L ** n
239 eq(x << n >> n, x,
Martin Panter2bc50d72015-09-24 00:19:42 +0000240 Frm("x << n >> n != x for x=%r, n=%r", x, n))
Walter Dörwalda0021592005-06-13 21:44:48 +0000241 eq(x // p2, x >> n,
Martin Panter2bc50d72015-09-24 00:19:42 +0000242 Frm("x // p2 != x >> n for x=%r n=%r p2=%r", x, n, p2))
Walter Dörwalda0021592005-06-13 21:44:48 +0000243 eq(x * p2, x << n,
Martin Panter2bc50d72015-09-24 00:19:42 +0000244 Frm("x * p2 != x << n for x=%r n=%r p2=%r", x, n, p2))
Walter Dörwalda0021592005-06-13 21:44:48 +0000245 eq(x & -p2, x >> n << n,
Martin Panter2bc50d72015-09-24 00:19:42 +0000246 Frm("not x & -p2 == x >> n << n for x=%r n=%r p2=%r", x, n, p2))
Walter Dörwalda0021592005-06-13 21:44:48 +0000247 eq(x & -p2, x & ~(p2 - 1),
Martin Panter2bc50d72015-09-24 00:19:42 +0000248 Frm("not x & -p2 == x & ~(p2 - 1) for x=%r n=%r p2=%r", x, n, p2))
Tim Peters7f270ba2002-08-13 21:06:55 +0000249
Walter Dörwalda0021592005-06-13 21:44:48 +0000250 def check_bitop_identities_2(self, x, y):
251 eq = self.assertEqual
Martin Panter2bc50d72015-09-24 00:19:42 +0000252 eq(x & y, y & x, Frm("x & y != y & x for x=%r, y=%r", x, y))
253 eq(x | y, y | x, Frm("x | y != y | x for x=%r, y=%r", x, y))
254 eq(x ^ y, y ^ x, Frm("x ^ y != y ^ x for x=%r, y=%r", x, y))
255 eq(x ^ y ^ x, y, Frm("x ^ y ^ x != y for x=%r, y=%r", x, y))
256 eq(x & y, ~(~x | ~y), Frm("x & y != ~(~x | ~y) for x=%r, y=%r", x, y))
257 eq(x | y, ~(~x & ~y), Frm("x | y != ~(~x & ~y) for x=%r, y=%r", x, y))
Walter Dörwalda0021592005-06-13 21:44:48 +0000258 eq(x ^ y, (x | y) & ~(x & y),
Martin Panter2bc50d72015-09-24 00:19:42 +0000259 Frm("x ^ y != (x | y) & ~(x & y) for x=%r, y=%r", x, y))
Walter Dörwalda0021592005-06-13 21:44:48 +0000260 eq(x ^ y, (x & ~y) | (~x & y),
Martin Panter2bc50d72015-09-24 00:19:42 +0000261 Frm("x ^ y == (x & ~y) | (~x & y) for x=%r, y=%r", x, y))
Walter Dörwalda0021592005-06-13 21:44:48 +0000262 eq(x ^ y, (x | y) & (~x | ~y),
Martin Panter2bc50d72015-09-24 00:19:42 +0000263 Frm("x ^ y == (x | y) & (~x | ~y) for x=%r, y=%r", x, y))
Tim Peters7f270ba2002-08-13 21:06:55 +0000264
Walter Dörwalda0021592005-06-13 21:44:48 +0000265 def check_bitop_identities_3(self, x, y, z):
266 eq = self.assertEqual
267 eq((x & y) & z, x & (y & z),
Martin Panter2bc50d72015-09-24 00:19:42 +0000268 Frm("(x & y) & z != x & (y & z) for x=%r, y=%r, z=%r", x, y, z))
Walter Dörwalda0021592005-06-13 21:44:48 +0000269 eq((x | y) | z, x | (y | z),
Martin Panter2bc50d72015-09-24 00:19:42 +0000270 Frm("(x | y) | z != x | (y | z) for x=%r, y=%r, z=%r", x, y, z))
Walter Dörwalda0021592005-06-13 21:44:48 +0000271 eq((x ^ y) ^ z, x ^ (y ^ z),
Martin Panter2bc50d72015-09-24 00:19:42 +0000272 Frm("(x ^ y) ^ z != x ^ (y ^ z) for x=%r, y=%r, z=%r", x, y, z))
Walter Dörwalda0021592005-06-13 21:44:48 +0000273 eq(x & (y | z), (x & y) | (x & z),
Martin Panter2bc50d72015-09-24 00:19:42 +0000274 Frm("x & (y | z) != (x & y) | (x & z) for x=%r, y=%r, z=%r", x, y, z))
Walter Dörwalda0021592005-06-13 21:44:48 +0000275 eq(x | (y & z), (x | y) & (x | z),
Martin Panter2bc50d72015-09-24 00:19:42 +0000276 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 +0000277
Walter Dörwalda0021592005-06-13 21:44:48 +0000278 def test_bitop_identities(self):
279 for x in special:
280 self.check_bitop_identities_1(x)
281 digits = xrange(1, MAXDIGITS+1)
282 for lenx in digits:
283 x = self.getran(lenx)
284 self.check_bitop_identities_1(x)
285 for leny in digits:
286 y = self.getran(leny)
287 self.check_bitop_identities_2(x, y)
288 self.check_bitop_identities_3(x, y, self.getran((lenx + leny)//2))
Guido van Rossum4365cab1998-08-13 14:20:17 +0000289
Walter Dörwalda0021592005-06-13 21:44:48 +0000290 def slow_format(self, x, base):
291 if (x, base) == (0, 8):
292 # this is an oddball!
293 return "0L"
294 digits = []
295 sign = 0
296 if x < 0:
297 sign, x = 1, -x
298 while x:
299 x, r = divmod(x, base)
300 digits.append(int(r))
301 digits.reverse()
302 digits = digits or [0]
303 return '-'[:sign] + \
304 {8: '0', 10: '', 16: '0x'}[base] + \
Raymond Hettinger3296e692005-06-29 23:29:56 +0000305 "".join(map(lambda i: "0123456789abcdef"[i], digits)) + "L"
Guido van Rossum4365cab1998-08-13 14:20:17 +0000306
Walter Dörwalda0021592005-06-13 21:44:48 +0000307 def check_format_1(self, x):
308 for base, mapper in (8, oct), (10, repr), (16, hex):
309 got = mapper(x)
310 expected = self.slow_format(x, base)
311 msg = Frm("%s returned %r but expected %r for %r",
312 mapper.__name__, got, expected, x)
313 self.assertEqual(got, expected, msg)
314 self.assertEqual(long(got, 0), x, Frm('long("%s", 0) != %r', got, x))
315 # str() has to be checked a little differently since there's no
316 # trailing "L"
317 got = str(x)
318 expected = self.slow_format(x, 10)[:-1]
319 msg = Frm("%s returned %r but expected %r for %r",
320 mapper.__name__, got, expected, x)
321 self.assertEqual(got, expected, msg)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000322
Walter Dörwalda0021592005-06-13 21:44:48 +0000323 def test_format(self):
324 for x in special:
325 self.check_format_1(x)
326 for i in xrange(10):
327 for lenx in xrange(1, MAXDIGITS+1):
328 x = self.getran(lenx)
329 self.check_format_1(x)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000330
Benjamin Peterson979395b2008-05-03 21:35:18 +0000331 def test_long(self):
332 self.assertEqual(long(314), 314L)
333 self.assertEqual(long(3.14), 3L)
334 self.assertEqual(long(314L), 314L)
Amaury Forgeot d'Arcd3ffb892008-09-09 07:24:30 +0000335 # Check that long() of basic types actually returns a long
336 self.assertEqual(type(long(314)), long)
337 self.assertEqual(type(long(3.14)), long)
338 self.assertEqual(type(long(314L)), long)
Benjamin Peterson979395b2008-05-03 21:35:18 +0000339 # Check that conversion from float truncates towards zero
340 self.assertEqual(long(-3.14), -3L)
341 self.assertEqual(long(3.9), 3L)
342 self.assertEqual(long(-3.9), -3L)
343 self.assertEqual(long(3.5), 3L)
344 self.assertEqual(long(-3.5), -3L)
345 self.assertEqual(long("-3"), -3L)
Mark Dickinson20665592010-05-25 19:01:08 +0000346 self.assertEqual(long("0b10", 2), 2L)
347 self.assertEqual(long("0o10", 8), 8L)
348 self.assertEqual(long("0x10", 16), 16L)
Benjamin Peterson979395b2008-05-03 21:35:18 +0000349 if test_support.have_unicode:
350 self.assertEqual(long(unicode("-3")), -3L)
351 # Different base:
352 self.assertEqual(long("10",16), 16L)
353 if test_support.have_unicode:
354 self.assertEqual(long(unicode("10"),16), 16L)
355 # Check conversions from string (same test set as for int(), and then some)
356 LL = [
357 ('1' + '0'*20, 10L**20),
358 ('1' + '0'*100, 10L**100)
359 ]
360 L2 = L[:]
361 if test_support.have_unicode:
362 L2 += [
363 (unicode('1') + unicode('0')*20, 10L**20),
364 (unicode('1') + unicode('0')*100, 10L**100),
365 ]
366 for s, v in L2 + LL:
367 for sign in "", "+", "-":
368 for prefix in "", " ", "\t", " \t\t ":
369 ss = prefix + sign + s
370 vv = v
371 if sign == "-" and v is not ValueError:
372 vv = -v
373 try:
374 self.assertEqual(long(ss), long(vv))
375 except v:
376 pass
377
378 self.assertRaises(ValueError, long, '123\0')
379 self.assertRaises(ValueError, long, '53', 40)
380 self.assertRaises(TypeError, long, 1, 12)
381
Mark Dickinson784a47f2010-05-26 19:06:33 +0000382 # tests with base 0
383 self.assertEqual(long(' 0123 ', 0), 83)
384 self.assertEqual(long(' 0123 ', 0), 83)
385 self.assertEqual(long('000', 0), 0)
386 self.assertEqual(long('0o123', 0), 83)
387 self.assertEqual(long('0x123', 0), 291)
388 self.assertEqual(long('0b100', 0), 4)
389 self.assertEqual(long(' 0O123 ', 0), 83)
390 self.assertEqual(long(' 0X123 ', 0), 291)
391 self.assertEqual(long(' 0B100 ', 0), 4)
392 self.assertEqual(long('0', 0), 0)
393 self.assertEqual(long('+0', 0), 0)
394 self.assertEqual(long('-0', 0), 0)
395 self.assertEqual(long('00', 0), 0)
396 self.assertRaises(ValueError, long, '08', 0)
397 self.assertRaises(ValueError, long, '-012395', 0)
398
Benjamin Peterson979395b2008-05-03 21:35:18 +0000399 # SF patch #1638879: embedded NULs were not detected with
400 # explicit base
401 self.assertRaises(ValueError, long, '123\0', 10)
402 self.assertRaises(ValueError, long, '123\x00 245', 20)
403
404 self.assertEqual(long('100000000000000000000000000000000', 2),
405 4294967296)
406 self.assertEqual(long('102002022201221111211', 3), 4294967296)
407 self.assertEqual(long('10000000000000000', 4), 4294967296)
408 self.assertEqual(long('32244002423141', 5), 4294967296)
409 self.assertEqual(long('1550104015504', 6), 4294967296)
410 self.assertEqual(long('211301422354', 7), 4294967296)
411 self.assertEqual(long('40000000000', 8), 4294967296)
412 self.assertEqual(long('12068657454', 9), 4294967296)
413 self.assertEqual(long('4294967296', 10), 4294967296)
414 self.assertEqual(long('1904440554', 11), 4294967296)
415 self.assertEqual(long('9ba461594', 12), 4294967296)
416 self.assertEqual(long('535a79889', 13), 4294967296)
417 self.assertEqual(long('2ca5b7464', 14), 4294967296)
418 self.assertEqual(long('1a20dcd81', 15), 4294967296)
419 self.assertEqual(long('100000000', 16), 4294967296)
420 self.assertEqual(long('a7ffda91', 17), 4294967296)
421 self.assertEqual(long('704he7g4', 18), 4294967296)
422 self.assertEqual(long('4f5aff66', 19), 4294967296)
423 self.assertEqual(long('3723ai4g', 20), 4294967296)
424 self.assertEqual(long('281d55i4', 21), 4294967296)
425 self.assertEqual(long('1fj8b184', 22), 4294967296)
426 self.assertEqual(long('1606k7ic', 23), 4294967296)
427 self.assertEqual(long('mb994ag', 24), 4294967296)
428 self.assertEqual(long('hek2mgl', 25), 4294967296)
429 self.assertEqual(long('dnchbnm', 26), 4294967296)
430 self.assertEqual(long('b28jpdm', 27), 4294967296)
431 self.assertEqual(long('8pfgih4', 28), 4294967296)
432 self.assertEqual(long('76beigg', 29), 4294967296)
433 self.assertEqual(long('5qmcpqg', 30), 4294967296)
434 self.assertEqual(long('4q0jto4', 31), 4294967296)
435 self.assertEqual(long('4000000', 32), 4294967296)
436 self.assertEqual(long('3aokq94', 33), 4294967296)
437 self.assertEqual(long('2qhxjli', 34), 4294967296)
438 self.assertEqual(long('2br45qb', 35), 4294967296)
439 self.assertEqual(long('1z141z4', 36), 4294967296)
440
441 self.assertEqual(long('100000000000000000000000000000001', 2),
442 4294967297)
443 self.assertEqual(long('102002022201221111212', 3), 4294967297)
444 self.assertEqual(long('10000000000000001', 4), 4294967297)
445 self.assertEqual(long('32244002423142', 5), 4294967297)
446 self.assertEqual(long('1550104015505', 6), 4294967297)
447 self.assertEqual(long('211301422355', 7), 4294967297)
448 self.assertEqual(long('40000000001', 8), 4294967297)
449 self.assertEqual(long('12068657455', 9), 4294967297)
450 self.assertEqual(long('4294967297', 10), 4294967297)
451 self.assertEqual(long('1904440555', 11), 4294967297)
452 self.assertEqual(long('9ba461595', 12), 4294967297)
453 self.assertEqual(long('535a7988a', 13), 4294967297)
454 self.assertEqual(long('2ca5b7465', 14), 4294967297)
455 self.assertEqual(long('1a20dcd82', 15), 4294967297)
456 self.assertEqual(long('100000001', 16), 4294967297)
457 self.assertEqual(long('a7ffda92', 17), 4294967297)
458 self.assertEqual(long('704he7g5', 18), 4294967297)
459 self.assertEqual(long('4f5aff67', 19), 4294967297)
460 self.assertEqual(long('3723ai4h', 20), 4294967297)
461 self.assertEqual(long('281d55i5', 21), 4294967297)
462 self.assertEqual(long('1fj8b185', 22), 4294967297)
463 self.assertEqual(long('1606k7id', 23), 4294967297)
464 self.assertEqual(long('mb994ah', 24), 4294967297)
465 self.assertEqual(long('hek2mgm', 25), 4294967297)
466 self.assertEqual(long('dnchbnn', 26), 4294967297)
467 self.assertEqual(long('b28jpdn', 27), 4294967297)
468 self.assertEqual(long('8pfgih5', 28), 4294967297)
469 self.assertEqual(long('76beigh', 29), 4294967297)
470 self.assertEqual(long('5qmcpqh', 30), 4294967297)
471 self.assertEqual(long('4q0jto5', 31), 4294967297)
472 self.assertEqual(long('4000001', 32), 4294967297)
473 self.assertEqual(long('3aokq95', 33), 4294967297)
474 self.assertEqual(long('2qhxjlj', 34), 4294967297)
475 self.assertEqual(long('2br45qc', 35), 4294967297)
476 self.assertEqual(long('1z141z5', 36), 4294967297)
477
478
479 def test_conversion(self):
480 # Test __long__()
481 class ClassicMissingMethods:
482 pass
483 self.assertRaises(AttributeError, long, ClassicMissingMethods())
484
485 class MissingMethods(object):
486 pass
487 self.assertRaises(TypeError, long, MissingMethods())
488
489 class Foo0:
490 def __long__(self):
491 return 42L
492
493 class Foo1(object):
494 def __long__(self):
495 return 42L
496
497 class Foo2(long):
498 def __long__(self):
499 return 42L
500
501 class Foo3(long):
502 def __long__(self):
503 return self
504
505 class Foo4(long):
506 def __long__(self):
507 return 42
508
509 class Foo5(long):
510 def __long__(self):
511 return 42.
512
513 self.assertEqual(long(Foo0()), 42L)
514 self.assertEqual(long(Foo1()), 42L)
515 self.assertEqual(long(Foo2()), 42L)
516 self.assertEqual(long(Foo3()), 0)
517 self.assertEqual(long(Foo4()), 42)
518 self.assertRaises(TypeError, long, Foo5())
519
520 class Classic:
521 pass
522 for base in (object, Classic):
523 class LongOverridesTrunc(base):
524 def __long__(self):
525 return 42
526 def __trunc__(self):
527 return -12
528 self.assertEqual(long(LongOverridesTrunc()), 42)
529
530 class JustTrunc(base):
531 def __trunc__(self):
532 return 42
533 self.assertEqual(long(JustTrunc()), 42)
534
535 for trunc_result_base in (object, Classic):
536 class Integral(trunc_result_base):
537 def __int__(self):
538 return 42
539
540 class TruncReturnsNonLong(base):
541 def __trunc__(self):
542 return Integral()
543 self.assertEqual(long(TruncReturnsNonLong()), 42)
544
545 class NonIntegral(trunc_result_base):
546 def __trunc__(self):
547 # Check that we avoid infinite recursion.
548 return NonIntegral()
549
550 class TruncReturnsNonIntegral(base):
551 def __trunc__(self):
552 return NonIntegral()
553 try:
554 long(TruncReturnsNonIntegral())
555 except TypeError as e:
Ezio Melotti2623a372010-11-21 13:34:58 +0000556 self.assertEqual(str(e),
557 "__trunc__ returned non-Integral"
558 " (type NonIntegral)")
Benjamin Peterson979395b2008-05-03 21:35:18 +0000559 else:
560 self.fail("Failed to raise TypeError with %s" %
561 ((base, trunc_result_base),))
562
Serhiy Storchaka8d30ad72015-11-25 15:55:54 +0200563 class TruncReturnsLongSubclass(base):
564 def __long__(self):
565 return OtherLongSubclass(42L)
566 good_int = TruncReturnsLongSubclass()
567 n = long(good_int)
568 self.assertEqual(n, 42L)
569 self.assertIs(type(n), OtherLongSubclass)
570 n = LongSubclass(good_int)
571 self.assertEqual(n, 42L)
572 self.assertIs(type(n), LongSubclass)
573
Walter Dörwalda0021592005-06-13 21:44:48 +0000574 def test_misc(self):
Guido van Rossum4365cab1998-08-13 14:20:17 +0000575
Walter Dörwalda0021592005-06-13 21:44:48 +0000576 # check the extremes in int<->long conversion
577 hugepos = sys.maxint
578 hugeneg = -hugepos - 1
579 hugepos_aslong = long(hugepos)
580 hugeneg_aslong = long(hugeneg)
581 self.assertEqual(hugepos, hugepos_aslong, "long(sys.maxint) != sys.maxint")
582 self.assertEqual(hugeneg, hugeneg_aslong,
583 "long(-sys.maxint-1) != -sys.maxint-1")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000584
Walter Dörwalda0021592005-06-13 21:44:48 +0000585 # long -> int should not fail for hugepos_aslong or hugeneg_aslong
Armin Rigo7ccbca92006-10-04 12:17:45 +0000586 x = int(hugepos_aslong)
Walter Dörwalda0021592005-06-13 21:44:48 +0000587 try:
Armin Rigo7ccbca92006-10-04 12:17:45 +0000588 self.assertEqual(x, hugepos,
Walter Dörwalda0021592005-06-13 21:44:48 +0000589 "converting sys.maxint to long and back to int fails")
590 except OverflowError:
591 self.fail("int(long(sys.maxint)) overflowed!")
Armin Rigo7ccbca92006-10-04 12:17:45 +0000592 if not isinstance(x, int):
Georg Brandldf8a3032010-02-06 23:08:00 +0000593 self.fail("int(long(sys.maxint)) should have returned int")
Armin Rigo7ccbca92006-10-04 12:17:45 +0000594 x = int(hugeneg_aslong)
Walter Dörwalda0021592005-06-13 21:44:48 +0000595 try:
Armin Rigo7ccbca92006-10-04 12:17:45 +0000596 self.assertEqual(x, hugeneg,
Walter Dörwalda0021592005-06-13 21:44:48 +0000597 "converting -sys.maxint-1 to long and back to int fails")
598 except OverflowError:
599 self.fail("int(long(-sys.maxint-1)) overflowed!")
Armin Rigo7ccbca92006-10-04 12:17:45 +0000600 if not isinstance(x, int):
Georg Brandldf8a3032010-02-06 23:08:00 +0000601 self.fail("int(long(-sys.maxint-1)) should have returned int")
Walter Dörwalda0021592005-06-13 21:44:48 +0000602 # but long -> int should overflow for hugepos+1 and hugeneg-1
603 x = hugepos_aslong + 1
604 try:
605 y = int(x)
606 except OverflowError:
607 self.fail("int(long(sys.maxint) + 1) mustn't overflow")
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000608 self.assertIsInstance(y, long,
Walter Dörwalda0021592005-06-13 21:44:48 +0000609 "int(long(sys.maxint) + 1) should have returned long")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000610
Walter Dörwalda0021592005-06-13 21:44:48 +0000611 x = hugeneg_aslong - 1
612 try:
613 y = int(x)
614 except OverflowError:
615 self.fail("int(long(-sys.maxint-1) - 1) mustn't overflow")
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000616 self.assertIsInstance(y, long,
Walter Dörwalda0021592005-06-13 21:44:48 +0000617 "int(long(-sys.maxint-1) - 1) should have returned long")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000618
Walter Dörwalda0021592005-06-13 21:44:48 +0000619 class long2(long):
620 pass
621 x = long2(1L<<100)
Walter Dörwaldf1715402002-11-19 20:49:15 +0000622 y = int(x)
Serhiy Storchaka708a5ea2014-02-08 14:28:20 +0200623 self.assertIs(type(y), long,
Walter Dörwalda0021592005-06-13 21:44:48 +0000624 "overflowing int conversion must return long not long subtype")
Guido van Rossum4581a0c1998-10-02 01:19:48 +0000625
Armin Rigo7ccbca92006-10-04 12:17:45 +0000626 # long -> Py_ssize_t conversion
627 class X(object):
628 def __getslice__(self, i, j):
629 return i, j
630
Florent Xicluna07627882010-03-21 01:14:24 +0000631 with test_support.check_py3k_warnings():
632 self.assertEqual(X()[-5L:7L], (-5, 7))
633 # use the clamping effect to test the smallest and largest longs
634 # that fit a Py_ssize_t
635 slicemin, slicemax = X()[-2L**100:2L**100]
636 self.assertEqual(X()[slicemin:slicemax], (slicemin, slicemax))
Armin Rigo7ccbca92006-10-04 12:17:45 +0000637
Mark Dickinsoncb61e5d2010-09-26 10:37:12 +0000638 def test_issue9869(self):
639 # Issue 9869: Interpreter crash when initializing an instance
640 # of a long subclass from an object whose __long__ method returns
641 # a plain int.
642 class BadLong(object):
643 def __long__(self):
644 return 1000000
645
646 class MyLong(long):
647 pass
648
649 x = MyLong(BadLong())
650 self.assertIsInstance(x, long)
651 self.assertEqual(x, 1000000)
652
653
Tim Peters26c7fa32001-08-23 22:56:21 +0000654# ----------------------------------- tests of auto int->long conversion
655
Walter Dörwalda0021592005-06-13 21:44:48 +0000656 def test_auto_overflow(self):
Walter Dörwalda0021592005-06-13 21:44:48 +0000657 special = [0, 1, 2, 3, sys.maxint-1, sys.maxint, sys.maxint+1]
658 sqrt = int(math.sqrt(sys.maxint))
659 special.extend([sqrt-1, sqrt, sqrt+1])
660 special.extend([-i for i in special])
Tim Peters26c7fa32001-08-23 22:56:21 +0000661
Walter Dörwalda0021592005-06-13 21:44:48 +0000662 def checkit(*args):
663 # Heavy use of nested scopes here!
664 self.assertEqual(got, expected,
665 Frm("for %r expected %r got %r", args, expected, got))
Tim Peters26c7fa32001-08-23 22:56:21 +0000666
Walter Dörwalda0021592005-06-13 21:44:48 +0000667 for x in special:
668 longx = long(x)
Tim Peters26c7fa32001-08-23 22:56:21 +0000669
Walter Dörwalda0021592005-06-13 21:44:48 +0000670 expected = -longx
671 got = -x
672 checkit('-', x)
Tim Peters26c7fa32001-08-23 22:56:21 +0000673
Walter Dörwalda0021592005-06-13 21:44:48 +0000674 for y in special:
675 longy = long(y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000676
Walter Dörwalda0021592005-06-13 21:44:48 +0000677 expected = longx + longy
678 got = x + y
679 checkit(x, '+', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000680
Walter Dörwalda0021592005-06-13 21:44:48 +0000681 expected = longx - longy
682 got = x - y
683 checkit(x, '-', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000684
Walter Dörwalda0021592005-06-13 21:44:48 +0000685 expected = longx * longy
686 got = x * y
687 checkit(x, '*', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000688
Walter Dörwalda0021592005-06-13 21:44:48 +0000689 if y:
Florent Xicluna07627882010-03-21 01:14:24 +0000690 with test_support.check_py3k_warnings():
691 expected = longx / longy
692 got = x / y
Walter Dörwalda0021592005-06-13 21:44:48 +0000693 checkit(x, '/', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000694
Walter Dörwalda0021592005-06-13 21:44:48 +0000695 expected = longx // longy
696 got = x // y
697 checkit(x, '//', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000698
Walter Dörwalda0021592005-06-13 21:44:48 +0000699 expected = divmod(longx, longy)
700 got = divmod(longx, longy)
701 checkit(x, 'divmod', y)
Tim Petersa3653092001-08-23 23:02:57 +0000702
Walter Dörwalda0021592005-06-13 21:44:48 +0000703 if abs(y) < 5 and not (x == 0 and y < 0):
704 expected = longx ** longy
705 got = x ** y
706 checkit(x, '**', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000707
Walter Dörwalda0021592005-06-13 21:44:48 +0000708 for z in special:
709 if z != 0 :
710 if y >= 0:
711 expected = pow(longx, longy, long(z))
712 got = pow(x, y, z)
713 checkit('pow', x, y, '%', z)
Tim Peters32f453e2001-09-03 08:35:41 +0000714 else:
Walter Dörwalda0021592005-06-13 21:44:48 +0000715 self.assertRaises(TypeError, pow,longx, longy, long(z))
Tim Peters26c7fa32001-08-23 22:56:21 +0000716
Mark Dickinson6736cf82009-04-20 21:13:33 +0000717 @unittest.skipUnless(float.__getformat__("double").startswith("IEEE"),
718 "test requires IEEE 754 doubles")
719 def test_float_conversion(self):
720 import sys
721 DBL_MAX = sys.float_info.max
722 DBL_MAX_EXP = sys.float_info.max_exp
723 DBL_MANT_DIG = sys.float_info.mant_dig
724
725 exact_values = [0L, 1L, 2L,
726 long(2**53-3),
727 long(2**53-2),
728 long(2**53-1),
729 long(2**53),
730 long(2**53+2),
731 long(2**54-4),
732 long(2**54-2),
733 long(2**54),
734 long(2**54+4)]
735 for x in exact_values:
736 self.assertEqual(long(float(x)), x)
737 self.assertEqual(long(float(-x)), -x)
738
739 # test round-half-even
740 for x, y in [(1, 0), (2, 2), (3, 4), (4, 4), (5, 4), (6, 6), (7, 8)]:
741 for p in xrange(15):
742 self.assertEqual(long(float(2L**p*(2**53+x))), 2L**p*(2**53+y))
743
744 for x, y in [(0, 0), (1, 0), (2, 0), (3, 4), (4, 4), (5, 4), (6, 8),
745 (7, 8), (8, 8), (9, 8), (10, 8), (11, 12), (12, 12),
746 (13, 12), (14, 16), (15, 16)]:
747 for p in xrange(15):
748 self.assertEqual(long(float(2L**p*(2**54+x))), 2L**p*(2**54+y))
749
750 # behaviour near extremes of floating-point range
751 long_dbl_max = long(DBL_MAX)
752 top_power = 2**DBL_MAX_EXP
Mark Dickinsona7e734f2009-04-20 21:41:04 +0000753 halfway = (long_dbl_max + top_power)//2
Mark Dickinson6736cf82009-04-20 21:13:33 +0000754 self.assertEqual(float(long_dbl_max), DBL_MAX)
755 self.assertEqual(float(long_dbl_max+1), DBL_MAX)
756 self.assertEqual(float(halfway-1), DBL_MAX)
757 self.assertRaises(OverflowError, float, halfway)
758 self.assertEqual(float(1-halfway), -DBL_MAX)
759 self.assertRaises(OverflowError, float, -halfway)
760 self.assertRaises(OverflowError, float, top_power-1)
761 self.assertRaises(OverflowError, float, top_power)
762 self.assertRaises(OverflowError, float, top_power+1)
763 self.assertRaises(OverflowError, float, 2*top_power-1)
764 self.assertRaises(OverflowError, float, 2*top_power)
765 self.assertRaises(OverflowError, float, top_power*top_power)
766
767 for p in xrange(100):
768 x = long(2**p * (2**53 + 1) + 1)
769 y = long(2**p * (2**53+ 2))
770 self.assertEqual(long(float(x)), y)
771
772 x = long(2**p * (2**53 + 1))
773 y = long(2**p * 2**53)
774 self.assertEqual(long(float(x)), y)
775
Walter Dörwalda0021592005-06-13 21:44:48 +0000776 def test_float_overflow(self):
Walter Dörwalda0021592005-06-13 21:44:48 +0000777 for x in -2.0, -1.0, 0.0, 1.0, 2.0:
778 self.assertEqual(float(long(x)), x)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000779
Walter Dörwalda0021592005-06-13 21:44:48 +0000780 shuge = '12345' * 120
781 huge = 1L << 30000
782 mhuge = -huge
783 namespace = {'huge': huge, 'mhuge': mhuge, 'shuge': shuge, 'math': math}
784 for test in ["float(huge)", "float(mhuge)",
785 "complex(huge)", "complex(mhuge)",
786 "complex(huge, 1)", "complex(mhuge, 1)",
787 "complex(1, huge)", "complex(1, mhuge)",
788 "1. + huge", "huge + 1.", "1. + mhuge", "mhuge + 1.",
789 "1. - huge", "huge - 1.", "1. - mhuge", "mhuge - 1.",
790 "1. * huge", "huge * 1.", "1. * mhuge", "mhuge * 1.",
791 "1. // huge", "huge // 1.", "1. // mhuge", "mhuge // 1.",
792 "1. / huge", "huge / 1.", "1. / mhuge", "mhuge / 1.",
793 "1. ** huge", "huge ** 1.", "1. ** mhuge", "mhuge ** 1.",
794 "math.sin(huge)", "math.sin(mhuge)",
795 "math.sqrt(huge)", "math.sqrt(mhuge)", # should do better
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +0000796 "math.floor(huge)", "math.floor(mhuge)"]:
Tim Peters9fffa3e2001-09-04 05:14:19 +0000797
Walter Dörwalda0021592005-06-13 21:44:48 +0000798 self.assertRaises(OverflowError, eval, test, namespace)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000799
Walter Dörwalda0021592005-06-13 21:44:48 +0000800 # XXX Perhaps float(shuge) can raise OverflowError on some box?
801 # The comparison should not.
802 self.assertNotEqual(float(shuge), int(shuge),
803 "float(shuge) should not equal int(shuge)")
Tim Peters83e7ccc2001-09-04 06:37:28 +0000804
Walter Dörwalda0021592005-06-13 21:44:48 +0000805 def test_logs(self):
Walter Dörwalda0021592005-06-13 21:44:48 +0000806 LOG10E = math.log10(math.e)
Tim Peters307fa782004-09-23 08:06:40 +0000807
Walter Dörwalda0021592005-06-13 21:44:48 +0000808 for exp in range(10) + [100, 1000, 10000]:
809 value = 10 ** exp
810 log10 = math.log10(value)
811 self.assertAlmostEqual(log10, exp)
Tim Peters78526162001-09-05 00:53:45 +0000812
Walter Dörwalda0021592005-06-13 21:44:48 +0000813 # log10(value) == exp, so log(value) == log10(value)/log10(e) ==
814 # exp/LOG10E
815 expected = exp / LOG10E
816 log = math.log(value)
817 self.assertAlmostEqual(log, expected)
Tim Peters78526162001-09-05 00:53:45 +0000818
Walter Dörwalda0021592005-06-13 21:44:48 +0000819 for bad in -(1L << 10000), -2L, 0L:
820 self.assertRaises(ValueError, math.log, bad)
821 self.assertRaises(ValueError, math.log10, bad)
Tim Peters78526162001-09-05 00:53:45 +0000822
Walter Dörwalda0021592005-06-13 21:44:48 +0000823 def test_mixed_compares(self):
824 eq = self.assertEqual
Tim Peters78526162001-09-05 00:53:45 +0000825
Walter Dörwalda0021592005-06-13 21:44:48 +0000826 # We're mostly concerned with that mixing floats and longs does the
827 # right stuff, even when longs are too large to fit in a float.
828 # The safest way to check the results is to use an entirely different
829 # method, which we do here via a skeletal rational class (which
830 # represents all Python ints, longs and floats exactly).
831 class Rat:
832 def __init__(self, value):
833 if isinstance(value, (int, long)):
834 self.n = value
835 self.d = 1
836 elif isinstance(value, float):
837 # Convert to exact rational equivalent.
838 f, e = math.frexp(abs(value))
839 assert f == 0 or 0.5 <= f < 1.0
840 # |value| = f * 2**e exactly
Tim Peters78526162001-09-05 00:53:45 +0000841
Walter Dörwalda0021592005-06-13 21:44:48 +0000842 # Suck up CHUNK bits at a time; 28 is enough so that we suck
843 # up all bits in 2 iterations for all known binary double-
844 # precision formats, and small enough to fit in an int.
845 CHUNK = 28
846 top = 0
847 # invariant: |value| = (top + f) * 2**e exactly
848 while f:
849 f = math.ldexp(f, CHUNK)
850 digit = int(f)
851 assert digit >> CHUNK == 0
852 top = (top << CHUNK) | digit
853 f -= digit
854 assert 0.0 <= f < 1.0
855 e -= CHUNK
Tim Peters78526162001-09-05 00:53:45 +0000856
Walter Dörwalda0021592005-06-13 21:44:48 +0000857 # Now |value| = top * 2**e exactly.
858 if e >= 0:
859 n = top << e
860 d = 1
861 else:
862 n = top
863 d = 1 << -e
864 if value < 0:
865 n = -n
866 self.n = n
867 self.d = d
868 assert float(n) / float(d) == value
Tim Peters307fa782004-09-23 08:06:40 +0000869 else:
Georg Brandldf8a3032010-02-06 23:08:00 +0000870 raise TypeError("can't deal with %r" % value)
Tim Peters307fa782004-09-23 08:06:40 +0000871
Walter Dörwalda0021592005-06-13 21:44:48 +0000872 def __cmp__(self, other):
873 if not isinstance(other, Rat):
874 other = Rat(other)
875 return cmp(self.n * other.d, self.d * other.n)
Tim Peters307fa782004-09-23 08:06:40 +0000876
Walter Dörwalda0021592005-06-13 21:44:48 +0000877 cases = [0, 0.001, 0.99, 1.0, 1.5, 1e20, 1e200]
878 # 2**48 is an important boundary in the internals. 2**53 is an
879 # important boundary for IEEE double precision.
880 for t in 2.0**48, 2.0**50, 2.0**53:
881 cases.extend([t - 1.0, t - 0.3, t, t + 0.3, t + 1.0,
882 long(t-1), long(t), long(t+1)])
883 cases.extend([0, 1, 2, sys.maxint, float(sys.maxint)])
884 # 1L<<20000 should exceed all double formats. long(1e200) is to
885 # check that we get equality with 1e200 above.
886 t = long(1e200)
887 cases.extend([0L, 1L, 2L, 1L << 20000, t-1, t, t+1])
888 cases.extend([-x for x in cases])
889 for x in cases:
890 Rx = Rat(x)
891 for y in cases:
892 Ry = Rat(y)
893 Rcmp = cmp(Rx, Ry)
894 xycmp = cmp(x, y)
895 eq(Rcmp, xycmp, Frm("%r %r %d %d", x, y, Rcmp, xycmp))
896 eq(x == y, Rcmp == 0, Frm("%r == %r %d", x, y, Rcmp))
897 eq(x != y, Rcmp != 0, Frm("%r != %r %d", x, y, Rcmp))
898 eq(x < y, Rcmp < 0, Frm("%r < %r %d", x, y, Rcmp))
899 eq(x <= y, Rcmp <= 0, Frm("%r <= %r %d", x, y, Rcmp))
900 eq(x > y, Rcmp > 0, Frm("%r > %r %d", x, y, Rcmp))
901 eq(x >= y, Rcmp >= 0, Frm("%r >= %r %d", x, y, Rcmp))
Tim Peters307fa782004-09-23 08:06:40 +0000902
Christian Heimes8267d1d2008-01-04 00:37:34 +0000903 def test_nan_inf(self):
904 self.assertRaises(OverflowError, long, float('inf'))
Mark Dickinsonb6467572008-08-04 21:30:09 +0000905 self.assertRaises(OverflowError, long, float('-inf'))
906 self.assertRaises(ValueError, long, float('nan'))
Christian Heimes8267d1d2008-01-04 00:37:34 +0000907
Mark Dickinson1a707982008-12-17 16:14:37 +0000908 def test_bit_length(self):
909 tiny = 1e-10
910 for x in xrange(-65000, 65000):
911 x = long(x)
912 k = x.bit_length()
913 # Check equivalence with Python version
914 self.assertEqual(k, len(bin(x).lstrip('-0b')))
915 # Behaviour as specified in the docs
916 if x != 0:
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000917 self.assertTrue(2**(k-1) <= abs(x) < 2**k)
Mark Dickinson1a707982008-12-17 16:14:37 +0000918 else:
919 self.assertEqual(k, 0)
920 # Alternative definition: x.bit_length() == 1 + floor(log_2(x))
921 if x != 0:
922 # When x is an exact power of 2, numeric errors can
923 # cause floor(log(x)/log(2)) to be one too small; for
924 # small x this can be fixed by adding a small quantity
925 # to the quotient before taking the floor.
926 self.assertEqual(k, 1 + math.floor(
927 math.log(abs(x))/math.log(2) + tiny))
928
929 self.assertEqual((0L).bit_length(), 0)
930 self.assertEqual((1L).bit_length(), 1)
931 self.assertEqual((-1L).bit_length(), 1)
932 self.assertEqual((2L).bit_length(), 2)
933 self.assertEqual((-2L).bit_length(), 2)
934 for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64, 234]:
935 a = 2L**i
936 self.assertEqual((a-1).bit_length(), i)
937 self.assertEqual((1-a).bit_length(), i)
938 self.assertEqual((a).bit_length(), i+1)
939 self.assertEqual((-a).bit_length(), i+1)
940 self.assertEqual((a+1).bit_length(), i+1)
941 self.assertEqual((-a-1).bit_length(), i+1)
942
943
Walter Dörwalda0021592005-06-13 21:44:48 +0000944def test_main():
945 test_support.run_unittest(LongTest)
Tim Peters307fa782004-09-23 08:06:40 +0000946
Walter Dörwalda0021592005-06-13 21:44:48 +0000947if __name__ == "__main__":
948 test_main()