blob: 9513bdfb30c4c728f50f2d6c3629481e62fb68f4 [file] [log] [blame]
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");