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_civar obj = {};
16425bb815Sopenharmony_ciObject.defineProperties(obj, {
17425bb815Sopenharmony_ci  "foo": {
18425bb815Sopenharmony_ci    value: true,
19425bb815Sopenharmony_ci    writable: true
20425bb815Sopenharmony_ci  },
21425bb815Sopenharmony_ci  "bar": {
22425bb815Sopenharmony_ci    value: "baz",
23425bb815Sopenharmony_ci    writable: false
24425bb815Sopenharmony_ci  },
25425bb815Sopenharmony_ci  "Hello": {
26425bb815Sopenharmony_ci    value: "world",
27425bb815Sopenharmony_ci    writable: false
28425bb815Sopenharmony_ci  },
29425bb815Sopenharmony_ci  "inner_object": {
30425bb815Sopenharmony_ci    value : {
31425bb815Sopenharmony_ci      "a" : 1,
32425bb815Sopenharmony_ci      "b" : {
33425bb815Sopenharmony_ci        value: "foo"
34425bb815Sopenharmony_ci      }
35425bb815Sopenharmony_ci    }
36425bb815Sopenharmony_ci  }
37425bb815Sopenharmony_ci});
38425bb815Sopenharmony_ci
39425bb815Sopenharmony_ciassert (obj.foo === true);
40425bb815Sopenharmony_ciassert (obj.bar === "baz");
41425bb815Sopenharmony_ciassert (obj.Hello === "world");
42425bb815Sopenharmony_ciassert (obj.inner_object.a === 1);
43425bb815Sopenharmony_ciassert (obj.inner_object.b.value === "foo");
44425bb815Sopenharmony_ci
45425bb815Sopenharmony_ci// These cases should throw TypeError
46425bb815Sopenharmony_citry {
47425bb815Sopenharmony_ci  Object.defineProperties(obj, undefined);
48425bb815Sopenharmony_ci  assert (false);
49425bb815Sopenharmony_ci} catch (e) {
50425bb815Sopenharmony_ci  assert (e instanceof TypeError);
51425bb815Sopenharmony_ci}
52425bb815Sopenharmony_ci
53425bb815Sopenharmony_citry {
54425bb815Sopenharmony_ci  Object.defineProperties(obj, null);
55425bb815Sopenharmony_ci  assert (false);
56425bb815Sopenharmony_ci} catch (e) {
57425bb815Sopenharmony_ci  assert (e instanceof TypeError);
58425bb815Sopenharmony_ci}
59425bb815Sopenharmony_ci
60425bb815Sopenharmony_citry {
61425bb815Sopenharmony_ci  Object.defineProperties(undefined, {
62425bb815Sopenharmony_ci    "foo": {
63425bb815Sopenharmony_ci      value: true,
64425bb815Sopenharmony_ci      writable: true
65425bb815Sopenharmony_ci    }
66425bb815Sopenharmony_ci  });
67425bb815Sopenharmony_ci  assert (false);
68425bb815Sopenharmony_ci} catch (e) {
69425bb815Sopenharmony_ci  assert (e instanceof TypeError);
70425bb815Sopenharmony_ci}
71425bb815Sopenharmony_ci
72425bb815Sopenharmony_ci// Check for internal assert, see issue #131.
73425bb815Sopenharmony_citry {
74425bb815Sopenharmony_ci  Object.defineProperties([], undefined);
75425bb815Sopenharmony_ci  assert (false);
76425bb815Sopenharmony_ci} catch (e) {
77425bb815Sopenharmony_ci  assert (e instanceof TypeError);
78425bb815Sopenharmony_ci}
79425bb815Sopenharmony_ci
80425bb815Sopenharmony_ci// If one of the properties is wrong than it shouldn't update the object.
81425bb815Sopenharmony_civar obj2 = {
82425bb815Sopenharmony_ci  a: 5
83425bb815Sopenharmony_ci};
84425bb815Sopenharmony_citry {
85425bb815Sopenharmony_ci  Object.defineProperties(obj2, {
86425bb815Sopenharmony_ci    "foo": {
87425bb815Sopenharmony_ci      value: true,
88425bb815Sopenharmony_ci      writable: true
89425bb815Sopenharmony_ci    },
90425bb815Sopenharmony_ci    "bar": {
91425bb815Sopenharmony_ci      value: 3,
92425bb815Sopenharmony_ci      set: 3
93425bb815Sopenharmony_ci    },
94425bb815Sopenharmony_ci    "Hello": {
95425bb815Sopenharmony_ci      value: "world",
96425bb815Sopenharmony_ci      writable: false
97425bb815Sopenharmony_ci    }
98425bb815Sopenharmony_ci  });
99425bb815Sopenharmony_ci  assert (false);
100425bb815Sopenharmony_ci} catch (e) {
101425bb815Sopenharmony_ci  assert (e instanceof TypeError);
102425bb815Sopenharmony_ci  assert (obj2.foo === undefined);
103425bb815Sopenharmony_ci  assert (obj2.set === undefined);
104425bb815Sopenharmony_ci  assert (obj2.Hello === undefined);
105425bb815Sopenharmony_ci  assert (obj2.a === 5);
106425bb815Sopenharmony_ci}
107425bb815Sopenharmony_ci
108425bb815Sopenharmony_ci// Define accessors
109425bb815Sopenharmony_civar obj = {};
110425bb815Sopenharmony_ciObject.defineProperties(obj, {
111425bb815Sopenharmony_ci  "foo": {
112425bb815Sopenharmony_ci    value: 42,
113425bb815Sopenharmony_ci    writable: true,
114425bb815Sopenharmony_ci  },
115425bb815Sopenharmony_ci  "bar": {
116425bb815Sopenharmony_ci    get: function() { return this.foo },
117425bb815Sopenharmony_ci    set: function(v) { this.foo = v }
118425bb815Sopenharmony_ci  }
119425bb815Sopenharmony_ci});
120425bb815Sopenharmony_ci
121425bb815Sopenharmony_ciassert (obj.bar === 42);
122425bb815Sopenharmony_ciobj.bar = "baz";
123425bb815Sopenharmony_ciassert (obj.foo === "baz");
124425bb815Sopenharmony_ci
125425bb815Sopenharmony_ci// Define get method which throws error
126425bb815Sopenharmony_civar obj = {};
127425bb815Sopenharmony_civar props = {
128425bb815Sopenharmony_ci  prop1: {
129425bb815Sopenharmony_ci    value: 1,
130425bb815Sopenharmony_ci    writable: true,
131425bb815Sopenharmony_ci  },
132425bb815Sopenharmony_ci  get bar() {
133425bb815Sopenharmony_ci    throw new TypeError("foo");
134425bb815Sopenharmony_ci    return { value : 2, writable : true };
135425bb815Sopenharmony_ci  },
136425bb815Sopenharmony_ci  prop2: {
137425bb815Sopenharmony_ci    value: 3,
138425bb815Sopenharmony_ci    writable: true,
139425bb815Sopenharmony_ci  },
140425bb815Sopenharmony_ci  prop3: {
141425bb815Sopenharmony_ci    value: 4,
142425bb815Sopenharmony_ci    writable: true,
143425bb815Sopenharmony_ci  }
144425bb815Sopenharmony_ci};
145425bb815Sopenharmony_ci
146425bb815Sopenharmony_citry {
147425bb815Sopenharmony_ci  Object.defineProperties(obj, props);
148425bb815Sopenharmony_ci  assert (false);
149425bb815Sopenharmony_ci} catch (e) {
150425bb815Sopenharmony_ci  assert (e instanceof TypeError);
151425bb815Sopenharmony_ci  assert (e.message === "foo");
152425bb815Sopenharmony_ci}
153425bb815Sopenharmony_ci
154425bb815Sopenharmony_ci// Define get method which deletes a property
155425bb815Sopenharmony_civar obj = {};
156425bb815Sopenharmony_ciObject.defineProperties(obj, {
157425bb815Sopenharmony_ci  "foo": {
158425bb815Sopenharmony_ci    value: 42,
159425bb815Sopenharmony_ci    writable: true,
160425bb815Sopenharmony_ci  },
161425bb815Sopenharmony_ci  "a": {
162425bb815Sopenharmony_ci    value: "b",
163425bb815Sopenharmony_ci    configurable: true
164425bb815Sopenharmony_ci  },
165425bb815Sopenharmony_ci  "bar": {
166425bb815Sopenharmony_ci    get: function() {
167425bb815Sopenharmony_ci      delete this.a;
168425bb815Sopenharmony_ci      return this.foo;
169425bb815Sopenharmony_ci    },
170425bb815Sopenharmony_ci  }
171425bb815Sopenharmony_ci});
172425bb815Sopenharmony_ci
173425bb815Sopenharmony_ciassert (obj.a === "b");
174425bb815Sopenharmony_ciassert (obj.bar === 42);
175425bb815Sopenharmony_ciassert (obj.a === undefined);
176425bb815Sopenharmony_ci
177425bb815Sopenharmony_ci// This code should throw TypeError
178425bb815Sopenharmony_civar obj = {};
179425bb815Sopenharmony_civar props = {
180425bb815Sopenharmony_ci  prop1: {
181425bb815Sopenharmony_ci    value: 1,
182425bb815Sopenharmony_ci    writable: true,
183425bb815Sopenharmony_ci  },
184425bb815Sopenharmony_ci  get bar() {
185425bb815Sopenharmony_ci    delete props.prop1;
186425bb815Sopenharmony_ci    delete props.prop2;
187425bb815Sopenharmony_ci    return { value : 2, writable : true };
188425bb815Sopenharmony_ci  },
189425bb815Sopenharmony_ci  prop2: {
190425bb815Sopenharmony_ci    value: 3,
191425bb815Sopenharmony_ci    writable: true,
192425bb815Sopenharmony_ci  },
193425bb815Sopenharmony_ci  prop3: {
194425bb815Sopenharmony_ci    value: 4,
195425bb815Sopenharmony_ci    writable: true,
196425bb815Sopenharmony_ci  }
197425bb815Sopenharmony_ci};
198425bb815Sopenharmony_ci
199425bb815Sopenharmony_citry {
200425bb815Sopenharmony_ci  Object.defineProperties(obj, props);
201425bb815Sopenharmony_ci  assert (false);
202425bb815Sopenharmony_ci} catch (e) {
203425bb815Sopenharmony_ci  assert (e instanceof TypeError);
204425bb815Sopenharmony_ci}
205