11import unittest
2+ from sets import Set
23
34from test import test_support
45
5- seq , res = 'abc' , [(0 ,'a' ), (1 ,'b' ), (2 ,'c' )]
6-
76class G :
87 'Sequence using __getitem__'
98 def __init__ (self , seqn ):
@@ -65,37 +64,49 @@ def __iter__(self):
6564class EnumerateTestCase (unittest .TestCase ):
6665
6766 enum = enumerate
67+ seq , res = 'abc' , [(0 ,'a' ), (1 ,'b' ), (2 ,'c' )]
6868
6969 def test_basicfunction (self ):
70- self .assertEqual (type (self .enum (seq )), self .enum )
71- e = self .enum (seq )
70+ self .assertEqual (type (self .enum (self . seq )), self .enum )
71+ e = self .enum (self . seq )
7272 self .assertEqual (iter (e ), e )
73- self .assertEqual (list (self .enum (seq )), res )
73+ self .assertEqual (list (self .enum (self . seq )), self . res )
7474 self .enum .__doc__
7575
7676 def test_getitemseqn (self ):
77- self .assertEqual (list (self .enum (G (seq ))), res )
77+ self .assertEqual (list (self .enum (G (self . seq ))), self . res )
7878 e = self .enum (G ('' ))
7979 self .assertRaises (StopIteration , e .next )
8080
8181 def test_iteratorseqn (self ):
82- self .assertEqual (list (self .enum (I (seq ))), res )
82+ self .assertEqual (list (self .enum (I (self . seq ))), self . res )
8383 e = self .enum (I ('' ))
8484 self .assertRaises (StopIteration , e .next )
8585
8686 def test_iteratorgenerator (self ):
87- self .assertEqual (list (self .enum (Ig (seq ))), res )
87+ self .assertEqual (list (self .enum (Ig (self . seq ))), self . res )
8888 e = self .enum (Ig ('' ))
8989 self .assertRaises (StopIteration , e .next )
9090
9191 def test_noniterable (self ):
92- self .assertRaises (TypeError , self .enum , X (seq ))
92+ self .assertRaises (TypeError , self .enum , X (self . seq ))
9393
9494 def test_illformediterable (self ):
95- self .assertRaises (TypeError , list , self .enum (N (seq )))
95+ self .assertRaises (TypeError , list , self .enum (N (self . seq )))
9696
9797 def test_exception_propagation (self ):
98- self .assertRaises (ZeroDivisionError , list , self .enum (E (seq )))
98+ self .assertRaises (ZeroDivisionError , list , self .enum (E (self .seq )))
99+
100+ def test_argumentcheck (self ):
101+ self .assertRaises (TypeError , self .enum ) # no arguments
102+ self .assertRaises (TypeError , self .enum , 1 ) # wrong type (not iterable)
103+ self .assertRaises (TypeError , self .enum , 'abc' , 2 ) # too many arguments
104+
105+ def test_tuple_reuse (self ):
106+ # Tests an implementation detail where tuple is reused
107+ # whenever nothing else holds a reference to it
108+ self .assertEqual (len (Set (map (id , list (self .seq )))), len (self .seq ))
109+ self .assertEqual (len (Set (map (id , enumerate (self .seq )))), min (1 ,len (self .seq )))
99110
100111class MyEnum (enumerate ):
101112 pass
@@ -104,8 +115,28 @@ class SubclassTestCase(EnumerateTestCase):
104115
105116 enum = MyEnum
106117
107- def test_main ():
108- test_support .run_unittest (EnumerateTestCase , SubclassTestCase )
118+ class TestEmpty (EnumerateTestCase ):
119+
120+ seq , res = '' , []
121+
122+ class TestBig (EnumerateTestCase ):
123+
124+ seq = range (10 ,20000 ,2 )
125+ res = zip (range (20000 ), seq )
126+
127+
128+ def test_main (verbose = None ):
129+ testclasses = (EnumerateTestCase , SubclassTestCase , TestEmpty , TestBig )
130+ test_support .run_unittest (* testclasses )
131+
132+ # verify reference counting
133+ import sys
134+ if verbose and hasattr (sys , "gettotalrefcount" ):
135+ counts = [None ] * 5
136+ for i in xrange (len (counts )):
137+ test_support .run_unittest (* testclasses )
138+ counts [i ] = sys .gettotalrefcount ()
139+ print counts
109140
110141if __name__ == "__main__" :
111- test_main ()
142+ test_main (verbose = True )
0 commit comments