117 lines
4.0 KiB
JavaScript

// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-module-namespace-exotic-objects-defineownproperty-p-desc
description: >
The [[DefineOwnProperty]] internal method returns `true` if no change is
requested, and `false` otherwise.
flags: [module]
features: [Symbol.iterator, Reflect, Symbol, Symbol.toStringTag]
---*/
import * as ns from './define-own-property.js';
export var local1;
var local2;
export { local2 as renamed };
export { local1 as indirect } from './define-own-property.js';
var sym = Symbol('test262');
const exported = ['local1', 'renamed', 'indirect'];
// Non-existant properties.
for (const key of ['local2', 0, sym, Symbol.iterator]) {
assert.sameValue(
Reflect.defineProperty(ns, key, {}),
false,
'Reflect.defineProperty(ns, , {}) must return false'
);
assert.throws(TypeError, function() {
Object.defineProperty(ns, key, {});
}, 'Object.defineProperty(ns, key, {}) throws a TypeError exception');
}
// Own properties. No change requested.
for (const key of ([...exported, Symbol.toStringTag])) {
assert.sameValue(
Reflect.defineProperty(ns, key, {}),
true,
'Reflect.defineProperty(ns, , {}) must return true'
);
assert.sameValue(
Object.defineProperty(ns, key, {}),
ns,
'Object.defineProperty(ns, , {}) returns ns'
);
}
assert.sameValue(
Reflect.defineProperty(ns, 'indirect',
{writable: true, enumerable: true, configurable: false}),
true,
'Reflect.defineProperty(ns, "indirect", {writable: true, enumerable: true, configurable: false}) must return true'
);
assert.sameValue(
Object.defineProperty(ns, 'indirect',
{writable: true, enumerable: true, configurable: false}),
ns,
'Object.defineProperty(ns, "indirect", {writable: true, enumerable: true, configurable: false}) returns ns'
);
assert.sameValue(
Reflect.defineProperty(ns, Symbol.toStringTag,
{value: "Module", writable: false, enumerable: false,
configurable: false}),
true,
'Reflect.defineProperty( ns, Symbol.toStringTag, {value: "Module", writable: false, enumerable: false, configurable: false} ) must return true'
);
assert.sameValue(
Object.defineProperty(ns, Symbol.toStringTag,
{value: "Module", writable: false, enumerable: false,
configurable: false}),
ns,
'Object.defineProperty( ns, Symbol.toStringTag, {value: "Module", writable: false, enumerable: false, configurable: false} ) returns ns'
);
// Own properties. Change requested.
for (const key of ([...exported, Symbol.toStringTag])) {
assert.sameValue(
Reflect.defineProperty(ns, key, {value: 123}),
false,
'Reflect.defineProperty(ns, , {value: 123}) must return false'
);
assert.throws(TypeError, function() {
Object.defineProperty(ns, key, {value: 123});
}, 'Object.defineProperty(ns, key, {value: 123}) throws a TypeError exception');
}
assert.sameValue(
Reflect.defineProperty(ns, 'indirect',
{writable: true, enumerable: true, configurable: true}),
false,
'Reflect.defineProperty(ns, "indirect", {writable: true, enumerable: true, configurable: true}) must return false'
);
assert.throws(TypeError, function() {
Object.defineProperty(ns, 'indirect',
{writable: true, enumerable: true, configurable: true});
}, 'Object.defineProperty(ns, "indirect", {writable: true, enumerable: true, configurable: true}) throws a TypeError exception');
assert.sameValue(
Reflect.defineProperty(ns, Symbol.toStringTag,
{value: "module", writable: false, enumerable: false,
configurable: false}),
false,
'Reflect.defineProperty( ns, Symbol.toStringTag, {value: "module", writable: false, enumerable: false, configurable: false} ) must return false'
);
assert.throws(TypeError, function() {
Object.defineProperty(ns, Symbol.toStringTag,
{value: "module", writable: false, enumerable: false,
configurable: false});
}, 'Object.defineProperty(ns, Symbol.toStringTag, {value: "module", writable: false, enumerable: false, configurable: false}) throws a TypeError exception');