define-own-property.js (3858B)
1 // |reftest| module 2 // Copyright (C) 2016 the V8 project authors. All rights reserved. 3 // This code is governed by the BSD license found in the LICENSE file. 4 /*--- 5 esid: sec-module-namespace-exotic-objects-defineownproperty-p-desc 6 description: > 7 The [[DefineOwnProperty]] internal method returns `true` if no change is 8 requested, and `false` otherwise. 9 flags: [module] 10 features: [Symbol.iterator, Reflect, Symbol, Symbol.toStringTag] 11 ---*/ 12 13 import * as ns from './define-own-property.js'; 14 export var local1; 15 var local2; 16 export { local2 as renamed }; 17 export { local1 as indirect } from './define-own-property.js'; 18 var sym = Symbol('test262'); 19 20 const exported = ['local1', 'renamed', 'indirect']; 21 22 23 // Non-existant properties. 24 25 for (const key of ['local2', 0, sym, Symbol.iterator]) { 26 assert.sameValue( 27 Reflect.defineProperty(ns, key, {}), 28 false, 29 'Reflect.defineProperty: ' + key.toString() 30 ); 31 assert.throws(TypeError, function() { 32 Object.defineProperty(ns, key, {}); 33 }, 'Object.defineProperty: ' + key.toString()); 34 } 35 36 37 // Own properties. No change requested. 38 39 for (const key of ([...exported, Symbol.toStringTag])) { 40 assert.sameValue( 41 Reflect.defineProperty(ns, key, {}), 42 true, 43 'Reflect.defineProperty: ' + key.toString() 44 ); 45 assert.sameValue( 46 Object.defineProperty(ns, key, {}), 47 ns, 48 'Object.defineProperty: ' + key.toString() 49 ); 50 51 } 52 53 assert.sameValue( 54 Reflect.defineProperty(ns, 'indirect', 55 {writable: true, enumerable: true, configurable: false}), 56 true, 57 'Reflect.defineProperty: indirect' 58 ); 59 assert.sameValue( 60 Object.defineProperty(ns, 'indirect', 61 {writable: true, enumerable: true, configurable: false}), 62 ns, 63 'Object.defineProperty: indirect' 64 ); 65 66 assert.sameValue( 67 Reflect.defineProperty(ns, Symbol.toStringTag, 68 {value: "Module", writable: false, enumerable: false, 69 configurable: false}), 70 true, 71 'Reflect.defineProperty: Symbol.toStringTag' 72 ); 73 assert.sameValue( 74 Object.defineProperty(ns, Symbol.toStringTag, 75 {value: "Module", writable: false, enumerable: false, 76 configurable: false}), 77 ns, 78 'Object.defineProperty: Symbol.toStringTag' 79 ); 80 81 82 // Own properties. Change requested. 83 84 for (const key of ([...exported, Symbol.toStringTag])) { 85 assert.sameValue( 86 Reflect.defineProperty(ns, key, {value: 123}), 87 false, 88 'Reflect.defineProperty: ' + key.toString() 89 ); 90 assert.throws(TypeError, function() { 91 Object.defineProperty(ns, key, {value: 123}); 92 }, 'Object.defineProperty: ' + key.toString()); 93 } 94 95 assert.sameValue( 96 Reflect.defineProperty(ns, 'indirect', 97 {writable: true, enumerable: true, configurable: true}), 98 false, 99 'Reflect.defineProperty: indirect' 100 ); 101 assert.throws(TypeError, function() { 102 Object.defineProperty(ns, 'indirect', 103 {writable: true, enumerable: true, configurable: true}); 104 }, 'Object.defineProperty: indirect'); 105 106 assert.sameValue( 107 Reflect.defineProperty(ns, Symbol.toStringTag, 108 {value: "module", writable: false, enumerable: false, 109 configurable: false}), 110 false, 111 'Reflect.defineProperty: Symbol.toStringTag' 112 ); 113 assert.throws(TypeError, function() { 114 Object.defineProperty(ns, Symbol.toStringTag, 115 {value: "module", writable: false, enumerable: false, 116 configurable: false}); 117 }, 'Object.defineProperty: Symbol.toStringTag'); 118 119 120 // Indirect change requested through Object.freeze 121 122 // Try freezing more times than there are exported properties 123 for (let i = 1; i < exported.length + 2; i++) { 124 assert.throws( 125 TypeError, 126 function () { 127 Object.freeze(ns); 128 }, 129 "Object.freeze: " + String(i) 130 ); 131 } 132 133 for (const key of exported) { 134 const desc = Object.getOwnPropertyDescriptor(ns, key); 135 assert.sameValue(desc.writable, true, String(key) + " writable"); 136 } 137 138 assert(!Object.isFrozen(ns), "namespace object not frozen"); 139 140 reportCompare(0, 0);