1// Copyright 2014 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// Flags: --harmony-proxies
6
7
8// TODO(arv): Once proxies can intercept symbols, add more tests.
9
10
11function TestBasics() {
12  var log = [];
13
14  var proxy = Proxy.create({
15    getPropertyDescriptor: function(key) {
16      log.push(key);
17      if (key === 'x') {
18        return {
19          value: 1,
20          configurable: true
21        };
22      }
23      return undefined;
24    }
25  });
26
27  var x = 'local';
28
29  with (proxy) {
30    assertEquals(1, x);
31  }
32
33  // One 'x' for HasBinding and one for GetBindingValue
34  assertEquals(['assertEquals', 'x', 'x'], log);
35}
36TestBasics();
37
38
39function TestInconsistent() {
40  var log = [];
41  var calls = 0;
42
43  var proxy = Proxy.create({
44    getPropertyDescriptor: function(key) {
45      log.push(key);
46      if (key === 'x' && calls < 1) {
47        calls++;
48        return {
49          value: 1,
50          configurable: true
51        };
52      }
53      return undefined;
54    }
55  });
56
57  var x = 'local';
58
59  with (proxy) {
60    assertEquals(void 0, x);
61  }
62
63  // One 'x' for HasBinding and one for GetBindingValue
64  assertEquals(['assertEquals', 'x', 'x'], log);
65}
66TestInconsistent();
67
68
69function TestUseProxyAsUnscopables() {
70  var x = 1;
71  var object = {
72    x: 2
73  };
74  var calls = 0;
75  var proxy = Proxy.create({
76    has: function(key) {
77      calls++;
78      assertEquals('x', key);
79      return calls === 2;
80    },
81    getPropertyDescriptor: function(key) {
82      assertUnreachable();
83    }
84  });
85
86  object[Symbol.unscopables] = proxy;
87
88  with (object) {
89    assertEquals(2, x);
90    assertEquals(1, x);
91  }
92
93  // HasBinding, HasBinding
94  assertEquals(2, calls);
95}
96TestUseProxyAsUnscopables();
97
98
99function TestThrowInHasUnscopables() {
100  var x = 1;
101  var object = {
102    x: 2
103  };
104
105  function CustomError() {}
106
107  var calls = 0;
108  var proxy = Proxy.create({
109    has: function(key) {
110      if (calls++ === 0) {
111        throw new CustomError();
112      }
113      assertUnreachable();
114    },
115    getPropertyDescriptor: function(key) {
116      assertUnreachable();
117    }
118  });
119
120  object[Symbol.unscopables] = proxy;
121
122  assertThrows(function() {
123    with (object) {
124      x;
125    }
126  }, CustomError);
127}
128TestThrowInHasUnscopables();
129
130
131var global = this;
132function TestGlobalShouldIgnoreUnscopables() {
133  global.x = 1;
134  var proxy = Proxy.create({
135    getPropertyDescriptor: function() {
136      assertUnreachable();
137    }
138  });
139  global[Symbol.unscopables] = proxy;
140
141  assertEquals(1, global.x);
142  assertEquals(1, x);
143
144  global.x = 2;
145  assertEquals(2, global.x);
146  assertEquals(2, x);
147
148  x = 3;
149  assertEquals(3, global.x);
150  assertEquals(3, x);
151}
152TestGlobalShouldIgnoreUnscopables();
153