Files
core-js/tests/unit-global/es.reflect.define-property.js

50 lines
2.0 KiB
JavaScript

import { DESCRIPTORS } from '../helpers/constants.js';
QUnit.test('Reflect.defineProperty', assert => {
const { defineProperty } = Reflect;
const { getOwnPropertyDescriptor, create } = Object;
assert.isFunction(defineProperty);
assert.arity(defineProperty, 3);
assert.name(defineProperty, 'defineProperty');
assert.looksNative(defineProperty);
assert.nonEnumerable(Reflect, 'defineProperty');
let object = {};
assert.true(defineProperty(object, 'foo', { value: 123 }));
assert.same(object.foo, 123);
if (DESCRIPTORS) {
object = {};
defineProperty(object, 'foo', {
value: 123,
enumerable: true,
});
assert.deepEqual(getOwnPropertyDescriptor(object, 'foo'), {
value: 123,
enumerable: true,
configurable: false,
writable: false,
});
assert.false(defineProperty(object, 'foo', {
value: 42,
}));
}
assert.throws(() => defineProperty(42, 'foo', {
value: 42,
}), TypeError, 'throws on primitive');
assert.throws(() => defineProperty(42, 1, {}));
assert.throws(() => defineProperty({}, create(null), {}));
assert.throws(() => defineProperty({}, 1, 1));
// ToPropertyDescriptor errors should throw, not return false
assert.throws(() => defineProperty({}, 'a', { get: 42 }), TypeError, 'throws on non-callable getter');
assert.throws(() => defineProperty({}, 'a', { set: 'str' }), TypeError, 'throws on non-callable setter');
assert.throws(() => defineProperty({}, 'a', { get: null }), TypeError, 'throws on null getter');
assert.throws(() => defineProperty({}, 'a', { get: false }), TypeError, 'throws on false getter');
if (DESCRIPTORS) {
assert.throws(() => defineProperty({}, 'a', { get() { /* empty */ }, value: 1 }), TypeError, 'throws on mixed accessor/data descriptor');
assert.true(defineProperty({}, 'a', { get: undefined }), 'undefined getter is valid');
}
});
QUnit.test('Reflect.defineProperty.sham flag', assert => {
assert.same(Reflect.defineProperty.sham, DESCRIPTORS ? undefined : true);
});