import cloneDeep from 'lodash/cloneDeep' ; import moize from '../src' ; type Arg = { one : number ; two : number ; three : ( ) => void ; four : symbol ; five : null ; } ; const method = jest . fn ( function ( { one , two , three , four , five } ) { return [ one , two , three , four , five ] ; } ) ; const memoized = moize . serialize ( method ) ; describe ( 'moize.serialize' , ( ) => { afterEach ( jest . clearAllMocks ) ; it ( 'serializes the args passed by' , ( ) => { const three = function ( ) { } ; const four = Symbol ( 'foo' ) ; const resultA = memoized ( { one : 1 , two : 2 , three , four , five : null } ) ; const resultB = memoized ( { one : 1 , two : 2 , three ( ) { } , four : Symbol ( 'foo' ) , five : null , } ) ; expect ( resultA ) . toEqual ( [ 1 , 2 , three , four , null ] ) ; expect ( resultB ) . toBe ( resultA ) ; expect ( method ) . toHaveBeenCalledTimes ( 1 ) ; } ) ; it ( 'handles circular objects' , ( ) => { type Arg = { deeply : { nested : { circular : Arg | { } ; } ; } ; } ; const circularMethod = jest . fn ( ( arg ) => arg ) ; const circularMemoized = moize . serialize ( circularMethod ) ; const circular = { deeply : { nested : { circular : { } , } , } , } ; circular . deeply . nested . circular = circular ; const resultA = circularMemoized ( cloneDeep ( circular ) ) ; const resultB = circularMemoized ( cloneDeep ( circular ) ) ; expect ( resultB ) . toBe ( resultA ) ; expect ( circularMethod ) . toHaveBeenCalledTimes ( 1 ) ; expect ( circularMemoized . cache . keys ) . toEqual ( [ [ '|{"deeply":{"nested":{"circular":"[ref=.]"}}}|' ] , ] ) ; } ) ; } ) ; describe ( 'moize.serializeWith' , ( ) => { afterEach ( jest . clearAllMocks ) ; it ( 'serializes the arguments passed with the custom serializer' , ( ) => { const withSerializer = moize . serializeWith ( ( args ) => [ JSON . stringify ( args ) , ] ) ( method ) ; const three = function ( ) { } ; const four = Symbol ( 'foo' ) ; const resultA = withSerializer ( { one : 1 , two : 2 , three , four , five : null , } ) ; const resultB = withSerializer ( { one : 1 , two : 2 , three ( ) { } , four : Symbol ( 'foo' ) , five : null , } ) ; expect ( resultA ) . toEqual ( [ 1 , 2 , three , four , null ] ) ; expect ( resultB ) . toBe ( resultA ) ; expect ( method ) . toHaveBeenCalledTimes ( 1 ) ; } ) ; } ) ;