2020-07-03 22:43:08 -07:00
describe ( "[[Delete]] trap normal behavior" , ( ) => {
test ( "forwarding when not defined in handler" , ( ) => {
expect ( delete ( new Proxy ( { } , { deleteProperty : undefined } ) ) . foo ) . toBe ( true ) ;
expect ( delete ( new Proxy ( { } , { deleteProperty : null } ) ) . foo ) . toBe ( true ) ;
expect ( delete ( new Proxy ( { } , { } ) ) . foo ) . toBe ( true ) ;
2020-06-03 14:34:52 -07:00
} ) ;
2020-07-03 22:43:08 -07:00
test ( "correct arguments supplied to trap" , ( ) => {
let o = { } ;
let p = new Proxy ( o , {
deleteProperty ( target , property ) {
expect ( target ) . toBe ( o ) ;
expect ( property ) . toBe ( "foo" ) ;
2020-06-03 14:34:52 -07:00
return true ;
}
2020-07-03 22:43:08 -07:00
} ) ;
2020-06-03 14:34:52 -07:00
2020-07-03 22:43:08 -07:00
delete p . foo ;
} ) ;
2020-06-03 14:34:52 -07:00
2020-07-03 22:43:08 -07:00
test ( "conditional deletion" , ( ) => {
o = { foo : 1 , bar : 2 } ;
p = new Proxy ( o , {
deleteProperty ( target , property ) {
if ( property === "foo" ) {
delete target [ property ] ;
return true ;
}
return false ;
}
} ) ;
2020-06-03 14:34:52 -07:00
2020-07-03 22:43:08 -07:00
expect ( delete p . foo ) . toBe ( true ) ;
expect ( delete p . bar ) . toBe ( false ) ;
2020-06-03 14:34:52 -07:00
2020-07-03 22:43:08 -07:00
expect ( o . foo ) . toBe ( undefined ) ;
expect ( o . bar ) . toBe ( 2 ) ;
2020-06-03 14:34:52 -07:00
} ) ;
2020-07-03 22:43:08 -07:00
} ) ;
2020-06-03 14:34:52 -07:00
2020-07-03 22:43:08 -07:00
describe ( "[[Delete]] invariants" , ( ) => {
test ( "cannot report a non-configurable own property as deleted" , ( ) => {
let o = { } ;
Object . defineProperty ( o , "foo" , { configurable : false } ) ;
let p = new Proxy ( o , {
deleteProperty ( ) {
return true ;
} ,
} ) ;
expect ( ( ) => {
delete p . foo ;
} ) . toThrowWithMessage ( TypeError , "Proxy handler's deleteProperty trap violates invariant: cannot report a non-configurable own property of the target as deleted" ) ;
} ) ;
} ) ;