blob: 3462540e7563868767e2c1e6c9d3df0224077a25 [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
98
99 # SF bug 1334662: int(string, base) wrong answers
100 # Various representations of 2**32 evaluated to 0
101 # rather than 2**32 in previous versions
102
103 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296)
104 self.assertEqual(int('102002022201221111211', 3), 4294967296)
105 self.assertEqual(int('10000000000000000', 4), 4294967296)
106 self.assertEqual(int('32244002423141', 5), 4294967296)
107 self.assertEqual(int('1550104015504', 6), 4294967296)
108 self.assertEqual(int('211301422354', 7), 4294967296)
109 self.assertEqual(int('40000000000', 8), 4294967296)
110 self.assertEqual(int('12068657454', 9), 4294967296)
111 self.assertEqual(int('4294967296', 10), 4294967296)
112 self.assertEqual(int('1904440554', 11), 4294967296)
113 self.assertEqual(int('9ba461594', 12), 4294967296)
114 self.assertEqual(int('535a79889', 13), 4294967296)
115 self.assertEqual(int('2ca5b7464', 14), 4294967296)
116 self.assertEqual(int('1a20dcd81', 15), 4294967296)
117 self.assertEqual(int('100000000', 16), 4294967296)
118 self.assertEqual(int('a7ffda91', 17), 4294967296)
119 self.assertEqual(int('704he7g4', 18), 4294967296)
120 self.assertEqual(int('4f5aff66', 19), 4294967296)
121 self.assertEqual(int('3723ai4g', 20), 4294967296)
122 self.assertEqual(int('281d55i4', 21), 4294967296)
123 self.assertEqual(int('1fj8b184', 22), 4294967296)
124 self.assertEqual(int('1606k7ic', 23), 4294967296)
125 self.assertEqual(int('mb994ag', 24), 4294967296)
126 self.assertEqual(int('hek2mgl', 25), 4294967296)
127 self.assertEqual(int('dnchbnm', 26), 4294967296)
128 self.assertEqual(int('b28jpdm', 27), 4294967296)
129 self.assertEqual(int('8pfgih4', 28), 4294967296)
130 self.assertEqual(int('76beigg', 29), 4294967296)
131 self.assertEqual(int('5qmcpqg', 30), 4294967296)
132 self.assertEqual(int('4q0jto4', 31), 4294967296)
133 self.assertEqual(int('4000000', 32), 4294967296)
134 self.assertEqual(int('3aokq94', 33), 4294967296)
135 self.assertEqual(int('2qhxjli', 34), 4294967296)
136 self.assertEqual(int('2br45qb', 35), 4294967296)
137 self.assertEqual(int('1z141z4', 36), 4294967296)
138
139 # tests with base 0
140 # this fails on 3.0, but in 2.x the old octal syntax is allowed
141 self.assertEqual(int(' 0o123 ', 0), 83)
142 self.assertEqual(int(' 0o123 ', 0), 83)
143 self.assertEqual(int('000', 0), 0)
144 self.assertEqual(int('0o123', 0), 83)
145 self.assertEqual(int('0x123', 0), 291)
146 self.assertEqual(int('0b100', 0), 4)
147 self.assertEqual(int(' 0O123 ', 0), 83)
148 self.assertEqual(int(' 0X123 ', 0), 291)
149 self.assertEqual(int(' 0B100 ', 0), 4)
150
151 # without base still base 10
152 self.assertEqual(int('0123'), 123)
153 self.assertEqual(int('0123', 10), 123)
154
155 # tests with prefix and base != 0
156 self.assertEqual(int('0x123', 16), 291)
157 self.assertEqual(int('0o123', 8), 83)
158 self.assertEqual(int('0b100', 2), 4)
159 self.assertEqual(int('0X123', 16), 291)
160 self.assertEqual(int('0O123', 8), 83)
161 self.assertEqual(int('0B100', 2), 4)
162
163 # the code has special checks for the first character after the
164 # type prefix
165 self.assertRaises(ValueError, int, '0b2', 2)
166 self.assertRaises(ValueError, int, '0b02', 2)
167 self.assertRaises(ValueError, int, '0B2', 2)
168 self.assertRaises(ValueError, int, '0B02', 2)
169 self.assertRaises(ValueError, int, '0o8', 8)
170 self.assertRaises(ValueError, int, '0o08', 8)
171 self.assertRaises(ValueError, int, '0O8', 8)
172 self.assertRaises(ValueError, int, '0O08', 8)
173 self.assertRaises(ValueError, int, '0xg', 16)
174 self.assertRaises(ValueError, int, '0x0g', 16)
175 self.assertRaises(ValueError, int, '0Xg', 16)
176 self.assertRaises(ValueError, int, '0X0g', 16)
177
178 # SF bug 1334662: int(string, base) wrong answers
179 # Checks for proper evaluation of 2**32 + 1
180 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297)
181 self.assertEqual(int('102002022201221111212', 3), 4294967297)
182 self.assertEqual(int('10000000000000001', 4), 4294967297)
183 self.assertEqual(int('32244002423142', 5), 4294967297)
184 self.assertEqual(int('1550104015505', 6), 4294967297)
185 self.assertEqual(int('211301422355', 7), 4294967297)
186 self.assertEqual(int('40000000001', 8), 4294967297)
187 self.assertEqual(int('12068657455', 9), 4294967297)
188 self.assertEqual(int('4294967297', 10), 4294967297)
189 self.assertEqual(int('1904440555', 11), 4294967297)
190 self.assertEqual(int('9ba461595', 12), 4294967297)
191 self.assertEqual(int('535a7988a', 13), 4294967297)
192 self.assertEqual(int('2ca5b7465', 14), 4294967297)
193 self.assertEqual(int('1a20dcd82', 15), 4294967297)
194 self.assertEqual(int('100000001', 16), 4294967297)
195 self.assertEqual(int('a7ffda92', 17), 4294967297)
196 self.assertEqual(int('704he7g5', 18), 4294967297)
197 self.assertEqual(int('4f5aff67', 19), 4294967297)
198 self.assertEqual(int('3723ai4h', 20), 4294967297)
199 self.assertEqual(int('281d55i5', 21), 4294967297)
200 self.assertEqual(int('1fj8b185', 22), 4294967297)
201 self.assertEqual(int('1606k7id', 23), 4294967297)
202 self.assertEqual(int('mb994ah', 24), 4294967297)
203 self.assertEqual(int('hek2mgm', 25), 4294967297)
204 self.assertEqual(int('dnchbnn', 26), 4294967297)
205 self.assertEqual(int('b28jpdn', 27), 4294967297)
206 self.assertEqual(int('8pfgih5', 28), 4294967297)
207 self.assertEqual(int('76beigh', 29), 4294967297)
208 self.assertEqual(int('5qmcpqh', 30), 4294967297)
209 self.assertEqual(int('4q0jto5', 31), 4294967297)
210 self.assertEqual(int('4000001', 32), 4294967297)
211 self.assertEqual(int('3aokq95', 33), 4294967297)
212 self.assertEqual(int('2qhxjlj', 34), 4294967297)
213 self.assertEqual(int('2br45qc', 35), 4294967297)
214 self.assertEqual(int('1z141z5', 36), 4294967297)
215
216 def test_intconversion(self):
217 # Test __int__()
218 class ClassicMissingMethods:
219 pass
220 self.assertRaises(TypeError, int, ClassicMissingMethods())
221
222 class MissingMethods(object):
223 pass
224 self.assertRaises(TypeError, int, MissingMethods())
225
226 class Foo0:
227 def __int__(self):
228 return 42
229
230 class Foo1(object):
231 def __int__(self):
232 return 42
233
234 class Foo2(int):
235 def __int__(self):
236 return 42
237
238 class Foo3(int):
239 def __int__(self):
240 return self
241
242 class Foo4(int):
243 def __int__(self):
244 return 42
245
246 class Foo5(int):
247 def __int__(self):
248 return 42.
249
250 self.assertEqual(int(Foo0()), 42)
251 self.assertEqual(int(Foo1()), 42)
252 self.assertEqual(int(Foo2()), 42)
253 self.assertEqual(int(Foo3()), 0)
254 self.assertEqual(int(Foo4()), 42)
255 self.assertRaises(TypeError, int, Foo5())
256
257 class Classic:
258 pass
259 for base in (object, Classic):
260 class IntOverridesTrunc(base):
261 def __int__(self):
262 return 42
263 def __trunc__(self):
264 return -12
265 self.assertEqual(int(IntOverridesTrunc()), 42)
266
267 class JustTrunc(base):
268 def __trunc__(self):
269 return 42
270 self.assertEqual(int(JustTrunc()), 42)
271
272 for trunc_result_base in (object, Classic):
273 class Integral(trunc_result_base):
274 def __int__(self):
275 return 42
276
277 class TruncReturnsNonInt(base):
278 def __trunc__(self):
279 return Integral()
280 self.assertEqual(int(TruncReturnsNonInt()), 42)
281
282 class NonIntegral(trunc_result_base):
283 def __trunc__(self):
284 # Check that we avoid infinite recursion.
285 return NonIntegral()
286
287 class TruncReturnsNonIntegral(base):
288 def __trunc__(self):
289 return NonIntegral()
290 try:
291 int(TruncReturnsNonIntegral())
292 except TypeError as e:
293 self.assertEquals(str(e),
294 "__trunc__ returned non-Integral"
295 " (type NonIntegral)")
296 else:
297 self.fail("Failed to raise TypeError with %s" %
298 ((base, trunc_result_base),))
299
300def test_main():
301 run_unittest(IntTestCases)
302
303if __name__ == "__main__":
304 test_main()