1ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport sys
2ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport unittest
4ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom test import test_support
5ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom test.test_support import run_unittest, have_unicode
6ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport math
7ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
8ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehL = [
9ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('0', 0),
10ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('1', 1),
11ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('9', 9),
12ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('10', 10),
13ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('99', 99),
14ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('100', 100),
15ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('314', 314),
16ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (' 314', 314),
17ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('314 ', 314),
18ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('  \t\t  314  \t\t  ', 314),
19ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (repr(sys.maxint), sys.maxint),
20ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('  1x', ValueError),
21ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('  1  ', 1),
22ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('  1\02  ', ValueError),
23ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', ValueError),
24ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (' ', ValueError),
25ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('  \t\t  ', ValueError)
26ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh]
27ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehif have_unicode:
28ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    L += [
29ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (unicode('0'), 0),
30ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (unicode('1'), 1),
31ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (unicode('9'), 9),
32ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (unicode('10'), 10),
33ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (unicode('99'), 99),
34ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (unicode('100'), 100),
35ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (unicode('314'), 314),
36ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (unicode(' 314'), 314),
37ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
38ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (unicode('  \t\t  314  \t\t  '), 314),
39ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (unicode('  1x'), ValueError),
40ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (unicode('  1  '), 1),
41ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (unicode('  1\02  '), ValueError),
42ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (unicode(''), ValueError),
43ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (unicode(' '), ValueError),
44ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (unicode('  \t\t  '), ValueError),
45ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (unichr(0x200), ValueError),
46ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh]
47ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
48ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass IntLongCommonTests(object):
49ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
50ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Mixin of test cases to share between both test_int and test_long."""
51ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
52ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Change to int or long in the TestCase subclass.
53ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ntype = None
54ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
55ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_no_args(self):
56ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(self.ntype(), 0)
57ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
58ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_keyword_args(self):
59ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Test invoking constructor using keyword arguments.
60ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(self.ntype(x=1.2), 1)
61ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(self.ntype('100', base=2), 4)
62ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(self.ntype(x='100', base=2), 4)
63ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, self.ntype, base=10)
64ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, self.ntype, base=0)
65ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
66ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass IntTestCases(IntLongCommonTests, unittest.TestCase):
67ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
68ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ntype = int
69ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
70ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_basic(self):
71ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(314), 314)
72ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(3.14), 3)
73ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(314L), 314)
74ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Check that conversion from float truncates towards zero
75ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(-3.14), -3)
76ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(3.9), 3)
77ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(-3.9), -3)
78ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(3.5), 3)
79ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(-3.5), -3)
80ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Different base:
81ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int("10",16), 16L)
82ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if have_unicode:
83ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(int(unicode("10"),16), 16L)
84ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Test conversion from strings and various anomalies
85ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for s, v in L:
86ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for sign in "", "+", "-":
87ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                for prefix in "", " ", "\t", "  \t\t  ":
88ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    ss = prefix + sign + s
89ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    vv = v
90ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    if sign == "-" and v is not ValueError:
91ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        vv = -v
92ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    try:
93ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        self.assertEqual(int(ss), vv)
94ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    except v:
95ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        pass
96ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
97ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        s = repr(-1-sys.maxint)
98ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = int(s)
99ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x+1, -sys.maxint)
100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIsInstance(x, int)
101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # should return long
102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(s[1:]), sys.maxint+1)
103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # should return long
105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = int(1e100)
106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIsInstance(x, long)
107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = int(-1e100)
108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIsInstance(x, long)
109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # SF bug 434186:  0x80000000/2 != 0x80000000>>1.
112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Worked by accident in Windows release build, but failed in debug build.
113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Failed in all Linux builds.
114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = -1-sys.maxint
115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x >> 1, x//2)
116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '123\0')
118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '53', 40)
119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # SF bug 1545497: embedded NULs were not detected with
121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # explicit base
122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '123\0', 10)
123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '123\x00 245', 20)
124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = int('1' * 600)
126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIsInstance(x, long)
127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if have_unicode:
129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            x = int(unichr(0x661) * 600)
130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertIsInstance(x, long)
131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, int, 1, 12)
133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('0123', 0), 83)
135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('0x123', 16), 291)
136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Bug 1679: "0x" is not a valid hex literal
138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, "0x", 16)
139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, "0x", 0)
140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, "0o", 8)
142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, "0o", 0)
143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, "0b", 2)
145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, "0b", 0)
146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # SF bug 1334662: int(string, base) wrong answers
149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Various representations of 2**32 evaluated to 0
150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # rather than 2**32 in previous versions
151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('102002022201221111211', 3), 4294967296L)
154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('10000000000000000', 4), 4294967296L)
155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('32244002423141', 5), 4294967296L)
156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('1550104015504', 6), 4294967296L)
157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('211301422354', 7), 4294967296L)
158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('40000000000', 8), 4294967296L)
159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('12068657454', 9), 4294967296L)
160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('4294967296', 10), 4294967296L)
161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('1904440554', 11), 4294967296L)
162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('9ba461594', 12), 4294967296L)
163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('535a79889', 13), 4294967296L)
164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('2ca5b7464', 14), 4294967296L)
165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('1a20dcd81', 15), 4294967296L)
166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('100000000', 16), 4294967296L)
167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('a7ffda91', 17), 4294967296L)
168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('704he7g4', 18), 4294967296L)
169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('4f5aff66', 19), 4294967296L)
170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('3723ai4g', 20), 4294967296L)
171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('281d55i4', 21), 4294967296L)
172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('1fj8b184', 22), 4294967296L)
173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('1606k7ic', 23), 4294967296L)
174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('mb994ag', 24), 4294967296L)
175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('hek2mgl', 25), 4294967296L)
176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('dnchbnm', 26), 4294967296L)
177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('b28jpdm', 27), 4294967296L)
178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('8pfgih4', 28), 4294967296L)
179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('76beigg', 29), 4294967296L)
180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('5qmcpqg', 30), 4294967296L)
181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('4q0jto4', 31), 4294967296L)
182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('4000000', 32), 4294967296L)
183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('3aokq94', 33), 4294967296L)
184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('2qhxjli', 34), 4294967296L)
185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('2br45qb', 35), 4294967296L)
186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('1z141z4', 36), 4294967296L)
187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # tests with base 0
189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # this fails on 3.0, but in 2.x the old octal syntax is allowed
190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(' 0123  ', 0), 83)
191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(' 0123  ', 0), 83)
192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('000', 0), 0)
193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('0o123', 0), 83)
194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('0x123', 0), 291)
195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('0b100', 0), 4)
196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(' 0O123   ', 0), 83)
197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(' 0X123  ', 0), 291)
198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(' 0B100 ', 0), 4)
199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('0', 0), 0)
200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('+0', 0), 0)
201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('-0', 0), 0)
202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('00', 0), 0)
203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '08', 0)
204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '-012395', 0)
205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # without base still base 10
207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('0123'), 123)
208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('0123', 10), 123)
209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # tests with prefix and base != 0
211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('0x123', 16), 291)
212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('0o123', 8), 83)
213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('0b100', 2), 4)
214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('0X123', 16), 291)
215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('0O123', 8), 83)
216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('0B100', 2), 4)
217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # the code has special checks for the first character after the
219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        #  type prefix
220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '0b2', 2)
221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '0b02', 2)
222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '0B2', 2)
223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '0B02', 2)
224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '0o8', 8)
225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '0o08', 8)
226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '0O8', 8)
227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '0O08', 8)
228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '0xg', 16)
229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '0x0g', 16)
230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '0Xg', 16)
231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '0X0g', 16)
232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # SF bug 1334662: int(string, base) wrong answers
234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Checks for proper evaluation of 2**32 + 1
235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('102002022201221111212', 3), 4294967297L)
237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('10000000000000001', 4), 4294967297L)
238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('32244002423142', 5), 4294967297L)
239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('1550104015505', 6), 4294967297L)
240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('211301422355', 7), 4294967297L)
241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('40000000001', 8), 4294967297L)
242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('12068657455', 9), 4294967297L)
243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('4294967297', 10), 4294967297L)
244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('1904440555', 11), 4294967297L)
245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('9ba461595', 12), 4294967297L)
246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('535a7988a', 13), 4294967297L)
247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('2ca5b7465', 14), 4294967297L)
248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('1a20dcd82', 15), 4294967297L)
249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('100000001', 16), 4294967297L)
250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('a7ffda92', 17), 4294967297L)
251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('704he7g5', 18), 4294967297L)
252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('4f5aff67', 19), 4294967297L)
253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('3723ai4h', 20), 4294967297L)
254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('281d55i5', 21), 4294967297L)
255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('1fj8b185', 22), 4294967297L)
256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('1606k7id', 23), 4294967297L)
257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('mb994ah', 24), 4294967297L)
258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('hek2mgm', 25), 4294967297L)
259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('dnchbnn', 26), 4294967297L)
260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('b28jpdn', 27), 4294967297L)
261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('8pfgih5', 28), 4294967297L)
262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('76beigh', 29), 4294967297L)
263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('5qmcpqh', 30), 4294967297L)
264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('4q0jto5', 31), 4294967297L)
265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('4000001', 32), 4294967297L)
266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('3aokq95', 33), 4294967297L)
267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('2qhxjlj', 34), 4294967297L)
268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('2br45qc', 35), 4294967297L)
269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int('1z141z5', 36), 4294967297L)
270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_bit_length(self):
272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        tiny = 1e-10
273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for x in xrange(-65000, 65000):
274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            k = x.bit_length()
275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            # Check equivalence with Python version
276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(k, len(bin(x).lstrip('-0b')))
277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            # Behaviour as specified in the docs
278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            if x != 0:
279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertTrue(2**(k-1) <= abs(x) < 2**k)
280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            else:
281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertEqual(k, 0)
282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            # Alternative definition: x.bit_length() == 1 + floor(log_2(x))
283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            if x != 0:
284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                # When x is an exact power of 2, numeric errors can
285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                # cause floor(log(x)/log(2)) to be one too small; for
286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                # small x this can be fixed by adding a small quantity
287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                # to the quotient before taking the floor.
288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertEqual(k, 1 + math.floor(
289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        math.log(abs(x))/math.log(2) + tiny))
290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual((0).bit_length(), 0)
292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual((1).bit_length(), 1)
293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual((-1).bit_length(), 1)
294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual((2).bit_length(), 2)
295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual((-2).bit_length(), 2)
296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64]:
297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            a = 2**i
298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual((a-1).bit_length(), i)
299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual((1-a).bit_length(), i)
300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual((a).bit_length(), i+1)
301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual((-a).bit_length(), i+1)
302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual((a+1).bit_length(), i+1)
303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual((-a-1).bit_length(), i+1)
304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    @unittest.skipUnless(float.__getformat__("double").startswith("IEEE"),
306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         "test requires IEEE 754 doubles")
307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_float_conversion(self):
308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # values exactly representable as floats
309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        exact_values = [-2, -1, 0, 1, 2, 2**52, 2**53-1, 2**53, 2**53+2,
310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         2**53+4, 2**54-4, 2**54-2, 2**63, -2**63, 2**64,
311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         -2**64, 10**20, 10**21, 10**22]
312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for value in exact_values:
313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(int(float(int(value))), value)
314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # test round-half-to-even
316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(2**53+1)), 2**53)
317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(2**53+2)), 2**53+2)
318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(2**53+3)), 2**53+4)
319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(2**53+5)), 2**53+4)
320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(2**53+6)), 2**53+6)
321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(2**53+7)), 2**53+8)
322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(-2**53-1)), -2**53)
324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(-2**53-2)), -2**53-2)
325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(-2**53-3)), -2**53-4)
326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(-2**53-5)), -2**53-4)
327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(-2**53-6)), -2**53-6)
328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(-2**53-7)), -2**53-8)
329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(2**54-2)), 2**54-2)
331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(2**54-1)), 2**54)
332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(2**54+2)), 2**54)
333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(2**54+3)), 2**54+4)
334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(2**54+5)), 2**54+4)
335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(2**54+6)), 2**54+8)
336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(2**54+10)), 2**54+8)
337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(float(2**54+11)), 2**54+12)
338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_valid_non_numeric_input_types_for_x(self):
340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Test possible valid non-numeric types for x, including subclasses
341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # of the allowed built-in types.
342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class CustomStr(str): pass
343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        values = ['100', CustomStr('100')]
344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if have_unicode:
346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            class CustomUnicode(unicode): pass
347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            values += [unicode('100'), CustomUnicode(unicode('100'))]
348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
349ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for x in values:
350ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            msg = 'x has value %s and type %s' % (x, type(x).__name__)
351ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            try:
352ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertEqual(int(x), 100, msg=msg)
353ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertEqual(int(x, 2), 4, msg=msg)
354ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            except TypeError, err:
355ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                raise AssertionError('For %s got TypeError: %s' %
356ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                     (type(x).__name__, err))
357ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
358ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_error_on_string_float_for_x(self):
359ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, int, '1.2')
360ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
361ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_error_on_bytearray_for_x(self):
362ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, int, bytearray('100'), 2)
363ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
364ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_error_on_invalid_int_bases(self):
365ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for base in [-1, 1, 1000]:
366ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertRaises(ValueError, int, '100', base)
367ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
368ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_error_on_string_base(self):
369ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, int, 100, base='foo')
370ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
371ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    @test_support.cpython_only
372ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_small_ints(self):
373ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIs(int('10'), 10)
374ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIs(int('-1'), -1)
375ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if have_unicode:
376ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertIs(int(u'10'), 10)
377ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertIs(int(u'-1'), -1)
378ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
379ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_intconversion(self):
380ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Test __int__()
381ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class ClassicMissingMethods:
382ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            pass
383ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(AttributeError, int, ClassicMissingMethods())
384ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
385ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class MissingMethods(object):
386ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            pass
387ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, int, MissingMethods())
388ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
389ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class Foo0:
390ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __int__(self):
391ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return 42
392ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
393ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class Foo1(object):
394ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __int__(self):
395ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return 42
396ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
397ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class Foo2(int):
398ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __int__(self):
399ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return 42
400ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
401ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class Foo3(int):
402ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __int__(self):
403ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return self
404ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
405ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class Foo4(int):
406ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __int__(self):
407ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return 42L
408ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
409ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class Foo5(int):
410ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __int__(self):
411ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return 42.
412ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
413ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(Foo0()), 42)
414ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(Foo1()), 42)
415ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(Foo2()), 42)
416ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(Foo3()), 0)
417ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(int(Foo4()), 42L)
418ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, int, Foo5())
419ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
420ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class Classic:
421ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            pass
422ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for base in (object, Classic):
423ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            class IntOverridesTrunc(base):
424ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                def __int__(self):
425ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    return 42
426ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                def __trunc__(self):
427ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    return -12
428ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(int(IntOverridesTrunc()), 42)
429ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
430ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            class JustTrunc(base):
431ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                def __trunc__(self):
432ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    return 42
433ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(int(JustTrunc()), 42)
434ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
435ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for trunc_result_base in (object, Classic):
436ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                class Integral(trunc_result_base):
437ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    def __int__(self):
438ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        return 42
439ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
440ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                class TruncReturnsNonInt(base):
441ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    def __trunc__(self):
442ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        return Integral()
443ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertEqual(int(TruncReturnsNonInt()), 42)
444ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
445ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                class NonIntegral(trunc_result_base):
446ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    def __trunc__(self):
447ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        # Check that we avoid infinite recursion.
448ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        return NonIntegral()
449ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
450ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                class TruncReturnsNonIntegral(base):
451ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    def __trunc__(self):
452ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        return NonIntegral()
453ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                try:
454ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    int(TruncReturnsNonIntegral())
455ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                except TypeError as e:
456ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    self.assertEqual(str(e),
457ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      "__trunc__ returned non-Integral"
458ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      " (type NonIntegral)")
459ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                else:
460ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    self.fail("Failed to raise TypeError with %s" %
461ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                              ((base, trunc_result_base),))
462ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
463ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef test_main():
464ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    run_unittest(IntTestCases)
465ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
466ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehif __name__ == "__main__":
467ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    test_main()
468