2020-07-03 22:43:08 -07:00
describe ( "[[Set]] trap normal behavior" , ( ) => {
2020-07-06 07:37:45 -07:00
test ( "forwarding when not defined in handler" , ( ) => {
expect ( ( new Proxy ( { } , { set : undefined } ) . foo = 1 ) ) . toBe ( 1 ) ;
expect ( ( new Proxy ( { } , { set : null } ) . foo = 1 ) ) . toBe ( 1 ) ;
expect ( ( new Proxy ( { } , { } ) . foo = 1 ) ) . toBe ( 1 ) ;
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 , {
set ( target , prop , value , receiver ) {
expect ( target ) . toBe ( o ) ;
expect ( prop ) . toBe ( "foo" ) ;
expect ( value ) . toBe ( 10 ) ;
expect ( receiver ) . toBe ( p ) ;
return true ;
} ,
} ) ;
p . foo = 10 ;
} ) ;
2020-06-03 14:34:52 -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 , {
set ( target , prop , value , receiver ) {
expect ( target ) . toBe ( o ) ;
expect ( prop ) . toBe ( "1" ) ;
expect ( value ) . toBe ( 10 ) ;
expect ( receiver ) . toBe ( p ) ;
return true ;
} ,
} ) ;
p [ 1 ] = 10 ;
} ) ;
2020-07-06 07:37:45 -07:00
test ( "conditional return value" , ( ) => {
let p = new Proxy (
{ } ,
{
set ( target , prop , value ) {
if ( target [ prop ] === value ) {
target [ prop ] *= 2 ;
} else {
target [ prop ] = value ;
}
} ,
}
) ;
2020-07-05 09:27:00 -07:00
2020-07-06 07:37:45 -07:00
p . foo = 10 ;
expect ( p . foo ) . toBe ( 10 ) ;
p . foo = 10 ;
expect ( p . foo ) . toBe ( 20 ) ;
p . foo = 10 ;
expect ( p . foo ) . toBe ( 10 ) ;
2020-12-26 16:24:24 +01:00
p [ Symbol . hasInstance ] = "foo" ;
2020-11-04 21:55:15 +00:00
expect ( p [ Symbol . hasInstance ] ) . toBe ( "foo" ) ;
2020-07-06 07:37:45 -07:00
} ) ;
2020-11-24 17:47:51 +00:00
test ( "custom receiver value" , ( ) => {
const o = { } ;
const r = { } ;
let p = new Proxy ( o , {
set ( target , property , value , receiver ) {
receiver [ property ] = value ;
return true ;
} ,
} ) ;
expect ( Reflect . set ( p , "foo" , 42 , r ) ) . toBe ( true ) ;
expect ( o . foo ) . toBeUndefined ( ) ;
expect ( r . foo ) . toBe ( 42 ) ;
} ) ;
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 ( "[[Set]] invariants" , ( ) => {
2020-07-06 07:37:45 -07:00
test ( "cannot return true for a non-configurable, non-writable property" , ( ) => {
let o = { } ;
Object . defineProperty ( o , "foo" , { value : 10 } ) ;
let p = new Proxy ( o , {
set ( ) {
return true ;
} ,
} ) ;
2020-06-03 14:34:52 -07:00
2020-07-06 07:37:45 -07:00
expect ( ( ) => {
p . foo = 12 ;
} ) . toThrowWithMessage (
TypeError ,
"Proxy handler's set trap violates invariant: cannot return true for a property on the target which is a non-configurable, non-writable own data property"
) ;
2020-06-03 14:34:52 -07:00
} ) ;
2020-07-06 07:37:45 -07:00
test ( "cannot return true for a non-configurable accessor property with no setter" , ( ) => {
let o = { } ;
Object . defineProperty ( o , "foo" , { get ( ) { } } ) ;
2020-06-03 14:34:52 -07:00
2020-07-06 07:37:45 -07:00
let p = new Proxy ( o , {
set ( ) {
return true ;
} ,
} ) ;
2020-06-03 14:34:52 -07:00
2020-07-06 07:37:45 -07:00
expect ( ( ) => {
p . foo = 12 ;
} ) . toThrowWithMessage (
TypeError ,
"Proxy handler's set trap violates invariant: cannot return true for a property on the target which is a non-configurable own accessor property with an undefined set attribute"
) ;
2020-07-03 22:43:08 -07:00
} ) ;
} ) ;