blob: fc33b85eb1627d2d21266afaf03ffd7799265c32 [file] [log] [blame]
Test behaviour of strict mode
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS testThis.call(null) is null
PASS testThis.call(1) is 1
PASS testThis.call(true) is true
PASS testThis.call(false) is false
PASS testThis.call(undefined) is undefined
PASS testLineContinuation.call(undefined) === undefined is false
PASS testEscapeSequence.call(undefined) === undefined is false
PASS testThis.call('a string') is 'a string'
PASS testThisDotAccess.call('a string') is 'a string'.length
PASS testThisDotAccess.call(null) threw exception TypeError: null is not an object (evaluating 'this.length').
PASS testThisDotAccess.call(undefined) threw exception TypeError: undefined is not an object (evaluating 'this.length').
PASS testThisDotAccess.call(true) is undefined.
PASS testThisDotAccess.call(false) is undefined.
PASS testThisDotAccess.call(1) is undefined.
PASS testThisBracketAccess.call('a string', 'length') is 'a string'.length
PASS testThisBracketAccess.call(null, 'length') threw exception TypeError: null is not an object (evaluating 'this[prop]').
PASS testThisBracketAccess.call(undefined, 'length') threw exception TypeError: undefined is not an object (evaluating 'this[prop]').
PASS testThisBracketAccess.call(true, 'length') is undefined.
PASS testThisBracketAccess.call(false, 'length') is undefined.
PASS testThisBracketAccess.call(1, 'length') is undefined.
PASS Function('"use strict"; return this;')() is undefined.
PASS Function('"use strict"; with({});') threw exception SyntaxError: 'with' statements are not valid in strict mode..
PASS testGlobalAccess() is undefined
PASS testThis.call() is undefined
PASS testThis.apply() is undefined
PASS testThis.call(undefined) is undefined
PASS testThis.apply(undefined) is undefined
PASS (function eval(){'use strict';}) threw exception SyntaxError: 'eval' is not a valid function name in strict mode..
PASS (function(){(function eval(){'use strict';})}) threw exception SyntaxError: 'eval' is not a valid function name in strict mode..
PASS (function (eval){'use strict';}) threw exception SyntaxError: Invalid parameters or function name in strict mode..
PASS (function(){(function (eval){'use strict';})}) threw exception SyntaxError: Invalid parameters or function name in strict mode..
PASS (function arguments(){'use strict';}) threw exception SyntaxError: 'arguments' is not a valid function name in strict mode..
PASS (function(){(function arguments(){'use strict';})}) threw exception SyntaxError: 'arguments' is not a valid function name in strict mode..
PASS (function (arguments){'use strict';}) threw exception SyntaxError: Invalid parameters or function name in strict mode..
PASS (function(){(function (arguments){'use strict';})}) threw exception SyntaxError: Invalid parameters or function name in strict mode..
PASS (function (){'use strict'; var eval;}) threw exception SyntaxError: Cannot declare a variable named eval in strict mode..
PASS (function(){(function (){'use strict'; var eval;})}) threw exception SyntaxError: Cannot declare a variable named eval in strict mode..
PASS (function (){'use strict'; var arguments;}) threw exception SyntaxError: Cannot declare a variable named arguments in strict mode..
PASS (function(){(function (){'use strict'; var arguments;})}) threw exception SyntaxError: Cannot declare a variable named arguments in strict mode..
PASS (function (){'use strict'; try{}catch(eval){}}) threw exception SyntaxError: Cannot declare a catch variable named 'eval' in strict mode..
PASS (function(){(function (){'use strict'; try{}catch(eval){}})}) threw exception SyntaxError: Cannot declare a catch variable named 'eval' in strict mode..
PASS (function (){'use strict'; try{}catch(arguments){}}) threw exception SyntaxError: Cannot declare a catch variable named 'arguments' in strict mode..
PASS (function(){(function (){'use strict'; try{}catch(arguments){}})}) threw exception SyntaxError: Cannot declare a catch variable named 'arguments' in strict mode..
PASS (function (a, a){'use strict';}) threw exception SyntaxError: Invalid parameters or function name in strict mode..
PASS (function(){(function (a, a){'use strict';})}) threw exception SyntaxError: Invalid parameters or function name in strict mode..
PASS (function (a){'use strict'; delete a;})() threw exception SyntaxError: Cannot delete unqualified property 'a' in strict mode..
PASS (function(){(function (a){'use strict'; delete a;})()}) threw exception SyntaxError: Cannot delete unqualified property 'a' in strict mode..
PASS (function (){'use strict'; var a; delete a;})() threw exception SyntaxError: Cannot delete unqualified property 'a' in strict mode..
PASS (function(){(function (){'use strict'; var a; delete a;})()}) threw exception SyntaxError: Cannot delete unqualified property 'a' in strict mode..
PASS (function (){var a; function f() {'use strict'; delete a;} })() threw exception SyntaxError: Cannot delete unqualified property 'a' in strict mode..
PASS (function(){(function (){var a; function f() {'use strict'; delete a;} })()}) threw exception SyntaxError: Cannot delete unqualified property 'a' in strict mode..
PASS (function (){'use strict'; with(1){};}) threw exception SyntaxError: 'with' statements are not valid in strict mode..
PASS (function(){(function (){'use strict'; with(1){};})}) threw exception SyntaxError: 'with' statements are not valid in strict mode..
PASS (function (){'use strict'; arguments.callee; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
PASS (function (){'use strict'; return arguments.caller; })() is undefined
PASS (function f(){'use strict'; f.arguments; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
PASS (function f(){'use strict'; f.caller; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
PASS (function f(){'use strict'; f.arguments=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
PASS (function f(){'use strict'; f.caller=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
PASS (function (arg){'use strict'; arguments.callee; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
PASS (function (arg){'use strict'; return arguments.caller; })() is undefined
PASS (function f(arg){'use strict'; f.arguments; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
PASS (function f(arg){'use strict'; f.caller; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
PASS (function f(arg){'use strict'; f.arguments=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
PASS (function f(arg){'use strict'; f.caller=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
PASS (function a(a){'use strict'; return a+2; })(40) is 42
PASS var foo = function a(a){'use strict'; return a+2; }; foo(40) is 42
PASS var o = {foo: function a(a){'use strict'; return a+2; } }; o.foo(40) is 42
PASS "caller" in function(){"use strict"} is true
PASS (function(){"use strict";}).hasOwnProperty("caller") is false
PASS (function(){"use strict";}).__proto__.hasOwnProperty("caller") is true
PASS "arguments" in function(){"use strict"} is true
PASS (function(){"use strict";}).hasOwnProperty("arguments") is false
PASS (function(){"use strict";}).__proto__.hasOwnProperty("arguments") is true
PASS 'use strict'; (function (){with(1){};}) threw exception SyntaxError: 'with' statements are not valid in strict mode..
PASS (function(){'use strict'; (function (){with(1){};})}) threw exception SyntaxError: 'with' statements are not valid in strict mode..
PASS 'use strict'; (function (){var a; delete a;}) threw exception SyntaxError: Cannot delete unqualified property 'a' in strict mode..
PASS (function(){'use strict'; (function (){var a; delete a;})}) threw exception SyntaxError: Cannot delete unqualified property 'a' in strict mode..
PASS 'use strict'; var a; (function (){ delete a;}) threw exception SyntaxError: Cannot delete unqualified property 'a' in strict mode..
PASS (function(){'use strict'; var a; (function (){ delete a;})}) threw exception SyntaxError: Cannot delete unqualified property 'a' in strict mode..
PASS var a; (function (){ 'use strict'; delete a;}) threw exception SyntaxError: Cannot delete unqualified property 'a' in strict mode..
PASS (function(){var a; (function (){ 'use strict'; delete a;})}) threw exception SyntaxError: Cannot delete unqualified property 'a' in strict mode..
PASS 'misc directive'; 'use strict'; with({}){} threw exception SyntaxError: 'with' statements are not valid in strict mode..
PASS (function(){'misc directive'; 'use strict'; with({}){}}) threw exception SyntaxError: 'with' statements are not valid in strict mode..
PASS 'use strict'; return threw exception SyntaxError: Return statements are only valid inside functions..
PASS 'use strict'; break threw exception SyntaxError: 'break' is only valid inside a switch or loop statement..
PASS (function(){'use strict'; break}) threw exception SyntaxError: 'break' is only valid inside a switch or loop statement..
PASS 'use strict'; continue threw exception SyntaxError: 'continue' is only valid inside a loop statement..
PASS (function(){'use strict'; continue}) threw exception SyntaxError: 'continue' is only valid inside a loop statement..
PASS 'use strict'; for(;;)return threw exception SyntaxError: Return statements are only valid inside functions..
PASS 'use strict'; for(;;)break missingLabel threw exception SyntaxError: Cannot use the undeclared label 'missingLabel'..
PASS (function(){'use strict'; for(;;)break missingLabel}) threw exception SyntaxError: Cannot use the undeclared label 'missingLabel'..
PASS 'use strict'; for(;;)continue missingLabel threw exception SyntaxError: Cannot use the undeclared label 'missingLabel'..
PASS (function(){'use strict'; for(;;)continue missingLabel}) threw exception SyntaxError: Cannot use the undeclared label 'missingLabel'..
PASS 'use strict'; 007; threw exception SyntaxError: Decimal integer literals with a leading zero are forbidden in strict mode.
PASS (function(){'use strict'; 007;}) threw exception SyntaxError: Decimal integer literals with a leading zero are forbidden in strict mode.
PASS 'use strict'; '\007'; threw exception SyntaxError: The only valid numeric escape in strict mode is '\0'.
PASS (function(){'use strict'; '\007';}) threw exception SyntaxError: The only valid numeric escape in strict mode is '\0'.
PASS '\007'; 'use strict'; threw exception SyntaxError: The only valid numeric escape in strict mode is '\0'.
PASS (function(){'\007'; 'use strict';}) threw exception SyntaxError: The only valid numeric escape in strict mode is '\0'.
PASS 'use strict'; delete aDeletableProperty; threw exception SyntaxError: Cannot delete unqualified property 'aDeletableProperty' in strict mode..
PASS (function(){'use strict'; delete aDeletableProperty;}) threw exception SyntaxError: Cannot delete unqualified property 'aDeletableProperty' in strict mode..
PASS 'use strict'; (function (){ delete someDeclaredGlobal;}) threw exception SyntaxError: Cannot delete unqualified property 'someDeclaredGlobal' in strict mode..
PASS (function(){'use strict'; (function (){ delete someDeclaredGlobal;})}) threw exception SyntaxError: Cannot delete unqualified property 'someDeclaredGlobal' in strict mode..
PASS (function (){ 'use strict'; delete someDeclaredGlobal;}) threw exception SyntaxError: Cannot delete unqualified property 'someDeclaredGlobal' in strict mode..
PASS (function(){(function (){ 'use strict'; delete someDeclaredGlobal;})}) threw exception SyntaxError: Cannot delete unqualified property 'someDeclaredGlobal' in strict mode..
PASS 'use strict'; if (0) { someGlobal = 'Shouldn\'t be able to assign this.'; }; true; is true
PASS 'use strict'; someGlobal = 'Shouldn\'t be able to assign this.'; threw exception ReferenceError: Can't find variable: someGlobal.
PASS 'use strict'; (function f(){ f = 'shouldn\'t be able to assign to function expression name'; })() threw exception TypeError: Attempted to assign to readonly property..
PASS 'use strict'; eval('var introducedVariable = "FAIL: variable introduced into containing scope";'); introducedVariable threw exception ReferenceError: Can't find variable: introducedVariable.
PASS 'use strict'; objectWithReadonlyProperty.prop = 'fail' threw exception TypeError: Attempted to assign to readonly property..
PASS 'use strict'; delete objectWithReadonlyProperty.prop threw exception TypeError: Unable to delete property..
PASS 'use strict'; delete objectWithReadonlyProperty[readonlyPropName] threw exception TypeError: Unable to delete property..
PASS 'use strict'; ++eval threw exception SyntaxError: Cannot modify 'eval' in strict mode..
PASS (function(){'use strict'; ++eval}) threw exception SyntaxError: Cannot modify 'eval' in strict mode..
PASS 'use strict'; eval++ threw exception SyntaxError: Cannot modify 'eval' in strict mode..
PASS (function(){'use strict'; eval++}) threw exception SyntaxError: Cannot modify 'eval' in strict mode..
PASS 'use strict'; --eval threw exception SyntaxError: Cannot modify 'eval' in strict mode..
PASS (function(){'use strict'; --eval}) threw exception SyntaxError: Cannot modify 'eval' in strict mode..
PASS 'use strict'; eval-- threw exception SyntaxError: 'eval' cannot be modified in strict mode..
PASS (function(){'use strict'; eval--}) threw exception SyntaxError: 'eval' cannot be modified in strict mode..
PASS 'use strict'; function f() { ++arguments } threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS (function(){'use strict'; function f() { ++arguments }}) threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS 'use strict'; function f() { arguments++ } threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS (function(){'use strict'; function f() { arguments++ }}) threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS 'use strict'; function f() { --arguments } threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS (function(){'use strict'; function f() { --arguments }}) threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS 'use strict'; function f() { arguments-- } threw exception SyntaxError: 'arguments' cannot be modified in strict mode..
PASS (function(){'use strict'; function f() { arguments-- }}) threw exception SyntaxError: 'arguments' cannot be modified in strict mode..
PASS global.eval('"use strict"; if (0) ++arguments; true;') threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS 'use strict'; ++(1, eval) threw exception SyntaxError: Prefix ++ operator applied to value that is not a reference..
PASS (function(){'use strict'; ++(1, eval)}) threw exception SyntaxError: Cannot modify 'eval' in strict mode..
PASS 'use strict'; ++(1, 2, 3, eval) threw exception SyntaxError: Prefix ++ operator applied to value that is not a reference..
PASS (function(){'use strict'; ++(1, 2, 3, eval)}) threw exception SyntaxError: Cannot modify 'eval' in strict mode..
PASS 'use strict'; (1, eval)++ threw exception SyntaxError: Postfix ++ operator applied to value that is not a reference..
PASS (function(){'use strict'; (1, eval)++}) threw exception SyntaxError: Cannot modify 'eval' in strict mode..
PASS 'use strict'; --(1, eval) threw exception SyntaxError: Prefix -- operator applied to value that is not a reference..
PASS (function(){'use strict'; --(1, eval)}) threw exception SyntaxError: Cannot modify 'eval' in strict mode..
PASS 'use strict'; (1, eval)-- threw exception SyntaxError: Postfix -- operator applied to value that is not a reference..
PASS (function(){'use strict'; (1, eval)--}) threw exception SyntaxError: 'eval' cannot be modified in strict mode..
PASS 'use strict'; (1, 2, 3, eval)-- threw exception SyntaxError: Postfix -- operator applied to value that is not a reference..
PASS (function(){'use strict'; (1, 2, 3, eval)--}) threw exception SyntaxError: 'eval' cannot be modified in strict mode..
PASS 'use strict'; function f() { ++(1, arguments) } threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS (function(){'use strict'; function f() { ++(1, arguments) }}) threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS 'use strict'; function f() { (1, arguments)++ } threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS (function(){'use strict'; function f() { (1, arguments)++ }}) threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS 'use strict'; function f() { --(1, arguments) } threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS (function(){'use strict'; function f() { --(1, arguments) }}) threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS 'use strict'; function f() { (1, arguments)-- } threw exception SyntaxError: 'arguments' cannot be modified in strict mode..
PASS (function(){'use strict'; function f() { (1, arguments)-- }}) threw exception SyntaxError: 'arguments' cannot be modified in strict mode..
PASS 'use strict'; if (0) delete +a.b did not throw exception.
PASS (function(){'use strict'; if (0) delete +a.b}) did not throw exception.
PASS 'use strict'; if (0) delete ++a.b did not throw exception.
PASS (function(){'use strict'; if (0) delete ++a.b}) did not throw exception.
PASS 'use strict'; if (0) delete void a.b did not throw exception.
PASS (function(){'use strict'; if (0) delete void a.b}) did not throw exception.
PASS (function (a){'use strict'; a = false; return a !== arguments[0]; })(true) is true
PASS (function (a){'use strict'; arguments[0] = false; return a !== arguments[0]; })(true) is true
PASS (function (a){'use strict'; a=false; return arguments; })(true)[0] is true
PASS (function (a){'use strict'; arguments[0]=false; return a; })(true) is true
PASS (function (a){'use strict'; arguments[0]=true; return arguments; })(false)[0] is true
PASS (function (){'use strict'; arguments[0]=true; return arguments; })(false)[0] is true
PASS (function (a){'use strict'; arguments[0]=true; a=false; return arguments; })()[0] is true
PASS (function (a){'use strict'; arguments[0]=false; a=true; return a; })() is true
PASS (function (a){'use strict'; arguments[0]=true; return arguments; })()[0] is true
PASS (function (){'use strict'; arguments[0]=true; return arguments; })()[0] is true
PASS (function (a){'use strict'; var local; (function (){local;})(); a = false; return a !== arguments[0]; })(true) is true
PASS (function (a){'use strict'; var local; (function (){local;})(); arguments[0] = false; return a !== arguments[0]; })(true) is true
PASS (function (a){'use strict'; var local; (function (){local;})(); a=false; return arguments; })(true)[0] is true
PASS (function (a){'use strict'; var local; (function (){local;})(); arguments[0]=false; return a; })(true) is true
PASS (function (a){'use strict'; var local; (function (){local;})(); arguments[0]=true; return arguments; })(false)[0] is true
PASS (function (){'use strict'; var local; (function (){local;})(); arguments[0]=true; return arguments; })(false)[0] is true
PASS (function (a){'use strict'; var local; (function (){local;})(); arguments[0]=true; a=false; return arguments; })()[0] is true
PASS (function (a){'use strict'; var local; (function (){local;})(); arguments[0]=true; return arguments; })()[0] is true
PASS (function (a){'use strict'; var local; (function (){local;})(); arguments[0]=false; a=true; return a; })() is true
PASS (function (){'use strict'; var local; (function (){local;})(); arguments[0]=true; return arguments; })()[0] is true
PASS 'use strict'; (function (){var a = true; eval('var a = false'); return a; })() is true
PASS (function (){var a = true; eval('"use strict"; var a = false'); return a; })() is true
PASS (function f(arg){'use strict'; return Object.getOwnPropertyDescriptor(f.__proto__, 'arguments').value; })() is undefined.
PASS (function f(arg){'use strict'; return Object.getOwnPropertyDescriptor(f.__proto__, 'caller').value; })() is undefined.
PASS (function f(arg){'use strict'; return Object.getOwnPropertyDescriptor(arguments, 'callee').value; })() is undefined.
PASS (function f(arg){'use strict'; return Object.getOwnPropertyDescriptor(arguments, 'caller'); })() is undefined.
PASS (function f(arg){'use strict'; var descriptor = Object.getOwnPropertyDescriptor(arguments, 'callee'); return descriptor.get === descriptor.set; })() is true
PASS (function f(arg){'use strict'; var descriptor = Object.getOwnPropertyDescriptor(f.__proto__, 'caller'); return descriptor.get === descriptor.set; })() is true
PASS (function f(arg){'use strict'; var descriptor = Object.getOwnPropertyDescriptor(f.__proto__, 'arguments'); return descriptor.get === descriptor.set; })() is true
PASS 'use strict'; (function f() { for(var i in this); })(); true; is true
PASS 'use strict'̻ threw exception SyntaxError: Invalid character '\u033b'.
PASS (function(){'use strict'̻}) threw exception SyntaxError: Invalid character '\u033b'.
PASS 'use strict'5.f threw exception SyntaxError: No identifiers allowed directly after numeric literal.
PASS (function(){'use strict'5.f}) threw exception SyntaxError: No identifiers allowed directly after numeric literal.
PASS 'use strict';̻ threw exception SyntaxError: Invalid character '\u033b'.
PASS (function(){'use strict';̻}) threw exception SyntaxError: Invalid character '\u033b'.
PASS 'use strict';5.f threw exception SyntaxError: No identifiers allowed directly after numeric literal.
PASS (function(){'use strict';5.f}) threw exception SyntaxError: No identifiers allowed directly after numeric literal.
PASS 'use strict';1-(eval=1); threw exception SyntaxError: Cannot modify 'eval' in strict mode..
PASS (function(){'use strict';1-(eval=1);}) threw exception SyntaxError: Cannot modify 'eval' in strict mode..
PASS 'use strict';arguments=1; threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS (function(){'use strict';arguments=1;}) threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS 'use strict';1-(arguments=1); threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS (function(){'use strict';1-(arguments=1);}) threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS 'use strict';var a=(eval=1); threw exception SyntaxError: Cannot modify 'eval' in strict mode..
PASS (function(){'use strict';var a=(eval=1);}) threw exception SyntaxError: Cannot modify 'eval' in strict mode..
PASS 'use strict';var a=(arguments=1); threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS (function(){'use strict';var a=(arguments=1);}) threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
PASS 'use strict'; try { throw 1; } catch (e) { aGlobal = true; } is true
PASS 'use strict'; (function () { try { throw 1; } catch (e) { aGlobal = true; }})(); aGlobal; is true
PASS (function () {'use strict'; try { throw 1; } catch (e) { aGlobal = true; }})(); aGlobal; is true
PASS try { throw 1; } catch (e) { aGlobal = true; } is true
PASS (function () { try { throw 1; } catch (e) { aGlobal = true; }})(); aGlobal; is true
PASS (function () {try { throw 1; } catch (e) { aGlobal = true; }})(); aGlobal; is true
PASS String(Object.getOwnPropertyDescriptor((function() { "use strict"; }).__proto__, "caller").get) is 'function () {\n [native code]\n}'
PASS successfullyParsed is true
TEST COMPLETE