2020-06-03 14:34:52 -07:00
load ( "test-common.js" ) ;
try {
let p = new Proxy ( { } , { defineProperty : null } ) ;
assert ( Object . defineProperty ( p , "foo" , { } ) === p ) ;
p = new Proxy ( { } , { defineProperty : undefined } ) ;
assert ( Object . defineProperty ( p , "foo" , { } ) === p ) ;
p = new Proxy ( { } , { } ) ;
assert ( Object . defineProperty ( p , "foo" , { } ) == p ) ;
let o = { } ;
p = new Proxy ( o , {
defineProperty ( target , name , descriptor ) {
assert ( target === o ) ;
assert ( name === "foo" ) ;
assert ( descriptor . configurable === true ) ;
assert ( descriptor . enumerable === undefined ) ;
assert ( descriptor . writable === true ) ;
assert ( descriptor . value === 10 ) ;
assert ( descriptor . get === undefined ) ;
assert ( descriptor . set === undefined ) ;
return true ;
} ,
} ) ;
Object . defineProperty ( p , "foo" , { configurable : true , writable : true , value : 10 } ) ;
p = new Proxy ( o , {
defineProperty ( target , name , descriptor ) {
if ( target [ name ] === undefined )
Object . defineProperty ( target , name , descriptor ) ;
return true ;
} ,
} ) ;
Object . defineProperty ( p , "foo" , { value : 10 , enumerable : true , configurable : false , writable : true } ) ;
let d = Object . getOwnPropertyDescriptor ( p , "foo" ) ;
assert ( d . enumerable === true ) ;
assert ( d . configurable === false ) ;
assert ( d . writable === true ) ;
assert ( d . value === 10 ) ;
assert ( d . get === undefined ) ;
assert ( d . set === undefined ) ;
Object . defineProperty ( p , "foo" , { value : 20 , enumerable : true , configurable : false , writable : true } ) ;
d = Object . getOwnPropertyDescriptor ( p , "foo" ) ;
assert ( d . enumerable === true ) ;
assert ( d . configurable === false ) ;
assert ( d . writable === true ) ;
assert ( d . value === 10 ) ;
assert ( d . get === undefined ) ;
assert ( d . set === undefined ) ;
// Invariants
p = new Proxy ( { } , {
defineProperty ( ) { return false ; }
} ) ;
assertThrowsError ( ( ) => {
Object . defineProperty ( p , "foo" , { } ) ;
} , {
error : TypeError ,
2020-06-09 22:48:01 -07:00
message : "Object's [[DefineProperty]] method returned false" ,
2020-06-03 14:34:52 -07:00
} ) ;
o = { } ;
Object . preventExtensions ( o ) ;
p = new Proxy ( o , {
defineProperty ( ) {
return true ;
}
} ) ;
assertThrowsError ( ( ) => {
Object . defineProperty ( p , "foo" , { } ) ;
} , {
error : TypeError ,
message : "Proxy handler's defineProperty trap violates invariant: a property cannot be reported as being defined if the property does not exist on the target and the target is non-extensible" ,
} ) ;
o = { } ;
Object . defineProperty ( o , "foo" , { value : 10 , configurable : true } ) ;
p = new Proxy ( o , {
defineProperty ( ) {
return true ;
} ,
} ) ;
assertThrowsError ( ( ) => {
Object . defineProperty ( p , "bar" , { value : 6 , configurable : false } ) ;
} , {
error : TypeError ,
message : "Proxy handler's defineProperty trap violates invariant: a property cannot be defined as non-configurable if it does not already exist on the target object" ,
} ) ;
assertThrowsError ( ( ) => {
Object . defineProperty ( p , "foo" , { value : 6 , configurable : false } ) ;
} , {
error : TypeError ,
message : "Proxy handler's defineProperty trap violates invariant: a property cannot be defined as non-configurable if it already exists on the target object as a configurable property" ,
} ) ;
console . log ( "PASS" ) ;
} catch ( e ) {
console . log ( "FAIL: " + e ) ;
}