summaryrefslogtreecommitdiffstats
path: root/js/src/tests/ecma_2017/Statements/for-in-with-assignment-syntax.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/ecma_2017/Statements/for-in-with-assignment-syntax.js')
-rw-r--r--js/src/tests/ecma_2017/Statements/for-in-with-assignment-syntax.js68
1 files changed, 68 insertions, 0 deletions
diff --git a/js/src/tests/ecma_2017/Statements/for-in-with-assignment-syntax.js b/js/src/tests/ecma_2017/Statements/for-in-with-assignment-syntax.js
new file mode 100644
index 000000000..4ac711e21
--- /dev/null
+++ b/js/src/tests/ecma_2017/Statements/for-in-with-assignment-syntax.js
@@ -0,0 +1,68 @@
+/* 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 validSyntax = [
+ "var x",
+];
+
+const destructuring = [
+ "[]",
+ "[,]",
+ "[a]",
+ "[a = 0]",
+ "[...a]",
+ "[...[]]",
+ "[...[a]]",
+ "{}",
+ "{p: x}",
+ "{p: x = 0}",
+ "{x}",
+ "{x = 0}",
+];
+
+const invalidSyntax = [
+ ...destructuring.map(binding => `var ${binding}`),
+ "let x",
+ ...destructuring.map(binding => `let ${binding}`),
+ "const x",
+ ...destructuring.map(binding => `const ${binding}`),
+ "x",
+ ...destructuring.map(binding => `${binding}`),
+ "o.p",
+ "o[0]",
+ "f()",
+];
+
+for (let valid of validSyntax) {
+ eval(`for (${valid} = 0 in {});`);
+ assertThrowsInstanceOf(() => eval(`"use strict"; for (${valid} = 0 in {});`),
+ SyntaxError);
+}
+
+for (let invalid of invalidSyntax) {
+ assertThrowsInstanceOf(() => eval(`for (${invalid} = 0 in {});`), SyntaxError);
+}
+
+// Invalid syntax, needs method context to parse.
+assertThrowsInstanceOf(() => eval(`({ m() { for (super.p = 0 in {}); } })`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`({ m() { for (super[0] = 0 in {}); } })`), SyntaxError);
+
+// Throws ReferenceError instead of SyntaxError, because we intermingle parsing
+// and early error checking.
+assertThrowsInstanceOf(() => eval(`for (0 = 0 in {});`), ReferenceError);
+assertThrowsInstanceOf(() => eval(`for (i++ = 0 in {});`), ReferenceError);
+assertThrowsInstanceOf(() => eval(`for (new F() = 0 in {});`), ReferenceError);
+assertThrowsInstanceOf(() => eval(`function f() { for (new.target = 0 in {}); }`), ReferenceError);
+assertThrowsInstanceOf(() => eval(`class C extends D { constructor() { for (super() = 0 in {}); } }`), ReferenceError);
+
+// Same as above, only this time don't make it look like we actually parse a for-in statement.
+assertThrowsInstanceOf(() => eval(`for (0 = 0 #####`), ReferenceError);
+assertThrowsInstanceOf(() => eval(`for (i++ = 0 #####`), ReferenceError);
+assertThrowsInstanceOf(() => eval(`for (new F() = 0 #####`), ReferenceError);
+assertThrowsInstanceOf(() => eval(`function f() { for (new.target = 0 #####`), ReferenceError);
+assertThrowsInstanceOf(() => eval(`class C extends D { constructor() { for (super() = 0 #####`), ReferenceError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);