blob: b92d14ef1762eb01ea89172a18990955815af96d [file] [log] [blame]
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/ */
assertDeepEq(Object.getOwnPropertySymbols({}), []);
// String keys are ignored.
assertEq(Object.getOwnPropertySymbols({a: 1, b: 2}).length, 0);
assertEq(Object.getOwnPropertySymbols([0, 1, 2, 3]).length, 0);
// Symbol keys are observed.
var iterable = {};
Object.defineProperty(iterable, Symbol.iterator, {
value: () => [][Symbol.iterator]()
});
assertDeepEq(Object.getOwnPropertySymbols(iterable), [Symbol.iterator]);
assertDeepEq(Object.getOwnPropertySymbols(new Proxy(iterable, {})), [Symbol.iterator]);
// Test on an object with a thousand own properties.
var obj = {};
for (var i = 0; i < 1000; i++) {
obj[Symbol.for("x" + i)] = 1;
}
assertEq(Object.getOwnPropertyNames(obj).length, 0);
var symbols = Object.getOwnPropertySymbols(obj);
assertEq(symbols.length, 1000);
assertEq(symbols.indexOf(Symbol.for("x0")) !== -1, true);
assertEq(symbols.indexOf(Symbol.for("x241")) !== -1, true);
assertEq(symbols.indexOf(Symbol.for("x999")) !== -1, true);
assertEq(Object.getOwnPropertySymbols(new Proxy(obj, {})).length, 1000);
// The prototype chain is not consulted.
assertEq(Object.getOwnPropertySymbols(Object.create(obj)).length, 0);
assertEq(Object.getOwnPropertySymbols(new Proxy(Object.create(obj), {})).length, 0);
// Primitives are coerced to objects; but there are never any symbol-keyed
// properties on the resulting wrapper objects.
assertThrowsInstanceOf(() => Object.getOwnPropertySymbols(), TypeError);
assertThrowsInstanceOf(() => Object.getOwnPropertySymbols(undefined), TypeError);
assertThrowsInstanceOf(() => Object.getOwnPropertySymbols(null), TypeError);
for (var primitive of [true, 1, 3.14, "hello", Symbol()])
assertEq(Object.getOwnPropertySymbols(primitive).length, 0);
assertEq(Object.getOwnPropertySymbols.length, 1);
if (typeof reportCompare === "function")
reportCompare(0, 0);