1979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Petersonimport sys
2979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
3979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Petersonimport unittest
4cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlovfrom test import test_support
5979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Petersonfrom test.test_support import run_unittest, have_unicode
61a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinsonimport math
7979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
8979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin PetersonL = [
9979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        ('0', 0),
10979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        ('1', 1),
11979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        ('9', 9),
12979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        ('10', 10),
13979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        ('99', 99),
14979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        ('100', 100),
15979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        ('314', 314),
16979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (' 314', 314),
17979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        ('314 ', 314),
18979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        ('  \t\t  314  \t\t  ', 314),
19979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (repr(sys.maxint), sys.maxint),
20979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        ('  1x', ValueError),
21979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        ('  1  ', 1),
22979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        ('  1\02  ', ValueError),
23979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        ('', ValueError),
24979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (' ', ValueError),
25979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        ('  \t\t  ', ValueError)
26979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson]
27979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Petersonif have_unicode:
28979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson    L += [
29979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (unicode('0'), 0),
30979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (unicode('1'), 1),
31979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (unicode('9'), 9),
32979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (unicode('10'), 10),
33979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (unicode('99'), 99),
34979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (unicode('100'), 100),
35979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (unicode('314'), 314),
36979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (unicode(' 314'), 314),
37979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
38979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (unicode('  \t\t  314  \t\t  '), 314),
39979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (unicode('  1x'), ValueError),
40979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (unicode('  1  '), 1),
41979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (unicode('  1\02  '), ValueError),
42979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (unicode(''), ValueError),
43979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (unicode(' '), ValueError),
44979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (unicode('  \t\t  '), ValueError),
45979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        (unichr(0x200), ValueError),
46979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson]
47979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
488d30ad7c8ad5df59be8a65c8f8dab0d13be00dabSerhiy Storchakaclass IntSubclass(int):
498d30ad7c8ad5df59be8a65c8f8dab0d13be00dabSerhiy Storchaka    pass
508d30ad7c8ad5df59be8a65c8f8dab0d13be00dabSerhiy Storchaka
516f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonekclass IntLongCommonTests(object):
526f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonek
536f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonek    """Mixin of test cases to share between both test_int and test_long."""
546f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonek
556f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonek    # Change to int or long in the TestCase subclass.
566f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonek    ntype = None
576f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonek
586f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonek    def test_no_args(self):
596f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonek        self.assertEqual(self.ntype(), 0)
606f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonek
616f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonek    def test_keyword_args(self):
626f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonek        # Test invoking constructor using keyword arguments.
636f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonek        self.assertEqual(self.ntype(x=1.2), 1)
646f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonek        self.assertEqual(self.ntype('100', base=2), 4)
656f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonek        self.assertEqual(self.ntype(x='100', base=2), 4)
66cf095f8e0f0ed1111995a5b8a8a5ebdb189683f2Serhiy Storchaka        self.assertRaises(TypeError, self.ntype, base=10)
67cf095f8e0f0ed1111995a5b8a8a5ebdb189683f2Serhiy Storchaka        self.assertRaises(TypeError, self.ntype, base=0)
686f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonek
696f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonekclass IntTestCases(IntLongCommonTests, unittest.TestCase):
706f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonek
716f70fe804690bbfea9caefe1ba01029aa1abf0ebChris Jerdonek    ntype = int
72979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
73979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson    def test_basic(self):
74979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(314), 314)
75979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(3.14), 3)
76979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(314L), 314)
77979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # Check that conversion from float truncates towards zero
78979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(-3.14), -3)
79979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(3.9), 3)
80979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(-3.9), -3)
81979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(3.5), 3)
82979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(-3.5), -3)
83979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # Different base:
84979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int("10",16), 16L)
85979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        if have_unicode:
86979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson            self.assertEqual(int(unicode("10"),16), 16L)
87979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # Test conversion from strings and various anomalies
88979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        for s, v in L:
89979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson            for sign in "", "+", "-":
90979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                for prefix in "", " ", "\t", "  \t\t  ":
91979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                    ss = prefix + sign + s
92979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                    vv = v
93979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                    if sign == "-" and v is not ValueError:
94979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                        vv = -v
95979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                    try:
96979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                        self.assertEqual(int(ss), vv)
97979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                    except v:
98979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                        pass
99979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
100979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        s = repr(-1-sys.maxint)
101979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        x = int(s)
102979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(x+1, -sys.maxint)
103b0f5adc3f4e098b1744eeac65fc830fb1df2b8abEzio Melotti        self.assertIsInstance(x, int)
104979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # should return long
105979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(s[1:]), sys.maxint+1)
106979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
107979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # should return long
108979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        x = int(1e100)
109b0f5adc3f4e098b1744eeac65fc830fb1df2b8abEzio Melotti        self.assertIsInstance(x, long)
110979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        x = int(-1e100)
111b0f5adc3f4e098b1744eeac65fc830fb1df2b8abEzio Melotti        self.assertIsInstance(x, long)
112979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
113979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
114979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # SF bug 434186:  0x80000000/2 != 0x80000000>>1.
115979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # Worked by accident in Windows release build, but failed in debug build.
116979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # Failed in all Linux builds.
117979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        x = -1-sys.maxint
118979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(x >> 1, x//2)
119979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
120979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, '123\0')
121979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, '53', 40)
122979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
123979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # SF bug 1545497: embedded NULs were not detected with
124979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # explicit base
125979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, '123\0', 10)
126979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, '123\x00 245', 20)
127979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
128979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        x = int('1' * 600)
129b0f5adc3f4e098b1744eeac65fc830fb1df2b8abEzio Melotti        self.assertIsInstance(x, long)
130979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
131979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        if have_unicode:
132979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson            x = int(unichr(0x661) * 600)
133b0f5adc3f4e098b1744eeac65fc830fb1df2b8abEzio Melotti            self.assertIsInstance(x, long)
134979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
135979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(TypeError, int, 1, 12)
136979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
137979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('0123', 0), 83)
138979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('0x123', 16), 291)
139979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
140979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # Bug 1679: "0x" is not a valid hex literal
141979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, "0x", 16)
142979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, "0x", 0)
143979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
144979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, "0o", 8)
145979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, "0o", 0)
146979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
147979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, "0b", 2)
148979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, "0b", 0)
149979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
150979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
151979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # SF bug 1334662: int(string, base) wrong answers
152979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # Various representations of 2**32 evaluated to 0
153979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # rather than 2**32 in previous versions
154979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
155979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
156979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('102002022201221111211', 3), 4294967296L)
157979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('10000000000000000', 4), 4294967296L)
158979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('32244002423141', 5), 4294967296L)
159979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('1550104015504', 6), 4294967296L)
160979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('211301422354', 7), 4294967296L)
161979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('40000000000', 8), 4294967296L)
162979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('12068657454', 9), 4294967296L)
163979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('4294967296', 10), 4294967296L)
164979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('1904440554', 11), 4294967296L)
165979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('9ba461594', 12), 4294967296L)
166979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('535a79889', 13), 4294967296L)
167979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('2ca5b7464', 14), 4294967296L)
168979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('1a20dcd81', 15), 4294967296L)
169979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('100000000', 16), 4294967296L)
170979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('a7ffda91', 17), 4294967296L)
171979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('704he7g4', 18), 4294967296L)
172979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('4f5aff66', 19), 4294967296L)
173979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('3723ai4g', 20), 4294967296L)
174979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('281d55i4', 21), 4294967296L)
175979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('1fj8b184', 22), 4294967296L)
176979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('1606k7ic', 23), 4294967296L)
177979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('mb994ag', 24), 4294967296L)
178979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('hek2mgl', 25), 4294967296L)
179979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('dnchbnm', 26), 4294967296L)
180979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('b28jpdm', 27), 4294967296L)
181979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('8pfgih4', 28), 4294967296L)
182979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('76beigg', 29), 4294967296L)
183979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('5qmcpqg', 30), 4294967296L)
184979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('4q0jto4', 31), 4294967296L)
185979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('4000000', 32), 4294967296L)
186979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('3aokq94', 33), 4294967296L)
187979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('2qhxjli', 34), 4294967296L)
188979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('2br45qb', 35), 4294967296L)
189979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('1z141z4', 36), 4294967296L)
190979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
191979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # tests with base 0
192979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # this fails on 3.0, but in 2.x the old octal syntax is allowed
193979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(' 0123  ', 0), 83)
194979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(' 0123  ', 0), 83)
195979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('000', 0), 0)
196979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('0o123', 0), 83)
197979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('0x123', 0), 291)
198979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('0b100', 0), 4)
199979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(' 0O123   ', 0), 83)
200979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(' 0X123  ', 0), 291)
201979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(' 0B100 ', 0), 4)
202784a47f2c0fcdee61518407900baa1e08025182bMark Dickinson        self.assertEqual(int('0', 0), 0)
203784a47f2c0fcdee61518407900baa1e08025182bMark Dickinson        self.assertEqual(int('+0', 0), 0)
204784a47f2c0fcdee61518407900baa1e08025182bMark Dickinson        self.assertEqual(int('-0', 0), 0)
205784a47f2c0fcdee61518407900baa1e08025182bMark Dickinson        self.assertEqual(int('00', 0), 0)
206784a47f2c0fcdee61518407900baa1e08025182bMark Dickinson        self.assertRaises(ValueError, int, '08', 0)
207784a47f2c0fcdee61518407900baa1e08025182bMark Dickinson        self.assertRaises(ValueError, int, '-012395', 0)
208979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
209979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # without base still base 10
210979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('0123'), 123)
211979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('0123', 10), 123)
212979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
213979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # tests with prefix and base != 0
214979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('0x123', 16), 291)
215979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('0o123', 8), 83)
216979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('0b100', 2), 4)
217979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('0X123', 16), 291)
218979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('0O123', 8), 83)
219979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('0B100', 2), 4)
220979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
221979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # the code has special checks for the first character after the
222979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        #  type prefix
223979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, '0b2', 2)
224979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, '0b02', 2)
225979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, '0B2', 2)
226979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, '0B02', 2)
227979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, '0o8', 8)
228979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, '0o08', 8)
229979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, '0O8', 8)
230979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, '0O08', 8)
231979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, '0xg', 16)
232979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, '0x0g', 16)
233979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, '0Xg', 16)
234979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(ValueError, int, '0X0g', 16)
235979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
236979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # SF bug 1334662: int(string, base) wrong answers
237979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # Checks for proper evaluation of 2**32 + 1
238979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
239979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('102002022201221111212', 3), 4294967297L)
240979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('10000000000000001', 4), 4294967297L)
241979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('32244002423142', 5), 4294967297L)
242979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('1550104015505', 6), 4294967297L)
243979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('211301422355', 7), 4294967297L)
244979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('40000000001', 8), 4294967297L)
245979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('12068657455', 9), 4294967297L)
246979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('4294967297', 10), 4294967297L)
247979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('1904440555', 11), 4294967297L)
248979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('9ba461595', 12), 4294967297L)
249979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('535a7988a', 13), 4294967297L)
250979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('2ca5b7465', 14), 4294967297L)
251979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('1a20dcd82', 15), 4294967297L)
252979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('100000001', 16), 4294967297L)
253979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('a7ffda92', 17), 4294967297L)
254979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('704he7g5', 18), 4294967297L)
255979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('4f5aff67', 19), 4294967297L)
256979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('3723ai4h', 20), 4294967297L)
257979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('281d55i5', 21), 4294967297L)
258979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('1fj8b185', 22), 4294967297L)
259979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('1606k7id', 23), 4294967297L)
260979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('mb994ah', 24), 4294967297L)
261979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('hek2mgm', 25), 4294967297L)
262979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('dnchbnn', 26), 4294967297L)
263979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('b28jpdn', 27), 4294967297L)
264979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('8pfgih5', 28), 4294967297L)
265979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('76beigh', 29), 4294967297L)
266979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('5qmcpqh', 30), 4294967297L)
267979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('4q0jto5', 31), 4294967297L)
268979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('4000001', 32), 4294967297L)
269979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('3aokq95', 33), 4294967297L)
270979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('2qhxjlj', 34), 4294967297L)
271979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('2br45qc', 35), 4294967297L)
272979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int('1z141z5', 36), 4294967297L)
273979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
2741a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson    def test_bit_length(self):
2751a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson        tiny = 1e-10
2761a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson        for x in xrange(-65000, 65000):
2771a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson            k = x.bit_length()
2781a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson            # Check equivalence with Python version
2791a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson            self.assertEqual(k, len(bin(x).lstrip('-0b')))
2801a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson            # Behaviour as specified in the docs
2811a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson            if x != 0:
2825c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson                self.assertTrue(2**(k-1) <= abs(x) < 2**k)
2831a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson            else:
2841a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson                self.assertEqual(k, 0)
2851a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson            # Alternative definition: x.bit_length() == 1 + floor(log_2(x))
2861a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson            if x != 0:
2871a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson                # When x is an exact power of 2, numeric errors can
2881a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson                # cause floor(log(x)/log(2)) to be one too small; for
2891a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson                # small x this can be fixed by adding a small quantity
2901a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson                # to the quotient before taking the floor.
2911a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson                self.assertEqual(k, 1 + math.floor(
2921a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson                        math.log(abs(x))/math.log(2) + tiny))
2931a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson
2941a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson        self.assertEqual((0).bit_length(), 0)
2951a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson        self.assertEqual((1).bit_length(), 1)
2961a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson        self.assertEqual((-1).bit_length(), 1)
2971a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson        self.assertEqual((2).bit_length(), 2)
2981a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson        self.assertEqual((-2).bit_length(), 2)
2991a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson        for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64]:
3001a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson            a = 2**i
3011a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson            self.assertEqual((a-1).bit_length(), i)
3021a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson            self.assertEqual((1-a).bit_length(), i)
3031a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson            self.assertEqual((a).bit_length(), i+1)
3041a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson            self.assertEqual((-a).bit_length(), i+1)
3051a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson            self.assertEqual((a+1).bit_length(), i+1)
3061a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson            self.assertEqual((-a-1).bit_length(), i+1)
3071a707981c8b57e5ca7c5b8aa38d3e5e6ca235dbfMark Dickinson
3086736cf8d20b67b74e8e959622132963285156242Mark Dickinson    @unittest.skipUnless(float.__getformat__("double").startswith("IEEE"),
3096736cf8d20b67b74e8e959622132963285156242Mark Dickinson                         "test requires IEEE 754 doubles")
3106736cf8d20b67b74e8e959622132963285156242Mark Dickinson    def test_float_conversion(self):
3116736cf8d20b67b74e8e959622132963285156242Mark Dickinson        # values exactly representable as floats
3126736cf8d20b67b74e8e959622132963285156242Mark Dickinson        exact_values = [-2, -1, 0, 1, 2, 2**52, 2**53-1, 2**53, 2**53+2,
3136736cf8d20b67b74e8e959622132963285156242Mark Dickinson                         2**53+4, 2**54-4, 2**54-2, 2**63, -2**63, 2**64,
3146736cf8d20b67b74e8e959622132963285156242Mark Dickinson                         -2**64, 10**20, 10**21, 10**22]
3156736cf8d20b67b74e8e959622132963285156242Mark Dickinson        for value in exact_values:
3166736cf8d20b67b74e8e959622132963285156242Mark Dickinson            self.assertEqual(int(float(int(value))), value)
3176736cf8d20b67b74e8e959622132963285156242Mark Dickinson
3186736cf8d20b67b74e8e959622132963285156242Mark Dickinson        # test round-half-to-even
3196736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(2**53+1)), 2**53)
3206736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(2**53+2)), 2**53+2)
3216736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(2**53+3)), 2**53+4)
3226736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(2**53+5)), 2**53+4)
3236736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(2**53+6)), 2**53+6)
3246736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(2**53+7)), 2**53+8)
3256736cf8d20b67b74e8e959622132963285156242Mark Dickinson
3266736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(-2**53-1)), -2**53)
3276736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(-2**53-2)), -2**53-2)
3286736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(-2**53-3)), -2**53-4)
3296736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(-2**53-5)), -2**53-4)
3306736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(-2**53-6)), -2**53-6)
3316736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(-2**53-7)), -2**53-8)
3326736cf8d20b67b74e8e959622132963285156242Mark Dickinson
3336736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(2**54-2)), 2**54-2)
3346736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(2**54-1)), 2**54)
3356736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(2**54+2)), 2**54)
3366736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(2**54+3)), 2**54+4)
3376736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(2**54+5)), 2**54+4)
3386736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(2**54+6)), 2**54+8)
3396736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(2**54+10)), 2**54+8)
3406736cf8d20b67b74e8e959622132963285156242Mark Dickinson        self.assertEqual(int(float(2**54+11)), 2**54+12)
3416736cf8d20b67b74e8e959622132963285156242Mark Dickinson
342cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov    def test_valid_non_numeric_input_types_for_x(self):
343cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov        # Test possible valid non-numeric types for x, including subclasses
344cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov        # of the allowed built-in types.
345cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov        class CustomStr(str): pass
3466156560e4b40ae81304d80b5a932fd90e6b4ba80Serhiy Storchaka        class CustomByteArray(bytearray): pass
3476156560e4b40ae81304d80b5a932fd90e6b4ba80Serhiy Storchaka        factories = [str, bytearray, CustomStr, CustomByteArray, buffer]
348cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov
349cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov        if have_unicode:
350cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov            class CustomUnicode(unicode): pass
3516156560e4b40ae81304d80b5a932fd90e6b4ba80Serhiy Storchaka            factories += [unicode, CustomUnicode]
352cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov
3536156560e4b40ae81304d80b5a932fd90e6b4ba80Serhiy Storchaka        for f in factories:
35443e9007767618aac7d6c30228518ae375ebb3008Serhiy Storchaka            with test_support.check_py3k_warnings(quiet=True):
35543e9007767618aac7d6c30228518ae375ebb3008Serhiy Storchaka                x = f('100')
356cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov            msg = 'x has value %s and type %s' % (x, type(x).__name__)
357cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov            try:
3588876145fabec7924981f36019f0c2e45f73fbad2Serhiy Storchaka                self.assertEqual(int(x), 100, msg=msg)
3596156560e4b40ae81304d80b5a932fd90e6b4ba80Serhiy Storchaka                if isinstance(x, basestring):
3606156560e4b40ae81304d80b5a932fd90e6b4ba80Serhiy Storchaka                    self.assertEqual(int(x, 2), 4, msg=msg)
361cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov            except TypeError, err:
362cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov                raise AssertionError('For %s got TypeError: %s' %
363cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov                                     (type(x).__name__, err))
3646156560e4b40ae81304d80b5a932fd90e6b4ba80Serhiy Storchaka            if not isinstance(x, basestring):
3656156560e4b40ae81304d80b5a932fd90e6b4ba80Serhiy Storchaka                errmsg = "can't convert non-string"
3666156560e4b40ae81304d80b5a932fd90e6b4ba80Serhiy Storchaka                with self.assertRaisesRegexp(TypeError, errmsg, msg=msg):
3676156560e4b40ae81304d80b5a932fd90e6b4ba80Serhiy Storchaka                    int(x, 2)
3686156560e4b40ae81304d80b5a932fd90e6b4ba80Serhiy Storchaka            errmsg = 'invalid literal'
36943e9007767618aac7d6c30228518ae375ebb3008Serhiy Storchaka            with self.assertRaisesRegexp(ValueError, errmsg, msg=msg), \
37043e9007767618aac7d6c30228518ae375ebb3008Serhiy Storchaka                 test_support.check_py3k_warnings(quiet=True):
3716156560e4b40ae81304d80b5a932fd90e6b4ba80Serhiy Storchaka                int(f('A' * 0x10))
3726156560e4b40ae81304d80b5a932fd90e6b4ba80Serhiy Storchaka
3736156560e4b40ae81304d80b5a932fd90e6b4ba80Serhiy Storchaka    def test_int_buffer(self):
37443e9007767618aac7d6c30228518ae375ebb3008Serhiy Storchaka        with test_support.check_py3k_warnings():
37543e9007767618aac7d6c30228518ae375ebb3008Serhiy Storchaka            self.assertEqual(int(buffer('123', 1, 2)), 23)
37643e9007767618aac7d6c30228518ae375ebb3008Serhiy Storchaka            self.assertEqual(int(buffer('123\x00', 1, 2)), 23)
37743e9007767618aac7d6c30228518ae375ebb3008Serhiy Storchaka            self.assertEqual(int(buffer('123 ', 1, 2)), 23)
37843e9007767618aac7d6c30228518ae375ebb3008Serhiy Storchaka            self.assertEqual(int(buffer('123A', 1, 2)), 23)
37943e9007767618aac7d6c30228518ae375ebb3008Serhiy Storchaka            self.assertEqual(int(buffer('1234', 1, 2)), 23)
380cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov
381cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov    def test_error_on_string_float_for_x(self):
382cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov        self.assertRaises(ValueError, int, '1.2')
383cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov
384cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov    def test_error_on_bytearray_for_x(self):
385cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov        self.assertRaises(TypeError, int, bytearray('100'), 2)
386cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov
387cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov    def test_error_on_invalid_int_bases(self):
388cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov        for base in [-1, 1, 1000]:
389cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov            self.assertRaises(ValueError, int, '100', base)
390cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov
391cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov    def test_error_on_string_base(self):
392cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov        self.assertRaises(TypeError, int, 100, base='foo')
393cddcafaf6b11f4da66fdccba20a777ccb55b800bAndrew Svetlov
394270767b2ceb5452d052b280eb1b174d7a32d43f5Serhiy Storchaka    @test_support.cpython_only
395270767b2ceb5452d052b280eb1b174d7a32d43f5Serhiy Storchaka    def test_small_ints(self):
396c90be30b0de9089e3abef0f288caf4a693f81356Serhiy Storchaka        self.assertIs(int('10'), 10)
397c90be30b0de9089e3abef0f288caf4a693f81356Serhiy Storchaka        self.assertIs(int('-1'), -1)
398270767b2ceb5452d052b280eb1b174d7a32d43f5Serhiy Storchaka        if have_unicode:
399c90be30b0de9089e3abef0f288caf4a693f81356Serhiy Storchaka            self.assertIs(int(u'10'), 10)
400c90be30b0de9089e3abef0f288caf4a693f81356Serhiy Storchaka            self.assertIs(int(u'-1'), -1)
401270767b2ceb5452d052b280eb1b174d7a32d43f5Serhiy Storchaka
402979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson    def test_intconversion(self):
403979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        # Test __int__()
404979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        class ClassicMissingMethods:
405979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson            pass
406979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(AttributeError, int, ClassicMissingMethods())
407979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
408979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        class MissingMethods(object):
409979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson            pass
410979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(TypeError, int, MissingMethods())
411979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
412979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        class Foo0:
413979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson            def __int__(self):
414979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                return 42
415979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
416979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        class Foo1(object):
417979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson            def __int__(self):
418979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                return 42
419979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
420979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        class Foo2(int):
421979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson            def __int__(self):
422979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                return 42
423979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
424979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        class Foo3(int):
425979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson            def __int__(self):
426979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                return self
427979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
428979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        class Foo4(int):
429979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson            def __int__(self):
430979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                return 42L
431979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
432979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        class Foo5(int):
433979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson            def __int__(self):
434979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                return 42.
435979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
436979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(Foo0()), 42)
437979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(Foo1()), 42)
438979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(Foo2()), 42)
439979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(Foo3()), 0)
440979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertEqual(int(Foo4()), 42L)
441979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        self.assertRaises(TypeError, int, Foo5())
442979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
443979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        class Classic:
444979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson            pass
445979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson        for base in (object, Classic):
446979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson            class IntOverridesTrunc(base):
447979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                def __int__(self):
448979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                    return 42
449979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                def __trunc__(self):
450979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                    return -12
451979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson            self.assertEqual(int(IntOverridesTrunc()), 42)
452979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
453979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson            class JustTrunc(base):
454979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                def __trunc__(self):
455979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                    return 42
456979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson            self.assertEqual(int(JustTrunc()), 42)
457979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
458979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson            for trunc_result_base in (object, Classic):
459979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                class Integral(trunc_result_base):
460979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                    def __int__(self):
461979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                        return 42
462979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
463979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                class TruncReturnsNonInt(base):
464979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                    def __trunc__(self):
465979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                        return Integral()
466979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                self.assertEqual(int(TruncReturnsNonInt()), 42)
467979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
468979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                class NonIntegral(trunc_result_base):
469979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                    def __trunc__(self):
470979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                        # Check that we avoid infinite recursion.
471979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                        return NonIntegral()
472979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
473979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                class TruncReturnsNonIntegral(base):
474979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                    def __trunc__(self):
475979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                        return NonIntegral()
476979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                try:
477979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                    int(TruncReturnsNonIntegral())
478979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                except TypeError as e:
4792623a37852153363335956afab010cb0beb7e74eEzio Melotti                    self.assertEqual(str(e),
480979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                                      "__trunc__ returned non-Integral"
481979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                                      " (type NonIntegral)")
482979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                else:
483979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                    self.fail("Failed to raise TypeError with %s" %
484979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson                              ((base, trunc_result_base),))
485979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
4868d30ad7c8ad5df59be8a65c8f8dab0d13be00dabSerhiy Storchaka                class TruncReturnsIntSubclass(base):
4878d30ad7c8ad5df59be8a65c8f8dab0d13be00dabSerhiy Storchaka                    def __trunc__(self):
4888d30ad7c8ad5df59be8a65c8f8dab0d13be00dabSerhiy Storchaka                        return True
4898d30ad7c8ad5df59be8a65c8f8dab0d13be00dabSerhiy Storchaka                good_int = TruncReturnsIntSubclass()
4908d30ad7c8ad5df59be8a65c8f8dab0d13be00dabSerhiy Storchaka                n = int(good_int)
4918d30ad7c8ad5df59be8a65c8f8dab0d13be00dabSerhiy Storchaka                self.assertEqual(n, 1)
4928d30ad7c8ad5df59be8a65c8f8dab0d13be00dabSerhiy Storchaka                self.assertIs(type(n), bool)
4938d30ad7c8ad5df59be8a65c8f8dab0d13be00dabSerhiy Storchaka                n = IntSubclass(good_int)
4948d30ad7c8ad5df59be8a65c8f8dab0d13be00dabSerhiy Storchaka                self.assertEqual(n, 1)
4958d30ad7c8ad5df59be8a65c8f8dab0d13be00dabSerhiy Storchaka                self.assertIs(type(n), IntSubclass)
4968d30ad7c8ad5df59be8a65c8f8dab0d13be00dabSerhiy Storchaka
4978d30ad7c8ad5df59be8a65c8f8dab0d13be00dabSerhiy Storchaka
498979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Petersondef test_main():
499979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson    run_unittest(IntTestCases)
500979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson
501979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Petersonif __name__ == "__main__":
502979395b7a8be422dfc9a081f1cd77260c6ea9aefBenjamin Peterson    test_main()
503