| // First, let's test the trivial. A chain of three works. |
| class base { |
| constructor() { } |
| testChain() { |
| this.baseCalled = true; |
| } |
| } |
| |
| class middle extends base { |
| constructor() { super(); } |
| testChain() { |
| this.middleCalled = true; |
| super.testChain(); |
| } |
| } |
| |
| class derived extends middle { |
| constructor() { super(); } |
| testChain() { |
| super.testChain(); |
| assertEq(this.middleCalled, true); |
| assertEq(this.baseCalled, true); |
| } |
| } |
| |
| new derived().testChain(); |
| |
| // Super even chains in a wellbehaved fashion with normal functions. |
| function bootlegMiddle() { } |
| bootlegMiddle.prototype = middle.prototype; |
| |
| new class extends bootlegMiddle { |
| constructor() { super(); } |
| testChain() { |
| super.testChain(); |
| assertEq(this.middleCalled, true); |
| assertEq(this.baseCalled, true); |
| } |
| }().testChain(); |
| |
| // Now let's try out some "long" chains |
| base.prototype.x = "yeehaw"; |
| |
| let chain = class extends base { constructor() { super(); } } |
| |
| const CHAIN_LENGTH = 100; |
| for (let i = 0; i < CHAIN_LENGTH; i++) |
| chain = class extends chain { constructor() { super(); } } |
| |
| // Now we poke the chain |
| let inst = new chain(); |
| inst.testChain(); |
| assertEq(inst.baseCalled, true); |
| |
| assertEq(inst.x, "yeehaw"); |
| |
| if (typeof reportCompare === 'function') |
| reportCompare(0,0,"OK"); |