2021-06-18 17:30:58 +01:00
|
|
|
#- test for leveled use of super() -#
|
|
|
|
|
|
|
|
#- setup -#
|
|
|
|
class A def r() return 'a' end def f() return self.r() end end
|
|
|
|
class B:A def r() return 'b' end def f() return super(self,A).f() + 'b' end end
|
|
|
|
class C:B def r() return 'c' end def f() return super(self,B).f() + 'c' end end
|
|
|
|
a=A()
|
|
|
|
b=B()
|
|
|
|
c=C()
|
|
|
|
|
|
|
|
#- regular behavior -#
|
|
|
|
assert(classname(a) == 'A')
|
|
|
|
assert(classname(b) == 'B')
|
|
|
|
assert(classname(c) == 'C')
|
|
|
|
assert(a.r() == 'a')
|
|
|
|
assert(b.r() == 'b')
|
|
|
|
assert(c.r() == 'c')
|
|
|
|
assert(a.f() == 'a')
|
|
|
|
|
|
|
|
#- standard use of super() -#
|
|
|
|
assert(super(a) == nil)
|
|
|
|
assert(super(A) == nil)
|
|
|
|
assert(classname(super(B)) == 'A')
|
|
|
|
assert(classname(super(C)) == 'B')
|
|
|
|
assert(classname(super(super(C))) == 'A')
|
|
|
|
assert(super(super(super(C))) == nil)
|
|
|
|
|
|
|
|
#- super() levele -#
|
2021-08-26 18:30:57 +01:00
|
|
|
assert(super(a,A) == nil)
|
|
|
|
assert(super(b,B) == nil)
|
|
|
|
assert(super(c,C) == nil)
|
2021-06-18 17:30:58 +01:00
|
|
|
assert(classname(super(c,B)) == 'B')
|
|
|
|
assert(classname(super(c,A)) == 'A')
|
|
|
|
assert(super(c,map) == nil) #- not a parent class -#
|
|
|
|
|
|
|
|
#- wrapping it all -#
|
|
|
|
assert(a.f() == 'a')
|
|
|
|
assert(b.f() == 'bb')
|
|
|
|
|
|
|
|
#- the last one is tricky:
|
|
|
|
c.f() -> calls f() in class B -> calls f() in class A -> calls r() of overall class hence C
|
|
|
|
-#
|
|
|
|
assert(c.f() == 'cbc')
|