183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# Test iterators.
283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport unittest
483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom test.test_support import run_unittest, TESTFN, unlink, have_unicode, \
583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                              check_py3k_warnings, cpython_only
683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# Test result of triple loop (too big to inline)
883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehTRIPLETS = [(0, 0, 0), (0, 0, 1), (0, 0, 2),
983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            (0, 1, 0), (0, 1, 1), (0, 1, 2),
1083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            (0, 2, 0), (0, 2, 1), (0, 2, 2),
1183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            (1, 0, 0), (1, 0, 1), (1, 0, 2),
1383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            (1, 1, 0), (1, 1, 1), (1, 1, 2),
1483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            (1, 2, 0), (1, 2, 1), (1, 2, 2),
1583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            (2, 0, 0), (2, 0, 1), (2, 0, 2),
1783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            (2, 1, 0), (2, 1, 1), (2, 1, 2),
1883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            (2, 2, 0), (2, 2, 1), (2, 2, 2)]
1983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# Helper classes
2183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass BasicIterClass:
2383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, n):
2483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.n = n
2583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.i = 0
2683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def next(self):
2783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        res = self.i
2883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if res >= self.n:
2983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise StopIteration
3083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.i = res + 1
3183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return res
3283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass IteratingSequenceClass:
3483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, n):
3583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.n = n
3683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __iter__(self):
3783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return BasicIterClass(self.n)
3883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass SequenceClass:
4083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, n):
4183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.n = n
4283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __getitem__(self, i):
4383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if 0 <= i < self.n:
4483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return i
4583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
4683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise IndexError
4783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
4883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# Main test suite
4983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TestCase(unittest.TestCase):
5183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Helper to check that an iterator returns a given sequence
5383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def check_iterator(self, it, seq):
5483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        res = []
5583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        while 1:
5683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
5783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                val = it.next()
5883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except StopIteration:
5983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                break
6083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            res.append(val)
6183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(res, seq)
6283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
6383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Helper to check that a for loop generates a given sequence
6483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def check_for_loop(self, expr, seq):
6583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        res = []
6683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for val in expr:
6783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            res.append(val)
6883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(res, seq)
6983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
7083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test basic use of iter() function
7183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_iter_basic(self):
7283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.check_iterator(iter(range(10)), range(10))
7383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
7483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test that iter(iter(x)) is the same as iter(x)
7583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_iter_idempotency(self):
7683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        seq = range(10)
7783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        it = iter(seq)
7883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        it2 = iter(it)
7983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(it is it2)
8083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
8183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test that for loops over iterators work
8283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_iter_for_loop(self):
8383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.check_for_loop(iter(range(10)), range(10))
8483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
8583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test several independent iterators over the same list
8683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_iter_independence(self):
8783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        seq = range(3)
8883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        res = []
8983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for i in iter(seq):
9083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for j in iter(seq):
9183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                for k in iter(seq):
9283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    res.append((i, j, k))
9383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(res, TRIPLETS)
9483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
9583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test triple list comprehension using iterators
9683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_nested_comprehensions_iter(self):
9783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        seq = range(3)
9883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        res = [(i, j, k)
9983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh               for i in iter(seq) for j in iter(seq) for k in iter(seq)]
10083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(res, TRIPLETS)
10183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
10283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test triple list comprehension without iterators
10383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_nested_comprehensions_for(self):
10483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        seq = range(3)
10583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        res = [(i, j, k) for i in seq for j in seq for k in seq]
10683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(res, TRIPLETS)
10783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
10883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test a class with __iter__ in a for loop
10983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_iter_class_for(self):
11083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.check_for_loop(IteratingSequenceClass(10), range(10))
11183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test a class with __iter__ with explicit iter()
11383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_iter_class_iter(self):
11483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.check_iterator(iter(IteratingSequenceClass(10)), range(10))
11583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test for loop on a sequence class without __iter__
11783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_seq_class_for(self):
11883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.check_for_loop(SequenceClass(10), range(10))
11983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
12083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test iter() on a sequence class without __iter__
12183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_seq_class_iter(self):
12283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.check_iterator(iter(SequenceClass(10)), range(10))
12383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
12483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test a new_style class with __iter__ but no next() method
12583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_new_style_iter_class(self):
12683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class IterClass(object):
12783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __iter__(self):
12883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return self
12983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, iter, IterClass())
13083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
13183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test two-argument iter() with callable instance
13283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_iter_callable(self):
13383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class C:
13483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __init__(self):
13583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.i = 0
13683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __call__(self):
13783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                i = self.i
13883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.i = i + 1
13983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if i > 100:
14083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    raise IndexError # Emergency stop
14183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return i
14283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.check_iterator(iter(C(), 10), range(10))
14383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
14483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test two-argument iter() with function
14583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_iter_function(self):
14683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        def spam(state=[0]):
14783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            i = state[0]
14883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            state[0] = i+1
14983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return i
15083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.check_iterator(iter(spam, 10), range(10))
15183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
15283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test two-argument iter() with function that raises StopIteration
15383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_iter_function_stop(self):
15483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        def spam(state=[0]):
15583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            i = state[0]
15683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if i == 10:
15783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise StopIteration
15883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            state[0] = i+1
15983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return i
16083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.check_iterator(iter(spam, 20), range(10))
16183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
16283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test exception propagation through function iterator
16383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_exception_function(self):
16483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        def spam(state=[0]):
16583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            i = state[0]
16683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            state[0] = i+1
16783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if i == 10:
16883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise RuntimeError
16983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return i
17083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        res = []
17183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
17283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for x in iter(spam, 20):
17383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                res.append(x)
17483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except RuntimeError:
17583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(res, range(10))
17683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
17783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.fail("should have raised RuntimeError")
17883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
17983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test exception propagation through sequence iterator
18083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_exception_sequence(self):
18183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class MySequenceClass(SequenceClass):
18283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __getitem__(self, i):
18383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if i == 10:
18483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    raise RuntimeError
18583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return SequenceClass.__getitem__(self, i)
18683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        res = []
18783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
18883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for x in MySequenceClass(20):
18983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                res.append(x)
19083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except RuntimeError:
19183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(res, range(10))
19283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
19383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.fail("should have raised RuntimeError")
19483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
19583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test for StopIteration from __getitem__
19683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_stop_sequence(self):
19783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class MySequenceClass(SequenceClass):
19883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __getitem__(self, i):
19983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if i == 10:
20083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    raise StopIteration
20183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return SequenceClass.__getitem__(self, i)
20283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.check_for_loop(MySequenceClass(20), range(10))
20383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
20483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test a big range
20583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_iter_big_range(self):
20683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.check_for_loop(iter(range(10000)), range(10000))
20783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
20883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test an empty list
20983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_iter_empty(self):
21083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.check_for_loop(iter([]), [])
21183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
21283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test a tuple
21383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_iter_tuple(self):
21483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.check_for_loop(iter((0,1,2,3,4,5,6,7,8,9)), range(10))
21583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
21683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test an xrange
21783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_iter_xrange(self):
21883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.check_for_loop(iter(xrange(10)), range(10))
21983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
22083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test a string
22183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_iter_string(self):
22283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.check_for_loop(iter("abcde"), ["a", "b", "c", "d", "e"])
22383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
22483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test a Unicode string
22583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if have_unicode:
22683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        def test_iter_unicode(self):
22783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.check_for_loop(iter(unicode("abcde")),
22883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                [unicode("a"), unicode("b"), unicode("c"),
22983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                 unicode("d"), unicode("e")])
23083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
23183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test a directory
23283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_iter_dict(self):
23383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        dict = {}
23483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for i in range(10):
23583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            dict[i] = None
23683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.check_for_loop(dict, dict.keys())
23783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
23883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test a file
23983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_iter_file(self):
24083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "w")
24183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
24283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for i in range(5):
24383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                f.write("%d\n" % i)
24483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
24583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
24683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "r")
24783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
24883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.check_for_loop(f, ["0\n", "1\n", "2\n", "3\n", "4\n"])
24983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.check_for_loop(f, [])
25083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
25183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
25283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
25383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                unlink(TESTFN)
25483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except OSError:
25583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                pass
25683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
25783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test list()'s use of iterators.
25883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_builtin_list(self):
25983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(SequenceClass(5)), range(5))
26083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(SequenceClass(0)), [])
26183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(()), [])
26283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(range(10, -1, -1)), range(10, -1, -1))
26383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
26483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        d = {"one": 1, "two": 2, "three": 3}
26583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(d), d.keys())
26683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
26783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, list, list)
26883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, list, 42)
26983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
27083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "w")
27183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
27283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for i in range(5):
27383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                f.write("%d\n" % i)
27483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
27583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
27683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "r")
27783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
27883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(list(f), ["0\n", "1\n", "2\n", "3\n", "4\n"])
27983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.seek(0, 0)
28083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(list(f),
28183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                             ["0\n", "1\n", "2\n", "3\n", "4\n"])
28283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
28383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
28483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
28583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                unlink(TESTFN)
28683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except OSError:
28783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                pass
28883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
28983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test tuples()'s use of iterators.
29083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_builtin_tuple(self):
29183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(tuple(SequenceClass(5)), (0, 1, 2, 3, 4))
29283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(tuple(SequenceClass(0)), ())
29383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(tuple([]), ())
29483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(tuple(()), ())
29583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(tuple("abc"), ("a", "b", "c"))
29683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
29783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        d = {"one": 1, "two": 2, "three": 3}
29883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(tuple(d), tuple(d.keys()))
29983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
30083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, tuple, list)
30183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, tuple, 42)
30283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
30383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "w")
30483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
30583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for i in range(5):
30683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                f.write("%d\n" % i)
30783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
30883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
30983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "r")
31083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
31183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(tuple(f), ("0\n", "1\n", "2\n", "3\n", "4\n"))
31283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.seek(0, 0)
31383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(tuple(f),
31483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                             ("0\n", "1\n", "2\n", "3\n", "4\n"))
31583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
31683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
31783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
31883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                unlink(TESTFN)
31983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except OSError:
32083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                pass
32183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
32283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test filter()'s use of iterators.
32383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_builtin_filter(self):
32483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(filter(None, SequenceClass(5)), range(1, 5))
32583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(filter(None, SequenceClass(0)), [])
32683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(filter(None, ()), ())
32783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(filter(None, "abc"), "abc")
32883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
32983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        d = {"one": 1, "two": 2, "three": 3}
33083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(filter(None, d), d.keys())
33183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
33283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, filter, None, list)
33383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, filter, None, 42)
33483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
33583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class Boolean:
33683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __init__(self, truth):
33783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.truth = truth
33883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __nonzero__(self):
33983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return self.truth
34083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        bTrue = Boolean(1)
34183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        bFalse = Boolean(0)
34283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
34383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class Seq:
34483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __init__(self, *args):
34583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.vals = args
34683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __iter__(self):
34783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                class SeqIter:
34883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    def __init__(self, vals):
34983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        self.vals = vals
35083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        self.i = 0
35183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    def __iter__(self):
35283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        return self
35383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    def next(self):
35483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        i = self.i
35583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        self.i = i + 1
35683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        if i < len(self.vals):
35783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                            return self.vals[i]
35883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        else:
35983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                            raise StopIteration
36083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return SeqIter(self.vals)
36183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
36283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        seq = Seq(*([bTrue, bFalse] * 25))
36383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(filter(lambda x: not x, seq), [bFalse]*25)
36483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(filter(lambda x: not x, iter(seq)), [bFalse]*25)
36583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
36683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test max() and min()'s use of iterators.
36783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_builtin_max_min(self):
36883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(max(SequenceClass(5)), 4)
36983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(min(SequenceClass(5)), 0)
37083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(max(8, -1), 8)
37183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(min(8, -1), -1)
37283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
37383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        d = {"one": 1, "two": 2, "three": 3}
37483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(max(d), "two")
37583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(min(d), "one")
37683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(max(d.itervalues()), 3)
37783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(min(iter(d.itervalues())), 1)
37883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
37983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "w")
38083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
38183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.write("medium line\n")
38283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.write("xtra large line\n")
38383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.write("itty-bitty line\n")
38483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
38583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
38683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "r")
38783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
38883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(min(f), "itty-bitty line\n")
38983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.seek(0, 0)
39083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(max(f), "xtra large line\n")
39183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
39283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
39383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
39483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                unlink(TESTFN)
39583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except OSError:
39683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                pass
39783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
39883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test map()'s use of iterators.
39983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_builtin_map(self):
40083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(map(lambda x: x+1, SequenceClass(5)), range(1, 6))
40183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
40283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        d = {"one": 1, "two": 2, "three": 3}
40383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(map(lambda k, d=d: (k, d[k]), d), d.items())
40483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        dkeys = d.keys()
40583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        expected = [(i < len(d) and dkeys[i] or None,
40683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     i,
40783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     i < len(d) and dkeys[i] or None)
40883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    for i in range(5)]
40983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
41083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Deprecated map(None, ...)
41183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        with check_py3k_warnings():
41283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(map(None, SequenceClass(5)), range(5))
41383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(map(None, d), d.keys())
41483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(map(None, d,
41583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                       SequenceClass(5),
41683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                       iter(d.iterkeys())),
41783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                             expected)
41883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
41983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "w")
42083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
42183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for i in range(10):
42283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                f.write("xy" * i + "\n") # line i has len 2*i+1
42383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
42483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
42583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "r")
42683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
42783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(map(len, f), range(1, 21, 2))
42883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
42983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
43083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
43183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                unlink(TESTFN)
43283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except OSError:
43383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                pass
43483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
43583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test zip()'s use of iterators.
43683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_builtin_zip(self):
43783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(zip(), [])
43883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(zip(*[]), [])
43983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(zip(*[(1, 2), 'ab']), [(1, 'a'), (2, 'b')])
44083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
44183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, zip, None)
44283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, zip, range(10), 42)
44383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, zip, range(10), zip)
44483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
44583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(zip(IteratingSequenceClass(3)),
44683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                         [(0,), (1,), (2,)])
44783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(zip(SequenceClass(3)),
44883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                         [(0,), (1,), (2,)])
44983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
45083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        d = {"one": 1, "two": 2, "three": 3}
45183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(d.items(), zip(d, d.itervalues()))
45283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
45383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Generate all ints starting at constructor arg.
45483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class IntsFrom:
45583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __init__(self, start):
45683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.i = start
45783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
45883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __iter__(self):
45983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return self
46083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
46183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def next(self):
46283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                i = self.i
46383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.i = i+1
46483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return i
46583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
46683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "w")
46783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
46883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.write("a\n" "bbb\n" "cc\n")
46983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
47083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
47183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "r")
47283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
47383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(zip(IntsFrom(0), f, IntsFrom(-100)),
47483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                             [(0, "a\n", -100),
47583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                              (1, "bbb\n", -99),
47683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                              (2, "cc\n", -98)])
47783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
47883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
47983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
48083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                unlink(TESTFN)
48183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except OSError:
48283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                pass
48383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
48483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(zip(xrange(5)), [(i,) for i in range(5)])
48583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
48683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Classes that lie about their lengths.
48783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class NoGuessLen5:
48883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __getitem__(self, i):
48983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if i >= 5:
49083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    raise IndexError
49183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return i
49283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
49383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class Guess3Len5(NoGuessLen5):
49483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __len__(self):
49583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return 3
49683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
49783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class Guess30Len5(NoGuessLen5):
49883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __len__(self):
49983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return 30
50083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
50183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(len(Guess3Len5()), 3)
50283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(len(Guess30Len5()), 30)
50383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(zip(NoGuessLen5()), zip(range(5)))
50483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(zip(Guess3Len5()), zip(range(5)))
50583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(zip(Guess30Len5()), zip(range(5)))
50683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
50783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        expected = [(i, i) for i in range(5)]
50883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for x in NoGuessLen5(), Guess3Len5(), Guess30Len5():
50983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for y in NoGuessLen5(), Guess3Len5(), Guess30Len5():
51083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.assertEqual(zip(x, y), expected)
51183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
51283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test reduces()'s use of iterators.
51383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_deprecated_builtin_reduce(self):
51483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        with check_py3k_warnings():
51583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._test_builtin_reduce()
51683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
51783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _test_builtin_reduce(self):
51883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        from operator import add
51983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(reduce(add, SequenceClass(5)), 10)
52083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(reduce(add, SequenceClass(5), 42), 52)
52183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, reduce, add, SequenceClass(0))
52283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(reduce(add, SequenceClass(0), 42), 42)
52383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(reduce(add, SequenceClass(1)), 0)
52483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(reduce(add, SequenceClass(1), 42), 42)
52583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
52683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        d = {"one": 1, "two": 2, "three": 3}
52783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(reduce(add, d), "".join(d.keys()))
52883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
52983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # This test case will be removed if we don't have Unicode
53083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_unicode_join_endcase(self):
53183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
53283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # This class inserts a Unicode object into its argument's natural
53383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # iteration, in the 3rd position.
53483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class OhPhooey:
53583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __init__(self, seq):
53683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.it = iter(seq)
53783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.i = 0
53883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
53983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __iter__(self):
54083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return self
54183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
54283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def next(self):
54383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                i = self.i
54483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.i = i+1
54583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if i == 2:
54683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    return unicode("fooled you!")
54783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return self.it.next()
54883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
54983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "w")
55083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
55183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.write("a\n" + "b\n" + "c\n")
55283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
55383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
55483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
55583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "r")
55683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Nasty:  string.join(s) can't know whether unicode.join() is needed
55783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # until it's seen all of s's elements.  But in this case, f's
55883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # iterator cannot be restarted.  So what we're testing here is
55983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # whether string.join() can manage to remember everything it's seen
56083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # and pass that on to unicode.join().
56183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
56283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            got = " - ".join(OhPhooey(f))
56383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(got, unicode("a\n - b\n - fooled you! - c\n"))
56483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
56583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
56683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
56783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                unlink(TESTFN)
56883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except OSError:
56983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                pass
57083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if not have_unicode:
57183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        def test_unicode_join_endcase(self): pass
57283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
57383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test iterators with 'x in y' and 'x not in y'.
57483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_in_and_not_in(self):
57583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for sc5 in IteratingSequenceClass(5), SequenceClass(5):
57683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for i in range(5):
57783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.assertIn(i, sc5)
57883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for i in "abc", -1, 5, 42.42, (3, 4), [], {1: 1}, 3-12j, sc5:
57983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.assertNotIn(i, sc5)
58083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
58183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, lambda: 3 in 12)
58283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, lambda: 3 not in map)
58383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
58483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        d = {"one": 1, "two": 2, "three": 3, 1j: 2j}
58583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for k in d:
58683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertIn(k, d)
58783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertNotIn(k, d.itervalues())
58883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for v in d.values():
58983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertIn(v, d.itervalues())
59083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertNotIn(v, d)
59183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for k, v in d.iteritems():
59283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertIn((k, v), d.iteritems())
59383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertNotIn((v, k), d.iteritems())
59483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
59583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "w")
59683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
59783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.write("a\n" "b\n" "c\n")
59883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
59983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
60083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "r")
60183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
60283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for chunk in "abc":
60383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                f.seek(0, 0)
60483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.assertNotIn(chunk, f)
60583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                f.seek(0, 0)
60683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.assertIn((chunk + "\n"), f)
60783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
60883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
60983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
61083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                unlink(TESTFN)
61183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except OSError:
61283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                pass
61383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
61483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test iterators with operator.countOf (PySequence_Count).
61583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_countOf(self):
61683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        from operator import countOf
61783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(countOf([1,2,2,3,2,5], 2), 3)
61883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(countOf((1,2,2,3,2,5), 2), 3)
61983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(countOf("122325", "2"), 3)
62083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(countOf("122325", "6"), 0)
62183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
62283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, countOf, 42, 1)
62383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, countOf, countOf, countOf)
62483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
62583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        d = {"one": 3, "two": 3, "three": 3, 1j: 2j}
62683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for k in d:
62783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(countOf(d, k), 1)
62883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(countOf(d.itervalues(), 3), 3)
62983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(countOf(d.itervalues(), 2j), 1)
63083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(countOf(d.itervalues(), 1j), 0)
63183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
63283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "w")
63383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
63483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.write("a\n" "b\n" "c\n" "b\n")
63583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
63683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
63783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "r")
63883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
63983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for letter, count in ("a", 1), ("b", 2), ("c", 1), ("d", 0):
64083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                f.seek(0, 0)
64183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.assertEqual(countOf(f, letter + "\n"), count)
64283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
64383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
64483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
64583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                unlink(TESTFN)
64683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except OSError:
64783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                pass
64883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
64983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test iterators with operator.indexOf (PySequence_Index).
65083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_indexOf(self):
65183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        from operator import indexOf
65283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(indexOf([1,2,2,3,2,5], 1), 0)
65383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(indexOf((1,2,2,3,2,5), 2), 1)
65483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(indexOf((1,2,2,3,2,5), 3), 3)
65583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(indexOf((1,2,2,3,2,5), 5), 5)
65683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, indexOf, (1,2,2,3,2,5), 0)
65783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, indexOf, (1,2,2,3,2,5), 6)
65883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
65983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(indexOf("122325", "2"), 1)
66083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(indexOf("122325", "5"), 5)
66183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, indexOf, "122325", "6")
66283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
66383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, indexOf, 42, 1)
66483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, indexOf, indexOf, indexOf)
66583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
66683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "w")
66783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
66883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.write("a\n" "b\n" "c\n" "d\n" "e\n")
66983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
67083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
67183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "r")
67283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
67383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            fiter = iter(f)
67483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(indexOf(fiter, "b\n"), 1)
67583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(indexOf(fiter, "d\n"), 1)
67683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(indexOf(fiter, "e\n"), 0)
67783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertRaises(ValueError, indexOf, fiter, "a\n")
67883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
67983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
68083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
68183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                unlink(TESTFN)
68283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except OSError:
68383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                pass
68483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
68583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        iclass = IteratingSequenceClass(3)
68683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for i in range(3):
68783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(indexOf(iclass, i), i)
68883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, indexOf, iclass, -1)
68983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
69083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test iterators with file.writelines().
69183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_writelines(self):
69283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = file(TESTFN, "w")
69383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
69483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
69583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertRaises(TypeError, f.writelines, None)
69683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertRaises(TypeError, f.writelines, 42)
69783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
69883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.writelines(["1\n", "2\n"])
69983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.writelines(("3\n", "4\n"))
70083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.writelines({'5\n': None})
70183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.writelines({})
70283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
70383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Try a big chunk too.
70483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            class Iterator:
70583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                def __init__(self, start, finish):
70683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.start = start
70783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.finish = finish
70883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.i = self.start
70983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
71083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                def next(self):
71183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    if self.i >= self.finish:
71283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        raise StopIteration
71383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    result = str(self.i) + '\n'
71483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.i += 1
71583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    return result
71683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
71783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                def __iter__(self):
71883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    return self
71983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
72083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            class Whatever:
72183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                def __init__(self, start, finish):
72283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.start = start
72383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.finish = finish
72483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
72583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                def __iter__(self):
72683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    return Iterator(self.start, self.finish)
72783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
72883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.writelines(Whatever(6, 6+2000))
72983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
73083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
73183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f = file(TESTFN)
73283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            expected = [str(i) + "\n" for i in range(1, 2006)]
73383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(list(f), expected)
73483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
73583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
73683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
73783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
73883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                unlink(TESTFN)
73983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except OSError:
74083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                pass
74183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
74283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
74383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Test iterators on RHS of unpacking assignments.
74483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_unpack_iter(self):
74583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        a, b = 1, 2
74683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((a, b), (1, 2))
74783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
74883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        a, b, c = IteratingSequenceClass(3)
74983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((a, b, c), (0, 1, 2))
75083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
75183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:    # too many values
75283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            a, b = IteratingSequenceClass(3)
75383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except ValueError:
75483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pass
75583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
75683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.fail("should have raised ValueError")
75783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
75883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:    # not enough values
75983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            a, b, c = IteratingSequenceClass(2)
76083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except ValueError:
76183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pass
76283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
76383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.fail("should have raised ValueError")
76483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
76583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:    # not iterable
76683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            a, b, c = len
76783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except TypeError:
76883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pass
76983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
77083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.fail("should have raised TypeError")
77183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
77283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        a, b, c = {1: 42, 2: 42, 3: 42}.itervalues()
77383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((a, b, c), (42, 42, 42))
77483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
77583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "w")
77683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        lines = ("a\n", "bb\n", "ccc\n")
77783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
77883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for line in lines:
77983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                f.write(line)
78083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
78183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
78283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        f = open(TESTFN, "r")
78383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
78483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            a, b, c = f
78583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual((a, b, c), lines)
78683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
78783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            f.close()
78883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
78983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                unlink(TESTFN)
79083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except OSError:
79183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                pass
79283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
79383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (a, b), (c,) = IteratingSequenceClass(2), {42: 24}
79483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((a, b, c), (0, 1, 42))
79583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
79683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
79783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @cpython_only
79883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_ref_counting_behavior(self):
79983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class C(object):
80083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            count = 0
80183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __new__(cls):
80283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                cls.count += 1
80383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return object.__new__(cls)
80483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __del__(self):
80583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                cls = self.__class__
80683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                assert cls.count > 0
80783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                cls.count -= 1
80883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        x = C()
80983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(C.count, 1)
81083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        del x
81183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(C.count, 0)
81283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        l = [C(), C(), C()]
81383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(C.count, 3)
81483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
81583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            a, b = iter(l)
81683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except ValueError:
81783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pass
81883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        del l
81983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(C.count, 0)
82083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
82183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
82283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Make sure StopIteration is a "sink state".
82383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # This tests various things that weren't sink states in Python 2.2.1,
82483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # plus various things that always were fine.
82583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
82683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_sinkstate_list(self):
82783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # This used to fail
82883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        a = range(5)
82983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        b = iter(a)
83083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(b), range(5))
83183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        a.extend(range(5, 10))
83283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(b), [])
83383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
83483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_sinkstate_tuple(self):
83583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        a = (0, 1, 2, 3, 4)
83683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        b = iter(a)
83783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(b), range(5))
83883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(b), [])
83983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
84083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_sinkstate_string(self):
84183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        a = "abcde"
84283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        b = iter(a)
84383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(b), ['a', 'b', 'c', 'd', 'e'])
84483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(b), [])
84583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
84683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_sinkstate_sequence(self):
84783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # This used to fail
84883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        a = SequenceClass(5)
84983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        b = iter(a)
85083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(b), range(5))
85183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        a.n = 10
85283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(b), [])
85383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
85483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_sinkstate_callable(self):
85583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # This used to fail
85683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        def spam(state=[0]):
85783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            i = state[0]
85883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            state[0] = i+1
85983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if i == 10:
86083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise AssertionError, "shouldn't have gotten this far"
86183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return i
86283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        b = iter(spam, 5)
86383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(b), range(5))
86483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(b), [])
86583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
86683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_sinkstate_dict(self):
86783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # XXX For a more thorough test, see towards the end of:
86883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # http://mail.python.org/pipermail/python-dev/2002-July/026512.html
86983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        a = {1:1, 2:2, 0:0, 4:4, 3:3}
87083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for b in iter(a), a.iterkeys(), a.iteritems(), a.itervalues():
87183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            b = iter(a)
87283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(len(list(b)), 5)
87383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(list(b), [])
87483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
87583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_sinkstate_yield(self):
87683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        def gen():
87783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for i in range(5):
87883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                yield i
87983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        b = gen()
88083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(b), range(5))
88183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(b), [])
88283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
88383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_sinkstate_range(self):
88483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        a = xrange(5)
88583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        b = iter(a)
88683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(b), range(5))
88783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(b), [])
88883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
88983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_sinkstate_enumerate(self):
89083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        a = range(5)
89183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        e = enumerate(a)
89283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        b = iter(e)
89383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(b), zip(range(5), range(5)))
89483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(list(b), [])
89583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
89683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_3720(self):
89783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Avoid a crash, when an iterator deletes its next() method.
89883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class BadIterator(object):
89983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __iter__(self):
90083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return self
90183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def next(self):
90283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                del BadIterator.next
90383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return 1
90483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
90583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
90683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for i in BadIterator() :
90783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                pass
90883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except TypeError:
90983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pass
91083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
91183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_extending_list_with_iterator_does_not_segfault(self):
91283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # The code to extend a list with an iterator has a fair
91383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # amount of nontrivial logic in terms of guessing how
91483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # much memory to allocate in advance, "stealing" refs,
91583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # and then shrinking at the end.  This is a basic smoke
91683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # test for that scenario.
91783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        def gen():
91883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for i in range(500):
91983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                yield i
92083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        lst = [0] * 500
92183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for i in range(240):
92283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            lst.pop(0)
92383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        lst.extend(gen())
92483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(len(lst), 760)
92583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
92683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
92783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef test_main():
92883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    run_unittest(TestCase)
92983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
93083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
93183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif __name__ == "__main__":
93283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    test_main()
933