summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/strict/strict-function-statements.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/non262/strict/strict-function-statements.js')
-rw-r--r--js/src/tests/non262/strict/strict-function-statements.js94
1 files changed, 94 insertions, 0 deletions
diff --git a/js/src/tests/non262/strict/strict-function-statements.js b/js/src/tests/non262/strict/strict-function-statements.js
new file mode 100644
index 0000000000..e6dc151394
--- /dev/null
+++ b/js/src/tests/non262/strict/strict-function-statements.js
@@ -0,0 +1,94 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+// Ordinary function definitions should be unaffected.
+assertEq(testLenientAndStrict("function f() { }",
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+// Lambdas are always permitted within blocks.
+assertEq(testLenientAndStrict("{ (function f() { }) }",
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+// Function statements within unbraced blocks are forbidden in strict mode code.
+// They are allowed only under if statements in sloppy mode.
+assertEq(testLenientAndStrict("if (true) function f() { }",
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("while (true) function f() { }",
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("do function f() { } while (true);",
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("for(;;) function f() { }",
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("for(x in []) function f() { }",
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("with(o) function f() { }",
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("switch(1) { case 1: function f() { } }",
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+assertEq(testLenientAndStrict("x: function f() { }",
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("try { function f() { } } catch (x) { }",
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+// Lambdas are always permitted within any sort of statement.
+assertEq(testLenientAndStrict("if (true) (function f() { })",
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+// Function statements are permitted in blocks within lenient functions.
+assertEq(parsesSuccessfully("function f() { function g() { } }"),
+ true);
+
+// Function statements are permitted in if statement within lenient functions.
+assertEq(parsesSuccessfully("function f() { if (true) function g() { } }"),
+ true);
+
+assertEq(parseRaisesException(SyntaxError)
+ ("function f() { 'use strict'; if (true) function g() { } }"),
+ true);
+
+assertEq(parsesSuccessfully("function f() { 'use strict'; { function g() { } } }"),
+ true);
+
+assertEq(parsesSuccessfully("function f() { 'use strict'; if (true) (function g() { }) }"),
+ true);
+
+assertEq(parsesSuccessfully("function f() { 'use strict'; { (function g() { }) } }"),
+ true);
+
+// Eval should behave the same way. (The parse-only tests use the Function constructor.)
+assertEq(testLenientAndStrict("function f() { }",
+ completesNormally,
+ completesNormally),
+ true);
+assertEq(testLenientAndStrict("{ function f() { } }",
+ completesNormally,
+ completesNormally),
+ true);
+
+reportCompare(true, true);