Test to ensure correct behaviour of Object.defineProperties

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


PASS Object.create() threw exception TypeError: Object prototype may only be an Object or null..
PASS Object.create('a string') threw exception TypeError: Object prototype may only be an Object or null..
PASS Object.create({}, 'a string') threw exception TypeError: Property descriptor list must be an Object..
PASS Object.create(null, 'a string') threw exception TypeError: Property descriptor list must be an Object..
PASS JSON.stringify(Object.create(null,{property:{value:'foo', enumerable:true}, property2:{value:'foo', enumerable:true}})) is '{"property":"foo","property2":"foo"}'
PASS JSON.stringify(Object.create({},{property:{value:'foo', enumerable:true}, property2:{value:'foo', enumerable:true}})) is '{"property":"foo","property2":"foo"}'
PASS JSON.stringify(Object.create({},{property:{value:'foo'}, property2:{value:'foo', enumerable:true}})) is '{"property2":"foo"}'
PASS JSON.stringify(Object.create(null,{property:{value:'foo'}, property2:{value:'foo', enumerable:true}})) is '{"property2":"foo"}'
PASS Object.getPrototypeOf(Object.create(Array.prototype)) is Array.prototype
PASS Object.getPrototypeOf(Object.create(null)) is null
PASS Object.create(null, DescriptorWithValueGetter).foo is true
PASS Object.create(null, DescriptorWithEnumerableGetter).foo is true
PASS Object.create(null, DescriptorWithConfigurableGetter).foo is true
PASS Object.create(null, DescriptorWithWritableGetter).foo is true
PASS Object.create(null, DescriptorWithGetGetter).foo is true
PASS Object.create(null, DescriptorWithSetGetter).foo is true
PASS successfullyParsed is true

TEST COMPLETE

