Index: test/mjsunit/object-define-property.js |
=================================================================== |
--- test/mjsunit/object-define-property.js (revision 4684) |
+++ test/mjsunit/object-define-property.js (working copy) |
@@ -53,36 +53,46 @@ |
assertTrue(/called on non-object/.test(e)); |
} |
-// Object |
+// Object. |
var obj1 = {}; |
-// Values |
+// Values. |
var val1 = 0; |
var val2 = 0; |
var val3 = 0; |
-// Descriptors |
+function setter1() {val1++; } |
+function getter1() {return val1; } |
+ |
+function setter2() {val2++; } |
+function getter2() {return val2; } |
+ |
+function setter3() {val3++; } |
+function getter3() {return val3; } |
+ |
+ |
+// Descriptors. |
var emptyDesc = {}; |
var accessorConfigurable = { |
- set: function() { val1++; }, |
- get: function() { return val1; }, |
+ set: setter1, |
+ get: getter1, |
configurable: true |
}; |
var accessorNoConfigurable = { |
- set: function() { val2++; }, |
- get: function() { return val2; }, |
+ set: setter2, |
+ get: getter2, |
configurable: false |
}; |
var accessorOnlySet = { |
- set: function() { val3++; }, |
+ set: setter3, |
configurable: true |
}; |
var accessorOnlyGet = { |
- get: function() { return val3; }, |
+ get: getter3, |
configurable: true |
}; |
@@ -200,7 +210,7 @@ |
assertEquals(4, val2); |
assertEquals(4, obj1.bar); |
-// Define an accessor that has only a setter |
+// Define an accessor that has only a setter. |
Object.defineProperty(obj1, "setOnly", accessorOnlySet); |
desc = Object.getOwnPropertyDescriptor(obj1, "setOnly"); |
assertTrue(desc.configurable); |
@@ -212,7 +222,7 @@ |
assertEquals(1, obj1.setOnly = 1); |
assertEquals(1, val3); |
-// Add a getter - should not touch the setter |
+// Add a getter - should not touch the setter. |
Object.defineProperty(obj1, "setOnly", accessorOnlyGet); |
desc = Object.getOwnPropertyDescriptor(obj1, "setOnly"); |
assertTrue(desc.configurable); |
@@ -256,7 +266,7 @@ |
assertEquals(obj1.foobar, 1000); |
-// Redefine to writable descriptor - now writing to foobar should be allowed |
+// Redefine to writable descriptor - now writing to foobar should be allowed. |
Object.defineProperty(obj1, "foobar", dataWritable); |
desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); |
assertEquals(obj1.foobar, 3000); |
@@ -375,7 +385,7 @@ |
// Redefinition of an accessor defined using __defineGetter__ and |
-// __defineSetter__ |
+// __defineSetter__. |
function get(){return this.x} |
function set(x){this.x=x}; |
@@ -442,7 +452,7 @@ |
assertEquals(5, val1); |
assertEquals(5, obj4.bar); |
-// Make sure an error is thrown when trying to access to redefined function |
+// Make sure an error is thrown when trying to access to redefined function. |
try { |
obj4.bar(); |
assertTrue(false); |
@@ -453,7 +463,7 @@ |
// Test runtime calls to DefineOrRedefineDataProperty and |
// DefineOrRedefineAccessorProperty - make sure we don't |
-// crash |
+// crash. |
try { |
%DefineOrRedefineAccessorProperty(0, 0, 0, 0, 0); |
} catch (e) { |
@@ -497,3 +507,210 @@ |
} catch (e) { |
assertTrue(/illegal access/.test(e)); |
} |
+ |
+// Test that all possible differences in step 6 in DefineOwnProperty is |
Erik Corry
2010/05/21 13:21:57
differences ... is -> differences ... are
Rico
2010/05/25 06:24:50
Done.
|
+// exercised, i.e., any difference in the given property descriptor and the |
+// existing properties should not return true, but throw an error if the |
+// existing configurable property is false. |
+ |
+var obj5 = {}; |
+// Enumerable will default to false. |
+Object.defineProperty(obj5, 'foo', accessorNoConfigurable); |
+desc = Object.getOwnPropertyDescriptor(obj5, 'foo'); |
+// First, test that we are actually allowed to set the accessor if all |
+// values are of the descriptor are the same as the existing one. |
+Object.defineProperty(obj5, 'foo', accessorNoConfigurable); |
+ |
+// Different setter. |
+var descDifferent = { |
+ configurable:false, |
+ enumerable:false, |
+ set: setter1, |
+ get: getter2 |
+}; |
+ |
+try { |
+ Object.defineProperty(obj5, 'foo', descDifferent); |
+ assertTrue(false); |
+} catch (e) { |
+ assertTrue(/Cannot redefine property/.test(e)); |
+} |
+ |
+// Different getter. |
+descDifferent = { |
+ configurable:false, |
+ enumerable:false, |
+ set: setter2, |
+ get: getter1 |
+}; |
+ |
+try { |
+ Object.defineProperty(obj5, 'foo', descDifferent); |
+ assertTrue(false); |
+} catch (e) { |
+ assertTrue(/Cannot redefine property/.test(e)); |
+} |
+ |
+// Different enumerable. |
+descDifferent = { |
+ configurable:false, |
+ enumerable:true, |
+ set: setter2, |
+ get: getter2 |
+}; |
+ |
+try { |
+ Object.defineProperty(obj5, 'foo', descDifferent); |
+ assertTrue(false); |
+} catch (e) { |
+ assertTrue(/Cannot redefine property/.test(e)); |
+} |
+ |
+// Different configurable. |
+descDifferent = { |
+ configurable:false, |
+ enumerable:true, |
+ set: setter2, |
+ get: getter2 |
+}; |
+ |
+try { |
+ Object.defineProperty(obj5, 'foo', descDifferent); |
+ assertTrue(false); |
+} catch (e) { |
+ assertTrue(/Cannot redefine property/.test(e)); |
+} |
+ |
+// No difference. |
+descDifferent = { |
+ configurable:false, |
+ enumerable:false, |
+ set: setter2, |
+ get: getter2 |
+}; |
+// Make sure we can still redefine if all properties are the same. |
+Object.defineProperty(obj5, 'foo', descDifferent); |
+ |
+// Make sure that obj5 still holds the original values. |
+desc = Object.getOwnPropertyDescriptor(obj5, 'foo'); |
+assertEquals(desc.get, getter2); |
+assertEquals(desc.set, setter2); |
+assertFalse(desc.enumerable); |
+assertFalse(desc.configurable); |
+ |
+ |
+// Also exercise step 6 on data property, writable and enumerable |
+// defaults to false. |
+Object.defineProperty(obj5, 'bar', dataNoConfigurable); |
+ |
+// Test that redefinition with the same property descriptor is possible |
+Object.defineProperty(obj5, 'bar', dataNoConfigurable); |
+ |
+// Different value. |
+descDifferent = { |
+ configurable:false, |
+ enumerable:false, |
+ writable: false, |
+ value: 1999 |
+}; |
+ |
+try { |
+ Object.defineProperty(obj5, 'bar', descDifferent); |
+ assertTrue(false); |
+} catch (e) { |
+ assertTrue(/Cannot redefine property/.test(e)); |
+} |
+ |
+// Different writable. |
+descDifferent = { |
+ configurable:false, |
+ enumerable:false, |
+ writable: true, |
+ value: 2000 |
+}; |
+ |
+try { |
+ Object.defineProperty(obj5, 'bar', descDifferent); |
+ assertTrue(false); |
+} catch (e) { |
+ assertTrue(/Cannot redefine property/.test(e)); |
+} |
+ |
+ |
+// Different enumerable. |
+descDifferent = { |
+ configurable:false, |
+ enumerable:true , |
+ writable:false, |
+ value: 2000 |
+}; |
+ |
+try { |
+ Object.defineProperty(obj5, 'bar', descDifferent); |
+ assertTrue(false); |
+} catch (e) { |
+ assertTrue(/Cannot redefine property/.test(e)); |
+} |
+ |
+ |
+// Different configurable. |
+descDifferent = { |
+ configurable:true, |
+ enumerable:false, |
+ writable:false, |
+ value: 2000 |
+}; |
+ |
+try { |
+ Object.defineProperty(obj5, 'bar', descDifferent); |
+ assertTrue(false); |
+} catch (e) { |
+ assertTrue(/Cannot redefine property/.test(e)); |
+} |
+ |
+// No difference. |
+descDifferent = { |
+ configurable:false, |
+ enumerable:false, |
+ writable:false, |
+ value:2000 |
+}; |
+// Make sure we can still redefine if all properties are the same. |
+Object.defineProperty(obj5, 'bar', descDifferent); |
+ |
+// Make sure that obj5 still holds the original values. |
+desc = Object.getOwnPropertyDescriptor(obj5, 'bar'); |
+assertEquals(desc.value, 2000); |
+assertFalse(desc.writable); |
+assertFalse(desc.enumerable); |
+assertFalse(desc.configurable); |
+ |
+ |
+// Make sure that we can't overwrite +0 with -0 and vise verca. |
Erik Corry
2010/05/21 13:21:57
vise verca -> vice versa
(or was that deliberate
Rico
2010/05/25 06:24:50
No :-) done
|
+var descMinusZero = {value: -0, configurable: false}; |
+var descPlusZero = {value: +0, configurable: false}; |
+ |
+Object.defineProperty(obj5, 'minuszero', descMinusZero); |
+ |
+// Make sure we can redefine with -0. |
+Object.defineProperty(obj5, 'minuszero', descMinusZero); |
+ |
+try { |
+ Object.defineProperty(obj5, 'minuszero', descPlusZero); |
+ assertUnreachable(); |
+} catch (e) { |
+ assertTrue(/Cannot redefine property/.test(e)); |
+} |
+ |
+ |
+Object.defineProperty(obj5, 'pluszero', descPlusZero); |
+ |
+// Make sure we can redefine with +0. |
+Object.defineProperty(obj5, 'pluszero', descPlusZero); |
+ |
+try { |
+ Object.defineProperty(obj5, 'pluszero', descMinusZero); |
+ assertUnreachable(); |
+} catch (e) { |
+ assertTrue(/Cannot redefine property/.test(e)); |
+} |