183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport sys
283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport unittest
483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom test import test_support
583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom test.test_support import run_unittest, have_unicode
683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport math
783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehL = [
983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ('0', 0),
1083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ('1', 1),
1183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ('9', 9),
1283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ('10', 10),
1383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ('99', 99),
1483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ('100', 100),
1583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ('314', 314),
1683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (' 314', 314),
1783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ('314 ', 314),
1883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ('  \t\t  314  \t\t  ', 314),
1983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (repr(sys.maxint), sys.maxint),
2083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ('  1x', ValueError),
2183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ('  1  ', 1),
2283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ('  1\02  ', ValueError),
2383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ('', ValueError),
2483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (' ', ValueError),
2583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ('  \t\t  ', ValueError)
2683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh]
2783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif have_unicode:
2883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    L += [
2983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (unicode('0'), 0),
3083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (unicode('1'), 1),
3183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (unicode('9'), 9),
3283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (unicode('10'), 10),
3383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (unicode('99'), 99),
3483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (unicode('100'), 100),
3583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (unicode('314'), 314),
3683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (unicode(' 314'), 314),
3783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
3883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (unicode('  \t\t  314  \t\t  '), 314),
3983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (unicode('  1x'), ValueError),
4083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (unicode('  1  '), 1),
4183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (unicode('  1\02  '), ValueError),
4283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (unicode(''), ValueError),
4383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (unicode(' '), ValueError),
4483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (unicode('  \t\t  '), ValueError),
4583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (unichr(0x200), ValueError),
4683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh]
4783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
4883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass IntLongCommonTests(object):
4983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """Mixin of test cases to share between both test_int and test_long."""
5183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Change to int or long in the TestCase subclass.
5383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ntype = None
5483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_no_args(self):
5683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(self.ntype(), 0)
5783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_keyword_args(self):
5983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Test invoking constructor using keyword arguments.
6083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(self.ntype(x=1.2), 1)
6183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(self.ntype('100', base=2), 4)
6283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(self.ntype(x='100', base=2), 4)
6383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, self.ntype, base=10)
6483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, self.ntype, base=0)
6583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
6683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass IntTestCases(IntLongCommonTests, unittest.TestCase):
6783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
6883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ntype = int
6983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
7083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_basic(self):
7183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(314), 314)
7283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(3.14), 3)
7383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(314L), 314)
7483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Check that conversion from float truncates towards zero
7583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(-3.14), -3)
7683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(3.9), 3)
7783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(-3.9), -3)
7883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(3.5), 3)
7983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(-3.5), -3)
8083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Different base:
8183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int("10",16), 16L)
8283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if have_unicode:
8383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(int(unicode("10"),16), 16L)
8483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Test conversion from strings and various anomalies
8583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for s, v in L:
8683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for sign in "", "+", "-":
8783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                for prefix in "", " ", "\t", "  \t\t  ":
8883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    ss = prefix + sign + s
8983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    vv = v
9083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    if sign == "-" and v is not ValueError:
9183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        vv = -v
9283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    try:
9383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        self.assertEqual(int(ss), vv)
9483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    except v:
9583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        pass
9683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
9783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        s = repr(-1-sys.maxint)
9883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        x = int(s)
9983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(x+1, -sys.maxint)
10083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertIsInstance(x, int)
10183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # should return long
10283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(s[1:]), sys.maxint+1)
10383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
10483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # should return long
10583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        x = int(1e100)
10683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertIsInstance(x, long)
10783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        x = int(-1e100)
10883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertIsInstance(x, long)
10983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # SF bug 434186:  0x80000000/2 != 0x80000000>>1.
11283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Worked by accident in Windows release build, but failed in debug build.
11383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Failed in all Linux builds.
11483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        x = -1-sys.maxint
11583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(x >> 1, x//2)
11683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '123\0')
11883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '53', 40)
11983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
12083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # SF bug 1545497: embedded NULs were not detected with
12183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # explicit base
12283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '123\0', 10)
12383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '123\x00 245', 20)
12483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
12583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        x = int('1' * 600)
12683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertIsInstance(x, long)
12783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
12883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if have_unicode:
12983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            x = int(unichr(0x661) * 600)
13083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertIsInstance(x, long)
13183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
13283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, int, 1, 12)
13383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
13483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('0123', 0), 83)
13583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('0x123', 16), 291)
13683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
13783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Bug 1679: "0x" is not a valid hex literal
13883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, "0x", 16)
13983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, "0x", 0)
14083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
14183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, "0o", 8)
14283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, "0o", 0)
14383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
14483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, "0b", 2)
14583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, "0b", 0)
14683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
14783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
14883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # SF bug 1334662: int(string, base) wrong answers
14983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Various representations of 2**32 evaluated to 0
15083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # rather than 2**32 in previous versions
15183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
15283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
15383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('102002022201221111211', 3), 4294967296L)
15483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('10000000000000000', 4), 4294967296L)
15583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('32244002423141', 5), 4294967296L)
15683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('1550104015504', 6), 4294967296L)
15783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('211301422354', 7), 4294967296L)
15883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('40000000000', 8), 4294967296L)
15983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('12068657454', 9), 4294967296L)
16083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('4294967296', 10), 4294967296L)
16183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('1904440554', 11), 4294967296L)
16283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('9ba461594', 12), 4294967296L)
16383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('535a79889', 13), 4294967296L)
16483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('2ca5b7464', 14), 4294967296L)
16583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('1a20dcd81', 15), 4294967296L)
16683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('100000000', 16), 4294967296L)
16783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('a7ffda91', 17), 4294967296L)
16883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('704he7g4', 18), 4294967296L)
16983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('4f5aff66', 19), 4294967296L)
17083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('3723ai4g', 20), 4294967296L)
17183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('281d55i4', 21), 4294967296L)
17283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('1fj8b184', 22), 4294967296L)
17383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('1606k7ic', 23), 4294967296L)
17483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('mb994ag', 24), 4294967296L)
17583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('hek2mgl', 25), 4294967296L)
17683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('dnchbnm', 26), 4294967296L)
17783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('b28jpdm', 27), 4294967296L)
17883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('8pfgih4', 28), 4294967296L)
17983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('76beigg', 29), 4294967296L)
18083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('5qmcpqg', 30), 4294967296L)
18183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('4q0jto4', 31), 4294967296L)
18283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('4000000', 32), 4294967296L)
18383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('3aokq94', 33), 4294967296L)
18483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('2qhxjli', 34), 4294967296L)
18583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('2br45qb', 35), 4294967296L)
18683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('1z141z4', 36), 4294967296L)
18783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
18883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # tests with base 0
18983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # this fails on 3.0, but in 2.x the old octal syntax is allowed
19083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(' 0123  ', 0), 83)
19183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(' 0123  ', 0), 83)
19283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('000', 0), 0)
19383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('0o123', 0), 83)
19483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('0x123', 0), 291)
19583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('0b100', 0), 4)
19683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(' 0O123   ', 0), 83)
19783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(' 0X123  ', 0), 291)
19883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(' 0B100 ', 0), 4)
19983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('0', 0), 0)
20083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('+0', 0), 0)
20183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('-0', 0), 0)
20283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('00', 0), 0)
20383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '08', 0)
20483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '-012395', 0)
20583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
20683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # without base still base 10
20783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('0123'), 123)
20883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('0123', 10), 123)
20983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
21083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # tests with prefix and base != 0
21183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('0x123', 16), 291)
21283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('0o123', 8), 83)
21383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('0b100', 2), 4)
21483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('0X123', 16), 291)
21583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('0O123', 8), 83)
21683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('0B100', 2), 4)
21783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
21883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # the code has special checks for the first character after the
21983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #  type prefix
22083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '0b2', 2)
22183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '0b02', 2)
22283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '0B2', 2)
22383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '0B02', 2)
22483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '0o8', 8)
22583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '0o08', 8)
22683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '0O8', 8)
22783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '0O08', 8)
22883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '0xg', 16)
22983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '0x0g', 16)
23083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '0Xg', 16)
23183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '0X0g', 16)
23283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
23383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # SF bug 1334662: int(string, base) wrong answers
23483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Checks for proper evaluation of 2**32 + 1
23583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
23683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('102002022201221111212', 3), 4294967297L)
23783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('10000000000000001', 4), 4294967297L)
23883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('32244002423142', 5), 4294967297L)
23983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('1550104015505', 6), 4294967297L)
24083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('211301422355', 7), 4294967297L)
24183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('40000000001', 8), 4294967297L)
24283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('12068657455', 9), 4294967297L)
24383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('4294967297', 10), 4294967297L)
24483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('1904440555', 11), 4294967297L)
24583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('9ba461595', 12), 4294967297L)
24683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('535a7988a', 13), 4294967297L)
24783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('2ca5b7465', 14), 4294967297L)
24883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('1a20dcd82', 15), 4294967297L)
24983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('100000001', 16), 4294967297L)
25083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('a7ffda92', 17), 4294967297L)
25183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('704he7g5', 18), 4294967297L)
25283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('4f5aff67', 19), 4294967297L)
25383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('3723ai4h', 20), 4294967297L)
25483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('281d55i5', 21), 4294967297L)
25583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('1fj8b185', 22), 4294967297L)
25683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('1606k7id', 23), 4294967297L)
25783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('mb994ah', 24), 4294967297L)
25883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('hek2mgm', 25), 4294967297L)
25983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('dnchbnn', 26), 4294967297L)
26083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('b28jpdn', 27), 4294967297L)
26183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('8pfgih5', 28), 4294967297L)
26283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('76beigh', 29), 4294967297L)
26383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('5qmcpqh', 30), 4294967297L)
26483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('4q0jto5', 31), 4294967297L)
26583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('4000001', 32), 4294967297L)
26683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('3aokq95', 33), 4294967297L)
26783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('2qhxjlj', 34), 4294967297L)
26883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('2br45qc', 35), 4294967297L)
26983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int('1z141z5', 36), 4294967297L)
27083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
27183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_bit_length(self):
27283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        tiny = 1e-10
27383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for x in xrange(-65000, 65000):
27483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            k = x.bit_length()
27583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Check equivalence with Python version
27683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(k, len(bin(x).lstrip('-0b')))
27783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Behaviour as specified in the docs
27883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if x != 0:
27983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.assertTrue(2**(k-1) <= abs(x) < 2**k)
28083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            else:
28183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.assertEqual(k, 0)
28283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Alternative definition: x.bit_length() == 1 + floor(log_2(x))
28383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if x != 0:
28483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # When x is an exact power of 2, numeric errors can
28583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # cause floor(log(x)/log(2)) to be one too small; for
28683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # small x this can be fixed by adding a small quantity
28783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # to the quotient before taking the floor.
28883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.assertEqual(k, 1 + math.floor(
28983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        math.log(abs(x))/math.log(2) + tiny))
29083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
29183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((0).bit_length(), 0)
29283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((1).bit_length(), 1)
29383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((-1).bit_length(), 1)
29483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((2).bit_length(), 2)
29583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((-2).bit_length(), 2)
29683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64]:
29783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            a = 2**i
29883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual((a-1).bit_length(), i)
29983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual((1-a).bit_length(), i)
30083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual((a).bit_length(), i+1)
30183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual((-a).bit_length(), i+1)
30283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual((a+1).bit_length(), i+1)
30383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual((-a-1).bit_length(), i+1)
30483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
30583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @unittest.skipUnless(float.__getformat__("double").startswith("IEEE"),
30683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                         "test requires IEEE 754 doubles")
30783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_float_conversion(self):
30883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # values exactly representable as floats
30983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        exact_values = [-2, -1, 0, 1, 2, 2**52, 2**53-1, 2**53, 2**53+2,
31083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                         2**53+4, 2**54-4, 2**54-2, 2**63, -2**63, 2**64,
31183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                         -2**64, 10**20, 10**21, 10**22]
31283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for value in exact_values:
31383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(int(float(int(value))), value)
31483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
31583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # test round-half-to-even
31683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(2**53+1)), 2**53)
31783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(2**53+2)), 2**53+2)
31883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(2**53+3)), 2**53+4)
31983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(2**53+5)), 2**53+4)
32083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(2**53+6)), 2**53+6)
32183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(2**53+7)), 2**53+8)
32283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
32383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(-2**53-1)), -2**53)
32483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(-2**53-2)), -2**53-2)
32583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(-2**53-3)), -2**53-4)
32683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(-2**53-5)), -2**53-4)
32783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(-2**53-6)), -2**53-6)
32883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(-2**53-7)), -2**53-8)
32983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
33083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(2**54-2)), 2**54-2)
33183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(2**54-1)), 2**54)
33283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(2**54+2)), 2**54)
33383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(2**54+3)), 2**54+4)
33483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(2**54+5)), 2**54+4)
33583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(2**54+6)), 2**54+8)
33683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(2**54+10)), 2**54+8)
33783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(float(2**54+11)), 2**54+12)
33883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
33983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_valid_non_numeric_input_types_for_x(self):
34083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Test possible valid non-numeric types for x, including subclasses
34183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # of the allowed built-in types.
34283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class CustomStr(str): pass
34383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        values = ['100', CustomStr('100')]
34483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
34583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if have_unicode:
34683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            class CustomUnicode(unicode): pass
34783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            values += [unicode('100'), CustomUnicode(unicode('100'))]
34883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
34983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for x in values:
35083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            msg = 'x has value %s and type %s' % (x, type(x).__name__)
35183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
35283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.assertEqual(int(x), 100, msg=msg)
35383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.assertEqual(int(x, 2), 4, msg=msg)
35483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except TypeError, err:
35583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise AssertionError('For %s got TypeError: %s' %
35683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                     (type(x).__name__, err))
35783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
35883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_error_on_string_float_for_x(self):
35983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, int, '1.2')
36083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
36183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_error_on_bytearray_for_x(self):
36283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, int, bytearray('100'), 2)
36383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
36483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_error_on_invalid_int_bases(self):
36583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for base in [-1, 1, 1000]:
36683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertRaises(ValueError, int, '100', base)
36783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
36883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_error_on_string_base(self):
36983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, int, 100, base='foo')
37083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
37183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @test_support.cpython_only
37283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_small_ints(self):
37383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertIs(int('10'), 10)
37483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertIs(int('-1'), -1)
37583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if have_unicode:
37683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertIs(int(u'10'), 10)
37783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertIs(int(u'-1'), -1)
37883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
37983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_intconversion(self):
38083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Test __int__()
38183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class ClassicMissingMethods:
38283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pass
38383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(AttributeError, int, ClassicMissingMethods())
38483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
38583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class MissingMethods(object):
38683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pass
38783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, int, MissingMethods())
38883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
38983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class Foo0:
39083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __int__(self):
39183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return 42
39283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
39383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class Foo1(object):
39483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __int__(self):
39583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return 42
39683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
39783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class Foo2(int):
39883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __int__(self):
39983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return 42
40083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
40183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class Foo3(int):
40283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __int__(self):
40383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return self
40483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
40583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class Foo4(int):
40683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __int__(self):
40783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return 42L
40883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
40983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class Foo5(int):
41083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __int__(self):
41183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return 42.
41283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
41383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(Foo0()), 42)
41483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(Foo1()), 42)
41583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(Foo2()), 42)
41683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(Foo3()), 0)
41783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(int(Foo4()), 42L)
41883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, int, Foo5())
41983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
42083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class Classic:
42183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pass
42283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for base in (object, Classic):
42383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            class IntOverridesTrunc(base):
42483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                def __int__(self):
42583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    return 42
42683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                def __trunc__(self):
42783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    return -12
42883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(int(IntOverridesTrunc()), 42)
42983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
43083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            class JustTrunc(base):
43183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                def __trunc__(self):
43283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    return 42
43383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(int(JustTrunc()), 42)
43483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
43583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for trunc_result_base in (object, Classic):
43683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                class Integral(trunc_result_base):
43783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    def __int__(self):
43883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        return 42
43983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
44083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                class TruncReturnsNonInt(base):
44183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    def __trunc__(self):
44283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        return Integral()
44383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.assertEqual(int(TruncReturnsNonInt()), 42)
44483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
44583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                class NonIntegral(trunc_result_base):
44683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    def __trunc__(self):
44783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        # Check that we avoid infinite recursion.
44883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        return NonIntegral()
44983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
45083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                class TruncReturnsNonIntegral(base):
45183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    def __trunc__(self):
45283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        return NonIntegral()
45383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                try:
45483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    int(TruncReturnsNonIntegral())
45583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                except TypeError as e:
45683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.assertEqual(str(e),
45783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                      "__trunc__ returned non-Integral"
45883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                      " (type NonIntegral)")
45983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                else:
46083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.fail("Failed to raise TypeError with %s" %
46183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                              ((base, trunc_result_base),))
46283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
46383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef test_main():
46483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    run_unittest(IntTestCases)
46583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
46683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif __name__ == "__main__":
46783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    test_main()
468