2020-07-03 22:43:08 -07:00
describe ( "[[Has]] trap normal behavior" , ( ) => {
2020-07-06 07:37:45 -07:00
test ( "forwarding when not defined in handler" , ( ) => {
expect ( "foo" in new Proxy ( { } , { has : null } ) ) . toBeFalse ( ) ;
expect ( "foo" in new Proxy ( { } , { has : undefined } ) ) . toBeFalse ( ) ;
expect ( "foo" in new Proxy ( { } , { } ) ) . toBeFalse ( ) ;
2020-07-03 22:43:08 -07:00
} ) ;
2020-06-03 14:34:52 -07:00
2020-07-06 07:37:45 -07:00
test ( "correct arguments supplied to trap" , ( ) => {
let o = { } ;
let p = new Proxy ( o , {
has ( target , prop ) {
expect ( target ) . toBe ( o ) ;
expect ( prop ) . toBe ( "foo" ) ;
return true ;
} ,
} ) ;
2020-06-03 14:34:52 -07:00
2020-07-06 07:37:45 -07:00
"foo" in p ;
2020-06-03 14:34:52 -07:00
} ) ;
2020-07-05 09:27:00 -07:00
2021-07-05 01:59:50 +02:00
test ( "correct arguments passed to trap even for number" , ( ) => {
let o = { } ;
let p = new Proxy ( o , {
has ( target , prop ) {
expect ( target ) . toBe ( o ) ;
expect ( prop ) . toBe ( "1" ) ;
return true ;
} ,
} ) ;
1 in p ;
} ) ;
2020-07-06 07:37:45 -07:00
test ( "conditional return" , ( ) => {
let o = { } ;
let p = new Proxy ( o , {
has ( target , prop ) {
if ( target . checkedFoo ) return true ;
if ( prop === "foo" ) target . checkedFoo = true ;
return false ;
} ,
} ) ;
expect ( "foo" in p ) . toBeFalse ( ) ;
expect ( "foo" in p ) . toBeTrue ( ) ;
} ) ;
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 ( "[[Has]] invariants" , ( ) => {
2020-07-06 07:37:45 -07:00
test ( "cannot return false if the property exists and is non-configurable" , ( ) => {
let o = { } ;
Object . defineProperty ( o , "foo" , { configurable : false } ) ;
2020-06-03 14:34:52 -07:00
2020-07-06 07:37:45 -07:00
p = new Proxy ( o , {
has ( ) {
return false ;
} ,
} ) ;
2020-06-03 14:34:52 -07:00
2020-07-06 07:37:45 -07:00
expect ( ( ) => {
"foo" in p ;
} ) . toThrowWithMessage (
TypeError ,
"Proxy handler's has trap violates invariant: a property cannot be reported as non-existent if it exists on the target as a non-configurable property"
) ;
} ) ;
2020-07-03 22:43:08 -07:00
2020-07-06 07:37:45 -07:00
test ( "cannot return false if the property exists and the target is non-extensible" , ( ) => {
let o = { } ;
Object . defineProperty ( o , "foo" , { value : 10 , configurable : true } ) ;
2020-07-03 22:43:08 -07:00
2020-07-06 07:37:45 -07:00
let p = new Proxy ( o , {
has ( ) {
return false ;
} ,
} ) ;
2020-07-05 09:27:00 -07:00
2020-07-06 07:37:45 -07:00
Object . preventExtensions ( o ) ;
2020-07-05 09:27:00 -07:00
2020-07-06 07:37:45 -07:00
expect ( ( ) => {
"foo" in p ;
} ) . toThrowWithMessage (
TypeError ,
"Proxy handler's has trap violates invariant: a property cannot be reported as non-existent if it exists on the target and the target is non-extensible"
) ;
} ) ;
2020-07-03 22:43:08 -07:00
} ) ;