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.defineProperty.length, 3); shouldThrow(() => { Reflect.defineProperty("hello"); }, `TypeError: Reflect.defineProperty requires the first argument be an object`); shouldThrow(() => { Reflect.defineProperty(null); }, `TypeError: Reflect.defineProperty requires the first argument be an object`); var object = {}; shouldBe(object[42], undefined); shouldBe(object.hello, undefined); shouldBe(Reflect.defineProperty(object, 42, { value: 42 }), true); shouldBe(Reflect.defineProperty(object, 'hello', { value: 50 }), true); shouldBe(object[42], 42); shouldBe(object.hello, 50); function testDescriptor(expected, actual) { shouldBe(expected.enumerable, actual.enumerable); shouldBe(expected.configurable, actual.configurable); shouldBe(expected.writable, actual.writable); shouldBe(expected.value, actual.value); shouldBe(expected.get, actual.get); shouldBe(expected.set, actual.set); } function getter() { } function setter() { } var object = {}; shouldBe(Reflect.defineProperty(object, 'cocoa', {}), true); testDescriptor(Object.getOwnPropertyDescriptor(object, 'cocoa'), { configurable: false, writable: false, enumerable: false, value: undefined }); var object = {}; shouldBe(Reflect.defineProperty(object, 'cocoa', { configurable: true }), true); testDescriptor(Object.getOwnPropertyDescriptor(object, 'cocoa'), { configurable: true, writable: false, enumerable: false, value: undefined }); var object = {}; shouldBe(Reflect.defineProperty(object, 'cocoa', { configurable: true, enumerable: true }), true); testDescriptor(Object.getOwnPropertyDescriptor(object, 'cocoa'), { configurable: true, writable: false, enumerable: true, value: undefined }); var object = {}; shouldBe(Reflect.defineProperty(object, 'cocoa', { configurable: true, enumerable: true, writable: true }), true); testDescriptor(Object.getOwnPropertyDescriptor(object, 'cocoa'), { configurable: true, writable: true, enumerable: true, value: undefined }); var object = {}; shouldBe(Reflect.defineProperty(object, 'cocoa', { configurable: true, enumerable: true, writable: true, value: 42 }), true); testDescriptor(Object.getOwnPropertyDescriptor(object, 'cocoa'), { configurable: true, writable: true, enumerable: true, value: 42 }); var object = {}; shouldBe(Reflect.defineProperty(object, 'cocoa', { configurable: true, enumerable: true, get: getter }), true); testDescriptor(Object.getOwnPropertyDescriptor(object, 'cocoa'), { configurable: true, enumerable: true, get: getter, set: undefined }); var object = {}; shouldBe(Reflect.defineProperty(object, 'cocoa', { configurable: true, enumerable: true, set: setter }), true); testDescriptor(Object.getOwnPropertyDescriptor(object, 'cocoa'), { configurable: true, enumerable: true, get: undefined, set: setter }); var object = {}; shouldBe(Reflect.defineProperty(object, 'cocoa', { configurable: true, enumerable: true, set: setter, get: getter }), true); testDescriptor(Object.getOwnPropertyDescriptor(object, 'cocoa'), { configurable: true, enumerable: true, get: getter, set: setter }); shouldThrow(() => { var object = {}; Reflect.defineProperty(object, 'cocoa', { configurable: true, enumerable: true, set: setter, get: getter, value: 42 }); }, `TypeError: Invalid property. 'value' present on property with getter or setter.`); shouldThrow(() => { var object = {}; Reflect.defineProperty(object, 'cocoa', { configurable: true, enumerable: true, value: 42, set: setter, get: getter }); }, `TypeError: Invalid property. 'value' present on property with getter or setter.`); shouldThrow(() => { var object = {}; Reflect.defineProperty(object, 'cocoa', { configurable: true, enumerable: true, writable: false, get: getter }); }, `TypeError: Invalid property. 'writable' present on property with getter or setter.`); var object = { cocoa: 42 }; shouldBe(Reflect.defineProperty(object, 'cocoa', { configurable: true, enumerable: true, writable: false, value: 50 }), true); testDescriptor(Object.getOwnPropertyDescriptor(object, 'cocoa'), { configurable: true, enumerable: true, writable: false, value: 50 }); var object = { cocoa: 42 }; shouldBe(Reflect.defineProperty(object, 'cocoa', { writable: false, value: 50 }), true); testDescriptor(Object.getOwnPropertyDescriptor(object, 'cocoa'), { configurable: true, enumerable: true, writable: false, value: 50 }); shouldBe(Reflect.defineProperty(object, 'cocoa', { writable: true, }), true); testDescriptor(Object.getOwnPropertyDescriptor(object, 'cocoa'), { configurable: true, enumerable: true, writable: true, value: 50 }); shouldBe(Reflect.defineProperty(object, 'cocoa', { writable: false, configurable: false, value: 50 }), true); testDescriptor(Object.getOwnPropertyDescriptor(object, 'cocoa'), { configurable: false, enumerable: true, writable: false, value: 50 }); shouldBe(Reflect.defineProperty(object, 'cocoa', { writable: true, }), false); testDescriptor(Object.getOwnPropertyDescriptor(object, 'cocoa'), { configurable: false, enumerable: true, writable: false, value: 50 }); shouldBe(Reflect.defineProperty(object, 'cocoa', { enumerable: false, }), false); testDescriptor(Object.getOwnPropertyDescriptor(object, 'cocoa'), { configurable: false, enumerable: true, writable: false, value: 50 }); shouldBe(Reflect.defineProperty(object, 'cocoa', { enumerable: true, }), true); testDescriptor(Object.getOwnPropertyDescriptor(object, 'cocoa'), { configurable: false, enumerable: true, writable: false, value: 50 }); var array = []; shouldBe(Reflect.defineProperty(array, 'length', { get: getter, set: setter }), false); testDescriptor(Object.getOwnPropertyDescriptor(array, 'length'), { configurable: false, enumerable: false, writable: true, value: 0 }); shouldBe(Reflect.defineProperty(array, 'length', { writable: false, value: 30 }), true); testDescriptor(Object.getOwnPropertyDescriptor(array, 'length'), { configurable: false, enumerable: false, writable: false, value: 30 }); array.length = 40; testDescriptor(Object.getOwnPropertyDescriptor(array, 'length'), { configurable: false, enumerable: false, writable: false, value: 30 });