You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

173 lines
4.9 KiB

/*===
firstarg
TypeError
TypeError
ok
TypeError
TypeError
TypeError
TypeError
ok
ok
ok
prototype: null
prototype: [object Object] true prototype
===*/
/* First argument must be null or Object; TypeError otherwise */
print('firstarg');
function firstArgTest() {
var obj;
var proto;
function test(arg, is_noarg) {
var t;
try {
if (is_noarg) {
t = Object.create();
} else {
t = Object.create(arg);
}
print('ok');
} catch (e) {
print(e.name);
}
}
test(undefined, true);
test(undefined);
test(null);
test(true);
test(false);
test(123);
test('foo');
test([1,2,3]);
test({ foo: 1, bar: 2});
test(function(){});
// when set as null or a specific object, must become the internal
// prototype
obj = Object.create(null);
print('prototype: ' + Object.getPrototypeOf(obj));
proto = { proto: 'prototype' };
obj = Object.create(proto);
print('prototype: ' + Object.getPrototypeOf(obj), Object.getPrototypeOf(obj) === proto, obj.proto);
}
try {
firstArgTest();
} catch (e) {
print(e);
}
/*===
property attributes
0 prop1 1 true true true undefined undefined
1 prop2 1 false true true undefined undefined
2 prop3 1 true false true undefined undefined
3 prop4 1 false false true undefined undefined
4 prop5 1 true true false undefined undefined
5 prop6 1 false true false undefined undefined
6 prop7 1 true false false undefined undefined
7 prop8 1 false false false undefined undefined
8 acc1 undefined undefined true true function function
9 acc2 undefined undefined false true function function
10 acc3 undefined undefined true false function function
11 acc4 undefined undefined false false function function
===*/
print('property attributes');
function propertyAttributeTest() {
var proto = {};
var obj;
var names = [ 'prop1', 'prop2', 'prop3', 'prop4',
'prop5', 'prop6', 'prop7', 'prop8',
'acc1', 'acc2', 'acc3', 'acc4' ];
var pd;
obj = Object.create(proto, {
prop1: { value: 1, writable: true, enumerable: true, configurable: true },
prop2: { value: 1, writable: false, enumerable: true, configurable: true },
prop3: { value: 1, writable: true, enumerable: false, configurable: true },
prop4: { value: 1, writable: false, enumerable: false, configurable: true },
prop5: { value: 1, writable: true, enumerable: true, configurable: false },
prop6: { value: 1, writable: false, enumerable: true, configurable: false },
prop7: { value: 1, writable: true, enumerable: false, configurable: false },
prop8: { value: 1, writable: false, enumerable: false, configurable: false },
acc1: { get: function(){}, set: function(){}, enumerable: true, configurable: true },
acc2: { get: function(){}, set: function(){}, enumerable: false, configurable: true },
acc3: { get: function(){}, set: function(){}, enumerable: true, configurable: false },
acc4: { get: function(){}, set: function(){}, enumerable: false, configurable: false }
});
for (i = 0; i < names.length; i++) {
pd = Object.getOwnPropertyDescriptor(obj, names[i]);
print(i, names[i], pd.value, pd.writable, pd.enumerable, pd.configurable,
typeof pd.get, typeof pd.set);
}
}
try {
propertyAttributeTest();
} catch (e) {
print(e);
}
/*===
object replaced
object prototype foo bar quux
===*/
/* The object should be created with the standard built-in Object constructor,
* even if Object had been replaced. Also test that the standard
* Object.defineProperties() behavior works even if Object.defineProperties is
* bogus.
*/
print('object replaced');
function objectReplacedTest() {
var Object_old;
var Object_defineProperties_old;
Object_old = Object;
Object_defineProperties_old = Object.defineProperties;
Object.defineProperties = function() {
print('replacement defineProperties() in original Object called');
throw new Error('never here');
}
Object = function() {
print('replacement Object constructor called');
throw new Error('never here');
};
Object.defineProperties = function () {
print('defineProperties() in replacement Object called');
throw new Error('never here');
}
obj = Object_old.create({ proto: 'prototype' }, {
foo: { value: 'foo', writable: true, enumerable: true, configurable: true },
bar: { value: 'bar', writable: true, enumerable: true, configurable: true },
quux: { value: 'quux', writable: true, enumerable: false, configurable: true },
});
Object = Object_old;
Object.defineProperties = Object_defineProperties_old;
print(typeof obj, obj.proto, obj.foo, obj.bar, obj.quux);
}
try {
objectReplacedTest();
} catch (e) {
print(e);
}