python (3.11.7)

(root)/
lib/
python3.11/
test/
test_operator.py
       1  import unittest
       2  import pickle
       3  import sys
       4  
       5  from test import support
       6  from test.support import import_helper
       7  
       8  
       9  py_operator = import_helper.import_fresh_module('operator',
      10                                                  blocked=['_operator'])
      11  c_operator = import_helper.import_fresh_module('operator',
      12                                                 fresh=['_operator'])
      13  
      14  class ESC[4;38;5;81mSeq1:
      15      def __init__(self, lst):
      16          self.lst = lst
      17      def __len__(self):
      18          return len(self.lst)
      19      def __getitem__(self, i):
      20          return self.lst[i]
      21      def __add__(self, other):
      22          return self.lst + other.lst
      23      def __mul__(self, other):
      24          return self.lst * other
      25      def __rmul__(self, other):
      26          return other * self.lst
      27  
      28  class ESC[4;38;5;81mSeq2(ESC[4;38;5;149mobject):
      29      def __init__(self, lst):
      30          self.lst = lst
      31      def __len__(self):
      32          return len(self.lst)
      33      def __getitem__(self, i):
      34          return self.lst[i]
      35      def __add__(self, other):
      36          return self.lst + other.lst
      37      def __mul__(self, other):
      38          return self.lst * other
      39      def __rmul__(self, other):
      40          return other * self.lst
      41  
      42  class ESC[4;38;5;81mBadIterable:
      43      def __iter__(self):
      44          raise ZeroDivisionError
      45  
      46  
      47  class ESC[4;38;5;81mOperatorTestCase:
      48      def test___all__(self):
      49          operator = self.module
      50          actual_all = set(operator.__all__)
      51          computed_all = set()
      52          for name in vars(operator):
      53              if name.startswith('__'):
      54                  continue
      55              value = getattr(operator, name)
      56              if value.__module__ in ('operator', '_operator'):
      57                  computed_all.add(name)
      58          self.assertSetEqual(computed_all, actual_all)
      59  
      60      def test_lt(self):
      61          operator = self.module
      62          self.assertRaises(TypeError, operator.lt)
      63          self.assertRaises(TypeError, operator.lt, 1j, 2j)
      64          self.assertFalse(operator.lt(1, 0))
      65          self.assertFalse(operator.lt(1, 0.0))
      66          self.assertFalse(operator.lt(1, 1))
      67          self.assertFalse(operator.lt(1, 1.0))
      68          self.assertTrue(operator.lt(1, 2))
      69          self.assertTrue(operator.lt(1, 2.0))
      70  
      71      def test_le(self):
      72          operator = self.module
      73          self.assertRaises(TypeError, operator.le)
      74          self.assertRaises(TypeError, operator.le, 1j, 2j)
      75          self.assertFalse(operator.le(1, 0))
      76          self.assertFalse(operator.le(1, 0.0))
      77          self.assertTrue(operator.le(1, 1))
      78          self.assertTrue(operator.le(1, 1.0))
      79          self.assertTrue(operator.le(1, 2))
      80          self.assertTrue(operator.le(1, 2.0))
      81  
      82      def test_eq(self):
      83          operator = self.module
      84          class ESC[4;38;5;81mC(ESC[4;38;5;149mobject):
      85              def __eq__(self, other):
      86                  raise SyntaxError
      87          self.assertRaises(TypeError, operator.eq)
      88          self.assertRaises(SyntaxError, operator.eq, C(), C())
      89          self.assertFalse(operator.eq(1, 0))
      90          self.assertFalse(operator.eq(1, 0.0))
      91          self.assertTrue(operator.eq(1, 1))
      92          self.assertTrue(operator.eq(1, 1.0))
      93          self.assertFalse(operator.eq(1, 2))
      94          self.assertFalse(operator.eq(1, 2.0))
      95  
      96      def test_ne(self):
      97          operator = self.module
      98          class ESC[4;38;5;81mC(ESC[4;38;5;149mobject):
      99              def __ne__(self, other):
     100                  raise SyntaxError
     101          self.assertRaises(TypeError, operator.ne)
     102          self.assertRaises(SyntaxError, operator.ne, C(), C())
     103          self.assertTrue(operator.ne(1, 0))
     104          self.assertTrue(operator.ne(1, 0.0))
     105          self.assertFalse(operator.ne(1, 1))
     106          self.assertFalse(operator.ne(1, 1.0))
     107          self.assertTrue(operator.ne(1, 2))
     108          self.assertTrue(operator.ne(1, 2.0))
     109  
     110      def test_ge(self):
     111          operator = self.module
     112          self.assertRaises(TypeError, operator.ge)
     113          self.assertRaises(TypeError, operator.ge, 1j, 2j)
     114          self.assertTrue(operator.ge(1, 0))
     115          self.assertTrue(operator.ge(1, 0.0))
     116          self.assertTrue(operator.ge(1, 1))
     117          self.assertTrue(operator.ge(1, 1.0))
     118          self.assertFalse(operator.ge(1, 2))
     119          self.assertFalse(operator.ge(1, 2.0))
     120  
     121      def test_gt(self):
     122          operator = self.module
     123          self.assertRaises(TypeError, operator.gt)
     124          self.assertRaises(TypeError, operator.gt, 1j, 2j)
     125          self.assertTrue(operator.gt(1, 0))
     126          self.assertTrue(operator.gt(1, 0.0))
     127          self.assertFalse(operator.gt(1, 1))
     128          self.assertFalse(operator.gt(1, 1.0))
     129          self.assertFalse(operator.gt(1, 2))
     130          self.assertFalse(operator.gt(1, 2.0))
     131  
     132      def test_abs(self):
     133          operator = self.module
     134          self.assertRaises(TypeError, operator.abs)
     135          self.assertRaises(TypeError, operator.abs, None)
     136          self.assertEqual(operator.abs(-1), 1)
     137          self.assertEqual(operator.abs(1), 1)
     138  
     139      def test_add(self):
     140          operator = self.module
     141          self.assertRaises(TypeError, operator.add)
     142          self.assertRaises(TypeError, operator.add, None, None)
     143          self.assertEqual(operator.add(3, 4), 7)
     144  
     145      def test_bitwise_and(self):
     146          operator = self.module
     147          self.assertRaises(TypeError, operator.and_)
     148          self.assertRaises(TypeError, operator.and_, None, None)
     149          self.assertEqual(operator.and_(0xf, 0xa), 0xa)
     150  
     151      def test_concat(self):
     152          operator = self.module
     153          self.assertRaises(TypeError, operator.concat)
     154          self.assertRaises(TypeError, operator.concat, None, None)
     155          self.assertEqual(operator.concat('py', 'thon'), 'python')
     156          self.assertEqual(operator.concat([1, 2], [3, 4]), [1, 2, 3, 4])
     157          self.assertEqual(operator.concat(Seq1([5, 6]), Seq1([7])), [5, 6, 7])
     158          self.assertEqual(operator.concat(Seq2([5, 6]), Seq2([7])), [5, 6, 7])
     159          self.assertRaises(TypeError, operator.concat, 13, 29)
     160  
     161      def test_countOf(self):
     162          operator = self.module
     163          self.assertRaises(TypeError, operator.countOf)
     164          self.assertRaises(TypeError, operator.countOf, None, None)
     165          self.assertRaises(ZeroDivisionError, operator.countOf, BadIterable(), 1)
     166          self.assertEqual(operator.countOf([1, 2, 1, 3, 1, 4], 3), 1)
     167          self.assertEqual(operator.countOf([1, 2, 1, 3, 1, 4], 5), 0)
     168          # is but not ==
     169          nan = float("nan")
     170          self.assertEqual(operator.countOf([nan, nan, 21], nan), 2)
     171          # == but not is
     172          self.assertEqual(operator.countOf([{}, 1, {}, 2], {}), 2)
     173  
     174      def test_delitem(self):
     175          operator = self.module
     176          a = [4, 3, 2, 1]
     177          self.assertRaises(TypeError, operator.delitem, a)
     178          self.assertRaises(TypeError, operator.delitem, a, None)
     179          self.assertIsNone(operator.delitem(a, 1))
     180          self.assertEqual(a, [4, 2, 1])
     181  
     182      def test_floordiv(self):
     183          operator = self.module
     184          self.assertRaises(TypeError, operator.floordiv, 5)
     185          self.assertRaises(TypeError, operator.floordiv, None, None)
     186          self.assertEqual(operator.floordiv(5, 2), 2)
     187  
     188      def test_truediv(self):
     189          operator = self.module
     190          self.assertRaises(TypeError, operator.truediv, 5)
     191          self.assertRaises(TypeError, operator.truediv, None, None)
     192          self.assertEqual(operator.truediv(5, 2), 2.5)
     193  
     194      def test_getitem(self):
     195          operator = self.module
     196          a = range(10)
     197          self.assertRaises(TypeError, operator.getitem)
     198          self.assertRaises(TypeError, operator.getitem, a, None)
     199          self.assertEqual(operator.getitem(a, 2), 2)
     200  
     201      def test_indexOf(self):
     202          operator = self.module
     203          self.assertRaises(TypeError, operator.indexOf)
     204          self.assertRaises(TypeError, operator.indexOf, None, None)
     205          self.assertRaises(ZeroDivisionError, operator.indexOf, BadIterable(), 1)
     206          self.assertEqual(operator.indexOf([4, 3, 2, 1], 3), 1)
     207          self.assertRaises(ValueError, operator.indexOf, [4, 3, 2, 1], 0)
     208          nan = float("nan")
     209          self.assertEqual(operator.indexOf([nan, nan, 21], nan), 0)
     210          self.assertEqual(operator.indexOf([{}, 1, {}, 2], {}), 0)
     211          it = iter('leave the iterator at exactly the position after the match')
     212          self.assertEqual(operator.indexOf(it, 'a'), 2)
     213          self.assertEqual(next(it), 'v')
     214  
     215      def test_invert(self):
     216          operator = self.module
     217          self.assertRaises(TypeError, operator.invert)
     218          self.assertRaises(TypeError, operator.invert, None)
     219          self.assertEqual(operator.inv(4), -5)
     220  
     221      def test_lshift(self):
     222          operator = self.module
     223          self.assertRaises(TypeError, operator.lshift)
     224          self.assertRaises(TypeError, operator.lshift, None, 42)
     225          self.assertEqual(operator.lshift(5, 1), 10)
     226          self.assertEqual(operator.lshift(5, 0), 5)
     227          self.assertRaises(ValueError, operator.lshift, 2, -1)
     228  
     229      def test_mod(self):
     230          operator = self.module
     231          self.assertRaises(TypeError, operator.mod)
     232          self.assertRaises(TypeError, operator.mod, None, 42)
     233          self.assertEqual(operator.mod(5, 2), 1)
     234  
     235      def test_mul(self):
     236          operator = self.module
     237          self.assertRaises(TypeError, operator.mul)
     238          self.assertRaises(TypeError, operator.mul, None, None)
     239          self.assertEqual(operator.mul(5, 2), 10)
     240  
     241      def test_matmul(self):
     242          operator = self.module
     243          self.assertRaises(TypeError, operator.matmul)
     244          self.assertRaises(TypeError, operator.matmul, 42, 42)
     245          class ESC[4;38;5;81mM:
     246              def __matmul__(self, other):
     247                  return other - 1
     248          self.assertEqual(M() @ 42, 41)
     249  
     250      def test_neg(self):
     251          operator = self.module
     252          self.assertRaises(TypeError, operator.neg)
     253          self.assertRaises(TypeError, operator.neg, None)
     254          self.assertEqual(operator.neg(5), -5)
     255          self.assertEqual(operator.neg(-5), 5)
     256          self.assertEqual(operator.neg(0), 0)
     257          self.assertEqual(operator.neg(-0), 0)
     258  
     259      def test_bitwise_or(self):
     260          operator = self.module
     261          self.assertRaises(TypeError, operator.or_)
     262          self.assertRaises(TypeError, operator.or_, None, None)
     263          self.assertEqual(operator.or_(0xa, 0x5), 0xf)
     264  
     265      def test_pos(self):
     266          operator = self.module
     267          self.assertRaises(TypeError, operator.pos)
     268          self.assertRaises(TypeError, operator.pos, None)
     269          self.assertEqual(operator.pos(5), 5)
     270          self.assertEqual(operator.pos(-5), -5)
     271          self.assertEqual(operator.pos(0), 0)
     272          self.assertEqual(operator.pos(-0), 0)
     273  
     274      def test_pow(self):
     275          operator = self.module
     276          self.assertRaises(TypeError, operator.pow)
     277          self.assertRaises(TypeError, operator.pow, None, None)
     278          self.assertEqual(operator.pow(3,5), 3**5)
     279          self.assertRaises(TypeError, operator.pow, 1)
     280          self.assertRaises(TypeError, operator.pow, 1, 2, 3)
     281  
     282      def test_rshift(self):
     283          operator = self.module
     284          self.assertRaises(TypeError, operator.rshift)
     285          self.assertRaises(TypeError, operator.rshift, None, 42)
     286          self.assertEqual(operator.rshift(5, 1), 2)
     287          self.assertEqual(operator.rshift(5, 0), 5)
     288          self.assertRaises(ValueError, operator.rshift, 2, -1)
     289  
     290      def test_contains(self):
     291          operator = self.module
     292          self.assertRaises(TypeError, operator.contains)
     293          self.assertRaises(TypeError, operator.contains, None, None)
     294          self.assertRaises(ZeroDivisionError, operator.contains, BadIterable(), 1)
     295          self.assertTrue(operator.contains(range(4), 2))
     296          self.assertFalse(operator.contains(range(4), 5))
     297  
     298      def test_setitem(self):
     299          operator = self.module
     300          a = list(range(3))
     301          self.assertRaises(TypeError, operator.setitem, a)
     302          self.assertRaises(TypeError, operator.setitem, a, None, None)
     303          self.assertIsNone(operator.setitem(a, 0, 2))
     304          self.assertEqual(a, [2, 1, 2])
     305          self.assertRaises(IndexError, operator.setitem, a, 4, 2)
     306  
     307      def test_sub(self):
     308          operator = self.module
     309          self.assertRaises(TypeError, operator.sub)
     310          self.assertRaises(TypeError, operator.sub, None, None)
     311          self.assertEqual(operator.sub(5, 2), 3)
     312  
     313      def test_truth(self):
     314          operator = self.module
     315          class ESC[4;38;5;81mC(ESC[4;38;5;149mobject):
     316              def __bool__(self):
     317                  raise SyntaxError
     318          self.assertRaises(TypeError, operator.truth)
     319          self.assertRaises(SyntaxError, operator.truth, C())
     320          self.assertTrue(operator.truth(5))
     321          self.assertTrue(operator.truth([0]))
     322          self.assertFalse(operator.truth(0))
     323          self.assertFalse(operator.truth([]))
     324  
     325      def test_bitwise_xor(self):
     326          operator = self.module
     327          self.assertRaises(TypeError, operator.xor)
     328          self.assertRaises(TypeError, operator.xor, None, None)
     329          self.assertEqual(operator.xor(0xb, 0xc), 0x7)
     330  
     331      def test_is(self):
     332          operator = self.module
     333          a = b = 'xyzpdq'
     334          c = a[:3] + b[3:]
     335          self.assertRaises(TypeError, operator.is_)
     336          self.assertTrue(operator.is_(a, b))
     337          self.assertFalse(operator.is_(a,c))
     338  
     339      def test_is_not(self):
     340          operator = self.module
     341          a = b = 'xyzpdq'
     342          c = a[:3] + b[3:]
     343          self.assertRaises(TypeError, operator.is_not)
     344          self.assertFalse(operator.is_not(a, b))
     345          self.assertTrue(operator.is_not(a,c))
     346  
     347      def test_attrgetter(self):
     348          operator = self.module
     349          class ESC[4;38;5;81mA:
     350              pass
     351          a = A()
     352          a.name = 'arthur'
     353          f = operator.attrgetter('name')
     354          self.assertEqual(f(a), 'arthur')
     355          self.assertRaises(TypeError, f)
     356          self.assertRaises(TypeError, f, a, 'dent')
     357          self.assertRaises(TypeError, f, a, surname='dent')
     358          f = operator.attrgetter('rank')
     359          self.assertRaises(AttributeError, f, a)
     360          self.assertRaises(TypeError, operator.attrgetter, 2)
     361          self.assertRaises(TypeError, operator.attrgetter)
     362  
     363          # multiple gets
     364          record = A()
     365          record.x = 'X'
     366          record.y = 'Y'
     367          record.z = 'Z'
     368          self.assertEqual(operator.attrgetter('x','z','y')(record), ('X', 'Z', 'Y'))
     369          self.assertRaises(TypeError, operator.attrgetter, ('x', (), 'y'))
     370  
     371          class ESC[4;38;5;81mC(ESC[4;38;5;149mobject):
     372              def __getattr__(self, name):
     373                  raise SyntaxError
     374          self.assertRaises(SyntaxError, operator.attrgetter('foo'), C())
     375  
     376          # recursive gets
     377          a = A()
     378          a.name = 'arthur'
     379          a.child = A()
     380          a.child.name = 'thomas'
     381          f = operator.attrgetter('child.name')
     382          self.assertEqual(f(a), 'thomas')
     383          self.assertRaises(AttributeError, f, a.child)
     384          f = operator.attrgetter('name', 'child.name')
     385          self.assertEqual(f(a), ('arthur', 'thomas'))
     386          f = operator.attrgetter('name', 'child.name', 'child.child.name')
     387          self.assertRaises(AttributeError, f, a)
     388          f = operator.attrgetter('child.')
     389          self.assertRaises(AttributeError, f, a)
     390          f = operator.attrgetter('.child')
     391          self.assertRaises(AttributeError, f, a)
     392  
     393          a.child.child = A()
     394          a.child.child.name = 'johnson'
     395          f = operator.attrgetter('child.child.name')
     396          self.assertEqual(f(a), 'johnson')
     397          f = operator.attrgetter('name', 'child.name', 'child.child.name')
     398          self.assertEqual(f(a), ('arthur', 'thomas', 'johnson'))
     399  
     400      def test_itemgetter(self):
     401          operator = self.module
     402          a = 'ABCDE'
     403          f = operator.itemgetter(2)
     404          self.assertEqual(f(a), 'C')
     405          self.assertRaises(TypeError, f)
     406          self.assertRaises(TypeError, f, a, 3)
     407          self.assertRaises(TypeError, f, a, size=3)
     408          f = operator.itemgetter(10)
     409          self.assertRaises(IndexError, f, a)
     410  
     411          class ESC[4;38;5;81mC(ESC[4;38;5;149mobject):
     412              def __getitem__(self, name):
     413                  raise SyntaxError
     414          self.assertRaises(SyntaxError, operator.itemgetter(42), C())
     415  
     416          f = operator.itemgetter('name')
     417          self.assertRaises(TypeError, f, a)
     418          self.assertRaises(TypeError, operator.itemgetter)
     419  
     420          d = dict(key='val')
     421          f = operator.itemgetter('key')
     422          self.assertEqual(f(d), 'val')
     423          f = operator.itemgetter('nonkey')
     424          self.assertRaises(KeyError, f, d)
     425  
     426          # example used in the docs
     427          inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
     428          getcount = operator.itemgetter(1)
     429          self.assertEqual(list(map(getcount, inventory)), [3, 2, 5, 1])
     430          self.assertEqual(sorted(inventory, key=getcount),
     431              [('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)])
     432  
     433          # multiple gets
     434          data = list(map(str, range(20)))
     435          self.assertEqual(operator.itemgetter(2,10,5)(data), ('2', '10', '5'))
     436          self.assertRaises(TypeError, operator.itemgetter(2, 'x', 5), data)
     437  
     438          # interesting indices
     439          t = tuple('abcde')
     440          self.assertEqual(operator.itemgetter(-1)(t), 'e')
     441          self.assertEqual(operator.itemgetter(slice(2, 4))(t), ('c', 'd'))
     442  
     443          # interesting sequences
     444          class ESC[4;38;5;81mT(ESC[4;38;5;149mtuple):
     445              'Tuple subclass'
     446              pass
     447          self.assertEqual(operator.itemgetter(0)(T('abc')), 'a')
     448          self.assertEqual(operator.itemgetter(0)(['a', 'b', 'c']), 'a')
     449          self.assertEqual(operator.itemgetter(0)(range(100, 200)), 100)
     450  
     451      def test_methodcaller(self):
     452          operator = self.module
     453          self.assertRaises(TypeError, operator.methodcaller)
     454          self.assertRaises(TypeError, operator.methodcaller, 12)
     455          class ESC[4;38;5;81mA:
     456              def foo(self, *args, **kwds):
     457                  return args[0] + args[1]
     458              def bar(self, f=42):
     459                  return f
     460              def baz(*args, **kwds):
     461                  return kwds['name'], kwds['self']
     462          a = A()
     463          f = operator.methodcaller('foo')
     464          self.assertRaises(IndexError, f, a)
     465          f = operator.methodcaller('foo', 1, 2)
     466          self.assertEqual(f(a), 3)
     467          self.assertRaises(TypeError, f)
     468          self.assertRaises(TypeError, f, a, 3)
     469          self.assertRaises(TypeError, f, a, spam=3)
     470          f = operator.methodcaller('bar')
     471          self.assertEqual(f(a), 42)
     472          self.assertRaises(TypeError, f, a, a)
     473          f = operator.methodcaller('bar', f=5)
     474          self.assertEqual(f(a), 5)
     475          f = operator.methodcaller('baz', name='spam', self='eggs')
     476          self.assertEqual(f(a), ('spam', 'eggs'))
     477  
     478      def test_inplace(self):
     479          operator = self.module
     480          class ESC[4;38;5;81mC(ESC[4;38;5;149mobject):
     481              def __iadd__     (self, other): return "iadd"
     482              def __iand__     (self, other): return "iand"
     483              def __ifloordiv__(self, other): return "ifloordiv"
     484              def __ilshift__  (self, other): return "ilshift"
     485              def __imod__     (self, other): return "imod"
     486              def __imul__     (self, other): return "imul"
     487              def __imatmul__  (self, other): return "imatmul"
     488              def __ior__      (self, other): return "ior"
     489              def __ipow__     (self, other): return "ipow"
     490              def __irshift__  (self, other): return "irshift"
     491              def __isub__     (self, other): return "isub"
     492              def __itruediv__ (self, other): return "itruediv"
     493              def __ixor__     (self, other): return "ixor"
     494              def __getitem__(self, other): return 5  # so that C is a sequence
     495          c = C()
     496          self.assertEqual(operator.iadd     (c, 5), "iadd")
     497          self.assertEqual(operator.iand     (c, 5), "iand")
     498          self.assertEqual(operator.ifloordiv(c, 5), "ifloordiv")
     499          self.assertEqual(operator.ilshift  (c, 5), "ilshift")
     500          self.assertEqual(operator.imod     (c, 5), "imod")
     501          self.assertEqual(operator.imul     (c, 5), "imul")
     502          self.assertEqual(operator.imatmul  (c, 5), "imatmul")
     503          self.assertEqual(operator.ior      (c, 5), "ior")
     504          self.assertEqual(operator.ipow     (c, 5), "ipow")
     505          self.assertEqual(operator.irshift  (c, 5), "irshift")
     506          self.assertEqual(operator.isub     (c, 5), "isub")
     507          self.assertEqual(operator.itruediv (c, 5), "itruediv")
     508          self.assertEqual(operator.ixor     (c, 5), "ixor")
     509          self.assertEqual(operator.iconcat  (c, c), "iadd")
     510  
     511      def test_length_hint(self):
     512          operator = self.module
     513          class ESC[4;38;5;81mX(ESC[4;38;5;149mobject):
     514              def __init__(self, value):
     515                  self.value = value
     516  
     517              def __length_hint__(self):
     518                  if type(self.value) is type:
     519                      raise self.value
     520                  else:
     521                      return self.value
     522  
     523          self.assertEqual(operator.length_hint([], 2), 0)
     524          self.assertEqual(operator.length_hint(iter([1, 2, 3])), 3)
     525  
     526          self.assertEqual(operator.length_hint(X(2)), 2)
     527          self.assertEqual(operator.length_hint(X(NotImplemented), 4), 4)
     528          self.assertEqual(operator.length_hint(X(TypeError), 12), 12)
     529          with self.assertRaises(TypeError):
     530              operator.length_hint(X("abc"))
     531          with self.assertRaises(ValueError):
     532              operator.length_hint(X(-2))
     533          with self.assertRaises(LookupError):
     534              operator.length_hint(X(LookupError))
     535  
     536      def test_call(self):
     537          operator = self.module
     538  
     539          def func(*args, **kwargs): return args, kwargs
     540  
     541          self.assertEqual(operator.call(func), ((), {}))
     542          self.assertEqual(operator.call(func, 0, 1), ((0, 1), {}))
     543          self.assertEqual(operator.call(func, a=2, obj=3),
     544                           ((), {"a": 2, "obj": 3}))
     545          self.assertEqual(operator.call(func, 0, 1, a=2, obj=3),
     546                           ((0, 1), {"a": 2, "obj": 3}))
     547  
     548      def test_dunder_is_original(self):
     549          operator = self.module
     550  
     551          names = [name for name in dir(operator) if not name.startswith('_')]
     552          for name in names:
     553              orig = getattr(operator, name)
     554              dunder = getattr(operator, '__' + name.strip('_') + '__', None)
     555              if dunder:
     556                  self.assertIs(dunder, orig)
     557  
     558  class ESC[4;38;5;81mPyOperatorTestCase(ESC[4;38;5;149mOperatorTestCase, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     559      module = py_operator
     560  
     561  @unittest.skipUnless(c_operator, 'requires _operator')
     562  class ESC[4;38;5;81mCOperatorTestCase(ESC[4;38;5;149mOperatorTestCase, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     563      module = c_operator
     564  
     565  
     566  class ESC[4;38;5;81mOperatorPickleTestCase:
     567      def copy(self, obj, proto):
     568          with support.swap_item(sys.modules, 'operator', self.module):
     569              pickled = pickle.dumps(obj, proto)
     570          with support.swap_item(sys.modules, 'operator', self.module2):
     571              return pickle.loads(pickled)
     572  
     573      def test_attrgetter(self):
     574          attrgetter = self.module.attrgetter
     575          class ESC[4;38;5;81mA:
     576              pass
     577          a = A()
     578          a.x = 'X'
     579          a.y = 'Y'
     580          a.z = 'Z'
     581          a.t = A()
     582          a.t.u = A()
     583          a.t.u.v = 'V'
     584          for proto in range(pickle.HIGHEST_PROTOCOL + 1):
     585              with self.subTest(proto=proto):
     586                  f = attrgetter('x')
     587                  f2 = self.copy(f, proto)
     588                  self.assertEqual(repr(f2), repr(f))
     589                  self.assertEqual(f2(a), f(a))
     590                  # multiple gets
     591                  f = attrgetter('x', 'y', 'z')
     592                  f2 = self.copy(f, proto)
     593                  self.assertEqual(repr(f2), repr(f))
     594                  self.assertEqual(f2(a), f(a))
     595                  # recursive gets
     596                  f = attrgetter('t.u.v')
     597                  f2 = self.copy(f, proto)
     598                  self.assertEqual(repr(f2), repr(f))
     599                  self.assertEqual(f2(a), f(a))
     600  
     601      def test_itemgetter(self):
     602          itemgetter = self.module.itemgetter
     603          a = 'ABCDE'
     604          for proto in range(pickle.HIGHEST_PROTOCOL + 1):
     605              with self.subTest(proto=proto):
     606                  f = itemgetter(2)
     607                  f2 = self.copy(f, proto)
     608                  self.assertEqual(repr(f2), repr(f))
     609                  self.assertEqual(f2(a), f(a))
     610                  # multiple gets
     611                  f = itemgetter(2, 0, 4)
     612                  f2 = self.copy(f, proto)
     613                  self.assertEqual(repr(f2), repr(f))
     614                  self.assertEqual(f2(a), f(a))
     615  
     616      def test_methodcaller(self):
     617          methodcaller = self.module.methodcaller
     618          class ESC[4;38;5;81mA:
     619              def foo(self, *args, **kwds):
     620                  return args[0] + args[1]
     621              def bar(self, f=42):
     622                  return f
     623              def baz(*args, **kwds):
     624                  return kwds['name'], kwds['self']
     625          a = A()
     626          for proto in range(pickle.HIGHEST_PROTOCOL + 1):
     627              with self.subTest(proto=proto):
     628                  f = methodcaller('bar')
     629                  f2 = self.copy(f, proto)
     630                  self.assertEqual(repr(f2), repr(f))
     631                  self.assertEqual(f2(a), f(a))
     632                  # positional args
     633                  f = methodcaller('foo', 1, 2)
     634                  f2 = self.copy(f, proto)
     635                  self.assertEqual(repr(f2), repr(f))
     636                  self.assertEqual(f2(a), f(a))
     637                  # keyword args
     638                  f = methodcaller('bar', f=5)
     639                  f2 = self.copy(f, proto)
     640                  self.assertEqual(repr(f2), repr(f))
     641                  self.assertEqual(f2(a), f(a))
     642                  f = methodcaller('baz', self='eggs', name='spam')
     643                  f2 = self.copy(f, proto)
     644                  # Can't test repr consistently with multiple keyword args
     645                  self.assertEqual(f2(a), f(a))
     646  
     647  class ESC[4;38;5;81mPyPyOperatorPickleTestCase(ESC[4;38;5;149mOperatorPickleTestCase, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     648      module = py_operator
     649      module2 = py_operator
     650  
     651  @unittest.skipUnless(c_operator, 'requires _operator')
     652  class ESC[4;38;5;81mPyCOperatorPickleTestCase(ESC[4;38;5;149mOperatorPickleTestCase, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     653      module = py_operator
     654      module2 = c_operator
     655  
     656  @unittest.skipUnless(c_operator, 'requires _operator')
     657  class ESC[4;38;5;81mCPyOperatorPickleTestCase(ESC[4;38;5;149mOperatorPickleTestCase, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     658      module = c_operator
     659      module2 = py_operator
     660  
     661  @unittest.skipUnless(c_operator, 'requires _operator')
     662  class ESC[4;38;5;81mCCOperatorPickleTestCase(ESC[4;38;5;149mOperatorPickleTestCase, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     663      module = c_operator
     664      module2 = c_operator
     665  
     666  
     667  if __name__ == "__main__":
     668      unittest.main()