| /* Any copyright is dedicated to the Public Domain. |
| * http://creativecommons.org/licenses/publicdomain/ */ |
| |
| // Test corner cases involving Reflect methods' propertyKey arguments. |
| |
| // keys - Array of propertyKey values to be tested. |
| // |
| // Each element of this array is a record with these properties: |
| // |
| // * value: a value that will be passed as a property key |
| // to the various Reflect methods; |
| // |
| // * expected: (optional) the string or symbol that ToPropertyKey(value) |
| // should return. If this is omitted, ToPropertyKey(value) === value. |
| // |
| var keys = [ |
| {value: null, expected: "null"}, |
| {value: undefined, expected: "undefined"}, |
| {value: true, expected: "true"}, |
| {value: 42, expected: "42"}, |
| {value: "string"}, |
| {value: ""}, |
| {value: "string with \0"}, |
| {value: new String("ok"), expected: "ok"}, |
| {value: Symbol("sym")}, |
| {value: Symbol.iterator}, |
| {value: Object(Symbol.for("comet")), expected: Symbol.for("comet")}, |
| { |
| value: { |
| toString() { return "key"; }, |
| valueOf() { return "bad"; } |
| }, |
| expected: "key" |
| }, |
| { |
| value: { |
| toString: undefined, |
| valueOf() { return "fallback"; } |
| }, |
| expected: "fallback" |
| }, |
| { |
| value: { |
| [Symbol.toPrimitive](hint) { return hint; } |
| }, |
| expected: "string" |
| }, |
| { |
| value: { |
| [Symbol.toPrimitive](hint) { return Symbol.for(hint); } |
| }, |
| expected: Symbol.for("string") |
| } |
| ]; |
| |
| for (var {value, expected} of keys) { |
| if (expected === undefined) |
| expected = value; |
| |
| var obj = {}; |
| assertEq(Reflect.defineProperty(obj, value, {value: 1, configurable: true}), true); |
| assertDeepEq(Reflect.ownKeys(obj), [expected]); |
| assertDeepEq(Reflect.getOwnPropertyDescriptor(obj, value), |
| {value: 1, |
| writable: false, |
| enumerable: false, |
| configurable: true}); |
| assertEq(Reflect.deleteProperty(obj, value), true); |
| assertEq(Reflect.has(obj, value), false); |
| assertEq(Reflect.set(obj, value, 113), true); |
| assertEq(obj[expected], 113); |
| assertEq(Reflect.has(obj, value), true); |
| assertEq(Reflect.get(obj, value), 113); |
| } |
| |
| // ToPropertyKey can throw. |
| var exc = {}; |
| var badKey = {toString() { throw exc; }}; |
| var methodNames = ["defineProperty", "deleteProperty", "has", "get", "getOwnPropertyDescriptor", "set"]; |
| for (var name of methodNames) { |
| assertThrowsValue(() => Reflect[name]({}, badKey), exc); |
| } |
| |
| reportCompare(0, 0); |