Index: test/mjsunit/harmony/proxies-enumerate.js |
diff --git a/test/mjsunit/harmony/proxies-enumerate.js b/test/mjsunit/harmony/proxies-enumerate.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..32d6bb5873283500ec98ac6ec2e769601fa33a3f |
--- /dev/null |
+++ b/test/mjsunit/harmony/proxies-enumerate.js |
@@ -0,0 +1,64 @@ |
+// Copyright 2015 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Flags: --harmony-proxies |
+ |
+var target = { |
+ "target_one": 1 |
+}; |
+target.__proto__ = { |
+ "target_two": 2 |
+}; |
+var handler = { |
+ enumerate: function(target) { |
+ function* keys() { |
+ yield "foo"; |
+ yield "bar"; |
+ } |
+ return keys(); |
+ } |
+} |
+ |
+var proxy = new Proxy(target, handler); |
+ |
+function TestForIn(receiver, expected) { |
+ var result = []; |
+ for (var k in receiver) { |
+ result.push(k); |
+ } |
+ assertEquals(expected, result); |
+} |
+ |
+TestForIn(proxy, ["foo", "bar"]); |
+ |
+// Properly call traps on proxies on the prototype chain. |
+var receiver = { |
+ "receiver_one": 1 |
+}; |
+receiver.__proto__ = proxy; |
+// TODO(jkummerow): Needs proper 'has' trap; implement that and enable this! |
+// TestForIn(receiver, ["receiver_one", "foo", "bar"]); |
+ |
+// Fall through to default behavior when trap is undefined. |
+handler.enumerate = undefined; |
+TestForIn(proxy, ["target_one", "target_two"]); |
+delete handler.enumerate; |
+TestForIn(proxy, ["target_one", "target_two"]); |
+ |
+// Non-string keys must be filtered. |
+function TestNonStringKey(key) { |
+ handler.enumerate = function(target) { |
+ function* keys() { yield key; } |
+ return keys(); |
+ } |
+ assertThrows("for (var k in proxy) {}", TypeError); |
+} |
+ |
+TestNonStringKey(1); |
+TestNonStringKey(3.14); |
+TestNonStringKey(Symbol("foo")); |
+TestNonStringKey({bad: "value"}); |
+TestNonStringKey(null); |
+TestNonStringKey(undefined); |
+TestNonStringKey(true); |