redefine-property.js (2383B)
1 function getLogString(obj) { 2 let log = getWatchtowerLog(); 3 return log.map(item => { 4 assertEq(item.object, obj); 5 if (typeof item.extra === "symbol") { 6 item.extra = "<symbol>"; 7 } 8 return item.kind + (item.extra ? ": " + item.extra : ""); 9 }).join("|"); 10 } 11 12 function testDefineProperty() { 13 let o = {}; 14 addWatchtowerTarget(o); 15 16 Object.defineProperty(o, "a", {value: 1, configurable: true, writable: true, enumerable: true}); 17 assertEq(getLogString(o), "add-prop: a"); 18 19 // This doesn't change the property's flags so is just a change-prop-value. 20 Object.defineProperty(o, "a", {value: 2}); 21 assertEq(getLogString(o), "change-prop-value: a"); 22 23 // This changes the property's flags but not its value so is just a change-prop-flags. 24 Object.defineProperty(o, "a", {value: 2, enumerable: false}); 25 assertEq(getLogString(o), "change-prop-flags: a"); 26 27 // This defineProperty is a no-op. 28 Object.defineProperty(o, "a", {value: 2, enumerable: false}); 29 assertEq(getLogString(o), ""); 30 31 // This changes both the property's value and its flags. 32 Object.defineProperty(o, "a", {value: 1, enumerable: true}); 33 assertEq(getLogString(o), "change-prop-flags: a|change-prop-value: a"); 34 35 // Turning the data property into a getter changes both its (slot) value and its flags. 36 let getter = () => 1; 37 Object.defineProperty(o, "a", {get: getter}); 38 assertEq(getLogString(o), "change-prop-flags: a|change-prop-value: a"); 39 40 // This defineProperty is a no-op. 41 Object.defineProperty(o, "a", {get: getter, enumerable: true}); 42 assertEq(getLogString(o), ""); 43 44 // Changing just the accessor property's flags. 45 Object.defineProperty(o, "a", {get: getter, enumerable: false}); 46 assertEq(getLogString(o), "change-prop-flags: a"); 47 48 // Changing the getter function counts as a property modification. 49 let getter2 = () => 2; 50 Object.defineProperty(o, "a", {get: getter2}); 51 assertEq(getLogString(o), "change-prop-value: a"); 52 53 // Changing both the property's accessors and its flags. 54 Object.defineProperty(o, "a", {set: getter, enumerable: true}); 55 assertEq(getLogString(o), "change-prop-flags: a|change-prop-value: a"); 56 57 // Change back to a data property. 58 Object.defineProperty(o, "a", {value: 1}); 59 assertEq(getLogString(o), "change-prop-flags: a|change-prop-value: a"); 60 } 61 62 for (var i = 0; i < 20; i++) { 63 testDefineProperty(); 64 }