this repo has no description
at trunk 424 lines 15 kB view raw
1#!/usr/bin/env python3 2# Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com) 3# WARNING: This is a temporary copy of code from the cpython library to 4# facilitate bringup. Please file a task for anything you change! 5# flake8: noqa 6# fmt: off 7""" 8Tests common to tuple, list and UserList.UserList 9""" 10 11import pickle 12import sys 13import unittest 14from test import support 15 16# Various iterables 17# This is used for checking the constructor (here and in test_deque.py) 18def iterfunc(seqn): 19 'Regular generator' 20 for i in seqn: 21 yield i 22 23class Sequence: 24 'Sequence using __getitem__' 25 def __init__(self, seqn): 26 self.seqn = seqn 27 def __getitem__(self, i): 28 return self.seqn[i] 29 30class IterFunc: 31 'Sequence using iterator protocol' 32 def __init__(self, seqn): 33 self.seqn = seqn 34 self.i = 0 35 def __iter__(self): 36 return self 37 def __next__(self): 38 if self.i >= len(self.seqn): raise StopIteration 39 v = self.seqn[self.i] 40 self.i += 1 41 return v 42 43class IterGen: 44 'Sequence using iterator protocol defined with a generator' 45 def __init__(self, seqn): 46 self.seqn = seqn 47 self.i = 0 48 def __iter__(self): 49 for val in self.seqn: 50 yield val 51 52class IterNextOnly: 53 'Missing __getitem__ and __iter__' 54 def __init__(self, seqn): 55 self.seqn = seqn 56 self.i = 0 57 def __next__(self): 58 if self.i >= len(self.seqn): raise StopIteration 59 v = self.seqn[self.i] 60 self.i += 1 61 return v 62 63class IterNoNext: 64 'Iterator missing __next__()' 65 def __init__(self, seqn): 66 self.seqn = seqn 67 self.i = 0 68 def __iter__(self): 69 return self 70 71class IterGenExc: 72 'Test propagation of exceptions' 73 def __init__(self, seqn): 74 self.seqn = seqn 75 self.i = 0 76 def __iter__(self): 77 return self 78 def __next__(self): 79 3 // 0 80 81class IterFuncStop: 82 'Test immediate stop' 83 def __init__(self, seqn): 84 pass 85 def __iter__(self): 86 return self 87 def __next__(self): 88 raise StopIteration 89 90from itertools import chain 91def itermulti(seqn): 92 'Test multiple tiers of iterators' 93 return chain(map(lambda x:x, iterfunc(IterGen(Sequence(seqn))))) 94 95class LyingTuple(tuple): 96 def __iter__(self): 97 yield 1 98 99class LyingList(list): 100 def __iter__(self): 101 yield 1 102 103class CommonTest(unittest.TestCase): 104 # The type to be tested 105 type2test = None 106 107 def test_constructors(self): 108 l0 = [] 109 l1 = [0] 110 l2 = [0, 1] 111 112 u = self.type2test() 113 u0 = self.type2test(l0) 114 u1 = self.type2test(l1) 115 u2 = self.type2test(l2) 116 117 uu = self.type2test(u) 118 uu0 = self.type2test(u0) 119 uu1 = self.type2test(u1) 120 uu2 = self.type2test(u2) 121 122 v = self.type2test(tuple(u)) 123 class OtherSeq: 124 def __init__(self, initseq): 125 self.__data = initseq 126 def __len__(self): 127 return len(self.__data) 128 def __getitem__(self, i): 129 return self.__data[i] 130 s = OtherSeq(u0) 131 v0 = self.type2test(s) 132 self.assertEqual(len(v0), len(s)) 133 134 s = "this is also a sequence" 135 vv = self.type2test(s) 136 self.assertEqual(len(vv), len(s)) 137 138 # Create from various iteratables 139 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)): 140 for g in (Sequence, IterFunc, IterGen, 141 itermulti, iterfunc): 142 self.assertEqual(self.type2test(g(s)), self.type2test(s)) 143 self.assertEqual(self.type2test(IterFuncStop(s)), self.type2test()) 144 self.assertEqual(self.type2test(c for c in "123"), self.type2test("123")) 145 self.assertRaises(TypeError, self.type2test, IterNextOnly(s)) 146 self.assertRaises(TypeError, self.type2test, IterNoNext(s)) 147 self.assertRaises(ZeroDivisionError, self.type2test, IterGenExc(s)) 148 149 # Issue #23757 150 self.assertEqual(self.type2test(LyingTuple((2,))), self.type2test((1,))) 151 self.assertEqual(self.type2test(LyingList([2])), self.type2test([1])) 152 153 def test_truth(self): 154 self.assertFalse(self.type2test()) 155 self.assertTrue(self.type2test([42])) 156 157 def test_getitem(self): 158 u = self.type2test([0, 1, 2, 3, 4]) 159 for i in range(len(u)): 160 self.assertEqual(u[i], i) 161 self.assertEqual(u[int(i)], i) 162 for i in range(-len(u), -1): 163 self.assertEqual(u[i], len(u)+i) 164 self.assertEqual(u[int(i)], len(u)+i) 165 self.assertRaises(IndexError, u.__getitem__, -len(u)-1) 166 self.assertRaises(IndexError, u.__getitem__, len(u)) 167 self.assertRaises(ValueError, u.__getitem__, slice(0,10,0)) 168 169 u = self.type2test() 170 self.assertRaises(IndexError, u.__getitem__, 0) 171 self.assertRaises(IndexError, u.__getitem__, -1) 172 173 self.assertRaises(TypeError, u.__getitem__) 174 175 a = self.type2test([10, 11]) 176 self.assertEqual(a[0], 10) 177 self.assertEqual(a[1], 11) 178 self.assertEqual(a[-2], 10) 179 self.assertEqual(a[-1], 11) 180 self.assertRaises(IndexError, a.__getitem__, -3) 181 self.assertRaises(IndexError, a.__getitem__, 3) 182 183 def test_getslice(self): 184 l = [0, 1, 2, 3, 4] 185 u = self.type2test(l) 186 187 self.assertEqual(u[0:0], self.type2test()) 188 self.assertEqual(u[1:2], self.type2test([1])) 189 self.assertEqual(u[-2:-1], self.type2test([3])) 190 self.assertEqual(u[-1000:1000], u) 191 self.assertEqual(u[1000:-1000], self.type2test([])) 192 self.assertEqual(u[:], u) 193 self.assertEqual(u[1:None], self.type2test([1, 2, 3, 4])) 194 self.assertEqual(u[None:3], self.type2test([0, 1, 2])) 195 196 # Extended slices 197 self.assertEqual(u[::], u) 198 self.assertEqual(u[::2], self.type2test([0, 2, 4])) 199 self.assertEqual(u[1::2], self.type2test([1, 3])) 200 self.assertEqual(u[::-1], self.type2test([4, 3, 2, 1, 0])) 201 self.assertEqual(u[::-2], self.type2test([4, 2, 0])) 202 self.assertEqual(u[3::-2], self.type2test([3, 1])) 203 self.assertEqual(u[3:3:-2], self.type2test([])) 204 self.assertEqual(u[3:2:-2], self.type2test([3])) 205 self.assertEqual(u[3:1:-2], self.type2test([3])) 206 self.assertEqual(u[3:0:-2], self.type2test([3, 1])) 207 self.assertEqual(u[::-100], self.type2test([4])) 208 self.assertEqual(u[100:-100:], self.type2test([])) 209 self.assertEqual(u[-100:100:], u) 210 self.assertEqual(u[100:-100:-1], u[::-1]) 211 self.assertEqual(u[-100:100:-1], self.type2test([])) 212 self.assertEqual(u[-100:100:2], self.type2test([0, 2, 4])) 213 214 # Test extreme cases with long ints 215 a = self.type2test([0,1,2,3,4]) 216 self.assertEqual(a[ -pow(2,128): 3 ], self.type2test([0,1,2])) 217 self.assertEqual(a[ 3: pow(2,145) ], self.type2test([3,4])) 218 self.assertEqual(a[3::sys.maxsize], self.type2test([3])) 219 220 def test_contains(self): 221 u = self.type2test([0, 1, 2]) 222 for i in u: 223 self.assertIn(i, u) 224 for i in min(u)-1, max(u)+1: 225 self.assertNotIn(i, u) 226 227 self.assertRaises(TypeError, u.__contains__) 228 229 def test_contains_fake(self): 230 class AllEq: 231 # Sequences must use rich comparison against each item 232 # (unless "is" is true, or an earlier item answered) 233 # So instances of AllEq must be found in all non-empty sequences. 234 def __eq__(self, other): 235 return True 236 __hash__ = None # Can't meet hash invariant requirements 237 self.assertNotIn(AllEq(), self.type2test([])) 238 self.assertIn(AllEq(), self.type2test([1])) 239 240 def test_contains_order(self): 241 # Sequences must test in-order. If a rich comparison has side 242 # effects, these will be visible to tests against later members. 243 # In this test, the "side effect" is a short-circuiting raise. 244 class DoNotTestEq(Exception): 245 pass 246 class StopCompares: 247 def __eq__(self, other): 248 raise DoNotTestEq 249 250 checkfirst = self.type2test([1, StopCompares()]) 251 self.assertIn(1, checkfirst) 252 checklast = self.type2test([StopCompares(), 1]) 253 self.assertRaises(DoNotTestEq, checklast.__contains__, 1) 254 255 def test_len(self): 256 self.assertEqual(len(self.type2test()), 0) 257 self.assertEqual(len(self.type2test([])), 0) 258 self.assertEqual(len(self.type2test([0])), 1) 259 self.assertEqual(len(self.type2test([0, 1, 2])), 3) 260 261 def test_minmax(self): 262 u = self.type2test([0, 1, 2]) 263 self.assertEqual(min(u), 0) 264 self.assertEqual(max(u), 2) 265 266 def test_addmul(self): 267 u1 = self.type2test([0]) 268 u2 = self.type2test([0, 1]) 269 self.assertEqual(u1, u1 + self.type2test()) 270 self.assertEqual(u1, self.type2test() + u1) 271 self.assertEqual(u1 + self.type2test([1]), u2) 272 self.assertEqual(self.type2test([-1]) + u1, self.type2test([-1, 0])) 273 self.assertEqual(self.type2test(), u2*0) 274 self.assertEqual(self.type2test(), 0*u2) 275 self.assertEqual(self.type2test(), u2*0) 276 self.assertEqual(self.type2test(), 0*u2) 277 self.assertEqual(u2, u2*1) 278 self.assertEqual(u2, 1*u2) 279 self.assertEqual(u2, u2*1) 280 self.assertEqual(u2, 1*u2) 281 self.assertEqual(u2+u2, u2*2) 282 self.assertEqual(u2+u2, 2*u2) 283 self.assertEqual(u2+u2, u2*2) 284 self.assertEqual(u2+u2, 2*u2) 285 self.assertEqual(u2+u2+u2, u2*3) 286 self.assertEqual(u2+u2+u2, 3*u2) 287 288 class subclass(self.type2test): 289 pass 290 u3 = subclass([0, 1]) 291 self.assertEqual(u3, u3*1) 292 self.assertIsNot(u3, u3*1) 293 294 def test_iadd(self): 295 u = self.type2test([0, 1]) 296 u += self.type2test() 297 self.assertEqual(u, self.type2test([0, 1])) 298 u += self.type2test([2, 3]) 299 self.assertEqual(u, self.type2test([0, 1, 2, 3])) 300 u += self.type2test([4, 5]) 301 self.assertEqual(u, self.type2test([0, 1, 2, 3, 4, 5])) 302 303 u = self.type2test("spam") 304 u += self.type2test("eggs") 305 self.assertEqual(u, self.type2test("spameggs")) 306 307 def test_imul(self): 308 u = self.type2test([0, 1]) 309 u *= 3 310 self.assertEqual(u, self.type2test([0, 1, 0, 1, 0, 1])) 311 u *= 0 312 self.assertEqual(u, self.type2test([])) 313 314 def test_getitemoverwriteiter(self): 315 # Verify that __getitem__ overrides are not recognized by __iter__ 316 class T(self.type2test): 317 def __getitem__(self, key): 318 return str(key) + '!!!' 319 self.assertEqual(next(iter(T((1,2)))), 1) 320 321 def test_repeat(self): 322 for m in range(4): 323 s = tuple(range(m)) 324 for n in range(-3, 5): 325 self.assertEqual(self.type2test(s*n), self.type2test(s)*n) 326 self.assertEqual(self.type2test(s)*(-4), self.type2test([])) 327 self.assertEqual(id(s), id(s*1)) 328 329 def test_bigrepeat(self): 330 if sys.maxsize <= 2147483647: 331 x = self.type2test([0]) 332 x *= 2**16 333 self.assertRaises(MemoryError, x.__mul__, 2**16) 334 if hasattr(x, '__imul__'): 335 self.assertRaises(MemoryError, x.__imul__, 2**16) 336 337 def test_subscript(self): 338 a = self.type2test([10, 11]) 339 self.assertEqual(a.__getitem__(0), 10) 340 self.assertEqual(a.__getitem__(1), 11) 341 self.assertEqual(a.__getitem__(-2), 10) 342 self.assertEqual(a.__getitem__(-1), 11) 343 self.assertRaises(IndexError, a.__getitem__, -3) 344 self.assertRaises(IndexError, a.__getitem__, 3) 345 self.assertEqual(a.__getitem__(slice(0,1)), self.type2test([10])) 346 self.assertEqual(a.__getitem__(slice(1,2)), self.type2test([11])) 347 self.assertEqual(a.__getitem__(slice(0,2)), self.type2test([10, 11])) 348 self.assertEqual(a.__getitem__(slice(0,3)), self.type2test([10, 11])) 349 self.assertEqual(a.__getitem__(slice(3,5)), self.type2test([])) 350 self.assertRaises(ValueError, a.__getitem__, slice(0, 10, 0)) 351 self.assertRaises(TypeError, a.__getitem__, 'x') 352 353 def test_count(self): 354 a = self.type2test([0, 1, 2])*3 355 self.assertEqual(a.count(0), 3) 356 self.assertEqual(a.count(1), 3) 357 self.assertEqual(a.count(3), 0) 358 359 self.assertRaises(TypeError, a.count) 360 361 class BadExc(Exception): 362 pass 363 364 class BadCmp: 365 def __eq__(self, other): 366 if other == 2: 367 raise BadExc() 368 return False 369 370 self.assertRaises(BadExc, a.count, BadCmp()) 371 372 def test_index(self): 373 u = self.type2test([0, 1]) 374 self.assertEqual(u.index(0), 0) 375 self.assertEqual(u.index(1), 1) 376 self.assertRaises(ValueError, u.index, 2) 377 378 u = self.type2test([-2, -1, 0, 0, 1, 2]) 379 self.assertEqual(u.count(0), 2) 380 self.assertEqual(u.index(0), 2) 381 self.assertEqual(u.index(0, 2), 2) 382 self.assertEqual(u.index(-2, -10), 0) 383 self.assertEqual(u.index(0, 3), 3) 384 self.assertEqual(u.index(0, 3, 4), 3) 385 self.assertRaises(ValueError, u.index, 2, 0, -10) 386 387 self.assertRaises(TypeError, u.index) 388 389 class BadExc(Exception): 390 pass 391 392 class BadCmp: 393 def __eq__(self, other): 394 if other == 2: 395 raise BadExc() 396 return False 397 398 a = self.type2test([0, 1, 2, 3]) 399 self.assertRaises(BadExc, a.index, BadCmp()) 400 401 a = self.type2test([-2, -1, 0, 0, 1, 2]) 402 self.assertEqual(a.index(0), 2) 403 self.assertEqual(a.index(0, 2), 2) 404 self.assertEqual(a.index(0, -4), 2) 405 self.assertEqual(a.index(-2, -10), 0) 406 self.assertEqual(a.index(0, 3), 3) 407 self.assertEqual(a.index(0, -3), 3) 408 self.assertEqual(a.index(0, 3, 4), 3) 409 self.assertEqual(a.index(0, -3, -2), 3) 410 self.assertEqual(a.index(0, -4*sys.maxsize, 4*sys.maxsize), 2) 411 self.assertRaises(ValueError, a.index, 0, 4*sys.maxsize,-4*sys.maxsize) 412 self.assertRaises(ValueError, a.index, 2, 0, -10) 413 414 def test_pickle(self): 415 lst = self.type2test([4, 5, 6, 7]) 416 for proto in range(pickle.HIGHEST_PROTOCOL + 1): 417 lst2 = pickle.loads(pickle.dumps(lst, proto)) 418 self.assertEqual(lst2, lst) 419 self.assertNotEqual(id(lst2), id(lst)) 420 421 @unittest.skip("garbage collection different in pyro") 422 def test_free_after_iterating(self): 423 support.check_free_after_iterating(self, iter, self.type2test) 424 support.check_free_after_iterating(self, reversed, self.type2test)