| Index: test/mjsunit/harmony/proxies.js
|
| diff --git a/test/mjsunit/harmony/proxies.js b/test/mjsunit/harmony/proxies.js
|
| index 84641d589e8e8f838ccc11d9157d74907c03b9b3..640033d9cc4a1f1081d69d5d5977308ca4bd63a5 100644
|
| --- a/test/mjsunit/harmony/proxies.js
|
| +++ b/test/mjsunit/harmony/proxies.js
|
| @@ -42,22 +42,27 @@ function TestGet(handler) {
|
| TestGet({
|
| get: function(r, k) { return 42 }
|
| })
|
| +
|
| TestGet({
|
| get: function(r, k) { return this.get2(r, k) },
|
| get2: function(r, k) { return 42 }
|
| })
|
| +
|
| TestGet({
|
| getPropertyDescriptor: function(k) { return {value: 42} }
|
| })
|
| +
|
| TestGet({
|
| getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) },
|
| getPropertyDescriptor2: function(k) { return {value: 42} }
|
| })
|
| +
|
| TestGet({
|
| getPropertyDescriptor: function(k) {
|
| return {get value() { return 42 }}
|
| }
|
| })
|
| +
|
| TestGet({
|
| get: undefined,
|
| getPropertyDescriptor: function(k) { return {value: 42} }
|
| @@ -83,32 +88,38 @@ function TestGetCall(handler) {
|
| TestGetCall({
|
| get: function(r, k) { return function() { return 55 } }
|
| })
|
| +
|
| TestGetCall({
|
| get: function(r, k) { return this.get2(r, k) },
|
| get2: function(r, k) { return function() { return 55 } }
|
| })
|
| +
|
| TestGetCall({
|
| getPropertyDescriptor: function(k) {
|
| return {value: function() { return 55 }}
|
| }
|
| })
|
| +
|
| TestGetCall({
|
| getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) },
|
| getPropertyDescriptor2: function(k) {
|
| return {value: function() { return 55 }}
|
| }
|
| })
|
| +
|
| TestGetCall({
|
| getPropertyDescriptor: function(k) {
|
| return {get value() { return function() { return 55 } }}
|
| }
|
| })
|
| +
|
| TestGetCall({
|
| get: undefined,
|
| getPropertyDescriptor: function(k) {
|
| return {value: function() { return 55 }}
|
| }
|
| })
|
| +
|
| TestGetCall({
|
| get: function(r, k) {
|
| if (k == "gg") {
|
| @@ -146,14 +157,17 @@ function TestSet(handler) {
|
| TestSet({
|
| set: function(r, k, v) { key = k; val = v; return true }
|
| })
|
| +
|
| TestSet({
|
| set: function(r, k, v) { return this.set2(r, k, v) },
|
| set2: function(r, k, v) { key = k; val = v; return true }
|
| })
|
| +
|
| TestSet({
|
| getOwnPropertyDescriptor: function(k) { return {writable: true} },
|
| defineProperty: function(k, desc) { key = k; val = desc.value }
|
| })
|
| +
|
| TestSet({
|
| getOwnPropertyDescriptor: function(k) {
|
| return this.getOwnPropertyDescriptor2(k)
|
| @@ -162,22 +176,26 @@ TestSet({
|
| defineProperty: function(k, desc) { this.defineProperty2(k, desc) },
|
| defineProperty2: function(k, desc) { key = k; val = desc.value }
|
| })
|
| +
|
| TestSet({
|
| getOwnPropertyDescriptor: function(k) {
|
| return {get writable() { return true }}
|
| },
|
| defineProperty: function(k, desc) { key = k; val = desc.value }
|
| })
|
| +
|
| TestSet({
|
| getOwnPropertyDescriptor: function(k) {
|
| return {set: function(v) { key = k; val = v }}
|
| }
|
| })
|
| +
|
| TestSet({
|
| getOwnPropertyDescriptor: function(k) { return null },
|
| getPropertyDescriptor: function(k) { return {writable: true} },
|
| defineProperty: function(k, desc) { key = k; val = desc.value }
|
| })
|
| +
|
| TestSet({
|
| getOwnPropertyDescriptor: function(k) { return null },
|
| getPropertyDescriptor: function(k) {
|
| @@ -185,12 +203,14 @@ TestSet({
|
| },
|
| defineProperty: function(k, desc) { key = k; val = desc.value }
|
| })
|
| +
|
| TestSet({
|
| getOwnPropertyDescriptor: function(k) { return null },
|
| getPropertyDescriptor: function(k) {
|
| return {set: function(v) { key = k; val = v }}
|
| }
|
| })
|
| +
|
| TestSet({
|
| getOwnPropertyDescriptor: function(k) { return null },
|
| getPropertyDescriptor: function(k) { return null },
|
| @@ -279,10 +299,12 @@ function TestDefine(handler) {
|
| TestDefine({
|
| defineProperty: function(k, d) { key = k; desc = d; return true }
|
| })
|
| +
|
| TestDefine({
|
| defineProperty: function(k, d) { return this.defineProperty2(k, d) },
|
| defineProperty2: function(k, d) { key = k; desc = d; return true }
|
| })
|
| +
|
| TestDefine(Proxy.create({
|
| get: function(pr, pk) {
|
| return function(k, d) { key = k; desc = d; return true }
|
| @@ -323,10 +345,12 @@ function TestDelete(handler) {
|
| TestDelete({
|
| 'delete': function(k) { key = k; return k < "z" }
|
| })
|
| +
|
| TestDelete({
|
| 'delete': function(k) { return this.delete2(k) },
|
| delete2: function(k) { key = k; return k < "z" }
|
| })
|
| +
|
| TestDelete(Proxy.create({
|
| get: function(pr, pk) {
|
| return function(k) { key = k; return k < "z" }
|
| @@ -363,6 +387,7 @@ TestDescriptor({
|
| defineProperty: function(k, d) { this["__" + k] = d; return true },
|
| getOwnPropertyDescriptor: function(k) { return this["__" + k] }
|
| })
|
| +
|
| TestDescriptor({
|
| defineProperty: function(k, d) { this["__" + k] = d; return true },
|
| getOwnPropertyDescriptor: function(k) {
|
| @@ -404,7 +429,7 @@ assertTrue("object" == typeof Proxy.create({}))
|
|
|
|
|
|
|
| -// Element (in).
|
| +// Membership test (in).
|
|
|
| var key
|
| function TestIn(handler) {
|
| @@ -442,26 +467,31 @@ function TestIn(handler) {
|
| 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) {
|
| @@ -477,7 +507,65 @@ TestIn(Proxy.create({
|
|
|
|
|
|
|
| -// Instanceof (instanceof).
|
| +// Own Properties (Object.prototype.hasOwnProperty).
|
| +
|
| +var key
|
| +function TestHasOwn(handler) {
|
| + var o = Proxy.create(handler)
|
| + assertTrue(Object.prototype.hasOwnProperty.call(o, "a"))
|
| + assertEquals("a", key)
|
| + assertTrue(Object.prototype.hasOwnProperty.call(o, 99))
|
| + assertEquals("99", key)
|
| + assertFalse(Object.prototype.hasOwnProperty.call(o, "z"))
|
| + assertEquals("z", key)
|
| +}
|
| +
|
| +TestHasOwn({
|
| + hasOwn: function(k) { key = k; return k < "z" }
|
| +})
|
| +
|
| +TestHasOwn({
|
| + hasOwn: function(k) { return this.hasOwn2(k) },
|
| + hasOwn2: function(k) { key = k; return k < "z" }
|
| +})
|
| +
|
| +TestHasOwn({
|
| + getOwnPropertyDescriptor: function(k) {
|
| + key = k; return k < "z" ? {value: 42} : void 0
|
| + }
|
| +})
|
| +
|
| +TestHasOwn({
|
| + getOwnPropertyDescriptor: function(k) {
|
| + return this.getOwnPropertyDescriptor2(k)
|
| + },
|
| + getOwnPropertyDescriptor2: function(k) {
|
| + key = k; return k < "z" ? {value: 42} : void 0
|
| + }
|
| +})
|
| +
|
| +TestHasOwn({
|
| + getOwnPropertyDescriptor: function(k) {
|
| + key = k; return k < "z" ? {get value() { return 42 }} : void 0
|
| + }
|
| +})
|
| +
|
| +TestHasOwn({
|
| + hasOwn: undefined,
|
| + getOwnPropertyDescriptor: function(k) {
|
| + key = k; return k < "z" ? {value: 42} : void 0
|
| + }
|
| +})
|
| +
|
| +TestHasOwn(Proxy.create({
|
| + get: function(pr, pk) {
|
| + return function(k) { key = k; return k < "z" }
|
| + }
|
| +}))
|
| +
|
| +
|
| +
|
| +// Instanceof (instanceof)
|
|
|
| function TestInstanceof() {
|
| var o = {}
|
| @@ -514,7 +602,7 @@ TestInstanceof()
|
|
|
|
|
|
|
| -// Prototype (Object.getPrototypeOf).
|
| +// Prototype (Object.getPrototypeOf, Object.prototype.isPrototypeOf).
|
|
|
| function TestPrototype() {
|
| var o = {}
|
| @@ -528,6 +616,32 @@ function TestPrototype() {
|
| assertSame(Object.getPrototypeOf(p2), o)
|
| assertSame(Object.getPrototypeOf(p3), p2)
|
| assertSame(Object.getPrototypeOf(p4), null)
|
| +
|
| + assertTrue(Object.prototype.isPrototypeOf(o))
|
| + assertFalse(Object.prototype.isPrototypeOf(p1))
|
| + assertTrue(Object.prototype.isPrototypeOf(p2))
|
| + assertTrue(Object.prototype.isPrototypeOf(p3))
|
| + assertFalse(Object.prototype.isPrototypeOf(p4))
|
| + assertTrue(Object.prototype.isPrototypeOf.call(Object.prototype, o))
|
| + assertFalse(Object.prototype.isPrototypeOf.call(Object.prototype, p1))
|
| + assertTrue(Object.prototype.isPrototypeOf.call(Object.prototype, p2))
|
| + assertTrue(Object.prototype.isPrototypeOf.call(Object.prototype, p3))
|
| + assertFalse(Object.prototype.isPrototypeOf.call(Object.prototype, p4))
|
| + assertFalse(Object.prototype.isPrototypeOf.call(o, o))
|
| + assertFalse(Object.prototype.isPrototypeOf.call(o, p1))
|
| + assertTrue(Object.prototype.isPrototypeOf.call(o, p2))
|
| + assertTrue(Object.prototype.isPrototypeOf.call(o, p3))
|
| + assertFalse(Object.prototype.isPrototypeOf.call(o, p4))
|
| + assertFalse(Object.prototype.isPrototypeOf.call(p1, p1))
|
| + assertFalse(Object.prototype.isPrototypeOf.call(p1, o))
|
| + assertFalse(Object.prototype.isPrototypeOf.call(p1, p2))
|
| + assertFalse(Object.prototype.isPrototypeOf.call(p1, p3))
|
| + assertFalse(Object.prototype.isPrototypeOf.call(p1, p4))
|
| + assertFalse(Object.prototype.isPrototypeOf.call(p2, p1))
|
| + assertFalse(Object.prototype.isPrototypeOf.call(p2, p2))
|
| + assertTrue(Object.prototype.isPrototypeOf.call(p2, p3))
|
| + assertFalse(Object.prototype.isPrototypeOf.call(p2, p4))
|
| + assertFalse(Object.prototype.isPrototypeOf.call(p3, p2))
|
| }
|
|
|
| TestPrototype()
|
| @@ -544,13 +658,16 @@ function TestPropertyNames(names, handler) {
|
| TestPropertyNames([], {
|
| getOwnPropertyNames: function() { return [] }
|
| })
|
| +
|
| TestPropertyNames(["a", "zz", " ", "0"], {
|
| getOwnPropertyNames: function() { return ["a", "zz", " ", 0] }
|
| })
|
| +
|
| TestPropertyNames(["throw", "function "], {
|
| getOwnPropertyNames: function() { return this.getOwnPropertyNames2() },
|
| getOwnPropertyNames2: function() { return ["throw", "function "] }
|
| })
|
| +
|
| TestPropertyNames(["[object Object]"], {
|
| get getOwnPropertyNames() {
|
| return function() { return [{}] }
|
| @@ -566,22 +683,27 @@ function TestKeys(names, handler) {
|
| TestKeys([], {
|
| keys: function() { return [] }
|
| })
|
| +
|
| TestKeys(["a", "zz", " ", "0"], {
|
| keys: function() { return ["a", "zz", " ", 0] }
|
| })
|
| +
|
| TestKeys(["throw", "function "], {
|
| keys: function() { return this.keys2() },
|
| keys2: function() { return ["throw", "function "] }
|
| })
|
| +
|
| TestKeys(["[object Object]"], {
|
| get keys() {
|
| return function() { return [{}] }
|
| }
|
| })
|
| +
|
| TestKeys(["a", "0"], {
|
| getOwnPropertyNames: function() { return ["a", 23, "zz", "", 0] },
|
| getOwnPropertyDescriptor: function(k) { return {enumerable: k.length == 1} }
|
| })
|
| +
|
| TestKeys(["23", "zz", ""], {
|
| getOwnPropertyNames: function() { return this.getOwnPropertyNames2() },
|
| getOwnPropertyNames2: function() { return ["a", 23, "zz", "", 0] },
|
| @@ -590,6 +712,7 @@ TestKeys(["23", "zz", ""], {
|
| },
|
| getOwnPropertyDescriptor2: function(k) { return {enumerable: k.length != 1} }
|
| })
|
| +
|
| TestKeys(["a", "b", "c", "5"], {
|
| get getOwnPropertyNames() {
|
| return function() { return ["0", 4, "a", "b", "c", 5] }
|
| @@ -598,6 +721,7 @@ TestKeys(["a", "b", "c", "5"], {
|
| return function(k) { return {enumerable: k >= "44"} }
|
| }
|
| })
|
| +
|
| TestKeys([], {
|
| get getOwnPropertyNames() {
|
| return function() { return ["a", "b", "c"] }
|
| @@ -661,6 +785,7 @@ function TestFix(names, handler) {
|
| TestFix([], {
|
| fix: function() { return {} }
|
| })
|
| +
|
| TestFix(["a", "b", "c", "d", "zz"], {
|
| fix: function() {
|
| return {
|
| @@ -672,12 +797,14 @@ TestFix(["a", "b", "c", "d", "zz"], {
|
| }
|
| }
|
| })
|
| +
|
| 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() {
|
| @@ -685,3 +812,87 @@ TestFix(["b"], {
|
| }
|
| }
|
| })
|
| +
|
| +
|
| +
|
| +// String conversion (Object.prototype.toString, Object.prototype.toLocaleString)
|
| +
|
| +var key
|
| +function TestToString(handler) {
|
| + var o = Proxy.create(handler)
|
| + key = ""
|
| + assertEquals("[object Object]", Object.prototype.toString.call(o))
|
| + assertEquals("", key)
|
| + assertEquals("my_proxy", Object.prototype.toLocaleString.call(o))
|
| + assertEquals("toString", key)
|
| +}
|
| +
|
| +TestToString({
|
| + get: function(r, k) { key = k; return function() { return "my_proxy" } }
|
| +})
|
| +
|
| +TestToString({
|
| + get: function(r, k) { return this.get2(r, k) },
|
| + get2: function(r, k) { key = k; return function() { return "my_proxy" } }
|
| +})
|
| +
|
| +TestToString(Proxy.create({
|
| + get: function(pr, pk) {
|
| + return function(r, k) { key = k; return function() { return "my_proxy" } }
|
| + }
|
| +}))
|
| +
|
| +
|
| +
|
| +// Value conversion (Object.prototype.toValue)
|
| +
|
| +function TestValueOf(handler) {
|
| + var o = Proxy.create(handler)
|
| + assertSame(o, Object.prototype.valueOf.call(o))
|
| +}
|
| +
|
| +TestValueOf({})
|
| +
|
| +
|
| +
|
| +// Enumerability (Object.prototype.propertyIsEnumerable)
|
| +
|
| +var key
|
| +function TestIsEnumerable(handler) {
|
| + var o = Proxy.create(handler)
|
| + assertTrue(Object.prototype.propertyIsEnumerable.call(o, "a"))
|
| + assertEquals("a", key)
|
| + assertTrue(Object.prototype.propertyIsEnumerable.call(o, 2))
|
| + assertEquals("2", key)
|
| + assertFalse(Object.prototype.propertyIsEnumerable.call(o, "z"))
|
| + assertEquals("z", key)
|
| +}
|
| +
|
| +TestIsEnumerable({
|
| + getOwnPropertyDescriptor: function(k) {
|
| + key = k; return {enumerable: k < "z", configurable: true}
|
| + },
|
| +})
|
| +
|
| +TestIsEnumerable({
|
| + getOwnPropertyDescriptor: function(k) {
|
| + return this.getOwnPropertyDescriptor2(k)
|
| + },
|
| + getOwnPropertyDescriptor2: function(k) {
|
| + key = k; return {enumerable: k < "z", configurable: true}
|
| + },
|
| +})
|
| +
|
| +TestIsEnumerable({
|
| + getOwnPropertyDescriptor: function(k) {
|
| + key = k; return {get enumerable() { return k < "z" }, configurable: true}
|
| + },
|
| +})
|
| +
|
| +TestIsEnumerable(Proxy.create({
|
| + get: function(pr, pk) {
|
| + return function(k) {
|
| + key = k; return {enumerable: k < "z", configurable: true}
|
| + }
|
| + }
|
| +}))
|
|
|