| 2748 | dir(C()) # This used to segfault |
| 2749 | |
| 2750 | def test_supers(self): |
| 2751 | # Testing super... |
| 2752 | |
| 2753 | class A(object): |
| 2754 | def meth(self, a): |
| 2755 | return "A(%r)" % a |
| 2756 | |
| 2757 | self.assertEqual(A().meth(1), "A(1)") |
| 2758 | |
| 2759 | class B(A): |
| 2760 | def __init__(self): |
| 2761 | self.__super = super(B, self) |
| 2762 | def meth(self, a): |
| 2763 | return "B(%r)" % a + self.__super.meth(a) |
| 2764 | |
| 2765 | self.assertEqual(B().meth(2), "B(2)A(2)") |
| 2766 | |
| 2767 | class C(A): |
| 2768 | def meth(self, a): |
| 2769 | return "C(%r)" % a + self.__super.meth(a) |
| 2770 | C._C__super = super(C) |
| 2771 | |
| 2772 | self.assertEqual(C().meth(3), "C(3)A(3)") |
| 2773 | |
| 2774 | class D(C, B): |
| 2775 | def meth(self, a): |
| 2776 | return "D(%r)" % a + super(D, self).meth(a) |
| 2777 | |
| 2778 | self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)") |
| 2779 | |
| 2780 | # Test for subclassing super |
| 2781 | |
| 2782 | class mysuper(super): |
| 2783 | def __init__(self, *args): |
| 2784 | return super(mysuper, self).__init__(*args) |
| 2785 | |
| 2786 | class E(D): |
| 2787 | def meth(self, a): |
| 2788 | return "E(%r)" % a + mysuper(E, self).meth(a) |
| 2789 | |
| 2790 | self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)") |
| 2791 | |
| 2792 | class F(E): |
| 2793 | def meth(self, a): |
| 2794 | s = self.__super # == mysuper(F, self) |
| 2795 | return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a) |
| 2796 | F._F__super = mysuper(F) |
| 2797 | |
| 2798 | self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)") |
| 2799 | |
| 2800 | # Make sure certain errors are raised |
| 2801 | |
| 2802 | try: |
| 2803 | super(D, 42) |
| 2804 | except TypeError: |
| 2805 | pass |
| 2806 | else: |
| 2807 | self.fail("shouldn't allow super(D, 42)") |