// 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;
  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]);

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