|
1 | 1 | import unittest |
| 2 | +import pickle |
| 3 | +import sys |
2 | 4 |
|
3 | 5 | from test import support |
4 | 6 |
|
@@ -35,6 +37,9 @@ def __rmul__(self, other): |
35 | 37 |
|
36 | 38 |
|
37 | 39 | class OperatorTestCase: |
| 40 | + def setUp(self): |
| 41 | + sys.modules['operator'] = self.module |
| 42 | + |
38 | 43 | def test_lt(self): |
39 | 44 | operator = self.module |
40 | 45 | self.assertRaises(TypeError, operator.lt) |
@@ -396,6 +401,7 @@ def __getitem__(self, name): |
396 | 401 | def test_methodcaller(self): |
397 | 402 | operator = self.module |
398 | 403 | self.assertRaises(TypeError, operator.methodcaller) |
| 404 | + self.assertRaises(TypeError, operator.methodcaller, 12) |
399 | 405 | class A: |
400 | 406 | def foo(self, *args, **kwds): |
401 | 407 | return args[0] + args[1] |
@@ -491,5 +497,108 @@ class PyOperatorTestCase(OperatorTestCase, unittest.TestCase): |
491 | 497 | class COperatorTestCase(OperatorTestCase, unittest.TestCase): |
492 | 498 | module = c_operator |
493 | 499 |
|
| 500 | + |
| 501 | +class OperatorPickleTestCase: |
| 502 | + def copy(self, obj, proto): |
| 503 | + with support.swap_item(sys.modules, 'operator', self.module): |
| 504 | + pickled = pickle.dumps(obj, proto) |
| 505 | + with support.swap_item(sys.modules, 'operator', self.module2): |
| 506 | + return pickle.loads(pickled) |
| 507 | + |
| 508 | + def test_attrgetter(self): |
| 509 | + attrgetter = self.module.attrgetter |
| 510 | + attrgetter = self.module.attrgetter |
| 511 | + class A: |
| 512 | + pass |
| 513 | + a = A() |
| 514 | + a.x = 'X' |
| 515 | + a.y = 'Y' |
| 516 | + a.z = 'Z' |
| 517 | + a.t = A() |
| 518 | + a.t.u = A() |
| 519 | + a.t.u.v = 'V' |
| 520 | + for proto in range(pickle.HIGHEST_PROTOCOL + 1): |
| 521 | + with self.subTest(proto=proto): |
| 522 | + f = attrgetter('x') |
| 523 | + f2 = self.copy(f, proto) |
| 524 | + self.assertEqual(repr(f2), repr(f)) |
| 525 | + self.assertEqual(f2(a), f(a)) |
| 526 | + # multiple gets |
| 527 | + f = attrgetter('x', 'y', 'z') |
| 528 | + f2 = self.copy(f, proto) |
| 529 | + self.assertEqual(repr(f2), repr(f)) |
| 530 | + self.assertEqual(f2(a), f(a)) |
| 531 | + # recursive gets |
| 532 | + f = attrgetter('t.u.v') |
| 533 | + f2 = self.copy(f, proto) |
| 534 | + self.assertEqual(repr(f2), repr(f)) |
| 535 | + self.assertEqual(f2(a), f(a)) |
| 536 | + |
| 537 | + def test_itemgetter(self): |
| 538 | + itemgetter = self.module.itemgetter |
| 539 | + a = 'ABCDE' |
| 540 | + for proto in range(pickle.HIGHEST_PROTOCOL + 1): |
| 541 | + with self.subTest(proto=proto): |
| 542 | + f = itemgetter(2) |
| 543 | + f2 = self.copy(f, proto) |
| 544 | + self.assertEqual(repr(f2), repr(f)) |
| 545 | + self.assertEqual(f2(a), f(a)) |
| 546 | + # multiple gets |
| 547 | + f = itemgetter(2, 0, 4) |
| 548 | + f2 = self.copy(f, proto) |
| 549 | + self.assertEqual(repr(f2), repr(f)) |
| 550 | + self.assertEqual(f2(a), f(a)) |
| 551 | + |
| 552 | + def test_methodcaller(self): |
| 553 | + methodcaller = self.module.methodcaller |
| 554 | + class A: |
| 555 | + def foo(self, *args, **kwds): |
| 556 | + return args[0] + args[1] |
| 557 | + def bar(self, f=42): |
| 558 | + return f |
| 559 | + def baz(*args, **kwds): |
| 560 | + return kwds['name'], kwds['self'] |
| 561 | + a = A() |
| 562 | + for proto in range(pickle.HIGHEST_PROTOCOL + 1): |
| 563 | + with self.subTest(proto=proto): |
| 564 | + f = methodcaller('bar') |
| 565 | + f2 = self.copy(f, proto) |
| 566 | + self.assertEqual(repr(f2), repr(f)) |
| 567 | + self.assertEqual(f2(a), f(a)) |
| 568 | + # positional args |
| 569 | + f = methodcaller('foo', 1, 2) |
| 570 | + f2 = self.copy(f, proto) |
| 571 | + self.assertEqual(repr(f2), repr(f)) |
| 572 | + self.assertEqual(f2(a), f(a)) |
| 573 | + # keyword args |
| 574 | + f = methodcaller('bar', f=5) |
| 575 | + f2 = self.copy(f, proto) |
| 576 | + self.assertEqual(repr(f2), repr(f)) |
| 577 | + self.assertEqual(f2(a), f(a)) |
| 578 | + f = methodcaller('baz', self='eggs', name='spam') |
| 579 | + f2 = self.copy(f, proto) |
| 580 | + # Can't test repr consistently with multiple keyword args |
| 581 | + self.assertEqual(f2(a), f(a)) |
| 582 | + |
| 583 | +class PyPyOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase): |
| 584 | + module = py_operator |
| 585 | + module2 = py_operator |
| 586 | + |
| 587 | +@unittest.skipUnless(c_operator, 'requires _operator') |
| 588 | +class PyCOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase): |
| 589 | + module = py_operator |
| 590 | + module2 = c_operator |
| 591 | + |
| 592 | +@unittest.skipUnless(c_operator, 'requires _operator') |
| 593 | +class CPyOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase): |
| 594 | + module = c_operator |
| 595 | + module2 = py_operator |
| 596 | + |
| 597 | +@unittest.skipUnless(c_operator, 'requires _operator') |
| 598 | +class CCOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase): |
| 599 | + module = c_operator |
| 600 | + module2 = c_operator |
| 601 | + |
| 602 | + |
494 | 603 | if __name__ == "__main__": |
495 | 604 | unittest.main() |
0 commit comments