diff options
Diffstat (limited to 'deps/v8/test/mjsunit/es6/proxies-with-unscopables.js')
-rw-r--r-- | deps/v8/test/mjsunit/es6/proxies-with-unscopables.js | 146 |
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(); |