blob: dd40ef6fe6df4936d694371f7e2eaf9e72171d34 [file] [log] [blame]
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001import sys
2
3import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test.support import run_unittest
Christian Heimes81ee3ef2008-05-04 22:42:01 +00005
6L = [
7 ('0', 0),
8 ('1', 1),
9 ('9', 9),
10 ('10', 10),
11 ('99', 99),
12 ('100', 100),
13 ('314', 314),
14 (' 314', 314),
15 ('314 ', 314),
16 (' \t\t 314 \t\t ', 314),
17 (repr(sys.maxsize), sys.maxsize),
18 (' 1x', ValueError),
19 (' 1 ', 1),
20 (' 1\02 ', ValueError),
21 ('', ValueError),
22 (' ', ValueError),
23 (' \t\t ', ValueError)
24]
25
26class IntTestCases(unittest.TestCase):
27
28 def test_basic(self):
29 self.assertEqual(int(314), 314)
30 self.assertEqual(int(3.14), 3)
31 # Check that conversion from float truncates towards zero
32 self.assertEqual(int(-3.14), -3)
33 self.assertEqual(int(3.9), 3)
34 self.assertEqual(int(-3.9), -3)
35 self.assertEqual(int(3.5), 3)
36 self.assertEqual(int(-3.5), -3)
37 # Different base:
38 self.assertEqual(int("10",16), 16)
39 # Test conversion from strings and various anomalies
40 for s, v in L:
41 for sign in "", "+", "-":
42 for prefix in "", " ", "\t", " \t\t ":
43 ss = prefix + sign + s
44 vv = v
45 if sign == "-" and v is not ValueError:
46 vv = -v
47 try:
48 self.assertEqual(int(ss), vv)
49 except ValueError:
50 pass
51
52 s = repr(-1-sys.maxsize)
53 x = int(s)
54 self.assertEqual(x+1, -sys.maxsize)
55 self.assert_(isinstance(x, int))
56 # should return long
57 self.assertEqual(int(s[1:]), sys.maxsize+1)
58
59 # should return long
60 x = int(1e100)
61 self.assert_(isinstance(x, int))
62 x = int(-1e100)
63 self.assert_(isinstance(x, int))
64
65
66 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
67 # Worked by accident in Windows release build, but failed in debug build.
68 # Failed in all Linux builds.
69 x = -1-sys.maxsize
70 self.assertEqual(x >> 1, x//2)
71
72 self.assertRaises(ValueError, int, '123\0')
73 self.assertRaises(ValueError, int, '53', 40)
74
75 # SF bug 1545497: embedded NULs were not detected with
76 # explicit base
77 self.assertRaises(ValueError, int, '123\0', 10)
78 self.assertRaises(ValueError, int, '123\x00 245', 20)
79
80 x = int('1' * 600)
81 self.assert_(isinstance(x, int))
82
83 self.assertRaises(TypeError, int, 1, 12)
84
85 self.assertEqual(int('0o123', 0), 83)
86 self.assertEqual(int('0x123', 16), 291)
87
88 # Bug 1679: "0x" is not a valid hex literal
89 self.assertRaises(ValueError, int, "0x", 16)
90 self.assertRaises(ValueError, int, "0x", 0)
91
92 self.assertRaises(ValueError, int, "0o", 8)
93 self.assertRaises(ValueError, int, "0o", 0)
94
95 self.assertRaises(ValueError, int, "0b", 2)
96 self.assertRaises(ValueError, int, "0b", 0)
97
Martin v. Löwis029656f2008-06-30 04:06:08 +000098 # Bug #3236: Return small longs from PyLong_FromString
99 self.assert_(int("10") is 10)
100 self.assert_(int("-1") is -1)
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000101
102 # SF bug 1334662: int(string, base) wrong answers
103 # Various representations of 2**32 evaluated to 0
104 # rather than 2**32 in previous versions
105
106 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296)
107 self.assertEqual(int('102002022201221111211', 3), 4294967296)
108 self.assertEqual(int('10000000000000000', 4), 4294967296)
109 self.assertEqual(int('32244002423141', 5), 4294967296)
110 self.assertEqual(int('1550104015504', 6), 4294967296)
111 self.assertEqual(int('211301422354', 7), 4294967296)
112 self.assertEqual(int('40000000000', 8), 4294967296)
113 self.assertEqual(int('12068657454', 9), 4294967296)
114 self.assertEqual(int('4294967296', 10), 4294967296)
115 self.assertEqual(int('1904440554', 11), 4294967296)
116 self.assertEqual(int('9ba461594', 12), 4294967296)
117 self.assertEqual(int('535a79889', 13), 4294967296)
118 self.assertEqual(int('2ca5b7464', 14), 4294967296)
119 self.assertEqual(int('1a20dcd81', 15), 4294967296)
120 self.assertEqual(int('100000000', 16), 4294967296)
121 self.assertEqual(int('a7ffda91', 17), 4294967296)
122 self.assertEqual(int('704he7g4', 18), 4294967296)
123 self.assertEqual(int('4f5aff66', 19), 4294967296)
124 self.assertEqual(int('3723ai4g', 20), 4294967296)
125 self.assertEqual(int('281d55i4', 21), 4294967296)
126 self.assertEqual(int('1fj8b184', 22), 4294967296)
127 self.assertEqual(int('1606k7ic', 23), 4294967296)
128 self.assertEqual(int('mb994ag', 24), 4294967296)
129 self.assertEqual(int('hek2mgl', 25), 4294967296)
130 self.assertEqual(int('dnchbnm', 26), 4294967296)
131 self.assertEqual(int('b28jpdm', 27), 4294967296)
132 self.assertEqual(int('8pfgih4', 28), 4294967296)
133 self.assertEqual(int('76beigg', 29), 4294967296)
134 self.assertEqual(int('5qmcpqg', 30), 4294967296)
135 self.assertEqual(int('4q0jto4', 31), 4294967296)
136 self.assertEqual(int('4000000', 32), 4294967296)
137 self.assertEqual(int('3aokq94', 33), 4294967296)
138 self.assertEqual(int('2qhxjli', 34), 4294967296)
139 self.assertEqual(int('2br45qb', 35), 4294967296)
140 self.assertEqual(int('1z141z4', 36), 4294967296)
141
142 # tests with base 0
143 # this fails on 3.0, but in 2.x the old octal syntax is allowed
144 self.assertEqual(int(' 0o123 ', 0), 83)
145 self.assertEqual(int(' 0o123 ', 0), 83)
146 self.assertEqual(int('000', 0), 0)
147 self.assertEqual(int('0o123', 0), 83)
148 self.assertEqual(int('0x123', 0), 291)
149 self.assertEqual(int('0b100', 0), 4)
150 self.assertEqual(int(' 0O123 ', 0), 83)
151 self.assertEqual(int(' 0X123 ', 0), 291)
152 self.assertEqual(int(' 0B100 ', 0), 4)
153
154 # without base still base 10
155 self.assertEqual(int('0123'), 123)
156 self.assertEqual(int('0123', 10), 123)
157
158 # tests with prefix and base != 0
159 self.assertEqual(int('0x123', 16), 291)
160 self.assertEqual(int('0o123', 8), 83)
161 self.assertEqual(int('0b100', 2), 4)
162 self.assertEqual(int('0X123', 16), 291)
163 self.assertEqual(int('0O123', 8), 83)
164 self.assertEqual(int('0B100', 2), 4)
165
166 # the code has special checks for the first character after the
167 # type prefix
168 self.assertRaises(ValueError, int, '0b2', 2)
169 self.assertRaises(ValueError, int, '0b02', 2)
170 self.assertRaises(ValueError, int, '0B2', 2)
171 self.assertRaises(ValueError, int, '0B02', 2)
172 self.assertRaises(ValueError, int, '0o8', 8)
173 self.assertRaises(ValueError, int, '0o08', 8)
174 self.assertRaises(ValueError, int, '0O8', 8)
175 self.assertRaises(ValueError, int, '0O08', 8)
176 self.assertRaises(ValueError, int, '0xg', 16)
177 self.assertRaises(ValueError, int, '0x0g', 16)
178 self.assertRaises(ValueError, int, '0Xg', 16)
179 self.assertRaises(ValueError, int, '0X0g', 16)
180
181 # SF bug 1334662: int(string, base) wrong answers
182 # Checks for proper evaluation of 2**32 + 1
183 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297)
184 self.assertEqual(int('102002022201221111212', 3), 4294967297)
185 self.assertEqual(int('10000000000000001', 4), 4294967297)
186 self.assertEqual(int('32244002423142', 5), 4294967297)
187 self.assertEqual(int('1550104015505', 6), 4294967297)
188 self.assertEqual(int('211301422355', 7), 4294967297)
189 self.assertEqual(int('40000000001', 8), 4294967297)
190 self.assertEqual(int('12068657455', 9), 4294967297)
191 self.assertEqual(int('4294967297', 10), 4294967297)
192 self.assertEqual(int('1904440555', 11), 4294967297)
193 self.assertEqual(int('9ba461595', 12), 4294967297)
194 self.assertEqual(int('535a7988a', 13), 4294967297)
195 self.assertEqual(int('2ca5b7465', 14), 4294967297)
196 self.assertEqual(int('1a20dcd82', 15), 4294967297)
197 self.assertEqual(int('100000001', 16), 4294967297)
198 self.assertEqual(int('a7ffda92', 17), 4294967297)
199 self.assertEqual(int('704he7g5', 18), 4294967297)
200 self.assertEqual(int('4f5aff67', 19), 4294967297)
201 self.assertEqual(int('3723ai4h', 20), 4294967297)
202 self.assertEqual(int('281d55i5', 21), 4294967297)
203 self.assertEqual(int('1fj8b185', 22), 4294967297)
204 self.assertEqual(int('1606k7id', 23), 4294967297)
205 self.assertEqual(int('mb994ah', 24), 4294967297)
206 self.assertEqual(int('hek2mgm', 25), 4294967297)
207 self.assertEqual(int('dnchbnn', 26), 4294967297)
208 self.assertEqual(int('b28jpdn', 27), 4294967297)
209 self.assertEqual(int('8pfgih5', 28), 4294967297)
210 self.assertEqual(int('76beigh', 29), 4294967297)
211 self.assertEqual(int('5qmcpqh', 30), 4294967297)
212 self.assertEqual(int('4q0jto5', 31), 4294967297)
213 self.assertEqual(int('4000001', 32), 4294967297)
214 self.assertEqual(int('3aokq95', 33), 4294967297)
215 self.assertEqual(int('2qhxjlj', 34), 4294967297)
216 self.assertEqual(int('2br45qc', 35), 4294967297)
217 self.assertEqual(int('1z141z5', 36), 4294967297)
218
219 def test_intconversion(self):
220 # Test __int__()
221 class ClassicMissingMethods:
222 pass
223 self.assertRaises(TypeError, int, ClassicMissingMethods())
224
225 class MissingMethods(object):
226 pass
227 self.assertRaises(TypeError, int, MissingMethods())
228
229 class Foo0:
230 def __int__(self):
231 return 42
232
233 class Foo1(object):
234 def __int__(self):
235 return 42
236
237 class Foo2(int):
238 def __int__(self):
239 return 42
240
241 class Foo3(int):
242 def __int__(self):
243 return self
244
245 class Foo4(int):
246 def __int__(self):
247 return 42
248
249 class Foo5(int):
250 def __int__(self):
251 return 42.
252
253 self.assertEqual(int(Foo0()), 42)
254 self.assertEqual(int(Foo1()), 42)
255 self.assertEqual(int(Foo2()), 42)
256 self.assertEqual(int(Foo3()), 0)
257 self.assertEqual(int(Foo4()), 42)
258 self.assertRaises(TypeError, int, Foo5())
259
260 class Classic:
261 pass
262 for base in (object, Classic):
263 class IntOverridesTrunc(base):
264 def __int__(self):
265 return 42
266 def __trunc__(self):
267 return -12
268 self.assertEqual(int(IntOverridesTrunc()), 42)
269
270 class JustTrunc(base):
271 def __trunc__(self):
272 return 42
273 self.assertEqual(int(JustTrunc()), 42)
274
275 for trunc_result_base in (object, Classic):
276 class Integral(trunc_result_base):
277 def __int__(self):
278 return 42
279
280 class TruncReturnsNonInt(base):
281 def __trunc__(self):
282 return Integral()
283 self.assertEqual(int(TruncReturnsNonInt()), 42)
284
285 class NonIntegral(trunc_result_base):
286 def __trunc__(self):
287 # Check that we avoid infinite recursion.
288 return NonIntegral()
289
290 class TruncReturnsNonIntegral(base):
291 def __trunc__(self):
292 return NonIntegral()
293 try:
294 int(TruncReturnsNonIntegral())
295 except TypeError as e:
296 self.assertEquals(str(e),
297 "__trunc__ returned non-Integral"
298 " (type NonIntegral)")
299 else:
300 self.fail("Failed to raise TypeError with %s" %
301 ((base, trunc_result_base),))
302
303def test_main():
304 run_unittest(IntTestCases)
305
306if __name__ == "__main__":
307 test_main()