Source code
Revision control
Copy as Markdown
Other Tools
function strictArgs() {
return (function (a, b, c) {'use strict'; return arguments; })(1, 2);
}
function normalArgs() {
return (function (a, b, c) { return arguments; })(1, 2);
}
function checkProperty(options, prop, shouldThrow) {
var desc, orig;
var obj = options.strict ? strictArgs() : normalArgs();
var objType = options.strict ? "strict arguments." : "normal arguments.";
function check() {
orig = Object.getOwnPropertyDescriptor(obj, prop);
var threw = false;
try {
obj[prop] = obj[prop];
}
catch (e) {
threw = true;
}
assertEq(threw, shouldThrow, objType + prop + " threw");
if (orig === undefined) {
// The property wasn't defined, so we can skip it.
return;
}
desc = Object.getOwnPropertyDescriptor(obj, prop);
if ("value" in orig) {
assertEq(desc.value, orig.value, objType + prop + " value");
} else {
assertEq(desc.get, orig.get, objType + prop + " get");
assertEq(desc.set, orig.set, objType + prop + " set");
}
assertEq(desc.writable, orig.writable, objType + prop + " writable");
assertEq(desc.enumerable, orig.enumerable, objType + prop + " enumerable");
assertEq(desc.configurable, orig.configurable, objType + prop + " configurable");
}
check();
if (orig && orig.configurable) {
if(options.refresh) { obj = options.strict ? strictArgs() : normalArgs(); }
Object.defineProperty(obj, prop, {writable: false, enumerable: true});
check();
if(options.refresh) { obj = options.strict ? strictArgs() : normalArgs(); }
Object.defineProperty(obj, prop, {writable: true, enumerable: false});
check();
if(options.refresh) { obj = options.strict ? strictArgs() : normalArgs(); }
Object.defineProperty(obj, prop, {writable: false, configurable: false});
check();
}
}
checkProperty({strict: true, refresh: true}, 'callee', true);
checkProperty({strict: true, refresh: false}, 'callee', true);
checkProperty({strict: false, refresh: true}, 'callee', false);
checkProperty({strict: false, refresh: false}, 'callee', false);
checkProperty({strict: true, refresh: true}, 'length', false);
checkProperty({strict: true, refresh: false}, 'length', false);
checkProperty({strict: false, refresh: true}, 'length', false);
checkProperty({strict: false, refresh: false}, 'length', false);
for (var i = 0; i <= 5; i++) {
checkProperty({strict: true, refresh: true}, "" + i, false);
checkProperty({strict: true, refresh: false}, "" + i, false);
checkProperty({strict: false, refresh: true}, "" + i, false);
checkProperty({strict: false, refresh: false}, "" + i, false);
}