blob: 960553e2f0c9426fcbdeb74a30965bd289aa8e19 [file] [log] [blame]
let nullSymbol = Symbol();
let propKeys = [
"foo", "", undefined, null, true, false, 0, 10, 1234.567,
Symbol("foo"), Symbol(""), nullSymbol,
];
function toKeyString(x) {
if (typeof x === "string")
return '"' + x + '"';
if (typeof x === "symbol")
return x.toString();
return "" + x;
}
function toFuncName(x) {
if (typeof x === "symbol") {
if (x !== nullSymbol) {
let str = x.toString();
let key = str.slice(7, str.length - 1);
return "[" + key + "]";
}
return "";
}
return "" + x;
}
function shouldBe(title, actual, expected) {
if (actual !== expected)
throw Error(title + ": actual:" + actual + " expected:" + expected);
}
function makeObj(propKey, classMethodName) {
return {
[propKey]: class { static [classMethodName](){} },
};
}
noInline(makeObj);
for (var i = 0; i < 1000; i++) {
for (var k = 0; k < propKeys.length; k++) {
let key = propKeys[k];
let o = makeObj(key, "prop");
shouldBe("typeof o[" + toKeyString(key) + "].name", typeof o[key].name, "string");
shouldBe("o[" + toKeyString(key) + "].name", o[key].name, toFuncName(key));
}
for (var k = 0; k < propKeys.length; k++) {
let key = propKeys[k];
let o = makeObj(key, "name");
shouldBe("typeof o[" + toKeyString(key) + "].name", typeof o[key], "function");
}
for (var k = 0; k < propKeys.length; k++) {
let key = propKeys[k];
let prop = { toString() { return "prop" } };
let o = makeObj(key, prop);
shouldBe("typeof o[" + toKeyString(key) + "].name", typeof o[key].name, "string");
shouldBe("o[" + toKeyString(key) + "].name", o[key].name, toFuncName(key));
}
for (var k = 0; k < propKeys.length; k++) {
let key = propKeys[k];
let prop = { toString() { return "name" } };
let o = makeObj(key, prop);
shouldBe("typeof o[" + toKeyString(key) + "].name", typeof o[key], "function");
}
}