| OLD | NEW |
| 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) |
| OLD | NEW |