diff options
Diffstat (limited to 'js/src/tests/ecma_5/extensions/strict-function-statements.js')
-rw-r--r-- | js/src/tests/ecma_5/extensions/strict-function-statements.js | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/js/src/tests/ecma_5/extensions/strict-function-statements.js b/js/src/tests/ecma_5/extensions/strict-function-statements.js new file mode 100644 index 000000000..e6dc15139 --- /dev/null +++ b/js/src/tests/ecma_5/extensions/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); |