|
1 | 1 | """Unit tests for zero-argument super() & related machinery.""" |
2 | 2 |
|
| 3 | +import copy |
| 4 | +import pickle |
3 | 5 | import textwrap |
4 | 6 | import threading |
5 | 7 | import unittest |
@@ -539,6 +541,74 @@ def work(): |
539 | 541 | for thread in threads: |
540 | 542 | thread.join() |
541 | 543 |
|
| 544 | + def test_special_methods(self): |
| 545 | + for e in E(), E: |
| 546 | + s = super(C, e) |
| 547 | + self.assertEqual(s.__reduce__, e.__reduce__) |
| 548 | + self.assertEqual(s.__reduce_ex__, e.__reduce_ex__) |
| 549 | + self.assertEqual(s.__getstate__, e.__getstate__) |
| 550 | + self.assertFalse(hasattr(s, '__getnewargs__')) |
| 551 | + self.assertFalse(hasattr(s, '__getnewargs_ex__')) |
| 552 | + self.assertFalse(hasattr(s, '__setstate__')) |
| 553 | + self.assertFalse(hasattr(s, '__copy__')) |
| 554 | + self.assertFalse(hasattr(s, '__deepcopy__')) |
| 555 | + |
| 556 | + def test_pickling(self): |
| 557 | + e = E() |
| 558 | + e.x = 1 |
| 559 | + s = super(C, e) |
| 560 | + for proto in range(pickle.HIGHEST_PROTOCOL + 1): |
| 561 | + with self.subTest(proto=proto): |
| 562 | + u = pickle.loads(pickle.dumps(s, proto)) |
| 563 | + self.assertEqual(u.f(), s.f()) |
| 564 | + self.assertIs(type(u), type(s)) |
| 565 | + self.assertIs(type(u.__self__), E) |
| 566 | + self.assertEqual(u.__self__.x, 1) |
| 567 | + self.assertIs(u.__thisclass__, C) |
| 568 | + self.assertIs(u.__self_class__, E) |
| 569 | + |
| 570 | + s = super(C, E) |
| 571 | + for proto in range(pickle.HIGHEST_PROTOCOL + 1): |
| 572 | + with self.subTest(proto=proto): |
| 573 | + u = pickle.loads(pickle.dumps(s, proto)) |
| 574 | + self.assertEqual(u.cm(), s.cm()) |
| 575 | + self.assertEqual(u.f, s.f) |
| 576 | + self.assertIs(type(u), type(s)) |
| 577 | + self.assertIs(u.__self__, E) |
| 578 | + self.assertIs(u.__thisclass__, C) |
| 579 | + self.assertIs(u.__self_class__, E) |
| 580 | + |
| 581 | + def test_shallow_copying(self): |
| 582 | + s = super(C, E()) |
| 583 | + self.assertIs(copy.copy(s), s) |
| 584 | + s = super(C, E) |
| 585 | + self.assertIs(copy.copy(s), s) |
| 586 | + |
| 587 | + def test_deep_copying(self): |
| 588 | + e = E() |
| 589 | + e.x = [1] |
| 590 | + s = super(C, e) |
| 591 | + u = copy.deepcopy(s) |
| 592 | + self.assertEqual(u.f(), s.f()) |
| 593 | + self.assertIs(type(u), type(s)) |
| 594 | + self.assertIsNot(u, s) |
| 595 | + self.assertIs(type(u.__self__), E) |
| 596 | + self.assertIsNot(u.__self__, e) |
| 597 | + self.assertIsNot(u.__self__.x, e.x) |
| 598 | + self.assertEqual(u.__self__.x, [1]) |
| 599 | + self.assertIs(u.__thisclass__, C) |
| 600 | + self.assertIs(u.__self_class__, E) |
| 601 | + |
| 602 | + s = super(C, E) |
| 603 | + u = copy.deepcopy(s) |
| 604 | + self.assertEqual(u.cm(), s.cm()) |
| 605 | + self.assertEqual(u.f, s.f) |
| 606 | + self.assertIsNot(u, s) |
| 607 | + self.assertIs(type(u), type(s)) |
| 608 | + self.assertIs(u.__self__, E) |
| 609 | + self.assertIs(u.__thisclass__, C) |
| 610 | + self.assertIs(u.__self_class__, E) |
| 611 | + |
542 | 612 |
|
543 | 613 | if __name__ == "__main__": |
544 | 614 | unittest.main() |
0 commit comments