Index: test/mjsunit/strong/functions.js |
diff --git a/test/mjsunit/strong/functions.js b/test/mjsunit/strong/functions.js |
index 4869ac6dfaef35befff01bac577b6bb57576936e..6956462e5d5edcc45d17a92a83c929dba5eface5 100644 |
--- a/test/mjsunit/strong/functions.js |
+++ b/test/mjsunit/strong/functions.js |
@@ -6,28 +6,82 @@ |
'use strong'; |
+function f() {} |
+function* g() {} |
+ |
(function NoArguments() { |
assertThrows("'use strong'; arguments", SyntaxError); |
assertThrows("'use strong'; function f() { arguments }", SyntaxError); |
+ assertThrows("'use strong'; function* g() { arguments }", SyntaxError); |
assertThrows("'use strong'; let f = function() { arguments }", SyntaxError); |
+ assertThrows("'use strong'; let g = function*() { arguments }", SyntaxError); |
assertThrows("'use strong'; let f = () => arguments", SyntaxError); |
// The following are strict mode errors already. |
assertThrows("'use strong'; let arguments", SyntaxError); |
assertThrows("'use strong'; function f(arguments) {}", SyntaxError); |
+ assertThrows("'use strong'; function* g(arguments) {}", SyntaxError); |
assertThrows("'use strong'; let f = (arguments) => {}", SyntaxError); |
})(); |
-function g() {} |
+(function NoArgumentsProperty() { |
+ assertFalse(f.hasOwnProperty("arguments")); |
+ assertFalse(g.hasOwnProperty("arguments")); |
+ assertThrows(function(){ f.arguments = 0 }, TypeError); |
+ assertThrows(function(){ g.arguments = 0 }, TypeError); |
+})(); |
+ |
+(function NoCaller() { |
+ assertFalse(f.hasOwnProperty("caller")); |
+ assertFalse(g.hasOwnProperty("caller")); |
+ assertThrows(function(){ f.caller = 0 }, TypeError); |
+ assertThrows(function(){ g.caller = 0 }, TypeError); |
+})(); |
+ |
+(function NoCallee() { |
+ assertFalse("callee" in f); |
+ assertFalse("callee" in g); |
+ assertThrows(function(){ f.callee = 0 }, TypeError); |
+ assertThrows(function(){ g.callee = 0 }, TypeError); |
+})(); |
-(function LexicalFunctionBindings(global) { |
+(function LexicalBindings(global) { |
+ assertEquals('function', typeof f); |
assertEquals('function', typeof g); |
+ assertEquals(undefined, global.f); |
assertEquals(undefined, global.g); |
})(this); |
-(function ImmutableFunctionBindings() { |
- function f() {} |
- assertThrows(function(){ eval("g = 0") }, TypeError); |
- assertThrows(function(){ eval("f = 0") }, TypeError); |
- assertEquals('function', typeof g); |
+(function ImmutableBindings() { |
+ function f2() {} |
+ function* g2() {} |
+ assertThrows(function(){ f = 0 }, TypeError); |
+ assertThrows(function(){ g = 0 }, TypeError); |
+ assertThrows(function(){ f2 = 0 }, TypeError); |
+ assertThrows(function(){ g2 = 0 }, TypeError); |
assertEquals('function', typeof f); |
+ assertEquals('function', typeof g); |
+ assertEquals('function', typeof f2); |
+ assertEquals('function', typeof g2); |
+})(); |
+ |
+(function NonExtensible() { |
+ assertThrows(function(){ f.a = 0 }, TypeError); |
+ assertThrows(function(){ g.a = 0 }, TypeError); |
+ assertThrows(function(){ Object.defineProperty(f, "a", {value: 0}) }, TypeError); |
+ assertThrows(function(){ Object.defineProperty(g, "a", {value: 0}) }, TypeError); |
+ assertThrows(function(){ Object.setPrototypeOf(f, {}) }, TypeError); |
+ assertThrows(function(){ Object.setPrototypeOf(g, {}) }, TypeError); |
+})(); |
+ |
+(function NoPrototype() { |
+ assertFalse("prototype" in f); |
+ assertFalse(g.hasOwnProperty("prototype")); |
+ assertThrows(function(){ f.prototype = 0 }, TypeError); |
+ assertThrows(function(){ g.prototype = 0 }, TypeError); |
+ assertThrows(function(){ f.prototype.a = 0 }, TypeError); |
+})(); |
+ |
+(function NonConstructor() { |
+ assertThrows(function(){ new f }, TypeError); |
+ assertThrows(function(){ new g }, TypeError); |
})(); |