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