summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/statements/for-in-with-assignment-syntax.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/non262/statements/for-in-with-assignment-syntax.js')
-rw-r--r--js/src/tests/non262/statements/for-in-with-assignment-syntax.js66
1 files changed, 66 insertions, 0 deletions
diff --git a/js/src/tests/non262/statements/for-in-with-assignment-syntax.js b/js/src/tests/non262/statements/for-in-with-assignment-syntax.js
new file mode 100644
index 0000000000..7540b4bd1b
--- /dev/null
+++ b/js/src/tests/non262/statements/for-in-with-assignment-syntax.js
@@ -0,0 +1,66 @@
+/* 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) {
+ Function(`for (${valid} = 0 in {});`);
+ assertThrowsInstanceOf(() => Function(`"use strict"; for (${valid} = 0 in {});`),
+ SyntaxError);
+}
+
+for (let invalid of invalidSyntax) {
+ assertThrowsInstanceOf(() => Function(`for (${invalid} = 0 in {});`), SyntaxError);
+}
+
+// Invalid syntax, needs method context to parse.
+assertThrowsInstanceOf(() => Function(`({ m() { for (super.p = 0 in {}); } })`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`({ m() { for (super[0] = 0 in {}); } })`), SyntaxError);
+
+assertThrowsInstanceOf(() => Function(`for (0 = 0 in {});`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`for (i++ = 0 in {});`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`for (new F() = 0 in {});`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`function f() { for (new.target = 0 in {}); }`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`class C extends D { constructor() { for (super() = 0 in {}); } }`), SyntaxError);
+
+// Same as above, only this time don't make it look like we actually parse a for-in statement.
+assertThrowsInstanceOf(() => Function(`for (0 = 0 #####`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`for (i++ = 0 #####`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`for (new F() = 0 #####`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`function f() { for (new.target = 0 #####`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`class C extends D { constructor() { for (super() = 0 #####`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);