diff --git a/src/dynamic-import/ns-define-own-property.case b/src/dynamic-import/ns-define-own-property.case new file mode 100644 index 0000000000..2e909bc67f --- /dev/null +++ b/src/dynamic-import/ns-define-own-property.case @@ -0,0 +1,114 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// Copyright (C) 2018 Leo Balter. 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 +desc: > + The [[DefineOwnProperty]] internal method returns `true` if no change is + requested, and `false` otherwise. +features: [Symbol.iterator, Reflect, Symbol, Symbol.toStringTag] +template: namespace +---*/ + +//- setup +var sym = Symbol('test262'); + +const exported = ['local1', 'renamed', 'indirect']; + +//- import +import('./define-own-property_FIXTURE.js') +//- body +// 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, + `No change requested, Reflect.defineProperty: ${key.toString()}` + ); + assert.sameValue( + Object.defineProperty(ns, key, {}), + ns, + `No change requested, 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, + `Change requested, Reflect.defineProperty: ${key.toString()}` + ); + assert.throws(TypeError, function() { + Object.defineProperty(ns, key, {value: 123}); + }, `Change requested, 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'); diff --git a/src/dynamic-import/ns-delete-exported-init-no-strict.case b/src/dynamic-import/ns-delete-exported-init-no-strict.case new file mode 100644 index 0000000000..f004fd78e0 --- /dev/null +++ b/src/dynamic-import/ns-delete-exported-init-no-strict.case @@ -0,0 +1,41 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-module-namespace-exotic-objects-delete-p +desc: > + The [[Delete]] behavior for a key that describes an initialized exported + binding on non strict mode +info: | + [...] + 2. If Type(P) is Symbol, then + a. Return ? OrdinaryDelete(O, P). + 3. Let exports be O.[[Exports]]. + 4. If P is an element of exports, return false. + 5. Return true. +template: namespace +flags: [noStrict] +---*/ + +//- import +import('./delete-exported-init_FIXTURE.js') +//- body +assert.sameValue(delete ns.local1, false, 'delete: local1'); +assert.sameValue( + Reflect.deleteProperty(ns, 'local1'), false, 'Reflect.deleteProperty: local1' +); +assert.sameValue(ns.local1, 333, 'binding unmodified: local1'); + +assert.sameValue(delete ns.renamed, false, 'delete: renamed'); +assert.sameValue( + Reflect.deleteProperty(ns, 'renamed'), false, 'Reflect.deleteProperty: renamed' +); +assert.sameValue(ns.renamed, 444, 'binding unmodified: renamed'); + +assert.sameValue(delete ns.indirect, false, 'delete: indirect'); +assert.sameValue( + Reflect.deleteProperty(ns, 'indirect'), + false, + 'Reflect.deleteProperty: indirect' +); +assert.sameValue(ns.indirect, 333, 'binding unmodified: indirect'); diff --git a/src/dynamic-import/ns-delete-exported-init-strict.case b/src/dynamic-import/ns-delete-exported-init-strict.case new file mode 100644 index 0000000000..9313542718 --- /dev/null +++ b/src/dynamic-import/ns-delete-exported-init-strict.case @@ -0,0 +1,47 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-module-namespace-exotic-objects-delete-p +desc: > + The [[Delete]] behavior for a key that describes an initialized exported + binding on strict mode +info: | + [...] + 2. If Type(P) is Symbol, then + a. Return ? OrdinaryDelete(O, P). + 3. Let exports be O.[[Exports]]. + 4. If P is an element of exports, return false. + 5. Return true. +template: namespace +flags: [onlyStrict] +---*/ + +//- import +import('./delete-exported-init_FIXTURE.js') +//- body +assert.throws(TypeError, function() { + delete ns.local1; +}, 'delete: local1'); +assert.sameValue( + Reflect.deleteProperty(ns, 'local1'), false, 'Reflect.deleteProperty: local1' +); +assert.sameValue(ns.local1, 333, 'binding unmodified: local1'); + +assert.throws(TypeError, function() { + delete ns.renamed; +}, 'delete: renamed'); +assert.sameValue( + Reflect.deleteProperty(ns, 'renamed'), false, 'Reflect.deleteProperty: renamed' +); +assert.sameValue(ns.renamed, 444, 'binding unmodified: renamed'); + +assert.throws(TypeError, function() { + delete ns.indirect; +}, 'delete: indirect'); +assert.sameValue( + Reflect.deleteProperty(ns, 'indirect'), + false, + 'Reflect.deleteProperty: indirect' +); +assert.sameValue(ns.indirect, 333, 'binding unmodified: indirect'); diff --git a/src/dynamic-import/ns-delete-non-exported-no-strict.case b/src/dynamic-import/ns-delete-non-exported-no-strict.case new file mode 100644 index 0000000000..d7efe56594 --- /dev/null +++ b/src/dynamic-import/ns-delete-non-exported-no-strict.case @@ -0,0 +1,37 @@ +// 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-delete-p +desc: > + The [[Delete]] behavior for a key that does not describe an exported binding +info: | + [...] + 2. If Type(P) is Symbol, then + a. Return ? OrdinaryDelete(O, P). + 3. Let exports be O.[[Exports]]. + 4. If P is an element of exports, return false. + 5. Return true. +template: namespace +flags: [noStrict] +---*/ + +//- import +import('./empty_FIXTURE.js') +//- body +assert(delete ns.undef, 'delete: undef'); +assert(Reflect.deleteProperty(ns, 'undef'), 'Reflect.deleteProperty: undef'); + +assert(delete ns.default, 'delete: default'); +assert( + Reflect.deleteProperty(ns, 'default'), 'Reflect.deleteProperty: default' +); + +assert.sameValue(delete ns[Symbol.toStringTag], false, 'delete: Symbol.toStringTag'); +assert.sameValue( + Reflect.deleteProperty(ns, Symbol.toStringTag), false, + 'Reflect.deleteProperty: Symbol.toStringTag' +); + +var sym = Symbol('test262'); +assert(delete ns[sym], 'delete: symbol'); +assert(Reflect.deleteProperty(ns, sym), 'Reflect.deleteProperty: symbol'); diff --git a/src/dynamic-import/ns-delete-non-exported-strict.case b/src/dynamic-import/ns-delete-non-exported-strict.case new file mode 100644 index 0000000000..0a819b800b --- /dev/null +++ b/src/dynamic-import/ns-delete-non-exported-strict.case @@ -0,0 +1,37 @@ +// 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-delete-p +desc: > + The [[Delete]] behavior for a key that does not describe an exported binding +info: | + [...] + 2. If Type(P) is Symbol, then + a. Return ? OrdinaryDelete(O, P). + 3. Let exports be O.[[Exports]]. + 4. If P is an element of exports, return false. + 5. Return true. +template: namespace +flags: [onlyStrict] +---*/ + +//- import +import('./empty_FIXTURE.js') +//- body +assert(delete ns.undef, 'delete: undef'); +assert(Reflect.deleteProperty(ns, 'undef'), 'Reflect.deleteProperty: undef'); + +assert(delete ns.default, 'delete: default'); +assert( + Reflect.deleteProperty(ns, 'default'), 'Reflect.deleteProperty: default' +); + +assert.sameValue( + Reflect.deleteProperty(ns, Symbol.toStringTag), false, + 'Reflect.deleteProperty: Symbol.toStringTag' + ); +assert.throws(TypeError, function() { delete ns[Symbol.toStringTag]; }, 'delete: Symbol.toStringTag'); + +var sym = Symbol('test262'); +assert(delete ns[sym], 'delete: symbol'); +assert(Reflect.deleteProperty(ns, sym), 'Reflect.deleteProperty: symbol'); diff --git a/test/language/module-code/dynamic-import/ns/define-own-property_FIXTURE.js b/test/language/module-code/dynamic-import/ns/define-own-property_FIXTURE.js new file mode 100644 index 0000000000..050f79c1d1 --- /dev/null +++ b/test/language/module-code/dynamic-import/ns/define-own-property_FIXTURE.js @@ -0,0 +1,7 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +export var local1; +var local2; +export { local2 as renamed }; +export { local1 as indirect } from './define-own-property_FIXTURE.js'; diff --git a/test/language/module-code/dynamic-import/ns/delete-exported-init_FIXTURE.js b/test/language/module-code/dynamic-import/ns/delete-exported-init_FIXTURE.js new file mode 100644 index 0000000000..29e539daa2 --- /dev/null +++ b/test/language/module-code/dynamic-import/ns/delete-exported-init_FIXTURE.js @@ -0,0 +1,7 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +export var local1 = 333; +var local2 = 444; +export { local2 as renamed }; +export { local1 as indirect } from './delete-exported-init_FIXTURE.js'; diff --git a/test/language/module-code/dynamic-import/ns/empty_FIXTURE.js b/test/language/module-code/dynamic-import/ns/empty_FIXTURE.js new file mode 100644 index 0000000000..96a3b85954 --- /dev/null +++ b/test/language/module-code/dynamic-import/ns/empty_FIXTURE.js @@ -0,0 +1,2 @@ +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file.