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

Side by Side Diff: test/mjsunit/harmony/proxies-get-own-property-descriptor.js

Issue 1451703003: [proxies] Wire up Object.getOwnPropertyDescriptor (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: moved test file Created 5 years, 1 month 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
« no previous file with comments | « src/runtime/runtime-object.cc ('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
(Empty)
1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Flags: --harmony-proxies
6
7 var target = {};
8 var configurable_desc = {
9 value: 123,
10 configurable: true,
11 writable: true,
12 enumerable: false,
13 };
14 Object.defineProperty(target, "configurable", configurable_desc);
15 var nonconfigurable_desc = {
16 value: 234,
17 configurable: false,
18 writable: false,
19 enumerable: true
20 }
21 Object.defineProperty(target, "nonconfigurable", nonconfigurable_desc);
22
23 var proxied_desc = {
24 value: 345,
25 configurable: true
26 };
27
28 var handler = {
29 "getOwnPropertyDescriptor": function(target, name) {
30 if (name === "proxied") {
31 return proxied_desc;
32 }
33 if (name === "return_null") {
34 return null;
35 }
36 return Object.getOwnPropertyDescriptor(target, name);
37 }
38 };
39
40 var proxy = new Proxy(target, handler);
41 var proxy_without_handler = new Proxy(target, {});
42
43 // Checking basic functionality:
44
45 assertEquals(configurable_desc,
46 Object.getOwnPropertyDescriptor(proxy, "configurable"));
47 assertEquals(nonconfigurable_desc,
48 Object.getOwnPropertyDescriptor(proxy, "nonconfigurable"));
49 assertEquals({ value: proxied_desc.value,
50 configurable: proxied_desc.configurable,
51 enumerable: false,
52 writable: false },
53 Object.getOwnPropertyDescriptor(proxy, "proxied"));
54 assertEquals(configurable_desc,
55 Object.getOwnPropertyDescriptor(proxy_without_handler,
56 "configurable"));
57 assertEquals(nonconfigurable_desc,
58 Object.getOwnPropertyDescriptor(proxy_without_handler,
59 "nonconfigurable"));
60
61 assertThrows('Object.getOwnPropertyDescriptor(proxy, "return_null")');
62
63 handler.getOwnPropertyDescriptor = undefined;
64 assertEquals(configurable_desc,
65 Object.getOwnPropertyDescriptor(proxy, "configurable"));
66
67 // Checking invariants mentioned explicitly by the ES spec:
68
69 // (Inv-1) "A property cannot be reported as non-existent, if it exists as a
70 // non-configurable own property of the target object."
71 handler.getOwnPropertyDescriptor = function(target, name) { return undefined; };
72 assertThrows('Object.getOwnPropertyDescriptor(proxy, "nonconfigurable")');
73 assertEquals(undefined, Object.getOwnPropertyDescriptor(proxy, "configurable"));
74
75 // (Inv-2) "A property cannot be reported as non-configurable, if it does not
76 // exist as an own property of the target object or if it exists as a
77 // configurable own property of the target object."
78 handler.getOwnPropertyDescriptor = function(target, name) {
79 return {value: 234, configurable: false, enumerable: true};
80 };
81 assertThrows('Object.getOwnPropertyDescriptor(proxy, "nonexistent")');
82 assertThrows('Object.getOwnPropertyDescriptor(proxy, "configurable")');
83 assertEquals(
84 false,
85 Object.getOwnPropertyDescriptor(proxy, "nonconfigurable").configurable);
86
87 // (Inv-3) "A property cannot be reported as non-existent, if it exists as an
88 // own property of the target object and the target object is not extensible."
89 Object.seal(target);
90 handler.getOwnPropertyDescriptor = function(target, name) { return undefined; };
91 assertThrows('Object.getOwnPropertyDescriptor(proxy, "configurable")');
92 assertThrows('Object.getOwnPropertyDescriptor(proxy, "nonconfigurable")');
93 assertEquals(undefined, Object.getOwnPropertyDescriptor(proxy, "nonexistent"));
94
95 // (Inv-4) "A property cannot be reported as existent, if it does not exist as
96 // an own property of the target object and the target object is not
97 // extensible."
98 var existent_desc = {value: "yes"};
99 handler.getOwnPropertyDescriptor = function() { return existent_desc; };
100 assertThrows('Object.getOwnPropertyDescriptor(proxy, "nonexistent")');
101 assertEquals(
102 {value: "yes", writable: false, enumerable: false, configurable: false},
103 Object.getOwnPropertyDescriptor(proxy, "configurable"));
104
105 // Checking individual bailout points in the implementation:
106
107 // Step 6: Trap is not callable.
108 handler.getOwnPropertyDescriptor = {};
109 assertThrows('Object.getOwnPropertyDescriptor(proxy, "configurable")');
110
111 // Step 8: Trap throws.
112 handler.getOwnPropertyDescriptor = function() { throw "ball"; };
113 assertThrows('Object.getOwnPropertyDescriptor(proxy, "configurable")');
114
115 // Step 9: Trap result is neither undefined nor an object.
116 handler.getOwnPropertyDescriptor = function() { return 1; }
117 assertThrows('Object.getOwnPropertyDescriptor(proxy, "configurable")');
118
119 // Step 11b: See (Inv-1) above.
120 // Step 11e: See (Inv-3) above.
121
122 // Step 16: Incompatible PropertyDescriptor; a non-configurable property
123 // cannot be reported as configurable. (Inv-4) above checks more cases.
124 handler.getOwnPropertyDescriptor = function(target, name) {
125 return {value: 456, configurable: true, writable: true}
126 };
127 assertThrows('Object.getOwnPropertyDescriptor(proxy, "nonconfigurable")');
128
129 // Step 17: See (Inv-2) above.
OLDNEW
« no previous file with comments | « src/runtime/runtime-object.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698