Home | History | Annotate | Download | only in es6
      1 // Copyright 2015 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 (function testNonCallable() {
      6   var proxy = new Proxy({},{});
      7   assertThrows(function(){ proxy() }, TypeError);
      8 
      9   var proxy2 = new Proxy(proxy, {});
     10   assertThrows(function(){ proxy2() }, TypeError);
     11 })();
     12 
     13 (function testCallProxyFallbackNoArguments() {
     14   var called = false;
     15   var target = function() {
     16     called = true;
     17   }
     18   var proxy = new Proxy(target, {});
     19   assertFalse(called);
     20   proxy();
     21   assertTrue(called);
     22 
     23   called = false;
     24   var proxy2 = new Proxy(proxy, {});
     25   assertFalse(called);
     26   proxy2();
     27   assertTrue(called);
     28 })();
     29 
     30 (function testCallProxyFallback1Argument() {
     31   var called = false;
     32   var target = function(a) {
     33     called = true;
     34     assertEquals('1', a);
     35   }
     36   var proxy = new Proxy(target, {});
     37   assertFalse(called);
     38   proxy('1');
     39   assertTrue(called);
     40 })();
     41 
     42 (function testCallProxyFallback2Arguments() {
     43   var called = false;
     44   var target = function(a, b) {
     45     called = true;
     46     assertEquals('1', a);
     47     assertEquals('2', b);
     48   }
     49   var proxy = new Proxy(target, {});
     50   assertFalse(called);
     51   proxy('1', '2');
     52   assertTrue(called);
     53 })();
     54 
     55 (function testCallProxyFallbackChangedReceiver() {
     56   var apply_receiver = {receiver:true};
     57   var seen_receiver = undefined;
     58   var target = function() {
     59     seen_receiver = this;
     60   }
     61   var proxy = new Proxy(target, {});
     62   assertEquals(undefined, seen_receiver);
     63   Reflect.apply(proxy, apply_receiver, [1,2,3,4]);
     64   assertSame(apply_receiver, seen_receiver);
     65 })();
     66 
     67 (function testCallProxyTrap() {
     68   var called_target = false;
     69   var called_handler = false;
     70   var target = function(a, b) {
     71     called_target = true;
     72     assertEquals(1, a);
     73     assertEquals(2, b);
     74   }
     75   var handler = {
     76     apply: function(target, this_arg, args) {
     77       target.apply(this_arg, args);
     78       called_handler = true;
     79     }
     80   }
     81   var proxy = new Proxy(target, handler);
     82   assertFalse(called_target);
     83   assertFalse(called_handler);
     84   Reflect.apply(proxy, {rec:1}, [1,2]);
     85   assertTrue(called_target);
     86   assertTrue(called_handler);
     87 })();
     88 
     89 
     90 (function testCallProxyNonCallableTarget() {
     91   var values = [NaN, 1.5, 100, /RegExp/, "string", {}, [], Symbol(),
     92                 new Map(), new Set(), new WeakMap(), new WeakSet()];
     93   values.forEach(target => {
     94     target = Object(target);
     95     var proxy = new Proxy(target, { apply() { assertUnreachable(); } });
     96     assertThrows(() => { proxy(); }, TypeError);
     97     assertThrows(() => { ({ proxy }).proxy(); }, TypeError);
     98     assertThrows(() => { Reflect.apply(proxy, null, []); }, TypeError);
     99     assertThrows(() => { Reflect.apply(proxy, { proxy }, []); }, TypeError);
    100     assertThrows(() => {
    101           Function.prototype.call.apply(proxy, [null]);
    102         }, TypeError);
    103     assertThrows(() => {
    104           Function.prototype.apply.apply(proxy, [null, []]);
    105         }, TypeError);
    106 
    107     var proxy_to_proxy = new Proxy(proxy, { apply() { assertUnreachable(); } });
    108     assertThrows(() => { proxy_to_proxy(); }, TypeError);
    109     assertThrows(() => { ({ proxy_to_proxy }).proxy_to_proxy(); }, TypeError);
    110     assertThrows(() => { Reflect.apply(proxy_to_proxy, null, []); }, TypeError);
    111     assertThrows(() => { Reflect.apply(proxy_to_proxy, { proxy }, []); },
    112                  TypeError);
    113     assertThrows(() => {
    114           Function.prototype.call.apply(proxy_to_proxy, [null]);
    115         }, TypeError);
    116     assertThrows(() => {
    117           Function.prototype.apply.apply(proxy_to_proxy, [null, []]);
    118         }, TypeError);
    119   });
    120 })();
    121