summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/es6/proxies-with-unscopables.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/mjsunit/es6/proxies-with-unscopables.js')
-rw-r--r--deps/v8/test/mjsunit/es6/proxies-with-unscopables.js146
1 files changed, 146 insertions, 0 deletions
diff --git a/deps/v8/test/mjsunit/es6/proxies-with-unscopables.js b/deps/v8/test/mjsunit/es6/proxies-with-unscopables.js
new file mode 100644
index 0000000000..b9a7ad8012
--- /dev/null
+++ b/deps/v8/test/mjsunit/es6/proxies-with-unscopables.js
@@ -0,0 +1,146 @@
+// Copyright 2014 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.
+
+
+function TestBasics() {
+ var log = [];
+
+ var proxy = new Proxy({}, {
+ get: function(target, key) {
+ log.push("get " + String(key));
+ if (key === 'x') return 1;
+ },
+ has: function(target, key) {
+ log.push("has " + String(key));
+ if (key === 'x') return true;
+ return false;
+ }
+ });
+
+ var x = 'local';
+
+ with (proxy) {
+ assertEquals(1, x);
+ }
+
+ assertEquals(['has assertEquals', 'has x', 'get Symbol(Symbol.unscopables)',
+ 'get x'], log);
+}
+TestBasics();
+
+
+function TestInconsistent() {
+ var log = [];
+
+ var proxy = new Proxy({}, {
+ get: function(target, key) {
+ log.push("get " + String(key));
+ return undefined;
+ },
+ has: function(target, key) {
+ log.push("has " + String(key));
+ if (key === 'x') return true;
+ return false;
+ }
+ });
+
+ var x = 'local';
+
+ with (proxy) {
+ assertEquals(void 0, x);
+ }
+
+ assertEquals(['has assertEquals', 'has x', 'get Symbol(Symbol.unscopables)',
+ 'get x'], log);
+}
+TestInconsistent();
+
+
+function TestUseProxyAsUnscopables() {
+ var x = 1;
+ var object = {
+ x: 2
+ };
+ var calls = 0;
+ var proxy = new Proxy({}, {
+ has: function() {
+ assertUnreachable();
+ },
+ get: function(target, key) {
+ assertEquals('x', key);
+ calls++;
+ return calls === 2 ? true : undefined;
+ }
+ });
+
+ object[Symbol.unscopables] = proxy;
+
+ with (object) {
+ assertEquals(2, x);
+ assertEquals(1, x);
+ }
+
+ // HasBinding, HasBinding
+ assertEquals(2, calls);
+}
+TestUseProxyAsUnscopables();
+
+
+function TestThrowInHasUnscopables() {
+ var x = 1;
+ var object = {
+ x: 2
+ };
+
+ function CustomError() {}
+
+ var calls = 0;
+ var proxy = new Proxy({}, {
+ has: function() {
+ assertUnreachable();
+ },
+ get: function(target, key) {
+ if (calls++ === 0) {
+ throw new CustomError();
+ }
+ assertUnreachable();
+ }
+ });
+
+ object[Symbol.unscopables] = proxy;
+
+ assertThrows(function() {
+ with (object) {
+ x;
+ }
+ }, CustomError);
+}
+TestThrowInHasUnscopables();
+
+
+var global = this;
+function TestGlobalShouldIgnoreUnscopables() {
+ global.x = 1;
+ var proxy = new Proxy({}, {
+ get: function() {
+ assertUnreachable();
+ },
+ has: function() {
+ assertUnreachable();
+ }
+ });
+ global[Symbol.unscopables] = proxy;
+
+ assertEquals(1, global.x);
+ assertEquals(1, x);
+
+ global.x = 2;
+ assertEquals(2, global.x);
+ assertEquals(2, x);
+
+ x = 3;
+ assertEquals(3, global.x);
+ assertEquals(3, x);
+}
+TestGlobalShouldIgnoreUnscopables();