summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/class/superPropDerivedCalls.js
blob: 1a8a0360570c9555e38925e5cab8cc9feef8f35f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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");