Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(11)

Side by Side Diff: Lib/test/seq_tests.py

Issue 602: range: lean and mean (Closed) SVN Base: http://svn.python.org/view/*checkout*/python/branches/py3k/
Patch Set: __len__ is back! Created 4 months, 1 week ago
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 """ 1 """
2 Tests common to tuple, list and UserList.UserList 2 Tests common to tuple, list and UserList.UserList
3 """ 3 """
4 4
5 import unittest 5 import unittest
6 import sys 6 import sys
7 7
8 # Various iterables 8 # Various iterables
9 # This is used for checking the constructor (here and in test_deque.py) 9 # This is used for checking the constructor (here and in test_deque.py)
10 def iterfunc(seqn): 10 def iterfunc(seqn):
11 'Regular generator' 11 'Regular generator'
12 for i in seqn: 12 for i in seqn:
13 yield i 13 yield i
14 14
15 class Sequence: 15 class Sequence:
16 'Sequence using __getitem__' 16 'Sequence using __getitem__'
17 def __init__(self, seqn): 17 def __init__(self, seqn):
18 self.seqn = seqn 18 self.seqn = seqn
19 def __getitem__(self, i): 19 def __getitem__(self, i):
20 return self.seqn[i] 20 return self.seqn[i]
21 21
22 class IterFunc: 22 class IterFunc:
23 'Sequence using iterator protocol' 23 'Sequence using iterator protocol'
24 def __init__(self, seqn): 24 def __init__(self, seqn):
25 self.seqn = seqn 25 self.seqn = seqn
26 self.i = 0 26 self.i = 0
27 def __iter__(self): 27 def __iter__(self):
28 return self 28 return self
29 def __next__(self): 29 def __next__(self):
30 if self.i >= len(self.seqn): raise StopIteration 30 if self.i >= len(self.seqn): raise StopIteration
31 v = self.seqn[self.i] 31 v = self.seqn[self.i]
32 self.i += 1 32 self.i += 1
33 return v 33 return v
34 34
35 class IterGen: 35 class IterGen:
36 'Sequence using iterator protocol defined with a generator' 36 'Sequence using iterator protocol defined with a generator'
37 def __init__(self, seqn): 37 def __init__(self, seqn):
38 self.seqn = seqn 38 self.seqn = seqn
39 self.i = 0 39 self.i = 0
40 def __iter__(self): 40 def __iter__(self):
41 for val in self.seqn: 41 for val in self.seqn:
42 yield val 42 yield val
43 43
44 class IterNextOnly: 44 class IterNextOnly:
45 'Missing __getitem__ and __iter__' 45 'Missing __getitem__ and __iter__'
46 def __init__(self, seqn): 46 def __init__(self, seqn):
47 self.seqn = seqn 47 self.seqn = seqn
48 self.i = 0 48 self.i = 0
49 def __next__(self): 49 def __next__(self):
50 if self.i >= len(self.seqn): raise StopIteration 50 if self.i >= len(self.seqn): raise StopIteration
51 v = self.seqn[self.i] 51 v = self.seqn[self.i]
52 self.i += 1 52 self.i += 1
53 return v 53 return v
54 54
55 class IterNoNext: 55 class IterNoNext:
56 'Iterator missing __next__()' 56 'Iterator missing __next__()'
57 def __init__(self, seqn): 57 def __init__(self, seqn):
58 self.seqn = seqn 58 self.seqn = seqn
59 self.i = 0 59 self.i = 0
60 def __iter__(self): 60 def __iter__(self):
61 return self 61 return self
62 62
63 class IterGenExc: 63 class IterGenExc:
64 'Test propagation of exceptions' 64 'Test propagation of exceptions'
65 def __init__(self, seqn): 65 def __init__(self, seqn):
66 self.seqn = seqn 66 self.seqn = seqn
67 self.i = 0 67 self.i = 0
68 def __iter__(self): 68 def __iter__(self):
69 return self 69 return self
70 def __next__(self): 70 def __next__(self):
71 3 // 0 71 3 // 0
72 72
73 class IterFuncStop: 73 class IterFuncStop:
74 'Test immediate stop' 74 'Test immediate stop'
75 def __init__(self, seqn): 75 def __init__(self, seqn):
76 pass 76 pass
77 def __iter__(self): 77 def __iter__(self):
78 return self 78 return self
79 def __next__(self): 79 def __next__(self):
80 raise StopIteration 80 raise StopIteration
81 81
82 from itertools import chain 82 from itertools import chain
83 def itermulti(seqn): 83 def itermulti(seqn):
84 'Test multiple tiers of iterators' 84 'Test multiple tiers of iterators'
85 return chain(map(lambda x:x, iterfunc(IterGen(Sequence(seqn))))) 85 return chain(map(lambda x:x, iterfunc(IterGen(Sequence(seqn)))))
86 86
87 class CommonTest(unittest.TestCase): 87 class CommonTest(unittest.TestCase):
88 # The type to be tested 88 # The type to be tested
89 type2test = None 89 type2test = None
90 90
91 def test_constructors(self): 91 def test_constructors(self):
92 l0 = [] 92 l0 = []
93 l1 = [0] 93 l1 = [0]
94 l2 = [0, 1] 94 l2 = [0, 1]
95 95
96 u = self.type2test() 96 u = self.type2test()
97 u0 = self.type2test(l0) 97 u0 = self.type2test(l0)
98 u1 = self.type2test(l1) 98 u1 = self.type2test(l1)
99 u2 = self.type2test(l2) 99 u2 = self.type2test(l2)
100 100
101 uu = self.type2test(u) 101 uu = self.type2test(u)
102 uu0 = self.type2test(u0) 102 uu0 = self.type2test(u0)
103 uu1 = self.type2test(u1) 103 uu1 = self.type2test(u1)
104 uu2 = self.type2test(u2) 104 uu2 = self.type2test(u2)
105 105
106 v = self.type2test(tuple(u)) 106 v = self.type2test(tuple(u))
107 class OtherSeq: 107 class OtherSeq:
108 def __init__(self, initseq): 108 def __init__(self, initseq):
109 self.__data = initseq 109 self.__data = initseq
110 def __len__(self): 110 def __len__(self):
111 return len(self.__data) 111 return len(self.__data)
112 def __getitem__(self, i): 112 def __getitem__(self, i):
113 return self.__data[i] 113 return self.__data[i]
114 s = OtherSeq(u0) 114 s = OtherSeq(u0)
115 v0 = self.type2test(s) 115 v0 = self.type2test(s)
116 self.assertEqual(len(v0), len(s)) 116 self.assertEqual(len(v0), len(s))
117 117
118 s = "this is also a sequence" 118 s = "this is also a sequence"
119 vv = self.type2test(s) 119 vv = self.type2test(s)
120 self.assertEqual(len(vv), len(s)) 120 self.assertEqual(len(vv), len(s))
121 121
122 # Create from various iteratables 122 # Create from various iteratables
123 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)): 123 for s in ("123", "", ('do', 1.2)):
124 for g in (Sequence, IterFunc, IterGen, 124 for g in (Sequence, IterFunc, IterGen,
125 itermulti, iterfunc): 125 itermulti, iterfunc):
126 self.assertEqual(self.type2test(g(s)), self.type2test(s)) 126 self.assertEqual(self.type2test(g(s)), self.type2test(s))
127 self.assertEqual(self.type2test(IterFuncStop(s)), self.type2test()) 127 self.assertEqual(self.type2test(IterFuncStop(s)), self.type2test())
128 self.assertEqual(self.type2test(c for c in "123"), self.type2test("1 23")) 128 self.assertEqual(self.type2test(c for c in "123"), self.type2test("1 23"))
129 self.assertRaises(TypeError, self.type2test, IterNextOnly(s)) 129 self.assertRaises(TypeError, self.type2test, IterNextOnly(s))
130 self.assertRaises(TypeError, self.type2test, IterNoNext(s)) 130 self.assertRaises(TypeError, self.type2test, IterNoNext(s))
131 self.assertRaises(ZeroDivisionError, self.type2test, IterGenExc(s)) 131 self.assertRaises(ZeroDivisionError, self.type2test, IterGenExc(s))
132 132
133 def test_truth(self): 133 def test_truth(self):
134 self.assert_(not self.type2test()) 134 self.assert_(not self.type2test())
135 self.assert_(self.type2test([42])) 135 self.assert_(self.type2test([42]))
136 136
137 def test_getitem(self): 137 def test_getitem(self):
138 u = self.type2test([0, 1, 2, 3, 4]) 138 u = self.type2test([0, 1, 2, 3, 4])
139 for i in range(len(u)): 139 for i in range(len(u)):
140 self.assertEqual(u[i], i) 140 self.assertEqual(u[i], i)
141 self.assertEqual(u[int(i)], i) 141 self.assertEqual(u[int(i)], i)
142 for i in range(-len(u), -1): 142 for i in range(-len(u), -1):
143 self.assertEqual(u[i], len(u)+i) 143 self.assertEqual(u[i], len(u)+i)
144 self.assertEqual(u[int(i)], len(u)+i) 144 self.assertEqual(u[int(i)], len(u)+i)
145 self.assertRaises(IndexError, u.__getitem__, -len(u)-1) 145 self.assertRaises(IndexError, u.__getitem__, -len(u)-1)
146 self.assertRaises(IndexError, u.__getitem__, len(u)) 146 self.assertRaises(IndexError, u.__getitem__, len(u))
147 self.assertRaises(ValueError, u.__getitem__, slice(0,10,0)) 147 self.assertRaises(ValueError, u.__getitem__, slice(0,10,0))
148 148
149 u = self.type2test() 149 u = self.type2test()
150 self.assertRaises(IndexError, u.__getitem__, 0) 150 self.assertRaises(IndexError, u.__getitem__, 0)
151 self.assertRaises(IndexError, u.__getitem__, -1) 151 self.assertRaises(IndexError, u.__getitem__, -1)
152 152
153 self.assertRaises(TypeError, u.__getitem__) 153 self.assertRaises(TypeError, u.__getitem__)
154 154
155 a = self.type2test([10, 11]) 155 a = self.type2test([10, 11])
156 self.assertEqual(a[0], 10) 156 self.assertEqual(a[0], 10)
157 self.assertEqual(a[1], 11) 157 self.assertEqual(a[1], 11)
158 self.assertEqual(a[-2], 10) 158 self.assertEqual(a[-2], 10)
159 self.assertEqual(a[-1], 11) 159 self.assertEqual(a[-1], 11)
160 self.assertRaises(IndexError, a.__getitem__, -3) 160 self.assertRaises(IndexError, a.__getitem__, -3)
161 self.assertRaises(IndexError, a.__getitem__, 3) 161 self.assertRaises(IndexError, a.__getitem__, 3)
162 162
163 def test_getslice(self): 163 def test_getslice(self):
164 l = [0, 1, 2, 3, 4] 164 l = [0, 1, 2, 3, 4]
165 u = self.type2test(l) 165 u = self.type2test(l)
166 166
167 self.assertEqual(u[0:0], self.type2test()) 167 self.assertEqual(u[0:0], self.type2test())
168 self.assertEqual(u[1:2], self.type2test([1])) 168 self.assertEqual(u[1:2], self.type2test([1]))
169 self.assertEqual(u[-2:-1], self.type2test([3])) 169 self.assertEqual(u[-2:-1], self.type2test([3]))
170 self.assertEqual(u[-1000:1000], u) 170 self.assertEqual(u[-1000:1000], u)
171 self.assertEqual(u[1000:-1000], self.type2test([])) 171 self.assertEqual(u[1000:-1000], self.type2test([]))
172 self.assertEqual(u[:], u) 172 self.assertEqual(u[:], u)
173 self.assertEqual(u[1:None], self.type2test([1, 2, 3, 4])) 173 self.assertEqual(u[1:None], self.type2test([1, 2, 3, 4]))
(...skipping 166 matching lines...) Show 10 above Show 10 below
340 340
341 class BadCmp: 341 class BadCmp:
342 def __eq__(self, other): 342 def __eq__(self, other):
343 if other == 2: 343 if other == 2:
344 raise BadExc() 344 raise BadExc()
345 return False 345 return False
346 346
347 self.assertRaises(BadExc, a.count, BadCmp()) 347 self.assertRaises(BadExc, a.count, BadCmp())
348 348
349 def test_index(self): 349 def test_index(self):
350 u = self.type2test([0, 1]) 350 u = self.type2test([0, 1])
351 self.assertEqual(u.index(0), 0) 351 self.assertEqual(u.index(0), 0)
352 self.assertEqual(u.index(1), 1) 352 self.assertEqual(u.index(1), 1)
353 self.assertRaises(ValueError, u.index, 2) 353 self.assertRaises(ValueError, u.index, 2)
354 354
355 u = self.type2test([-2, -1, 0, 0, 1, 2]) 355 u = self.type2test([-2, -1, 0, 0, 1, 2])
356 self.assertEqual(u.count(0), 2) 356 self.assertEqual(u.count(0), 2)
357 self.assertEqual(u.index(0), 2) 357 self.assertEqual(u.index(0), 2)
358 self.assertEqual(u.index(0, 2), 2) 358 self.assertEqual(u.index(0, 2), 2)
359 self.assertEqual(u.index(-2, -10), 0) 359 self.assertEqual(u.index(-2, -10), 0)
360 self.assertEqual(u.index(0, 3), 3) 360 self.assertEqual(u.index(0, 3), 3)
361 self.assertEqual(u.index(0, 3, 4), 3) 361 self.assertEqual(u.index(0, 3, 4), 3)
362 self.assertRaises(ValueError, u.index, 2, 0, -10) 362 self.assertRaises(ValueError, u.index, 2, 0, -10)
363 363
364 self.assertRaises(TypeError, u.index) 364 self.assertRaises(TypeError, u.index)
365 365
366 class BadExc(Exception): 366 class BadExc(Exception):
367 pass 367 pass
368 368
369 class BadCmp: 369 class BadCmp:
370 def __eq__(self, other): 370 def __eq__(self, other):
371 if other == 2: 371 if other == 2:
372 raise BadExc() 372 raise BadExc()
373 return False 373 return False
374 374
375 a = self.type2test([0, 1, 2, 3]) 375 a = self.type2test([0, 1, 2, 3])
376 self.assertRaises(BadExc, a.index, BadCmp()) 376 self.assertRaises(BadExc, a.index, BadCmp())
377 377
378 a = self.type2test([-2, -1, 0, 0, 1, 2]) 378 a = self.type2test([-2, -1, 0, 0, 1, 2])
379 self.assertEqual(a.index(0), 2) 379 self.assertEqual(a.index(0), 2)
380 self.assertEqual(a.index(0, 2), 2) 380 self.assertEqual(a.index(0, 2), 2)
381 self.assertEqual(a.index(0, -4), 2) 381 self.assertEqual(a.index(0, -4), 2)
382 self.assertEqual(a.index(-2, -10), 0) 382 self.assertEqual(a.index(-2, -10), 0)
383 self.assertEqual(a.index(0, 3), 3) 383 self.assertEqual(a.index(0, 3), 3)
384 self.assertEqual(a.index(0, -3), 3) 384 self.assertEqual(a.index(0, -3), 3)
385 self.assertEqual(a.index(0, 3, 4), 3) 385 self.assertEqual(a.index(0, 3, 4), 3)
386 self.assertEqual(a.index(0, -3, -2), 3) 386 self.assertEqual(a.index(0, -3, -2), 3)
387 self.assertEqual(a.index(0, -4*sys.maxsize, 4*sys.maxsize), 2) 387 self.assertEqual(a.index(0, -4*sys.maxsize, 4*sys.maxsize), 2)
388 self.assertRaises(ValueError, a.index, 0, 4*sys.maxsize,-4*sys.maxsize) 388 self.assertRaises(ValueError, a.index, 0, 4*sys.maxsize,-4*sys.maxsize)
389 self.assertRaises(ValueError, a.index, 2, 0, -10) 389 self.assertRaises(ValueError, a.index, 2, 0, -10)
OLDNEW

Powered by Google App Engine
This is Rietveld r305