test_range.py 2.84 KB
Newer Older
Neal Norwitz's avatar
Neal Norwitz committed
1 2
# Python test set -- built-in functions

3
import test.support, unittest
Neal Norwitz's avatar
Neal Norwitz committed
4
import sys
5
import pickle
Neal Norwitz's avatar
Neal Norwitz committed
6 7 8 9 10

import warnings
warnings.filterwarnings("ignore", "integer argument expected",
                        DeprecationWarning, "unittest")

11 12
class RangeTest(unittest.TestCase):
    def test_range(self):
13 14 15 16 17 18
        self.assertEqual(list(range(3)), [0, 1, 2])
        self.assertEqual(list(range(1, 5)), [1, 2, 3, 4])
        self.assertEqual(list(range(0)), [])
        self.assertEqual(list(range(-3)), [])
        self.assertEqual(list(range(1, 10, 3)), [1, 4, 7])
        self.assertEqual(list(range(5, -5, -3)), [5, 2, -1, -4])
Neal Norwitz's avatar
Neal Norwitz committed
19 20 21 22 23

        a = 10
        b = 100
        c = 50

24 25 26
        self.assertEqual(list(range(a, a+2)), [a, a+1])
        self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
        self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
Neal Norwitz's avatar
Neal Norwitz committed
27

28
        seq = list(range(a, b, c))
Neal Norwitz's avatar
Neal Norwitz committed
29 30 31 32
        self.assert_(a in seq)
        self.assert_(b not in seq)
        self.assertEqual(len(seq), 2)

33
        seq = list(range(b, a, -c))
Neal Norwitz's avatar
Neal Norwitz committed
34 35 36 37
        self.assert_(b in seq)
        self.assert_(a not in seq)
        self.assertEqual(len(seq), 2)

38
        seq = list(range(-a, -b, -c))
Neal Norwitz's avatar
Neal Norwitz committed
39 40 41 42
        self.assert_(-a in seq)
        self.assert_(-b not in seq)
        self.assertEqual(len(seq), 2)

43 44 45
        self.assertRaises(TypeError, range)
        self.assertRaises(TypeError, range, 1, 2, 3, 4)
        self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitz's avatar
Neal Norwitz committed
46

47 48 49 50
        self.assertRaises(TypeError, range, 0.0, 2, 1)
        self.assertRaises(TypeError, range, 1, 2.0, 1)
        self.assertRaises(TypeError, range, 1, 2, 1.0)
        self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Neal Norwitz's avatar
Neal Norwitz committed
51

52 53
        self.assertRaises(TypeError, range, 0, "spam")
        self.assertRaises(TypeError, range, 0, 42, "spam")
Neal Norwitz's avatar
Neal Norwitz committed
54

55
        self.assertEqual(len(range(0, sys.maxsize, sys.maxsize-1)), 2)
Tim Peters's avatar
Tim Peters committed
56

57 58
        r = range(-sys.maxsize, sys.maxsize, 2)
        self.assertEqual(len(r), sys.maxsize)
Tim Peters's avatar
Tim Peters committed
59

60
    def test_repr(self):
61
        self.assertEqual(repr(range(1)), 'range(0, 1)')
62 63 64
        self.assertEqual(repr(range(1, 2)), 'range(1, 2)')
        self.assertEqual(repr(range(1, 2, 3)), 'range(1, 2, 3)')

65 66 67
    def test_pickling(self):
        testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1),
                     (13, 21, 3), (-2, 2, 2)]
68
        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
69 70 71 72 73
            for t in testcases:
                r = range(*t)
                self.assertEquals(list(pickle.loads(pickle.dumps(r, proto))),
                                  list(r))

74 75 76 77 78 79 80
    def test_odd_bug(self):
        # This used to raise a "SystemError: NULL result without error"
        # because the range validation step was eating the exception
        # before NULL was returned.
        with self.assertRaises(TypeError):
            range([], 1, -1)

Neal Norwitz's avatar
Neal Norwitz committed
81
def test_main():
82
    test.support.run_unittest(RangeTest)
Neal Norwitz's avatar
Neal Norwitz committed
83 84 85

if __name__ == "__main__":
    test_main()