| let derivedInstance; |
| |
| class base { |
| constructor() { } |
| method(a, b, c) { |
| assertEq(this, derivedInstance); |
| this.methodCalled = true; |
| assertEq(a, 1); |
| assertEq(b, 2); |
| assertEq(c, 3); |
| } |
| |
| get prop() { |
| assertEq(this, derivedInstance); |
| this.getterCalled = true; |
| return this._prop; |
| } |
| |
| set prop(val) { |
| assertEq(this, derivedInstance); |
| this.setterCalled = true; |
| this._prop = val; |
| } |
| } |
| |
| class derived extends base { |
| constructor() { super(); } |
| |
| // |super| actually checks the chain, not |this| |
| method() { throw "FAIL"; } |
| get prop() { throw "FAIL"; } |
| set prop(v) { throw "FAIL"; } |
| |
| test() { |
| this.reset(); |
| // While we're here. Let's check on super spread calls... |
| let spread = [1,2,3]; |
| super.method(...spread); |
| super.prop++; |
| this.asserts(); |
| } |
| |
| testInEval() { |
| this.reset(); |
| eval("super.method(1,2,3); super.prop++"); |
| this.asserts(); |
| } |
| |
| testInArrow() { |
| this.reset(); |
| (() => (super.method(1,2,3), super.prop++))(); |
| this.asserts(); |
| } |
| |
| reset() { |
| this._prop = 0; |
| this.methodCalled = false; |
| this.setterCalled = false; |
| this.getterCalled = false; |
| } |
| |
| asserts() { |
| assertEq(this.methodCalled, true); |
| assertEq(this.getterCalled, true); |
| assertEq(this.setterCalled, true); |
| assertEq(this._prop, 1); |
| } |
| |
| } |
| |
| derivedInstance = new derived(); |
| derivedInstance.test(); |
| derivedInstance.testInEval(); |
| derivedInstance.testInArrow(); |
| |
| if (typeof reportCompare === 'function') |
| reportCompare(0,0,"OK"); |