1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/tests/ecma_5/extensions/strict-function-statements.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,100 @@ 1.4 +/* 1.5 + * Any copyright is dedicated to the Public Domain. 1.6 + * http://creativecommons.org/licenses/publicdomain/ 1.7 + */ 1.8 + 1.9 +// Ordinary function definitions should be unaffected. 1.10 +assertEq(testLenientAndStrict("function f() { }", 1.11 + parsesSuccessfully, 1.12 + parsesSuccessfully), 1.13 + true); 1.14 + 1.15 +// Function statements within blocks are forbidden in strict mode code. 1.16 +assertEq(testLenientAndStrict("{ function f() { } }", 1.17 + parsesSuccessfully, 1.18 + parseRaisesException(SyntaxError)), 1.19 + true); 1.20 + 1.21 +// Lambdas are always permitted within blocks. 1.22 +assertEq(testLenientAndStrict("{ (function f() { }) }", 1.23 + parsesSuccessfully, 1.24 + parsesSuccessfully), 1.25 + true); 1.26 + 1.27 +// Function statements within any sort of statement are forbidden in strict mode code. 1.28 +assertEq(testLenientAndStrict("if (true) function f() { }", 1.29 + parsesSuccessfully, 1.30 + parseRaisesException(SyntaxError)), 1.31 + true); 1.32 +assertEq(testLenientAndStrict("while (true) function f() { }", 1.33 + parsesSuccessfully, 1.34 + parseRaisesException(SyntaxError)), 1.35 + true); 1.36 +assertEq(testLenientAndStrict("do function f() { } while (true);", 1.37 + parsesSuccessfully, 1.38 + parseRaisesException(SyntaxError)), 1.39 + true); 1.40 +assertEq(testLenientAndStrict("for(;;) function f() { }", 1.41 + parsesSuccessfully, 1.42 + parseRaisesException(SyntaxError)), 1.43 + true); 1.44 +assertEq(testLenientAndStrict("for(x in []) function f() { }", 1.45 + parsesSuccessfully, 1.46 + parseRaisesException(SyntaxError)), 1.47 + true); 1.48 +assertEq(testLenientAndStrict("with(o) function f() { }", 1.49 + parsesSuccessfully, 1.50 + parseRaisesException(SyntaxError)), 1.51 + true); 1.52 +assertEq(testLenientAndStrict("switch(1) { case 1: function f() { } }", 1.53 + parsesSuccessfully, 1.54 + parseRaisesException(SyntaxError)), 1.55 + true); 1.56 +assertEq(testLenientAndStrict("x: function f() { }", 1.57 + parsesSuccessfully, 1.58 + parseRaisesException(SyntaxError)), 1.59 + true); 1.60 +assertEq(testLenientAndStrict("try { function f() { } } catch (x) { }", 1.61 + parsesSuccessfully, 1.62 + parseRaisesException(SyntaxError)), 1.63 + true); 1.64 + 1.65 +// Lambdas are always permitted within any sort of statement. 1.66 +assertEq(testLenientAndStrict("if (true) (function f() { })", 1.67 + parsesSuccessfully, 1.68 + parsesSuccessfully), 1.69 + true); 1.70 + 1.71 +// Function statements are permitted in blocks within lenient functions. 1.72 +assertEq(parsesSuccessfully("function f() { function g() { } }"), 1.73 + true); 1.74 + 1.75 +// Function statements are permitted in any statement within lenient functions. 1.76 +assertEq(parsesSuccessfully("function f() { if (true) function g() { } }"), 1.77 + true); 1.78 + 1.79 +assertEq(parseRaisesException(SyntaxError) 1.80 + ("function f() { 'use strict'; if (true) function g() { } }"), 1.81 + true); 1.82 + 1.83 +assertEq(parseRaisesException(SyntaxError) 1.84 + ("function f() { 'use strict'; { function g() { } } }"), 1.85 + true); 1.86 + 1.87 +assertEq(parsesSuccessfully("function f() { 'use strict'; if (true) (function g() { }) }"), 1.88 + true); 1.89 + 1.90 +assertEq(parsesSuccessfully("function f() { 'use strict'; { (function g() { }) } }"), 1.91 + true); 1.92 + 1.93 +// Eval should behave the same way. (The parse-only tests use the Function constructor.) 1.94 +assertEq(testLenientAndStrict("function f() { }", 1.95 + completesNormally, 1.96 + completesNormally), 1.97 + true); 1.98 +assertEq(testLenientAndStrict("{ function f() { } }", 1.99 + completesNormally, 1.100 + raisesException(SyntaxError)), 1.101 + true); 1.102 + 1.103 +reportCompare(true, true);