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