1// Copyright JS Foundation and other contributors, http://js.foundation
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// Copyright 2015 the V8 project authors. All rights reserved.
16// Use of this source code is governed by a BSD-style license that can be
17// found in the LICENSE file.
18
19var target = {};
20var handler = { has (target) {
21  throw 42;
22}};
23
24var proxy = new Proxy(target, handler);
25
26try {
27  // 12.9.3
28  "foo" in proxy;
29  assert(false);
30} catch (e) {
31  assert(e === 42);
32}
33
34try {
35  // 8.1.1.2.1
36  with (proxy) {
37    p;
38    assert(false);
39  }
40  assert(false);
41} catch (e) {
42  assert(e === 42);
43}
44
45try {
46  // ecma_op_put_value_lex_env_base/[[HasProperty]]
47  with (proxy) {
48    function a (){}
49    assert(false);
50  }
51  assert(false);
52} catch (e) {
53  assert(e === 42);
54}
55
56// test basic functionality
57var target = {
58  "target_one": 1
59};
60
61var handler = {
62  has: function(target, prop) {
63    return prop == "present";
64  }
65}
66
67var proxy = new Proxy(target, handler);
68
69assert("present" in proxy === true);
70assert("non_present" in proxy === false);
71
72var target = {
73  foo: 5,
74  bar: 10
75};
76
77var handler = {
78  has: function(target, prop) {
79    if (prop[0] === 'f') {
80      return false;
81    }
82    return prop in target;
83  }
84};
85
86var proxy = new Proxy(target, handler);
87
88assert("foo" in proxy === false);
89assert("bar" in proxy === true);
90
91// test with no trap
92var target = {
93  foo: "foo"
94};
95var handler = {};
96var proxy = new Proxy(target, handler);
97
98assert("foo" in proxy === true);
99
100// test with "undefined" trap
101var target = {
102  foo: "foo"
103};
104var handler = {has: null};
105var proxy = new Proxy(target, handler);
106
107assert("foo" in proxy === true);
108
109// test with invalid trap
110var target = {
111  foo: "foo"
112};
113var handler = {has: 42};
114var proxy = new Proxy(target, handler);
115
116try {
117  "foo" in proxy;
118  assert(false);
119} catch (e) {
120  assert(e instanceof TypeError);
121}
122
123// test when target is proxy
124var target = {
125  foo: "foo"
126};
127
128var handler = {
129  has: function(target, prop) {
130    return prop in target;
131  }
132}
133
134var proxy1 = new Proxy(target, handler);
135var proxy2 = new Proxy(proxy1, handler);
136
137assert("foo" in proxy2 === true);
138
139// test when invariants gets violated
140var target = {};
141
142Object.defineProperty(target, "prop", {
143  configurable: false,
144  value: 10
145})
146
147var handler = {
148  has: function(target, prop) {
149    return false;
150  }
151}
152
153var proxy = new Proxy(target, handler);
154
155try {
156  'prop' in proxy;
157  assert(false);
158} catch (e) {
159  assert(e instanceof TypeError);
160}
161
162var target = { a: 10 };
163Object.preventExtensions(target);
164
165var proxy = new Proxy(target, handler);
166
167try {
168  'a' in proxy;
169  assert(false);
170} catch (e) {
171  assert(e instanceof TypeError);
172}
173