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