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]); |
+})(); |