summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/syntax/escaped-strict-reserved-words-and-yield.js
blob: 9d683bd9752989fc5c0074a41c5ae0a469b5a434 (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

const testCases = [
    // Label identifier.
    id => `${id}: ;`,

    // Binding identifier.
    id => `var ${id};`,
    id => `let ${id};`,
    id => `const ${id} = 0;`,

    // Binding identifier in binding pattern.
    id => `var [${id}] = [];`,
    id => `var [${id} = 0] = [];`,
    id => `var [...${id}] = [];`,
    id => `var {a: ${id}} = {};`,
    id => `var {${id}} = {};`,
    id => `var {${id} = 0} = {};`,

    id => `let [${id}] = [];`,
    id => `let [${id} = 0] = [];`,
    id => `let [...${id}] = [];`,
    id => `let {a: ${id}} = {};`,
    id => `let {${id}} = {};`,
    id => `let {${id} = 0} = {};`,

    id => `const [${id}] = [];`,
    id => `const [${id} = 0] = [];`,
    id => `const [...${id}] = [];`,
    id => `const {a: ${id}} = {};`,
    id => `const {${id}} = {};`,
    id => `const {${id} = 0} = {};`,

    // Identifier reference.
    id => `void ${id};`,
];

const strictReservedWords = [
    "implements",
    "interface",
    "package",
    "private",
    "protected",
    "public",
];

function escapeWord(s) {
    return "\\u00" + s.charCodeAt(0).toString(16) + s.substring(1);
}

for (let strictReservedWordOrYield of [...strictReservedWords, "yield"]) {
    let escapedStrictReservedWordOrYield = escapeWord(strictReservedWordOrYield);

    for (let testCase of testCases) {
        eval(testCase(strictReservedWordOrYield));
        eval(testCase(escapedStrictReservedWordOrYield));

        assertThrowsInstanceOf(() => eval(String.raw`
            "use strict";
            ${testCase(strictReservedWordOrYield)}
        `), SyntaxError);

        assertThrowsInstanceOf(() => eval(String.raw`
            "use strict";
            ${testCase(escapedStrictReservedWordOrYield)}
        `), SyntaxError);
    }
}

// |yield| is always a keyword in generator functions.
for (let testCase of testCases) {
    let yield = "yield";
    let escapedYield = escapeWord("yield");

    assertThrowsInstanceOf(() => eval(String.raw`
        function* g() {
            ${testCase(yield)}
        }
    `), SyntaxError);

    assertThrowsInstanceOf(() => eval(String.raw`
        function* g() {
            ${testCase(escapedYield)}
        }
    `), SyntaxError);

    assertThrowsInstanceOf(() => eval(String.raw`
        "use strict";
        function* g() {
            ${testCase(yield)}
        }
    `), SyntaxError);

    assertThrowsInstanceOf(() => eval(String.raw`
        "use strict";
        function* g() {
            ${testCase(escapedYield)}
        }
    `), SyntaxError);
}

if (typeof reportCompare === "function")
    reportCompare(0, 0, "ok");