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 description must be an object..
PASS Object.create(null, 'a string') threw exception TypeError: Property description 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

