Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(163)

Side by Side Diff: test/mjsunit/harmony/proxies.js

Issue 7237050: Implement Object.getOwnPropertyDescriptor for proxies. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« src/v8natives.js ('K') | « src/v8natives.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Flags: --harmony-proxies 1 // Flags: --harmony-proxies
2 2
3 // Copyright 2008 the V8 project authors. All rights reserved. 3 // Copyright 2008 the V8 project authors. All rights reserved.
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // met:
7 // 7 //
8 // * Redistributions of source code must retain the above copyright 8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer. 9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above 10 // * Redistributions in binary form must reproduce the above
(...skipping 17 matching lines...) Expand all
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 29
30 30
31 31
32 // Getters. 32 // Getters.
33 33
34 function TestGet(handler) { 34 function TestGet(handler) {
35 var o = Proxy.create(handler) 35 var o = Proxy.create(handler)
36 assertEquals(42, o.a) 36 assertEquals(42, o.a)
37 assertEquals(42, o["b"]) 37 assertEquals(42, o["b"])
38 // assertEquals(Object.getOwnPropertyDescriptor(o, "b").value, 42)
39 } 38 }
40 39
41 TestGet({ 40 TestGet({
42 get: function(r, k) { return 42 } 41 get: function(r, k) { return 42 }
43 }) 42 })
44 TestGet({ 43 TestGet({
45 get: function(r, k) { return this.get2(r, k) }, 44 get: function(r, k) { return this.get2(r, k) },
46 get2: function(r, k) { return 42 } 45 get2: function(r, k) { return 42 }
47 }) 46 })
48 TestGet({ 47 TestGet({
(...skipping 13 matching lines...) Expand all
62 getPropertyDescriptor: function(k) { return {value: 42} } 61 getPropertyDescriptor: function(k) { return {value: 42} }
63 }) 62 })
64 63
65 TestGet(Proxy.create({ 64 TestGet(Proxy.create({
66 get: function(pr, pk) { 65 get: function(pr, pk) {
67 return function(r, k) { return 42 } 66 return function(r, k) { return 42 }
68 } 67 }
69 })) 68 }))
70 69
71 70
71 function TestGetCall(handler) {
72 var p = Proxy.create(handler)
73 assertEquals(55, p.f())
74 assertEquals(55, p.f("unused", "arguments"))
75 assertEquals(55, p.f.call(p))
76 assertEquals(55, p.withargs(45, 5))
77 assertEquals(55, p.withargs.call(p, 11, 22))
78 assertEquals("6655", "66" + p) // calls p.toString
79 }
80
81 TestGetCall({
82 get: function(r, k) { return function() { return 55 } }
83 })
84 TestGetCall({
85 get: function(r, k) { return this.get2(r, k) },
86 get2: function(r, k) { return function() { return 55 } }
87 })
88 TestGetCall({
89 getPropertyDescriptor: function(k) {
90 return {value: function() { return 55 }}
91 }
92 })
93 TestGetCall({
94 getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) },
95 getPropertyDescriptor2: function(k) {
96 return {value: function() { return 55 }}
97 }
98 })
99 TestGetCall({
100 getPropertyDescriptor: function(k) {
101 return {get value() { return function() { return 55 } }}
102 }
103 })
104 TestGetCall({
105 get: undefined,
106 getPropertyDescriptor: function(k) {
107 return {value: function() { return 55 }}
108 }
109 })
110 TestGetCall({
111 get: function(r, k) {
112 if (k == "gg") {
113 return function() { return 55 }
114 } else if (k == "withargs") {
115 return function(n, m) { return n + m * 2 }
116 } else {
117 return function() { return this.gg() }
118 }
119 }
120 })
121
122 TestGetCall(Proxy.create({
123 get: function(pr, pk) {
124 return function(r, k) { return function() { return 55 } }
125 }
126 }))
127
128
72 129
73 // Setters. 130 // Setters.
74 131
75 var key 132 var key
76 var val 133 var val
77 function TestSet(handler) { 134 function TestSet(handler) {
78 var o = Proxy.create(handler) 135 var o = Proxy.create(handler)
79 assertEquals(42, o.a = 42) 136 assertEquals(42, o.a = 42)
80 assertEquals("a", key) 137 assertEquals("a", key)
81 assertEquals(42, val) 138 assertEquals(42, val)
82 assertEquals(43, o["b"] = 43) 139 assertEquals(43, o["b"] = 43)
83 assertEquals("b", key) 140 assertEquals("b", key)
84 assertEquals(43, val) 141 assertEquals(43, val)
85 // assertTrue(Object.defineProperty(o, "c", {value: 44}))
86 // assertEquals("c", key)
87 // assertEquals(44, val)
88 } 142 }
89 143
90 TestSet({ 144 TestSet({
91 set: function(r, k, v) { key = k; val = v; return true } 145 set: function(r, k, v) { key = k; val = v; return true }
92 }) 146 })
93 TestSet({ 147 TestSet({
94 set: function(r, k, v) { return this.set2(r, k, v) }, 148 set: function(r, k, v) { return this.set2(r, k, v) },
95 set2: function(r, k, v) { key = k; val = v; return true } 149 set2: function(r, k, v) { key = k; val = v; return true }
96 }) 150 })
97 TestSet({ 151 TestSet({
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 }) 196 })
143 197
144 TestSet(Proxy.create({ 198 TestSet(Proxy.create({
145 get: function(pr, pk) { 199 get: function(pr, pk) {
146 return function(r, k, v) { key = k; val = v; return true } 200 return function(r, k, v) { key = k; val = v; return true }
147 } 201 }
148 })) 202 }))
149 203
150 204
151 205
152 // Property definition (Object.defineProperty). 206 // Property definition (Object.defineProperty and Object.defineProperties).
153 207
154 var key 208 var key
155 var desc 209 var desc
156 function TestDefine(handler) { 210 function TestDefine(handler) {
157 var o = Proxy.create(handler) 211 var o = Proxy.create(handler)
158 assertEquals(o, Object.defineProperty(o, "a", {value: 44})) 212 assertEquals(o, Object.defineProperty(o, "a", {value: 44}))
159 assertEquals("a", key) 213 assertEquals("a", key)
160 assertEquals(1, Object.getOwnPropertyNames(desc).length) 214 assertEquals(1, Object.getOwnPropertyNames(desc).length)
161 assertEquals(44, desc.value) 215 assertEquals(44, desc.value)
162 216
(...skipping 23 matching lines...) Expand all
186 240
187 assertEquals(o, Object.defineProperty(o, "e", {get: function(){ return 5 }})) 241 assertEquals(o, Object.defineProperty(o, "e", {get: function(){ return 5 }}))
188 assertEquals("e", key) 242 assertEquals("e", key)
189 assertEquals(1, Object.getOwnPropertyNames(desc).length) 243 assertEquals(1, Object.getOwnPropertyNames(desc).length)
190 assertEquals(5, desc.get()) 244 assertEquals(5, desc.get())
191 245
192 assertEquals(o, Object.defineProperty(o, "zzz", {})) 246 assertEquals(o, Object.defineProperty(o, "zzz", {}))
193 assertEquals("zzz", key) 247 assertEquals("zzz", key)
194 assertEquals(0, Object.getOwnPropertyNames(desc).length) 248 assertEquals(0, Object.getOwnPropertyNames(desc).length)
195 249
196 // This test requires [s in proxy] to be implemented first. 250 // TODO(rossberg): This test requires [s in proxy] to be implemented first.
197 // var d = Proxy.create({ 251 // var d = Proxy.create({
198 // get: function(r, k) { return (k === "value") ? 77 : void 0 }, 252 // get: function(r, k) { return (k === "value") ? 77 : void 0 },
199 // getOwnPropertyNames: function() { return ["value"] } 253 // getOwnPropertyNames: function() { return ["value"] }
200 // }) 254 // })
201 // assertEquals(1, Object.getOwnPropertyNames(d).length) 255 // assertEquals(1, Object.getOwnPropertyNames(d).length)
202 // assertEquals(77, d.value) 256 // assertEquals(77, d.value)
203 // assertEquals(o, Object.defineProperty(o, "p", d)) 257 // assertEquals(o, Object.defineProperty(o, "p", d))
204 // assertEquals("p", key) 258 // assertEquals("p", key)
205 // assertEquals(1, Object.getOwnPropertyNames(desc).length) 259 // assertEquals(1, Object.getOwnPropertyNames(desc).length)
206 // assertEquals(77, desc.value) 260 // assertEquals(77, desc.value)
261
262 var props = {
263 'bla': {},
264 blub: {get: function() { return true }},
265 '': {get value() { return 20 }},
266 last: {value: 21, configurable: true, mine: "eyes"}
267 }
268 Object.defineProperty(props, "hidden", {value: "hidden", enumerable: false})
269 assertEquals(o, Object.defineProperties(o, props))
270 assertEquals("last", key)
271 assertEquals(2, Object.getOwnPropertyNames(desc).length)
272 assertEquals(21, desc.value)
273 assertEquals(true, desc.configurable)
274 assertEquals(undefined, desc.mine) // Arguably a bug in the spec...
207 } 275 }
208 276
209 TestDefine({ 277 TestDefine({
210 defineProperty: function(k, d) { key = k; desc = d; return true } 278 defineProperty: function(k, d) { key = k; desc = d; return true }
211 }) 279 })
212 TestDefine({ 280 TestDefine({
213 defineProperty: function(k, d) { return this.defineProperty2(k, d) }, 281 defineProperty: function(k, d) { return this.defineProperty2(k, d) },
214 defineProperty2: function(k, d) { key = k; desc = d; return true } 282 defineProperty2: function(k, d) { key = k; desc = d; return true }
215 }) 283 })
216 TestDefine(Proxy.create({ 284 TestDefine(Proxy.create({
217 get: function(pr, pk) { 285 get: function(pr, pk) {
218 return function(k, d) { key = k; desc = d; return true } 286 return function(k, d) { key = k; desc = d; return true }
219 } 287 }
220 })) 288 }))
221 289
222 290
223 291
292 // Property descriptors (Object.getOwnPropertyDescriptor).
293
294 function TestDescriptor(handler) {
295 var o = Proxy.create(handler)
296 var descs = [
297 {configurable: true},
298 {value: 34, enumerable: true, configurable: true},
299 {value: 3, writable: false, mine: "eyes", configurable: true},
300 {get value() { return 20 }, get configurable() { return true }},
301 {get: function() { "get" }, set: function() { "set" }, configurable: true}
302 ]
303 for (var i = 0; i < descs.length; ++i) {
304 assertEquals(o, Object.defineProperty(o, i, descs[i]))
305 var desc = Object.getOwnPropertyDescriptor(o, i)
306 for (p in descs[i]) {
307 // TODO(rossberg): Ignore user attributes as long as the spec isn't
308 // fixed suitably.
309 if (p != "mine") assertEquals(descs[i][p], desc[p])
310 }
311 assertEquals(undefined, Object.getOwnPropertyDescriptor(o, "absent"))
312 }
313 }
314
315
316 TestDescriptor({
317 defineProperty: function(k, d) { this["__" + k] = d; return true },
318 getOwnPropertyDescriptor: function(k) { return this["__" + k] }
319 })
320 TestDescriptor({
321 defineProperty: function(k, d) { this["__" + k] = d; return true },
322 getOwnPropertyDescriptor: function(k) {
323 return this.getOwnPropertyDescriptor2(k)
324 },
325 getOwnPropertyDescriptor2: function(k) { return this["__" + k] }
326 })
327
328
329
224 // Comparison. 330 // Comparison.
225 331
226 function TestComparison(eq) { 332 function TestComparison(eq) {
227 var o1 = Proxy.create({}) 333 var o1 = Proxy.create({})
228 var o2 = Proxy.create({}) 334 var o2 = Proxy.create({})
229 335
230 assertTrue(eq(o1, o1)) 336 assertTrue(eq(o1, o1))
231 assertTrue(eq(o2, o2)) 337 assertTrue(eq(o2, o2))
232 assertTrue(!eq(o1, o2)) 338 assertTrue(!eq(o1, o2))
233 assertTrue(!eq(o1, {})) 339 assertTrue(!eq(o1, {}))
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 assertSame(Object.getPrototypeOf(p1), null) 408 assertSame(Object.getPrototypeOf(p1), null)
303 assertSame(Object.getPrototypeOf(p2), o) 409 assertSame(Object.getPrototypeOf(p2), o)
304 assertSame(Object.getPrototypeOf(p3), p2) 410 assertSame(Object.getPrototypeOf(p3), p2)
305 assertSame(Object.getPrototypeOf(p4), null) 411 assertSame(Object.getPrototypeOf(p4), null)
306 } 412 }
307 413
308 TestPrototype() 414 TestPrototype()
309 415
310 416
311 417
312 // Property names (Object.getOwnPropertyNames). 418 // Property names (Object.getOwnPropertyNames, Object.keys).
313 419
314 function TestPropertyNames(names, handler) { 420 function TestPropertyNames(names, handler) {
315 var p = Proxy.create(handler) 421 var p = Proxy.create(handler)
316 assertArrayEquals(names, Object.getOwnPropertyNames(p)) 422 assertArrayEquals(names, Object.getOwnPropertyNames(p))
317 } 423 }
318 424
319 TestPropertyNames([], { 425 TestPropertyNames([], {
320 getOwnPropertyNames: function() { return [] } 426 getOwnPropertyNames: function() { return [] }
321 }) 427 })
322 TestPropertyNames(["a", "zz", " ", "0"], { 428 TestPropertyNames(["a", "zz", " ", "0"], {
323 getOwnPropertyNames: function() { return ["a", "zz", " ", 0] } 429 getOwnPropertyNames: function() { return ["a", "zz", " ", 0] }
324 }) 430 })
325 TestPropertyNames(["throw", "function "], { 431 TestPropertyNames(["throw", "function "], {
326 getOwnPropertyNames: function() { return this.getOwnPropertyNames2() }, 432 getOwnPropertyNames: function() { return this.getOwnPropertyNames2() },
327 getOwnPropertyNames2: function() { return ["throw", "function "] } 433 getOwnPropertyNames2: function() { return ["throw", "function "] }
328 }) 434 })
329 TestPropertyNames(["[object Object]"], { 435 TestPropertyNames(["[object Object]"], {
330 get getOwnPropertyNames() { 436 get getOwnPropertyNames() {
331 return function() { return [{}] } 437 return function() { return [{}] }
332 } 438 }
333 }) 439 })
440
441
442 function TestKeys(names, handler) {
443 var p = Proxy.create(handler)
444 assertArrayEquals(names, Object.keys(p))
445 }
446
447 TestKeys([], {
448 keys: function() { return [] }
449 })
450 TestKeys(["a", "zz", " ", "0"], {
451 keys: function() { return ["a", "zz", " ", 0] }
452 })
453 TestKeys(["throw", "function "], {
454 keys: function() { return this.keys2() },
455 keys2: function() { return ["throw", "function "] }
456 })
457 TestKeys(["[object Object]"], {
458 get keys() {
459 return function() { return [{}] }
460 }
461 })
462 TestKeys(["a", "0"], {
463 getOwnPropertyNames: function() { return ["a", 23, "zz", "", 0] },
464 getOwnPropertyDescriptor: function(k) { return {enumerable: k.length == 1} }
465 })
466 TestKeys(["23", "zz", ""], {
467 getOwnPropertyNames: function() { return this.getOwnPropertyNames2() },
468 getOwnPropertyNames2: function() { return ["a", 23, "zz", "", 0] },
469 getOwnPropertyDescriptor: function(k) {
470 return this.getOwnPropertyDescriptor2(k)
471 },
472 getOwnPropertyDescriptor2: function(k) { return {enumerable: k.length != 1} }
473 })
474 TestKeys(["a", "b", "c", "5"], {
475 get getOwnPropertyNames() {
476 return function() { return ["0", 4, "a", "b", "c", 5] }
477 },
478 get getOwnPropertyDescriptor() {
479 return function(k) { return {enumerable: k >= "44"} }
480 }
481 })
482 TestKeys([], {
483 get getOwnPropertyNames() {
484 return function() { return ["a", "b", "c"] }
485 },
486 getOwnPropertyDescriptor: function(k) { return {} }
487 })
OLDNEW
« src/v8natives.js ('K') | « src/v8natives.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698