* Beefed-up tests
* Allow tuple re-use
* Call tp_iternext directly
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 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 @@
 
     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)