mirror of https://github.com/tc39/test262.git
138 lines
3.7 KiB
JavaScript
138 lines
3.7 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: ' + key.toString()
|
|
);
|
|
assert.throws(TypeError, function() {
|
|
Object.defineProperty(ns, key, {});
|
|
}, 'Object.defineProperty: ' + key.toString());
|
|
}
|
|
|
|
|
|
// Own properties. No change requested.
|
|
|
|
for (const key of ([...exported, Symbol.toStringTag])) {
|
|
assert.sameValue(
|
|
Reflect.defineProperty(ns, key, {}),
|
|
true,
|
|
'Reflect.defineProperty: ' + key.toString()
|
|
);
|
|
assert.sameValue(
|
|
Object.defineProperty(ns, key, {}),
|
|
ns,
|
|
'Object.defineProperty: ' + key.toString()
|
|
);
|
|
|
|
}
|
|
|
|
assert.sameValue(
|
|
Reflect.defineProperty(ns, 'indirect',
|
|
{writable: true, enumerable: true, configurable: false}),
|
|
true,
|
|
'Reflect.defineProperty: indirect'
|
|
);
|
|
assert.sameValue(
|
|
Object.defineProperty(ns, 'indirect',
|
|
{writable: true, enumerable: true, configurable: false}),
|
|
ns,
|
|
'Object.defineProperty: indirect'
|
|
);
|
|
|
|
assert.sameValue(
|
|
Reflect.defineProperty(ns, Symbol.toStringTag,
|
|
{value: "Module", writable: false, enumerable: false,
|
|
configurable: false}),
|
|
true,
|
|
'Reflect.defineProperty: Symbol.toStringTag'
|
|
);
|
|
assert.sameValue(
|
|
Object.defineProperty(ns, Symbol.toStringTag,
|
|
{value: "Module", writable: false, enumerable: false,
|
|
configurable: false}),
|
|
ns,
|
|
'Object.defineProperty: Symbol.toStringTag'
|
|
);
|
|
|
|
|
|
// Own properties. Change requested.
|
|
|
|
for (const key of ([...exported, Symbol.toStringTag])) {
|
|
assert.sameValue(
|
|
Reflect.defineProperty(ns, key, {value: 123}),
|
|
false,
|
|
'Reflect.defineProperty: ' + key.toString()
|
|
);
|
|
assert.throws(TypeError, function() {
|
|
Object.defineProperty(ns, key, {value: 123});
|
|
}, 'Object.defineProperty: ' + key.toString());
|
|
}
|
|
|
|
assert.sameValue(
|
|
Reflect.defineProperty(ns, 'indirect',
|
|
{writable: true, enumerable: true, configurable: true}),
|
|
false,
|
|
'Reflect.defineProperty: indirect'
|
|
);
|
|
assert.throws(TypeError, function() {
|
|
Object.defineProperty(ns, 'indirect',
|
|
{writable: true, enumerable: true, configurable: true});
|
|
}, 'Object.defineProperty: indirect');
|
|
|
|
assert.sameValue(
|
|
Reflect.defineProperty(ns, Symbol.toStringTag,
|
|
{value: "module", writable: false, enumerable: false,
|
|
configurable: false}),
|
|
false,
|
|
'Reflect.defineProperty: Symbol.toStringTag'
|
|
);
|
|
assert.throws(TypeError, function() {
|
|
Object.defineProperty(ns, Symbol.toStringTag,
|
|
{value: "module", writable: false, enumerable: false,
|
|
configurable: false});
|
|
}, 'Object.defineProperty: Symbol.toStringTag');
|
|
|
|
|
|
// Indirect change requested through Object.freeze
|
|
|
|
// Try freezing more times than there are exported properties
|
|
for (let i = 1; i < exported.length + 2; i++) {
|
|
assert.throws(
|
|
TypeError,
|
|
function () {
|
|
Object.freeze(ns);
|
|
},
|
|
"Object.freeze: " + String(i)
|
|
);
|
|
}
|
|
|
|
for (const key of exported) {
|
|
const desc = Object.getOwnPropertyDescriptor(ns, key);
|
|
assert.sameValue(desc.writable, true, String(key) + " writable");
|
|
}
|
|
|
|
assert(!Object.isFrozen(ns), "namespace object not frozen");
|