mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Add tests for tuple, list and UserList that initialize the object from
various iterables. (Copied from test_deque.py as suggested by Jim Jewett in SF bug #1166274)
This commit is contained in:
parent
24ff83d5f3
commit
09a3f2cc2f
2 changed files with 97 additions and 83 deletions
|
@ -5,6 +5,85 @@ Tests common to tuple, list and UserList.UserList
|
||||||
import unittest
|
import unittest
|
||||||
from test import test_support
|
from test import test_support
|
||||||
|
|
||||||
|
# Various iterables
|
||||||
|
# This is used for checking the constructor (here and in test_deque.py)
|
||||||
|
def iterfunc(seqn):
|
||||||
|
'Regular generator'
|
||||||
|
for i in seqn:
|
||||||
|
yield i
|
||||||
|
|
||||||
|
class Sequence:
|
||||||
|
'Sequence using __getitem__'
|
||||||
|
def __init__(self, seqn):
|
||||||
|
self.seqn = seqn
|
||||||
|
def __getitem__(self, i):
|
||||||
|
return self.seqn[i]
|
||||||
|
|
||||||
|
class IterFunc:
|
||||||
|
'Sequence using iterator protocol'
|
||||||
|
def __init__(self, seqn):
|
||||||
|
self.seqn = seqn
|
||||||
|
self.i = 0
|
||||||
|
def __iter__(self):
|
||||||
|
return self
|
||||||
|
def next(self):
|
||||||
|
if self.i >= len(self.seqn): raise StopIteration
|
||||||
|
v = self.seqn[self.i]
|
||||||
|
self.i += 1
|
||||||
|
return v
|
||||||
|
|
||||||
|
class IterGen:
|
||||||
|
'Sequence using iterator protocol defined with a generator'
|
||||||
|
def __init__(self, seqn):
|
||||||
|
self.seqn = seqn
|
||||||
|
self.i = 0
|
||||||
|
def __iter__(self):
|
||||||
|
for val in self.seqn:
|
||||||
|
yield val
|
||||||
|
|
||||||
|
class IterNextOnly:
|
||||||
|
'Missing __getitem__ and __iter__'
|
||||||
|
def __init__(self, seqn):
|
||||||
|
self.seqn = seqn
|
||||||
|
self.i = 0
|
||||||
|
def next(self):
|
||||||
|
if self.i >= len(self.seqn): raise StopIteration
|
||||||
|
v = self.seqn[self.i]
|
||||||
|
self.i += 1
|
||||||
|
return v
|
||||||
|
|
||||||
|
class IterNoNext:
|
||||||
|
'Iterator missing next()'
|
||||||
|
def __init__(self, seqn):
|
||||||
|
self.seqn = seqn
|
||||||
|
self.i = 0
|
||||||
|
def __iter__(self):
|
||||||
|
return self
|
||||||
|
|
||||||
|
class IterGenExc:
|
||||||
|
'Test propagation of exceptions'
|
||||||
|
def __init__(self, seqn):
|
||||||
|
self.seqn = seqn
|
||||||
|
self.i = 0
|
||||||
|
def __iter__(self):
|
||||||
|
return self
|
||||||
|
def next(self):
|
||||||
|
3 // 0
|
||||||
|
|
||||||
|
class IterFuncStop:
|
||||||
|
'Test immediate stop'
|
||||||
|
def __init__(self, seqn):
|
||||||
|
pass
|
||||||
|
def __iter__(self):
|
||||||
|
return self
|
||||||
|
def next(self):
|
||||||
|
raise StopIteration
|
||||||
|
|
||||||
|
from itertools import chain, imap
|
||||||
|
def itermulti(seqn):
|
||||||
|
'Test multiple tiers of iterators'
|
||||||
|
return chain(imap(lambda x:x, iterfunc(IterGen(Sequence(seqn)))))
|
||||||
|
|
||||||
class CommonTest(unittest.TestCase):
|
class CommonTest(unittest.TestCase):
|
||||||
# The type to be tested
|
# The type to be tested
|
||||||
type2test = None
|
type2test = None
|
||||||
|
@ -40,6 +119,17 @@ class CommonTest(unittest.TestCase):
|
||||||
vv = self.type2test(s)
|
vv = self.type2test(s)
|
||||||
self.assertEqual(len(vv), len(s))
|
self.assertEqual(len(vv), len(s))
|
||||||
|
|
||||||
|
# Create from various iteratables
|
||||||
|
for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
|
||||||
|
for g in (Sequence, IterFunc, IterGen,
|
||||||
|
itermulti, iterfunc):
|
||||||
|
self.assertEqual(self.type2test(g(s)), self.type2test(s))
|
||||||
|
self.assertEqual(self.type2test(IterFuncStop(s)), self.type2test())
|
||||||
|
self.assertEqual(self.type2test(c for c in "123"), self.type2test("123"))
|
||||||
|
self.assertRaises(TypeError, self.type2test, IterNextOnly(s))
|
||||||
|
self.assertRaises(TypeError, self.type2test, IterNoNext(s))
|
||||||
|
self.assertRaises(ZeroDivisionError, self.type2test, IterGenExc(s))
|
||||||
|
|
||||||
def test_truth(self):
|
def test_truth(self):
|
||||||
self.assert_(not self.type2test())
|
self.assert_(not self.type2test())
|
||||||
self.assert_(self.type2test([42]))
|
self.assert_(self.type2test([42]))
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
from collections import deque
|
from collections import deque
|
||||||
import unittest
|
import unittest
|
||||||
from test import test_support
|
from test import test_support, seq_tests
|
||||||
from weakref import proxy
|
from weakref import proxy
|
||||||
import copy
|
import copy
|
||||||
import cPickle as pickle
|
import cPickle as pickle
|
||||||
|
@ -378,93 +378,17 @@ class TestBasic(unittest.TestCase):
|
||||||
d.append(1)
|
d.append(1)
|
||||||
gc.collect()
|
gc.collect()
|
||||||
|
|
||||||
def R(seqn):
|
|
||||||
'Regular generator'
|
|
||||||
for i in seqn:
|
|
||||||
yield i
|
|
||||||
|
|
||||||
class G:
|
|
||||||
'Sequence using __getitem__'
|
|
||||||
def __init__(self, seqn):
|
|
||||||
self.seqn = seqn
|
|
||||||
def __getitem__(self, i):
|
|
||||||
return self.seqn[i]
|
|
||||||
|
|
||||||
class I:
|
|
||||||
'Sequence using iterator protocol'
|
|
||||||
def __init__(self, seqn):
|
|
||||||
self.seqn = seqn
|
|
||||||
self.i = 0
|
|
||||||
def __iter__(self):
|
|
||||||
return self
|
|
||||||
def next(self):
|
|
||||||
if self.i >= len(self.seqn): raise StopIteration
|
|
||||||
v = self.seqn[self.i]
|
|
||||||
self.i += 1
|
|
||||||
return v
|
|
||||||
|
|
||||||
class Ig:
|
|
||||||
'Sequence using iterator protocol defined with a generator'
|
|
||||||
def __init__(self, seqn):
|
|
||||||
self.seqn = seqn
|
|
||||||
self.i = 0
|
|
||||||
def __iter__(self):
|
|
||||||
for val in self.seqn:
|
|
||||||
yield val
|
|
||||||
|
|
||||||
class X:
|
|
||||||
'Missing __getitem__ and __iter__'
|
|
||||||
def __init__(self, seqn):
|
|
||||||
self.seqn = seqn
|
|
||||||
self.i = 0
|
|
||||||
def next(self):
|
|
||||||
if self.i >= len(self.seqn): raise StopIteration
|
|
||||||
v = self.seqn[self.i]
|
|
||||||
self.i += 1
|
|
||||||
return v
|
|
||||||
|
|
||||||
class N:
|
|
||||||
'Iterator missing next()'
|
|
||||||
def __init__(self, seqn):
|
|
||||||
self.seqn = seqn
|
|
||||||
self.i = 0
|
|
||||||
def __iter__(self):
|
|
||||||
return self
|
|
||||||
|
|
||||||
class E:
|
|
||||||
'Test propagation of exceptions'
|
|
||||||
def __init__(self, seqn):
|
|
||||||
self.seqn = seqn
|
|
||||||
self.i = 0
|
|
||||||
def __iter__(self):
|
|
||||||
return self
|
|
||||||
def next(self):
|
|
||||||
3 // 0
|
|
||||||
|
|
||||||
class S:
|
|
||||||
'Test immediate stop'
|
|
||||||
def __init__(self, seqn):
|
|
||||||
pass
|
|
||||||
def __iter__(self):
|
|
||||||
return self
|
|
||||||
def next(self):
|
|
||||||
raise StopIteration
|
|
||||||
|
|
||||||
from itertools import chain, imap
|
|
||||||
def L(seqn):
|
|
||||||
'Test multiple tiers of iterators'
|
|
||||||
return chain(imap(lambda x:x, R(Ig(G(seqn)))))
|
|
||||||
|
|
||||||
|
|
||||||
class TestVariousIteratorArgs(unittest.TestCase):
|
class TestVariousIteratorArgs(unittest.TestCase):
|
||||||
|
|
||||||
def test_constructor(self):
|
def test_constructor(self):
|
||||||
for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
|
for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
|
||||||
for g in (G, I, Ig, S, L, R):
|
for g in (seq_tests.Sequence, seq_tests.IterFunc,
|
||||||
|
seq_tests.IterGen, seq_tests.IterFuncStop,
|
||||||
|
seq_tests.itermulti, seq_tests.iterfunc):
|
||||||
self.assertEqual(list(deque(g(s))), list(g(s)))
|
self.assertEqual(list(deque(g(s))), list(g(s)))
|
||||||
self.assertRaises(TypeError, deque, X(s))
|
self.assertRaises(TypeError, deque, seq_tests.IterNextOnly(s))
|
||||||
self.assertRaises(TypeError, deque, N(s))
|
self.assertRaises(TypeError, deque, seq_tests.IterNoNext(s))
|
||||||
self.assertRaises(ZeroDivisionError, deque, E(s))
|
self.assertRaises(ZeroDivisionError, deque, seq_tests.IterGenExc(s))
|
||||||
|
|
||||||
def test_iter_with_altered_data(self):
|
def test_iter_with_altered_data(self):
|
||||||
d = deque('abcdefg')
|
d = deque('abcdefg')
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue