/*
 * Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/licenses/publicdomain/
 */

/* Object.freeze */

function getme() { return 42; };
function setme(x) { };

var properties = { all:       { value:1, writable:true,  configurable:true,  enumerable: true },
                   readOnly:  { value:2, writable:false, configurable:true,  enumerable: true },
                   nonConfig: { value:3, writable:true,  configurable:false, enumerable: true },
                   none:      { value:4, writable:false, configurable:false, enumerable: true },
                   getter:    { get: getme,              configurable:false, enumerable: true },
                   setter:    { set: setme,              configurable:false, enumerable: true },
                   getandset: { get: getme, set: setme,  configurable:false, enumerable: true }
                 };
var o = Object.defineProperties({}, properties);

Object.freeze(o);

function getPropertyOf(obj) {
    return function (prop) {
        return Object.getOwnPropertyDescriptor(obj, prop);
    };
};

assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'all'),
                   { value: 1, writable:false,  enumerable:true, configurable:false }),
         true);
assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'readOnly'),
                   { value: 2, writable:false,  enumerable:true, configurable:false }),
         true);
assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'nonConfig'),
                    { value: 3, writable:false,  enumerable:true, configurable:false }),
         true);
assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'none'),
                    { value: 4, writable:false,  enumerable:true, configurable:false }),
         true);
assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'getter'),
                    { get: getme, set: (void 0), enumerable:true, configurable:false }),
         true);
assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'setter'),
                    { set: setme, get: (void 0), enumerable:true, configurable:false }),
         true);
assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'getandset'),
                    { get: getme, set: setme,    enumerable:true, configurable:false }),
         true);

reportCompare(true, true);
