summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/class/superPropChains.js
blob: e8c0de05cd3377d82c2a160e6ca4e6b567513258 (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
// 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");