/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ */ // Basic tests for standard Object APIs interacting with symbols. // Object.defineProperty function F() {} var f = new F; Object.defineProperty(f, Symbol.for("name"), { configurable: true, value: "eff" }); assertEq("name" in f, false); assertEq("Symbol(name)" in f, false); assertEq(Symbol.for("name") in f, true); assertEq(f[Symbol.for("name")], "eff"); // Object.defineProperties function D() {} var descs = new D; var s1 = Symbol("s1"); var hits = 0; descs[s1] = { get: () => hits++, set: undefined, enumerable: true, configurable: true }; var s2 = Symbol("s2"); descs[s2] = { value: {}, writable: true, enumerable: false, configurable: true }; var s3 = Symbol("s3"); D.prototype[s3] = {value: "FAIL"}; assertEq(Object.defineProperties(f, descs), f); assertEq(s1 in f, true); assertEq(f[s1], 0); assertEq(hits, 1); assertEq(s2 in f, true); assertEq(f[s2], descs[s2].value); assertEq(s3 in f, false); // Object.create var n = Object.create({}, descs); assertEq(s1 in n, true); assertEq(n[s1], 1); assertEq(hits, 2); assertEq(s2 in n, true); assertEq(n[s2], descs[s2].value); assertEq(s3 in n, false); // Object.getOwnPropertyDescriptor var desc = Object.getOwnPropertyDescriptor(n, s1); assertDeepEq(desc, descs[s1]); assertEq(desc.get, descs[s1].get); desc = Object.getOwnPropertyDescriptor(n, s2); assertDeepEq(desc, descs[s2]); assertEq(desc.value, descs[s2].value); // Object.prototype.hasOwnProperty assertEq(descs.hasOwnProperty(s1), true); assertEq(descs.hasOwnProperty(s2), true); assertEq(descs.hasOwnProperty(s3), false); assertEq([].hasOwnProperty(Symbol.iterator), false); assertEq(Array.prototype.hasOwnProperty(Symbol.iterator), true); // Object.prototype.propertyIsEnumerable assertEq(n.propertyIsEnumerable(s1), true); assertEq(n.propertyIsEnumerable(s2), false); assertEq(n.propertyIsEnumerable(s3), false); // no such property assertEq(D.prototype.propertyIsEnumerable(s3), true); assertEq(descs.propertyIsEnumerable(s3), false); // inherited properties are not considered // Object.preventExtensions var obj = {}; obj[s1] = 1; assertEq(Object.preventExtensions(obj), obj); assertThrowsInstanceOf(function () { "use strict"; obj[s2] = 2; }, TypeError); obj[s2] = 2; // still no effect assertEq(s2 in obj, false); // Object.isSealed, Object.isFrozen assertEq(Object.isSealed(obj), false); assertEq(Object.isFrozen(obj), false); assertEq(delete obj[s1], true); assertEq(Object.isSealed(obj), true); assertEq(Object.isFrozen(obj), true); obj = {}; obj[s1] = 1; Object.preventExtensions(obj); Object.defineProperty(obj, s1, {configurable: false}); // still writable assertEq(Object.isSealed(obj), true); assertEq(Object.isFrozen(obj), false); obj[s1] = 2; assertEq(obj[s1], 2); Object.defineProperty(obj, s1, {writable: false}); assertEq(Object.isFrozen(obj), true); // Object.seal, Object.freeze var obj = {}; obj[s1] = 1; Object.seal(obj); desc = Object.getOwnPropertyDescriptor(obj, s1); assertEq(desc.configurable, false); assertEq(desc.writable, true); Object.freeze(obj); assertEq(Object.getOwnPropertyDescriptor(obj, s1).writable, false); // Object.setPrototypeOf purges caches for symbol-keyed properties. var proto = {}; proto[s1] = 1; Object.defineProperty(proto, s2, { get: () => 2, set: v => undefined }); var obj = Object.create(proto); var last1, last2; var N = 9; for (var i = 0; i < N; i++) { last1 = obj[s1]; last2 = obj[s2]; obj[s2] = "marker"; if (i === N - 2) Object.setPrototypeOf(obj, {}); } assertEq(last1, undefined); assertEq(last2, undefined); assertEq(obj.hasOwnProperty(s2), true); assertEq(obj[s2], "marker"); if (typeof reportCompare === "function") reportCompare(0, 0);