11import unittest
22from test import test_support
33import operator
4+ from sys import maxint
45
56class oldstyle :
67 def __index__ (self ):
@@ -10,68 +11,115 @@ class newstyle(object):
1011 def __index__ (self ):
1112 return self .ind
1213
14+ class TrapInt (int ):
15+ def __index__ (self ):
16+ return self
17+
18+ class TrapLong (long ):
19+ def __index__ (self ):
20+ return self
21+
1322class BaseTestCase (unittest .TestCase ):
1423 def setUp (self ):
1524 self .o = oldstyle ()
1625 self .n = newstyle ()
17- self .o2 = oldstyle ()
18- self .n2 = newstyle ()
1926
2027 def test_basic (self ):
2128 self .o .ind = - 2
2229 self .n .ind = 2
23- assert (self .seq [self .n ] == self .seq [2 ])
24- assert (self .seq [self .o ] == self .seq [- 2 ])
25- assert (operator .index (self .o ) == - 2 )
26- assert (operator .index (self .n ) == 2 )
30+ self .assertEqual (operator .index (self .o ), - 2 )
31+ self .assertEqual (operator .index (self .n ), 2 )
32+
33+ def test_slice (self ):
34+ self .o .ind = 1
35+ self .n .ind = 2
36+ slc = slice (self .o , self .o , self .o )
37+ check_slc = slice (1 , 1 , 1 )
38+ self .assertEqual (slc .indices (self .o ), check_slc .indices (1 ))
39+ slc = slice (self .n , self .n , self .n )
40+ check_slc = slice (2 , 2 , 2 )
41+ self .assertEqual (slc .indices (self .n ), check_slc .indices (2 ))
2742
43+ def test_wrappers (self ):
44+ self .o .ind = 4
45+ self .n .ind = 5
46+ self .assertEqual (6 .__index__ (), 6 )
47+ self .assertEqual (- 7L .__index__ (), - 7 )
48+ self .assertEqual (self .o .__index__ (), 4 )
49+ self .assertEqual (self .n .__index__ (), 5 )
50+
51+ def test_infinite_recursion (self ):
52+ self .failUnlessRaises (TypeError , operator .index , TrapInt ())
53+ self .failUnlessRaises (TypeError , operator .index , TrapLong ())
54+ self .failUnless (slice (TrapInt ()).indices (0 )== (0 ,0 ,1 ))
55+ self .failUnlessRaises (TypeError , slice (TrapLong ()).indices , 0 )
56+
2857 def test_error (self ):
2958 self .o .ind = 'dumb'
3059 self .n .ind = 'bad'
31- myfunc = lambda x , obj : obj .seq [x ]
3260 self .failUnlessRaises (TypeError , operator .index , self .o )
3361 self .failUnlessRaises (TypeError , operator .index , self .n )
34- self .failUnlessRaises (TypeError , myfunc , self .o , self )
35- self .failUnlessRaises (TypeError , myfunc , self .n , self )
62+ self .failUnlessRaises (TypeError , slice (self .o ).indices , 0 )
63+ self .failUnlessRaises (TypeError , slice (self .n ).indices , 0 )
64+
65+
66+ class SeqTestCase (unittest .TestCase ):
67+ # This test case isn't run directly. It just defines common tests
68+ # to the different sequence types below
69+ def setUp (self ):
70+ self .o = oldstyle ()
71+ self .n = newstyle ()
72+ self .o2 = oldstyle ()
73+ self .n2 = newstyle ()
74+
75+ def test_index (self ):
76+ self .o .ind = - 2
77+ self .n .ind = 2
78+ self .assertEqual (self .seq [self .n ], self .seq [2 ])
79+ self .assertEqual (self .seq [self .o ], self .seq [- 2 ])
3680
3781 def test_slice (self ):
3882 self .o .ind = 1
3983 self .o2 .ind = 3
4084 self .n .ind = 2
4185 self .n2 .ind = 4
42- assert (self .seq [self .o :self .o2 ] == self .seq [1 :3 ])
43- assert (self .seq [self .n :self .n2 ] == self .seq [2 :4 ])
86+ self . assertEqual (self .seq [self .o :self .o2 ], self .seq [1 :3 ])
87+ self . assertEqual (self .seq [self .n :self .n2 ], self .seq [2 :4 ])
4488
4589 def test_repeat (self ):
4690 self .o .ind = 3
4791 self .n .ind = 2
48- assert (self .seq * self .o == self .seq * 3 )
49- assert (self .seq * self .n == self .seq * 2 )
50- assert (self .o * self .seq == self .seq * 3 )
51- assert (self .n * self .seq == self .seq * 2 )
92+ self . assertEqual (self .seq * self .o , self .seq * 3 )
93+ self . assertEqual (self .seq * self .n , self .seq * 2 )
94+ self . assertEqual (self .o * self .seq , self .seq * 3 )
95+ self . assertEqual (self .n * self .seq , self .seq * 2 )
5296
5397 def test_wrappers (self ):
54- n = self .n
55- n .ind = 5
56- assert n .__index__ () == 5
57- assert 6 .__index__ () == 6
58- assert - 7L .__index__ () == - 7
59- assert self .seq .__getitem__ (n ) == self .seq [5 ]
60- assert self .seq .__mul__ (n ) == self .seq * 5
61- assert self .seq .__rmul__ (n ) == self .seq * 5
62-
63- def test_infinite_recusion (self ):
64- class Trap1 (int ):
65- def __index__ (self ):
66- return self
67- class Trap2 (long ):
68- def __index__ (self ):
69- return self
70- self .failUnlessRaises (TypeError , operator .getitem , self .seq , Trap1 ())
71- self .failUnlessRaises (TypeError , operator .getitem , self .seq , Trap2 ())
72-
73-
74- class ListTestCase (BaseTestCase ):
98+ self .o .ind = 4
99+ self .n .ind = 5
100+ self .assertEqual (self .seq .__getitem__ (self .o ), self .seq [4 ])
101+ self .assertEqual (self .seq .__mul__ (self .o ), self .seq * 4 )
102+ self .assertEqual (self .seq .__rmul__ (self .o ), self .seq * 4 )
103+ self .assertEqual (self .seq .__getitem__ (self .n ), self .seq [5 ])
104+ self .assertEqual (self .seq .__mul__ (self .n ), self .seq * 5 )
105+ self .assertEqual (self .seq .__rmul__ (self .n ), self .seq * 5 )
106+
107+ def test_infinite_recursion (self ):
108+ self .failUnlessRaises (TypeError , operator .getitem , self .seq , TrapInt ())
109+ self .failUnlessRaises (TypeError , operator .getitem , self .seq , TrapLong ())
110+
111+ def test_error (self ):
112+ self .o .ind = 'dumb'
113+ self .n .ind = 'bad'
114+ indexobj = lambda x , obj : obj .seq [x ]
115+ self .failUnlessRaises (TypeError , indexobj , self .o , self )
116+ self .failUnlessRaises (TypeError , indexobj , self .n , self )
117+ sliceobj = lambda x , obj : obj .seq [x :]
118+ self .failUnlessRaises (TypeError , sliceobj , self .o , self )
119+ self .failUnlessRaises (TypeError , sliceobj , self .n , self )
120+
121+
122+ class ListTestCase (SeqTestCase ):
75123 seq = [0 ,10 ,20 ,30 ,40 ,50 ]
76124
77125 def test_setdelitem (self ):
@@ -82,36 +130,36 @@ def test_setdelitem(self):
82130 del lst [self .n ]
83131 lst [self .o ] = 'X'
84132 lst [self .n ] = 'Y'
85- assert lst == list ('abYdefghXj' )
133+ self . assertEqual ( lst , list ('abYdefghXj' ) )
86134
87135 lst = [5 , 6 , 7 , 8 , 9 , 10 , 11 ]
88136 lst .__setitem__ (self .n , "here" )
89- assert lst == [5 , 6 , "here" , 8 , 9 , 10 , 11 ]
137+ self . assertEqual ( lst , [5 , 6 , "here" , 8 , 9 , 10 , 11 ])
90138 lst .__delitem__ (self .n )
91- assert lst == [5 , 6 , 8 , 9 , 10 , 11 ]
139+ self . assertEqual ( lst , [5 , 6 , 8 , 9 , 10 , 11 ])
92140
93141 def test_inplace_repeat (self ):
94142 self .o .ind = 2
95143 self .n .ind = 3
96144 lst = [6 , 4 ]
97145 lst *= self .o
98- assert lst == [6 , 4 , 6 , 4 ]
146+ self . assertEqual ( lst , [6 , 4 , 6 , 4 ])
99147 lst *= self .n
100- assert lst == [6 , 4 , 6 , 4 ] * 3
148+ self . assertEqual ( lst , [6 , 4 , 6 , 4 ] * 3 )
101149
102150 lst = [5 , 6 , 7 , 8 , 9 , 11 ]
103151 l2 = lst .__imul__ (self .n )
104- assert l2 is lst
105- assert lst == [5 , 6 , 7 , 8 , 9 , 11 ] * 3
152+ self . assert_ ( l2 is lst )
153+ self . assertEqual ( lst , [5 , 6 , 7 , 8 , 9 , 11 ] * 3 )
106154
107155
108- class TupleTestCase (BaseTestCase ):
156+ class TupleTestCase (SeqTestCase ):
109157 seq = (0 ,10 ,20 ,30 ,40 ,50 )
110158
111- class StringTestCase (BaseTestCase ):
159+ class StringTestCase (SeqTestCase ):
112160 seq = "this is a test"
113161
114- class UnicodeTestCase (BaseTestCase ):
162+ class UnicodeTestCase (SeqTestCase ):
115163 seq = u"this is a test"
116164
117165
@@ -120,17 +168,47 @@ class XRangeTestCase(unittest.TestCase):
120168 def test_xrange (self ):
121169 n = newstyle ()
122170 n .ind = 5
123- assert xrange (1 , 20 )[n ] == 6
124- assert xrange (1 , 20 ).__getitem__ (n ) == 6
171+ self .assertEqual (xrange (1 , 20 )[n ], 6 )
172+ self .assertEqual (xrange (1 , 20 ).__getitem__ (n ), 6 )
173+
174+ class OverflowTestCase (unittest .TestCase ):
175+
176+ def setUp (self ):
177+ self .pos = 2 ** 100
178+ self .neg = - self .pos
179+
180+ def test_large_longs (self ):
181+ self .assertEqual (self .pos .__index__ (), self .pos )
182+ self .assertEqual (self .neg .__index__ (), self .neg )
183+
184+ def test_getitem (self ):
185+ class GetItem (object ):
186+ def __len__ (self ):
187+ return maxint
188+ def __getitem__ (self , key ):
189+ return key
190+ def __getslice__ (self , i , j ):
191+ return i , j
192+ x = GetItem ()
193+ self .assertEqual (x [self .pos ], self .pos )
194+ self .assertEqual (x [self .neg ], self .neg )
195+ self .assertEqual (x [self .neg :self .pos ], (- 1 , maxint ))
196+ self .assertEqual (x [self .neg :self .pos :1 ].indices (maxint ), (0 , maxint , 1 ))
197+
198+ def test_sequence_repeat (self ):
199+ self .failUnlessRaises (OverflowError , lambda : "a" * self .pos )
200+ self .failUnlessRaises (OverflowError , lambda : "a" * self .neg )
125201
126202
127203def test_main ():
128204 test_support .run_unittest (
205+ BaseTestCase ,
129206 ListTestCase ,
130207 TupleTestCase ,
131208 StringTestCase ,
132209 UnicodeTestCase ,
133210 XRangeTestCase ,
211+ OverflowTestCase ,
134212 )
135213
136214if __name__ == "__main__" :
0 commit comments