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