// 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 testNonCallable() {
  var proxy = new Proxy({},{});
  assertThrows(function(){ proxy() }, TypeError);

  var proxy2 = new Proxy(proxy, {});
  assertThrows(function(){ proxy2() }, TypeError);
})();

(function testCallProxyFallbackNoArguments() {
  var called = false;
  var target = function() {
    called = true;
  }
  var proxy = new Proxy(target, {});
  assertFalse(called);
  proxy();
  assertTrue(called);

  called = false;
  var proxy2 = new Proxy(proxy, {});
  assertFalse(called);
  proxy2();
  assertTrue(called);
})();

(function testCallProxyFallback1Argument() {
  var called = false;
  var target = function(a) {
    called = true;
    assertEquals('1', a);
  }
  var proxy = new Proxy(target, {});
  assertFalse(called);
  proxy('1');
  assertTrue(called);
})();

(function testCallProxyFallback2Arguments() {
  var called = false;
  var target = function(a, b) {
    called = true;
    assertEquals('1', a);
    assertEquals('2', b);
  }
  var proxy = new Proxy(target, {});
  assertFalse(called);
  proxy('1', '2');
  assertTrue(called);
})();

(function testCallProxyFallbackChangedReceiver() {
  var apply_receiver = {receiver:true};
  var seen_receiver = undefined;
  var target = function() {
    seen_receiver = this;
  }
  var proxy = new Proxy(target, {});
  assertEquals(undefined, seen_receiver);
  Reflect.apply(proxy, apply_receiver, [1,2,3,4]);
  assertSame(apply_receiver, seen_receiver);
})();

(function testCallProxyTrap() {
  var called_target = false;
  var called_handler = false;
  var target = function(a, b) {
    called_target = true;
    assertEquals(1, a);
    assertEquals(2, b);
  }
  var handler = {
    apply: function(target, this_arg, args) {
      target.apply(this_arg, args);
      called_handler = true;
    }
  }
  var proxy = new Proxy(target, handler);
  assertFalse(called_target);
  assertFalse(called_handler);
  Reflect.apply(proxy, {rec:1}, [1,2]);
  assertTrue(called_target);
  assertTrue(called_handler);
})();


(function testCallProxyNonCallableTarget() {
  var values = [NaN, 1.5, 100, /RegExp/, "string", {}, [], Symbol(),
                new Map(), new Set(), new WeakMap(), new WeakSet()];
  values.forEach(target => {
    target = Object(target);
    var proxy = new Proxy(target, { apply() { assertUnreachable(); } });
    assertThrows(() => { proxy(); }, TypeError);
    assertThrows(() => { ({ proxy }).proxy(); }, TypeError);
    assertThrows(() => { Reflect.apply(proxy, null, []); }, TypeError);
    assertThrows(() => { Reflect.apply(proxy, { proxy }, []); }, TypeError);
    assertThrows(() => {
          Function.prototype.call.apply(proxy, [null]);
        }, TypeError);
    assertThrows(() => {
          Function.prototype.apply.apply(proxy, [null, []]);
        }, TypeError);

    var proxy_to_proxy = new Proxy(proxy, { apply() { assertUnreachable(); } });
    assertThrows(() => { proxy_to_proxy(); }, TypeError);
    assertThrows(() => { ({ proxy_to_proxy }).proxy_to_proxy(); }, TypeError);
    assertThrows(() => { Reflect.apply(proxy_to_proxy, null, []); }, TypeError);
    assertThrows(() => { Reflect.apply(proxy_to_proxy, { proxy }, []); },
                 TypeError);
    assertThrows(() => {
          Function.prototype.call.apply(proxy_to_proxy, [null]);
        }, TypeError);
    assertThrows(() => {
          Function.prototype.apply.apply(proxy_to_proxy, [null, []]);
        }, TypeError);
  });
})();
