Index: test/mjsunit/harmony/proxies.js |
diff --git a/test/mjsunit/harmony/proxies.js b/test/mjsunit/harmony/proxies.js |
index f87d756ee1e3ce6a9374c872abd2c7a5b8899f19..84641d589e8e8f838ccc11d9157d74907c03b9b3 100644 |
--- a/test/mjsunit/harmony/proxies.js |
+++ b/test/mjsunit/harmony/proxies.js |
@@ -28,6 +28,8 @@ |
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+// TODO(rossberg): test exception cases. |
+ |
// Getters. |
@@ -402,6 +404,79 @@ assertTrue("object" == typeof Proxy.create({})) |
+// Element (in). |
Mads Ager (chromium)
2011/07/19 08:18:05
We should have tests for the case where the Has tr
rossberg
2011/07/19 09:29:52
I left that for the TODO at the top, since I still
|
+ |
+var key |
+function TestIn(handler) { |
+ var o = Proxy.create(handler) |
+ assertTrue("a" in o) |
+ assertEquals("a", key) |
+ assertTrue(99 in o) |
+ assertEquals("99", key) |
+ assertFalse("z" in o) |
+ assertEquals("z", key) |
+ |
+ if ("b" in o) { |
+ } else { |
+ assertTrue(false) |
+ } |
+ assertEquals("b", key) |
+ |
+ if ("zz" in o) { |
+ assertTrue(false) |
+ } |
+ assertEquals("zz", key) |
+ |
+ if (!("c" in o)) { |
+ assertTrue(false) |
+ } |
+ assertEquals("c", key) |
+ |
+ if (!("zzz" in o)) { |
+ } else { |
+ assertTrue(false) |
+ } |
+ assertEquals("zzz", key) |
+} |
+ |
+TestIn({ |
+ has: function(k) { key = k; return k < "z" } |
+}) |
+TestIn({ |
+ has: function(k) { return this.has2(k) }, |
+ has2: function(k) { key = k; return k < "z" } |
+}) |
+TestIn({ |
+ getPropertyDescriptor: function(k) { |
+ key = k; return k < "z" ? {value: 42} : void 0 |
+ } |
+}) |
+TestIn({ |
+ getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) }, |
+ getPropertyDescriptor2: function(k) { |
+ key = k; return k < "z" ? {value: 42} : void 0 |
+ } |
+}) |
+TestIn({ |
+ getPropertyDescriptor: function(k) { |
+ key = k; return k < "z" ? {get value() { return 42 }} : void 0 |
+ } |
+}) |
+TestIn({ |
+ get: undefined, |
+ getPropertyDescriptor: function(k) { |
+ key = k; return k < "z" ? {value: 42} : void 0 |
+ } |
+}) |
+ |
+TestIn(Proxy.create({ |
+ get: function(pr, pk) { |
+ return function(k) { key = k; return k < "z" } |
+ } |
+})) |
+ |
+ |
+ |
// Instanceof (instanceof). |
function TestInstanceof() { |
@@ -529,3 +604,84 @@ TestKeys([], { |
}, |
getOwnPropertyDescriptor: function(k) { return {} } |
}) |
+ |
+ |
+ |
+// Fixing (Object.freeze, Object.seal, Object.preventExtensions, |
+// Object.isFrozen, Object.isSealed, Object.isExtensible) |
+ |
+function TestFix(names, handler) { |
+ var proto = {p: 77} |
+ var assertFixing = function(o, s, f, e) { |
+ assertEquals(s, Object.isSealed(o)) |
+ assertEquals(f, Object.isFrozen(o)) |
+ assertEquals(e, Object.isExtensible(o)) |
+ } |
+ |
+ var o1 = Proxy.create(handler, proto) |
+ assertFixing(o1, false, false, true) |
+ Object.seal(o1) |
+ assertFixing(o1, true, names.length === 0, false) |
+ assertArrayEquals(names.sort(), Object.getOwnPropertyNames(o1).sort()) |
+ assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), |
+ Object.keys(o1).sort()) |
+ assertEquals(proto, Object.getPrototypeOf(o1)) |
+ assertEquals(77, o1.p) |
+ for (var n in o1) { |
+ var desc = Object.getOwnPropertyDescriptor(o1, n) |
+ if (desc !== undefined) assertFalse(desc.configurable) |
+ } |
+ |
+ var o2 = Proxy.create(handler, proto) |
+ assertFixing(o2, false, false, true) |
+ Object.freeze(o2) |
+ assertFixing(o2, true, true, false) |
+ assertArrayEquals(names.sort(), Object.getOwnPropertyNames(o2).sort()) |
+ assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), |
+ Object.keys(o2).sort()) |
+ assertEquals(proto, Object.getPrototypeOf(o2)) |
+ assertEquals(77, o2.p) |
+ for (var n in o2) { |
+ var desc = Object.getOwnPropertyDescriptor(o2, n) |
+ if (desc !== undefined) assertFalse(desc.writable) |
+ if (desc !== undefined) assertFalse(desc.configurable) |
+ } |
+ |
+ var o3 = Proxy.create(handler, proto) |
+ assertFixing(o3, false, false, true) |
+ Object.preventExtensions(o3) |
+ assertFixing(o3, names.length === 0, names.length === 0, false) |
+ assertArrayEquals(names.sort(), Object.getOwnPropertyNames(o3).sort()) |
+ assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), |
+ Object.keys(o3).sort()) |
+ assertEquals(proto, Object.getPrototypeOf(o3)) |
+ assertEquals(77, o3.p) |
+} |
+ |
+TestFix([], { |
+ fix: function() { return {} } |
+}) |
+TestFix(["a", "b", "c", "d", "zz"], { |
+ fix: function() { |
+ return { |
+ a: {value: "a", writable: true, configurable: false, enumerable: true}, |
+ b: {value: 33, writable: false, configurable: false, enumerable: true}, |
+ c: {value: 0, writable: true, configurable: true, enumerable: true}, |
+ d: {value: true, writable: false, configurable: true, enumerable: true}, |
+ zz: {value: 0, enumerable: false} |
+ } |
+ } |
+}) |
+TestFix(["a"], { |
+ fix: function() { return this.fix2() }, |
+ fix2: function() { |
+ return {a: {value: 4, writable: true, configurable: true, enumerable: true}} |
+ } |
+}) |
+TestFix(["b"], { |
+ get fix() { |
+ return function() { |
+ return {b: {configurable: true, writable: true, enumerable: true}} |
+ } |
+ } |
+}) |