diff options
author | Raymond Hettinger <python@rcn.com> | 2003-05-28 14:05:34 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2003-05-28 14:05:34 (GMT) |
commit | e8b0f0461baf7aa59bc517406432ccbb70443aac (patch) | |
tree | 1dca8982664ede1116aea9af2d0e9460c1183b34 /Lib | |
parent | a95d3b78c8a14a9e86d3d5f9642add8292968378 (diff) | |
download | cpython-e8b0f0461baf7aa59bc517406432ccbb70443aac.zip cpython-e8b0f0461baf7aa59bc517406432ccbb70443aac.tar.gz cpython-e8b0f0461baf7aa59bc517406432ccbb70443aac.tar.bz2 |
* Beefed-up tests
* Allow tuple re-use
* Call tp_iternext directly
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_enumerate.py | 59 |
1 files changed, 45 insertions, 14 deletions
diff --git a/Lib/test/test_enumerate.py b/Lib/test/test_enumerate.py index 701b0c0..00f97ef 100644 --- a/Lib/test/test_enumerate.py +++ b/Lib/test/test_enumerate.py @@ -1,9 +1,8 @@ import unittest +from sets import Set from test import test_support -seq, res = 'abc', [(0,'a'), (1,'b'), (2,'c')] - class G: 'Sequence using __getitem__' def __init__(self, seqn): @@ -65,37 +64,49 @@ class N: class EnumerateTestCase(unittest.TestCase): enum = enumerate + seq, res = 'abc', [(0,'a'), (1,'b'), (2,'c')] def test_basicfunction(self): - self.assertEqual(type(self.enum(seq)), self.enum) - e = self.enum(seq) + self.assertEqual(type(self.enum(self.seq)), self.enum) + e = self.enum(self.seq) self.assertEqual(iter(e), e) - self.assertEqual(list(self.enum(seq)), res) + self.assertEqual(list(self.enum(self.seq)), self.res) self.enum.__doc__ def test_getitemseqn(self): - self.assertEqual(list(self.enum(G(seq))), res) + self.assertEqual(list(self.enum(G(self.seq))), self.res) e = self.enum(G('')) self.assertRaises(StopIteration, e.next) def test_iteratorseqn(self): - self.assertEqual(list(self.enum(I(seq))), res) + self.assertEqual(list(self.enum(I(self.seq))), self.res) e = self.enum(I('')) self.assertRaises(StopIteration, e.next) def test_iteratorgenerator(self): - self.assertEqual(list(self.enum(Ig(seq))), res) + self.assertEqual(list(self.enum(Ig(self.seq))), self.res) e = self.enum(Ig('')) self.assertRaises(StopIteration, e.next) def test_noniterable(self): - self.assertRaises(TypeError, self.enum, X(seq)) + self.assertRaises(TypeError, self.enum, X(self.seq)) def test_illformediterable(self): - self.assertRaises(TypeError, list, self.enum(N(seq))) + self.assertRaises(TypeError, list, self.enum(N(self.seq))) def test_exception_propagation(self): - self.assertRaises(ZeroDivisionError, list, self.enum(E(seq))) + self.assertRaises(ZeroDivisionError, list, self.enum(E(self.seq))) + + def test_argumentcheck(self): + self.assertRaises(TypeError, self.enum) # no arguments + self.assertRaises(TypeError, self.enum, 1) # wrong type (not iterable) + self.assertRaises(TypeError, self.enum, 'abc', 2) # too many arguments + + def test_tuple_reuse(self): + # Tests an implementation detail where tuple is reused + # whenever nothing else holds a reference to it + self.assertEqual(len(Set(map(id, list(self.seq)))), len(self.seq)) + self.assertEqual(len(Set(map(id, enumerate(self.seq)))), min(1,len(self.seq))) class MyEnum(enumerate): pass @@ -104,8 +115,28 @@ class SubclassTestCase(EnumerateTestCase): enum = MyEnum -def test_main(): - test_support.run_unittest(EnumerateTestCase, SubclassTestCase) +class TestEmpty(EnumerateTestCase): + + seq, res = '', [] + +class TestBig(EnumerateTestCase): + + seq = range(10,20000,2) + res = zip(range(20000), seq) + + +def test_main(verbose=None): + testclasses = (EnumerateTestCase, SubclassTestCase, TestEmpty, TestBig) + test_support.run_unittest(*testclasses) + + # verify reference counting + import sys + if verbose and hasattr(sys, "gettotalrefcount"): + counts = [None] * 5 + for i in xrange(len(counts)): + test_support.run_unittest(*testclasses) + counts[i] = sys.gettotalrefcount() + print counts if __name__ == "__main__": - test_main() + test_main(verbose=True) |