1425bb815Sopenharmony_ci// Copyright JS Foundation and other contributors, http://js.foundation
2425bb815Sopenharmony_ci//
3425bb815Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
4425bb815Sopenharmony_ci// you may not use this file except in compliance with the License.
5425bb815Sopenharmony_ci// You may obtain a copy of the License at
6425bb815Sopenharmony_ci//
7425bb815Sopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
8425bb815Sopenharmony_ci//
9425bb815Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software
10425bb815Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS
11425bb815Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12425bb815Sopenharmony_ci// See the License for the specific language governing permissions and
13425bb815Sopenharmony_ci// limitations under the License.
14425bb815Sopenharmony_ci
15425bb815Sopenharmony_ci// Copyright 2015 the V8 project authors. All rights reserved.
16425bb815Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be
17425bb815Sopenharmony_ci// found in the LICENSE file.
18425bb815Sopenharmony_ci
19425bb815Sopenharmony_civar target = {};
20425bb815Sopenharmony_civar handler = { deleteProperty (target) {
21425bb815Sopenharmony_ci  throw 42;
22425bb815Sopenharmony_ci}, get (object, propName) {
23425bb815Sopenharmony_ci  if (propName == "length") {
24425bb815Sopenharmony_ci    return 5;
25425bb815Sopenharmony_ci  }
26425bb815Sopenharmony_ci}};
27425bb815Sopenharmony_ci
28425bb815Sopenharmony_civar proxy = new Proxy(target, handler);
29425bb815Sopenharmony_ci
30425bb815Sopenharmony_civar a = 5;
31425bb815Sopenharmony_ci
32425bb815Sopenharmony_ci// ecma_op_delete_binding
33425bb815Sopenharmony_ciwith (proxy) {
34425bb815Sopenharmony_ci  delete a
35425bb815Sopenharmony_ci}
36425bb815Sopenharmony_ci
37425bb815Sopenharmony_citry {
38425bb815Sopenharmony_ci  // 22.1.3.16.6.e
39425bb815Sopenharmony_ci  Array.prototype.pop.call(proxy);
40425bb815Sopenharmony_ci  assert(false);
41425bb815Sopenharmony_ci} catch (e) {
42425bb815Sopenharmony_ci  assert(e === 42);
43425bb815Sopenharmony_ci}
44425bb815Sopenharmony_ci
45425bb815Sopenharmony_ci// test basic functionality
46425bb815Sopenharmony_civar target = {foo: "bar"};
47425bb815Sopenharmony_civar handler = {
48425bb815Sopenharmony_ci  deleteProperty(obj, prop) {
49425bb815Sopenharmony_ci    delete obj[prop];
50425bb815Sopenharmony_ci  }
51425bb815Sopenharmony_ci}
52425bb815Sopenharmony_ci
53425bb815Sopenharmony_civar proxy = new Proxy(target, handler);
54425bb815Sopenharmony_ci
55425bb815Sopenharmony_ciassert(target.foo === "bar")
56425bb815Sopenharmony_ciassert(proxy.foo === "bar");
57425bb815Sopenharmony_ci
58425bb815Sopenharmony_ciassert(delete proxy.foo === false);
59425bb815Sopenharmony_ci
60425bb815Sopenharmony_ciassert(target.foo === undefined);
61425bb815Sopenharmony_ciassert(proxy.foo === undefined);
62425bb815Sopenharmony_ci
63425bb815Sopenharmony_ciassert(target.bar === undefined);
64425bb815Sopenharmony_ciassert(delete proxy.bar == false);
65425bb815Sopenharmony_ciassert(target.bar === undefined);
66425bb815Sopenharmony_ci
67425bb815Sopenharmony_civar handler2 = {
68425bb815Sopenharmony_ci  deleteProperty(obj, prop) {
69425bb815Sopenharmony_ci    delete obj[prop];
70425bb815Sopenharmony_ci    return true;
71425bb815Sopenharmony_ci  }
72425bb815Sopenharmony_ci}
73425bb815Sopenharmony_ci
74425bb815Sopenharmony_civar proxy = new Proxy(target, handler2);
75425bb815Sopenharmony_ci
76425bb815Sopenharmony_ciassert(target.bar === undefined);
77425bb815Sopenharmony_ciassert(delete proxy.bar == true);
78425bb815Sopenharmony_ciassert(target.bar === undefined);
79425bb815Sopenharmony_ci
80425bb815Sopenharmony_ci// test with no trap
81425bb815Sopenharmony_civar target = {1: 42};
82425bb815Sopenharmony_civar handler = {};
83425bb815Sopenharmony_civar proxy = new Proxy(target, handler);
84425bb815Sopenharmony_ci
85425bb815Sopenharmony_ciassert(target[1] === 42)
86425bb815Sopenharmony_ciassert(delete proxy[1] === true)
87425bb815Sopenharmony_ciassert(target[1] === undefined);
88425bb815Sopenharmony_ci
89425bb815Sopenharmony_ci// test with undefined trap
90425bb815Sopenharmony_civar target = {2: 52};
91425bb815Sopenharmony_civar handler = { deleteProperty: null};
92425bb815Sopenharmony_civar proxy = new Proxy(target, handler);
93425bb815Sopenharmony_ci
94425bb815Sopenharmony_ciassert(target[2] === 52)
95425bb815Sopenharmony_ciassert(delete proxy[2] === true)
96425bb815Sopenharmony_ciassert(target[2] === undefined);
97425bb815Sopenharmony_ci
98425bb815Sopenharmony_ci// test when trap is invalid
99425bb815Sopenharmony_civar target = {};
100425bb815Sopenharmony_civar handler = { deleteProperty: true };
101425bb815Sopenharmony_civar proxy = new Proxy(target, handler);
102425bb815Sopenharmony_ci
103425bb815Sopenharmony_citry {
104425bb815Sopenharmony_ci  delete proxy[0];
105425bb815Sopenharmony_ci  assert(false);
106425bb815Sopenharmony_ci} catch (e) {
107425bb815Sopenharmony_ci  assert(e instanceof TypeError);
108425bb815Sopenharmony_ci}
109425bb815Sopenharmony_ci
110425bb815Sopenharmony_ci// test when handler is null
111425bb815Sopenharmony_civar revocable = Proxy.revocable ({}, {});
112425bb815Sopenharmony_civar proxy = revocable.proxy;
113425bb815Sopenharmony_cirevocable.revoke();
114425bb815Sopenharmony_ci
115425bb815Sopenharmony_citry {
116425bb815Sopenharmony_ci  delete proxy.foo;
117425bb815Sopenharmony_ci  assert(false);
118425bb815Sopenharmony_ci} catch (e) {
119425bb815Sopenharmony_ci  assert(e instanceof TypeError);
120425bb815Sopenharmony_ci}
121425bb815Sopenharmony_ci
122425bb815Sopenharmony_ci// test when target is proxy
123425bb815Sopenharmony_civar target = {prop: "foo"};
124425bb815Sopenharmony_civar handler = {
125425bb815Sopenharmony_ci  deleteProperty(obj, prop) {
126425bb815Sopenharmony_ci    delete obj[prop];
127425bb815Sopenharmony_ci  }
128425bb815Sopenharmony_ci};
129425bb815Sopenharmony_ci
130425bb815Sopenharmony_civar proxy1 = new Proxy(target, handler);
131425bb815Sopenharmony_civar proxy2 = new Proxy(proxy1, handler);
132425bb815Sopenharmony_ci
133425bb815Sopenharmony_ciassert(target.prop === "foo");
134425bb815Sopenharmony_ciassert(proxy1.prop === "foo");
135425bb815Sopenharmony_ciassert(proxy2.prop === "foo");
136425bb815Sopenharmony_ci
137425bb815Sopenharmony_cidelete proxy2.prop;
138425bb815Sopenharmony_ci
139425bb815Sopenharmony_ciassert(target.prop === undefined);
140425bb815Sopenharmony_ciassert(proxy1.prop === undefined);
141425bb815Sopenharmony_ciassert(proxy2.prop === undefined);
142425bb815Sopenharmony_ci
143425bb815Sopenharmony_ci// tests when invariants gets violated
144425bb815Sopenharmony_civar target = {};
145425bb815Sopenharmony_civar handler = {
146425bb815Sopenharmony_ci  deleteProperty(obj, prop) {
147425bb815Sopenharmony_ci    delete obj[prop];
148425bb815Sopenharmony_ci    return true;
149425bb815Sopenharmony_ci  }
150425bb815Sopenharmony_ci};
151425bb815Sopenharmony_ci
152425bb815Sopenharmony_ciObject.defineProperty(target, "foo", {
153425bb815Sopenharmony_ci  configurable: false,
154425bb815Sopenharmony_ci  value: "foo"
155425bb815Sopenharmony_ci});
156425bb815Sopenharmony_ci
157425bb815Sopenharmony_civar proxy = new Proxy (target, handler);
158425bb815Sopenharmony_ci
159425bb815Sopenharmony_citry {
160425bb815Sopenharmony_ci  delete proxy.foo;
161425bb815Sopenharmony_ci  assert(false);
162425bb815Sopenharmony_ci} catch (e) {
163425bb815Sopenharmony_ci  assert(e instanceof TypeError);
164425bb815Sopenharmony_ci}
165