summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_enumerate.py
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2003-05-28 14:05:34 (GMT)
committerRaymond Hettinger <python@rcn.com>2003-05-28 14:05:34 (GMT)
commite8b0f0461baf7aa59bc517406432ccbb70443aac (patch)
tree1dca8982664ede1116aea9af2d0e9460c1183b34 /Lib/test/test_enumerate.py
parenta95d3b78c8a14a9e86d3d5f9642add8292968378 (diff)
downloadcpython-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/test/test_enumerate.py')
-rw-r--r--Lib/test/test_enumerate.py59
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)