function shouldBe(actual, expected) { if (actual !== expected) throw new Error('bad value: ' + actual); } function shouldThrow(func, message) { var error = null; try { func(); } catch (e) { error = e; } if (!error) throw new Error("not thrown."); if (String(error) !== message) throw new Error("bad error: " + String(error)); } shouldBe(Reflect.getOwnPropertyDescriptor.length, 2); var toPropertyKey = { toString() { throw new Error("ok"); } }; shouldThrow(() => { Reflect.getOwnPropertyDescriptor("hello", 42); }, `TypeError: Reflect.getOwnPropertyDescriptor requires the first argument be an object`); shouldThrow(() => { Reflect.getOwnPropertyDescriptor("hello", toPropertyKey); }, `TypeError: Reflect.getOwnPropertyDescriptor requires the first argument be an object`); shouldThrow(() => { Reflect.getOwnPropertyDescriptor(null, toPropertyKey); }, `TypeError: Reflect.getOwnPropertyDescriptor requires the first argument be an object`); shouldThrow(() => { Reflect.getOwnPropertyDescriptor(undefined, toPropertyKey); }, `TypeError: Reflect.getOwnPropertyDescriptor requires the first argument be an object`); shouldThrow(() => { Reflect.getOwnPropertyDescriptor({}, toPropertyKey); }, `Error: ok`); shouldBe(Reflect.getOwnPropertyDescriptor({ __proto__: { hello: 42 } }, "hello"), undefined); shouldBe(JSON.stringify(Reflect.getOwnPropertyDescriptor({ hello: 42 }, "hello")), `{"value":42,"writable":true,"enumerable":true,"configurable":true}`); (function () { var object = { get hello() { } }; var desc = Reflect.getOwnPropertyDescriptor(object, "hello"); shouldBe(JSON.stringify(desc), `{"enumerable":true,"configurable":true}`); shouldBe(desc.set, undefined); shouldBe(desc.get, Object.getOwnPropertyDescriptor(object, "hello").get); }()); (function () { var object = { set hello(value) { } }; var desc = Reflect.getOwnPropertyDescriptor(object, "hello"); shouldBe(JSON.stringify(desc), `{"enumerable":true,"configurable":true}`); shouldBe(desc.set, Object.getOwnPropertyDescriptor(object, "hello").set); shouldBe(desc.get, undefined); }()); (function () { var object = Object.defineProperty({}, "hello", { enumerable: false, value: 42 }); var desc = Reflect.getOwnPropertyDescriptor(object, "hello"); shouldBe(JSON.stringify(desc), `{"value":42,"writable":false,"enumerable":false,"configurable":false}`); }()); (function () { var object = Object.defineProperty({}, "hello", { enumerable: false, configurable: true, value: 42 }); var desc = Reflect.getOwnPropertyDescriptor(object, "hello"); shouldBe(JSON.stringify(desc), `{"value":42,"writable":false,"enumerable":false,"configurable":true}`); }()); (function () { var object = Object.defineProperty({}, "hello", { enumerable: true, configurable: false, value: 42 }); var desc = Reflect.getOwnPropertyDescriptor(object, "hello"); shouldBe(JSON.stringify(desc), `{"value":42,"writable":false,"enumerable":true,"configurable":false}`); }()); (function () { var object = Object.defineProperty({}, "hello", { enumerable: true, configurable: false, writable: false, value: 42 }); var desc = Reflect.getOwnPropertyDescriptor(object, "hello"); shouldBe(JSON.stringify(desc), `{"value":42,"writable":false,"enumerable":true,"configurable":false}`); }()); (function () { var object = Object.defineProperty({}, "hello", { enumerable: true, configurable: false, writable: true, value: 42 }); var desc = Reflect.getOwnPropertyDescriptor(object, "hello"); shouldBe(JSON.stringify(desc), `{"value":42,"writable":true,"enumerable":true,"configurable":false}`); }()); (function () { var object = { get hello() { }, set hello(value) { } }; var desc = Reflect.getOwnPropertyDescriptor(object, "hello"); shouldBe(JSON.stringify(desc), `{"enumerable":true,"configurable":true}`); shouldBe(desc.get, Object.getOwnPropertyDescriptor(object, "hello").get); shouldBe(desc.set, Object.getOwnPropertyDescriptor(object, "hello").set); }()); (function () { var object = { get hello() { }, set hello(value) { } }; var desc = Reflect.getOwnPropertyDescriptor(object, { toString() { return "hello"; } }); shouldBe(JSON.stringify(desc), `{"enumerable":true,"configurable":true}`); shouldBe(desc.get, Object.getOwnPropertyDescriptor(object, "hello").get); shouldBe(desc.set, Object.getOwnPropertyDescriptor(object, "hello").set); }());