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 = { deleteProperty (target) {
21  throw 42;
22}, get (object, propName) {
23  if (propName == "length") {
24    return 5;
25  }
26}};
27
28var proxy = new Proxy(target, handler);
29
30var a = 5;
31
32// ecma_op_delete_binding
33with (proxy) {
34  delete a
35}
36
37try {
38  // 22.1.3.16.6.e
39  Array.prototype.pop.call(proxy);
40  assert(false);
41} catch (e) {
42  assert(e === 42);
43}
44
45// test basic functionality
46var target = {foo: "bar"};
47var handler = {
48  deleteProperty(obj, prop) {
49    delete obj[prop];
50  }
51}
52
53var proxy = new Proxy(target, handler);
54
55assert(target.foo === "bar")
56assert(proxy.foo === "bar");
57
58assert(delete proxy.foo === false);
59
60assert(target.foo === undefined);
61assert(proxy.foo === undefined);
62
63assert(target.bar === undefined);
64assert(delete proxy.bar == false);
65assert(target.bar === undefined);
66
67var handler2 = {
68  deleteProperty(obj, prop) {
69    delete obj[prop];
70    return true;
71  }
72}
73
74var proxy = new Proxy(target, handler2);
75
76assert(target.bar === undefined);
77assert(delete proxy.bar == true);
78assert(target.bar === undefined);
79
80// test with no trap
81var target = {1: 42};
82var handler = {};
83var proxy = new Proxy(target, handler);
84
85assert(target[1] === 42)
86assert(delete proxy[1] === true)
87assert(target[1] === undefined);
88
89// test with undefined trap
90var target = {2: 52};
91var handler = { deleteProperty: null};
92var proxy = new Proxy(target, handler);
93
94assert(target[2] === 52)
95assert(delete proxy[2] === true)
96assert(target[2] === undefined);
97
98// test when trap is invalid
99var target = {};
100var handler = { deleteProperty: true };
101var proxy = new Proxy(target, handler);
102
103try {
104  delete proxy[0];
105  assert(false);
106} catch (e) {
107  assert(e instanceof TypeError);
108}
109
110// test when handler is null
111var revocable = Proxy.revocable ({}, {});
112var proxy = revocable.proxy;
113revocable.revoke();
114
115try {
116  delete proxy.foo;
117  assert(false);
118} catch (e) {
119  assert(e instanceof TypeError);
120}
121
122// test when target is proxy
123var target = {prop: "foo"};
124var handler = {
125  deleteProperty(obj, prop) {
126    delete obj[prop];
127  }
128};
129
130var proxy1 = new Proxy(target, handler);
131var proxy2 = new Proxy(proxy1, handler);
132
133assert(target.prop === "foo");
134assert(proxy1.prop === "foo");
135assert(proxy2.prop === "foo");
136
137delete proxy2.prop;
138
139assert(target.prop === undefined);
140assert(proxy1.prop === undefined);
141assert(proxy2.prop === undefined);
142
143// tests when invariants gets violated
144var target = {};
145var handler = {
146  deleteProperty(obj, prop) {
147    delete obj[prop];
148    return true;
149  }
150};
151
152Object.defineProperty(target, "foo", {
153  configurable: false,
154  value: "foo"
155});
156
157var proxy = new Proxy (target, handler);
158
159try {
160  delete proxy.foo;
161  assert(false);
162} catch (e) {
163  assert(e instanceof TypeError);
164}
165