| var BUGNUMBER = 924672; |
| var summary = 'Method Definitions' |
| |
| print(BUGNUMBER + ": " + summary); |
| |
| // Function definitions. |
| function syntaxError (script) { |
| try { |
| Function(script); |
| } catch (e) { |
| if (e instanceof SyntaxError) { |
| return; |
| } |
| } |
| throw new Error('Expected syntax error: ' + script); |
| } |
| |
| |
| // Tests begin. |
| |
| syntaxError("{a(){}}"); |
| syntaxError("b = {a("); |
| syntaxError("b = {a)"); |
| syntaxError("b = {a(}"); |
| syntaxError("b = {a)}"); |
| syntaxError("b = {a()"); |
| syntaxError("b = {a()}"); |
| syntaxError("b = {a(){}"); |
| syntaxError("b = {a){}"); |
| syntaxError("b = {a}}"); |
| syntaxError("b = {a{}}"); |
| syntaxError("b = {a({}}"); |
| syntaxError("b = {a@(){}}"); |
| syntaxError("b = {a() => 0}"); |
| syntaxError("b = {a() void 0}"); |
| syntaxError("b = {a() 1}"); |
| syntaxError("b = {a() false}"); |
| |
| b = {a(){return 5;}}; |
| assertEq(b.a(), 5); |
| |
| b = {a(){return "hey";}}; |
| assertEq(b.a(), "hey"); |
| |
| b = {a(){return arguments;}}; |
| assertEq(b.a().length, 0); |
| |
| b = {a(c){return arguments;}}; |
| assertEq(b.a().length, 0); |
| |
| b = {a(c){return arguments;}}; |
| assertEq(b.a(1).length, 1); |
| |
| b = {a(c){return arguments;}}; |
| assertEq(b.a(1)[0], 1); |
| |
| b = {a(c,d){return arguments;}}; |
| assertEq(b.a(1,2).length, 2); |
| |
| b = {a(c,d){return arguments;}}; |
| assertEq(b.a(1,2)[0], 1); |
| |
| b = {a(c,d){return arguments;}}; |
| assertEq(b.a(1,2)[1], 2); |
| |
| // Methods along with other properties. |
| syntaxError("b = {,a(){}}"); |
| syntaxError("b = {@,a(){}}"); |
| syntaxError("b = {a(){},@}"); |
| syntaxError("b = {a : 5 , (){}}"); |
| syntaxError("b = {a : 5@ , a(){}}"); |
| syntaxError("b = {a : , a(){}}"); |
| syntaxError("b = {a : 5, a()}}"); |
| syntaxError("b = {a : 5, a({}}"); |
| syntaxError("b = {a : 5, a){}}"); |
| syntaxError("b = {a : 5, a(){}"); |
| var c = "d"; |
| b = { a : 5, |
| [c] : "hey", |
| e() {return 6;}, |
| get f() {return 7;}, |
| set f(g) {this.h = 9;} |
| } |
| assertEq(b.a, 5); |
| assertEq(b.d, "hey"); |
| assertEq(b.e(), 6); |
| assertEq(b.f, 7); |
| assertEq(b.h !== 9, true); |
| b.f = 15; |
| assertEq(b.h, 9); |
| |
| |
| var i = 0; |
| var a = { |
| foo0 : function (){return 0;}, |
| ["foo" + ++i](){return 1;}, |
| ["foo" + ++i](){return 2;}, |
| ["foo" + ++i](){return 3;}, |
| foo4(){return 4;} |
| }; |
| assertEq(a.foo0(), 0); |
| assertEq(a.foo1(), 1); |
| assertEq(a.foo2(), 2); |
| assertEq(a.foo3(), 3); |
| assertEq(a.foo4(), 4); |
| |
| // Symbols. |
| var unique_sym = Symbol("1"), registered_sym = Symbol.for("2"); |
| a = { [unique_sym](){return 2;}, [registered_sym](){return 3;} }; |
| assertEq(a[unique_sym](), 2); |
| assertEq(a[registered_sym](), 3); |
| |
| // Method characteristics. |
| a = { b(){ return 4;} }; |
| b = Object.getOwnPropertyDescriptor(a, "b"); |
| assertEq(b.configurable, true); |
| assertEq(b.enumerable, true); |
| assertEq(b.writable, true); |
| assertEq(b.value(), 4); |
| |
| // prototype property |
| assertEq(a.b.prototype, undefined); |
| assertEq(a.b.hasOwnProperty("prototype"), false); |
| |
| // Defining several methods using eval. |
| var code = "({"; |
| for (i = 0; i < 1000; i++) |
| code += "['foo' + " + i + "]() {return 'ok';}, " |
| code += "['bar']() {return 'all ok'}});"; |
| var obj = eval(code); |
| for (i = 0; i < 1000; i++) |
| assertEq(obj["foo" + i](), "ok"); |
| assertEq(obj["bar"](), "all ok"); |
| |
| // this |
| var obj = { |
| a : "hey", |
| meth(){return this.a;} |
| } |
| assertEq(obj.meth(), "hey"); |
| |
| // Inheritance |
| var obj2 = Object.create(obj); |
| assertEq(obj2.meth(), "hey"); |
| |
| var obj = { |
| a() { |
| return "hey"; |
| } |
| } |
| assertEq(obj.a.call(), "hey"); |
| |
| // Duplicates |
| var obj = { |
| meth : 3, |
| meth() { return 4; }, |
| meth() { return 5; } |
| } |
| assertEq(obj.meth(), 5); |
| |
| var obj = { |
| meth() { return 4; }, |
| meth() { return 5; }, |
| meth : 3 |
| } |
| assertEq(obj.meth, 3); |
| assertThrowsInstanceOf(function() {obj.meth();}, TypeError); |
| |
| // Strict mode |
| a = {b(c){"use strict";return c;}}; |
| assertEq(a.b(1), 1); |
| a = {["b"](c){"use strict";return c;}}; |
| assertEq(a.b(1), 1); |
| |
| // Allow strict-reserved names as methods in objects. |
| // (Bug 1124362) |
| a = { static() { return 4; } }; |
| assertEq(a.static(), 4); |
| |
| a = { get static() { return 4; } }; |
| assertEq(a.static, 4); |
| |
| a = { set static(x) { assertEq(x, 4); } }; |
| a.static = 4; |
| |
| function testStrictMode() { |
| "use strict"; |
| var obj = { static() { return 4; } }; |
| assertEq(obj.static(), 4); |
| |
| obj = { get static() { return 4; } }; |
| assertEq(obj.static, 4); |
| |
| obj = { set static(x) { assertEq(x, 4); } }; |
| obj.static = 4; |
| } |
| testStrictMode(); |
| |
| // Tests provided by benvie in the bug to distinguish from ES5 desugar. |
| assertEq(({ method() {} }).method.name, "method"); |
| assertThrowsInstanceOf(function() {({ method() { method() } }).method() }, ReferenceError); |
| |
| if (typeof reportCompare === 'function') |
| reportCompare(0, 0, "ok"); |