Chromium Code Reviews| Index: test/mjsunit/harmony/proxies-integrity.js |
| diff --git a/test/mjsunit/harmony/proxies-integrity.js b/test/mjsunit/harmony/proxies-integrity.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..9ed6005d6b2ffcbff5d24b57e83dc7605292b4a5 |
| --- /dev/null |
| +++ b/test/mjsunit/harmony/proxies-integrity.js |
| @@ -0,0 +1,213 @@ |
| +// 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 --harmony-reflect |
| + |
| + |
| + |
| +function toKey(x) { |
| + if (typeof x === "symbol") return x; |
| + return String(x); |
| +} |
| + |
| + |
| +const noconf = {configurable: false}; |
| +const noconf_nowrite = {configurable: false, writable: false}; |
| + |
| + |
| +var symbol = Symbol(); |
| + |
| + |
| +var log = []; |
| +var logger = {}; |
| +var handler = new Proxy({}, logger); |
| + |
| +logger.get = function(t, trap, r) { |
| + return function() { |
| + log.push([trap, ...arguments]); |
| + return Reflect[trap](...arguments); |
| + } |
| +}; |
| + |
| + |
| +(function Seal() { |
| + var target = []; |
| + var proxy = new Proxy(target, handler); |
| + log.length = 0; |
| + |
| + target.wurst = 42; |
| + target[0] = true; |
| + Object.defineProperty(target, symbol, {get: undefined}); |
| + |
| + Object.seal(proxy); |
| + assertEquals(6, log.length) |
| + for (var i in log) assertSame(target, log[i][1]); |
| + |
| + assertArrayEquals( |
| + ["preventExtensions", target], log[0]); |
| + assertArrayEquals( |
| + ["ownKeys", target], log[1]); |
| + assertArrayEquals( |
| + ["defineProperty", target, toKey(0), noconf], log[2]); |
| + assertArrayEquals( |
| + ["defineProperty", target, toKey("length"), noconf], log[3]); |
| + assertArrayEquals( |
| + ["defineProperty", target, toKey("wurst"), noconf], log[4]); |
| + assertArrayEquals( |
| + ["defineProperty", target, toKey(symbol), noconf], log[5]); |
| +})(); |
| + |
| + |
| +(function Freeze() { |
| + var target = []; |
| + var proxy = new Proxy(target, handler); |
| + log.length = 0; |
| + |
| + target.wurst = 42; |
| + target[0] = true; |
| + Object.defineProperty(target, symbol, {get: undefined}); |
| + |
| + Object.freeze(proxy); |
| + assertEquals(10, log.length) |
| + for (var i in log) assertSame(target, log[i][1]); |
| + |
| + assertArrayEquals( |
| + ["preventExtensions", target], log[0]); |
| + assertArrayEquals( |
| + ["ownKeys", target], log[1]); |
| + assertArrayEquals( |
| + ["getOwnPropertyDescriptor", target, toKey(0)], log[2]); |
| + assertArrayEquals( |
| + ["defineProperty", target, toKey(0), noconf_nowrite], log[3]); |
| + assertArrayEquals( |
| + ["getOwnPropertyDescriptor", target, toKey("length")], log[4]); |
| + assertArrayEquals( |
| + ["defineProperty", target, toKey("length"), noconf_nowrite], log[5]); |
| + assertArrayEquals( |
| + ["getOwnPropertyDescriptor", target, toKey("wurst")], log[6]); |
| + assertArrayEquals( |
| + ["defineProperty", target, toKey("wurst"), noconf_nowrite], log[7]); |
| + assertArrayEquals( |
| + ["getOwnPropertyDescriptor", target, toKey(symbol)], log[8]); |
| + assertArrayEquals( |
| + ["defineProperty", target, toKey(symbol), noconf], log[9]); |
| +})(); |
| + |
| + |
| +(function IsSealed() { |
| + var target = []; |
| + var proxy = new Proxy(target, handler); |
| + |
| + target.wurst = 42; |
|
rossberg
2015/12/07 14:00:12
I highly prefer kaese.
|
| + target[0] = true; |
| + Object.defineProperty(target, symbol, {get: undefined}); |
| + |
| + // Extensible. |
| + |
| + log.length = 0; |
| + |
| + Object.isSealed(proxy); |
| + assertEquals(1, log.length) |
| + for (var i in log) assertSame(target, log[i][1]); |
| + |
| + assertArrayEquals( |
| + ["isExtensible", target], log[0]); |
|
rossberg
2015/12/07 14:00:12
Nit: remove line break.
|
| + |
| + // Not extensible but not sealed. |
| + |
| + log.length = 0; |
| + Object.preventExtensions(target); |
| + |
| + Object.isSealed(proxy); |
| + assertEquals(3, log.length) |
| + for (var i in log) assertSame(target, log[i][1]); |
| + |
| + assertArrayEquals( |
| + ["isExtensible", target], log[0]); |
| + assertArrayEquals( |
| + ["ownKeys", target], log[1]); |
| + assertArrayEquals( |
| + ["getOwnPropertyDescriptor", target, toKey(0)], log[2]); |
| + |
| + // Sealed. |
| + |
| + log.length = 0; |
| + Object.seal(target); |
| + |
| + Object.isSealed(proxy); |
| + assertEquals(6, log.length) |
| + for (var i in log) assertSame(target, log[i][1]); |
| + |
| + assertArrayEquals( |
| + ["isExtensible", target], log[0]); |
| + assertArrayEquals( |
| + ["ownKeys", target], log[1]); |
| + assertArrayEquals( |
| + ["getOwnPropertyDescriptor", target, toKey(0)], log[2]); |
| + assertArrayEquals( |
| + ["getOwnPropertyDescriptor", target, toKey("length")], log[3]); |
| + assertArrayEquals( |
| + ["getOwnPropertyDescriptor", target, toKey("wurst")], log[4]); |
| + assertArrayEquals( |
| + ["getOwnPropertyDescriptor", target, toKey(symbol)], log[5]); |
| +})(); |
| + |
| + |
| +(function IsFrozen() { |
| + var target = []; |
| + var proxy = new Proxy(target, handler); |
| + |
| + target.wurst = 42; |
| + target[0] = true; |
| + Object.defineProperty(target, symbol, {get: undefined}); |
| + |
| + // Extensible. |
| + |
| + log.length = 0; |
| + |
| + Object.isFrozen(proxy); |
| + assertEquals(1, log.length) |
| + for (var i in log) assertSame(target, log[i][1]); |
| + |
| + assertArrayEquals( |
| + ["isExtensible", target], log[0]); |
| + |
| + // Not extensible but not frozen. |
| + |
| + log.length = 0; |
| + Object.preventExtensions(target); |
| + |
| + Object.isFrozen(proxy); |
| + assertEquals(3, log.length) |
| + for (var i in log) assertSame(target, log[i][1]); |
| + |
| + assertArrayEquals( |
| + ["isExtensible", target], log[0]); |
| + assertArrayEquals( |
| + ["ownKeys", target], log[1]); |
| + assertArrayEquals( |
| + ["getOwnPropertyDescriptor", target, toKey(0)], log[2]); |
| + |
| + // Frozen. |
| + |
| + log.length = 0; |
| + Object.freeze(target); |
| + |
| + Object.isFrozen(proxy); |
| + assertEquals(6, log.length) |
| + for (var i in log) assertSame(target, log[i][1]); |
| + |
| + assertArrayEquals( |
| + ["isExtensible", target], log[0]); |
| + assertArrayEquals( |
| + ["ownKeys", target], log[1]); |
| + assertArrayEquals( |
| + ["getOwnPropertyDescriptor", target, toKey(0)], log[2]); |
| + assertArrayEquals( |
| + ["getOwnPropertyDescriptor", target, toKey("length")], log[3]); |
| + assertArrayEquals( |
| + ["getOwnPropertyDescriptor", target, toKey("wurst")], log[4]); |
| + assertArrayEquals( |
| + ["getOwnPropertyDescriptor", target, toKey(symbol)], log[5]); |
| +})(); |