| 2654 | |
| 2655 | @unittest.expectedFailure # TODO: RUSTPYTHON |
| 2656 | def test_supers(self): |
| 2657 | # Testing super... |
| 2658 | |
| 2659 | class A(object): |
| 2660 | def meth(self, a): |
| 2661 | return "A(%r)" % a |
| 2662 | |
| 2663 | self.assertEqual(A().meth(1), "A(1)") |
| 2664 | |
| 2665 | class B(A): |
| 2666 | def __init__(self): |
| 2667 | self.__super = super(B, self) |
| 2668 | def meth(self, a): |
| 2669 | return "B(%r)" % a + self.__super.meth(a) |
| 2670 | |
| 2671 | self.assertEqual(B().meth(2), "B(2)A(2)") |
| 2672 | |
| 2673 | class C(A): |
| 2674 | def meth(self, a): |
| 2675 | return "C(%r)" % a + self.__super.meth(a) |
| 2676 | C._C__super = super(C) |
| 2677 | |
| 2678 | self.assertEqual(C().meth(3), "C(3)A(3)") |
| 2679 | |
| 2680 | class D(C, B): |
| 2681 | def meth(self, a): |
| 2682 | return "D(%r)" % a + super(D, self).meth(a) |
| 2683 | |
| 2684 | self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)") |
| 2685 | |
| 2686 | # Test for subclassing super |
| 2687 | |
| 2688 | class mysuper(super): |
| 2689 | def __init__(self, *args): |
| 2690 | return super(mysuper, self).__init__(*args) |
| 2691 | |
| 2692 | class E(D): |
| 2693 | def meth(self, a): |
| 2694 | return "E(%r)" % a + mysuper(E, self).meth(a) |
| 2695 | |
| 2696 | self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)") |
| 2697 | |
| 2698 | class F(E): |
| 2699 | def meth(self, a): |
| 2700 | s = self.__super # == mysuper(F, self) |
| 2701 | return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a) |
| 2702 | F._F__super = mysuper(F) |
| 2703 | |
| 2704 | self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)") |
| 2705 | |
| 2706 | # Make sure certain errors are raised |
| 2707 | |
| 2708 | try: |
| 2709 | super(D, 42) |
| 2710 | except TypeError: |
| 2711 | pass |
| 2712 | else: |
| 2713 | self.fail("shouldn't allow super(D, 42)") |