Index: test/mjsunit/object-define-property.js |
diff --git a/test/mjsunit/object-define-property.js b/test/mjsunit/object-define-property.js |
index d24a4e5a398c0d84a85052283daf0f0516d4f87f..a8a32130c433ace2cfe465e094a99e1c936048fa 100644 |
--- a/test/mjsunit/object-define-property.js |
+++ b/test/mjsunit/object-define-property.js |
@@ -749,14 +749,33 @@ assertTrue(desc.writable); |
assertTrue(desc.enumerable); |
assertFalse(desc.configurable); |
-// Ensure that we can't overwrite the non configurable element. |
+// Can use defineProperty to change the value of a non |
+// configurable property. |
try { |
Object.defineProperty(obj6, '2', descElement); |
+ desc = Object.getOwnPropertyDescriptor(obj6, '2'); |
+ assertEquals(desc.value, 'foobar'); |
+} catch (e) { |
+ assertUnreachable(); |
+} |
+ |
+// Ensure that we can't change the descriptor of a |
+// non configurable property. |
+try { |
+ var descAccessor = { get: function() { return 0; } }; |
+ Object.defineProperty(obj6, '2', descAccessor); |
assertUnreachable(); |
} catch (e) { |
assertTrue(/Cannot redefine property/.test(e)); |
} |
+Object.defineProperty(obj6, '2', descElementNonWritable); |
+desc = Object.getOwnPropertyDescriptor(obj6, '2'); |
+assertEquals(desc.value, 'foofoo'); |
+assertFalse(desc.writable); |
+assertTrue(desc.enumerable); |
+assertFalse(desc.configurable); |
+ |
Object.defineProperty(obj6, '3', descElementNonWritable); |
desc = Object.getOwnPropertyDescriptor(obj6, '3'); |
assertEquals(desc.value, 'foofoo'); |
@@ -827,14 +846,33 @@ assertTrue(desc.writable); |
assertTrue(desc.enumerable); |
assertFalse(desc.configurable); |
-// Ensure that we can't overwrite the non configurable element. |
+// Can use defineProperty to change the value of a non |
+// configurable property of an array. |
try { |
Object.defineProperty(arr, '2', descElement); |
+ desc = Object.getOwnPropertyDescriptor(arr, '2'); |
+ assertEquals(desc.value, 'foobar'); |
+} catch (e) { |
+ assertUnreachable(); |
+} |
+ |
+// Ensure that we can't change the descriptor of a |
+// non configurable property. |
+try { |
+ var descAccessor = { get: function() { return 0; } }; |
+ Object.defineProperty(arr, '2', descAccessor); |
assertUnreachable(); |
} catch (e) { |
assertTrue(/Cannot redefine property/.test(e)); |
} |
+Object.defineProperty(arr, '2', descElementNonWritable); |
+desc = Object.getOwnPropertyDescriptor(arr, '2'); |
+assertEquals(desc.value, 'foofoo'); |
+assertFalse(desc.writable); |
+assertTrue(desc.enumerable); |
+assertFalse(desc.configurable); |
+ |
Object.defineProperty(arr, '3', descElementNonWritable); |
desc = Object.getOwnPropertyDescriptor(arr, '3'); |
assertEquals(desc.value, 'foofoo'); |
@@ -898,3 +936,98 @@ Object.defineProperty(o, "x", { writable: false }); |
assertEquals(undefined, o.x); |
o.x = 37; |
assertEquals(undefined, o.x); |
+ |
+function testDefineProperty(obj, propertyName, desc, resultDesc) { |
+ Object.defineProperty(obj, propertyName, desc); |
+ var actualDesc = Object.getOwnPropertyDescriptor(obj, propertyName); |
+ assertEquals(resultDesc.enumerable, actualDesc.enumerable); |
+ assertEquals(resultDesc.configurable, actualDesc.configurable); |
+ if (resultDesc.hasOwnProperty('value')) { |
+ assertEquals(resultDesc.value, actualDesc.value); |
+ assertEquals(resultDesc.writable, actualDesc.writable); |
+ assertFalse(resultDesc.hasOwnProperty('get')); |
+ assertFalse(resultDesc.hasOwnProperty('set')); |
+ } else { |
+ assertEquals(resultDesc.get, actualDesc.get); |
+ assertEquals(resultDesc.set, actualDesc.set); |
+ assertFalse(resultDesc.hasOwnProperty('value')); |
+ assertFalse(resultDesc.hasOwnProperty('writable')); |
+ } |
+} |
+ |
+// tests redefining existing property with a generic descriptor |
+o = { p : 42 }; |
+testDefineProperty(o, 'p', |
+ { }, |
+ { value : 42, writable : true, enumerable : true, configurable : true }); |
+ |
+o = { p : 42 }; |
+testDefineProperty(o, 'p', |
+ { enumerable : true }, |
+ { value : 42, writable : true, enumerable : true, configurable : true }); |
+ |
+o = { p : 42 }; |
+testDefineProperty(o, 'p', |
+ { configurable : true }, |
+ { value : 42, writable : true, enumerable : true, configurable : true }); |
+ |
+o = { p : 42 }; |
+testDefineProperty(o, 'p', |
+ { enumerable : false }, |
+ { value : 42, writable : true, enumerable : false, configurable : true }); |
+ |
+o = { p : 42 }; |
+testDefineProperty(o, 'p', |
+ { configurable : false }, |
+ { value : 42, writable : true, enumerable : true, configurable : false }); |
+ |
+o = { p : 42 }; |
+testDefineProperty(o, 'p', |
+ { enumerable : true, configurable : true }, |
+ { value : 42, writable : true, enumerable : true, configurable : true }); |
+ |
+o = { p : 42 }; |
+testDefineProperty(o, 'p', |
+ { enumerable : false, configurable : true }, |
+ { value : 42, writable : true, enumerable : false, configurable : true }); |
+ |
+o = { p : 42 }; |
+testDefineProperty(o, 'p', |
+ { enumerable : true, configurable : false }, |
+ { value : 42, writable : true, enumerable : true, configurable : false }); |
+ |
+o = { p : 42 }; |
+testDefineProperty(o, 'p', |
+ { enumerable : false, configurable : false }, |
+ { value : 42, writable : true, enumerable : false, configurable : false }); |
+ |
+// can make a writable, non-configurable field non-writable |
+o = { p : 42 }; |
+Object.defineProperty(o, 'p', { configurable: false }); |
+testDefineProperty(o, 'p', |
+ { writable: false }, |
+ { value : 42, writable : false, enumerable : true, configurable : false }); |
+ |
+// redefine of get only property with generic descriptor |
+o = {}; |
+Object.defineProperty(o, 'p', |
+ { get : getter1, enumerable: true, configurable: true }); |
+testDefineProperty(o, 'p', |
+ { enumerable : false, configurable : false }, |
+ { get: getter1, set: undefined, enumerable : false, configurable : false }); |
+ |
+// redefine of get/set only property with generic descriptor |
+o = {}; |
+Object.defineProperty(o, 'p', |
+ { get: getter1, set: setter1, enumerable: true, configurable: true }); |
+testDefineProperty(o, 'p', |
+ { enumerable : false, configurable : false }, |
+ { get: getter1, set: setter1, enumerable : false, configurable : false }); |
+ |
+// redefine of set only property with generic descriptor |
+o = {}; |
+Object.defineProperty(o, 'p', |
+ { set : setter1, enumerable: true, configurable: true }); |
+testDefineProperty(o, 'p', |
+ { enumerable : false, configurable : false }, |
+ { get: undefined, set: setter1, enumerable : false, configurable : false }); |