import moize from '../src' ; const foo = 'foo' ; const bar = 'bar' ; const method = jest . fn ( function ( one , two ) { return { one , two } ; } ) ; describe ( 'moize.isCollectingStats' , ( ) => { it ( 'should identify if stats are being collected' , ( ) => { expect ( moize . isCollectingStats ( ) ) . toBe ( false ) ; moize . collectStats ( ) ; expect ( moize . isCollectingStats ( ) ) . toBe ( true ) ; moize . collectStats ( false ) ; expect ( moize . isCollectingStats ( ) ) . toBe ( false ) ; } ) ; } ) ; describe ( 'moize.profile' , ( ) => { beforeEach ( ( ) => { moize . collectStats ( ) ; } ) ; afterEach ( ( ) => { moize . collectStats ( false ) ; moize . clearStats ( ) ; } ) ; it ( 'should create a memoized method with the profileName passed' , ( ) => { const profileName = 'profileName' ; const profiled = moize . profile ( profileName ) ( method ) ; profiled ( foo , bar ) ; profiled ( foo , bar ) ; expect ( profiled . getStats ( ) ) . toEqual ( { calls : 2 , hits : 1 , usage : '50.0000%' , } ) ; profiled . clearStats ( ) ; expect ( profiled . getStats ( ) ) . toEqual ( { calls : 0 , hits : 0 , usage : '0.0000%' , } ) ; } ) ; it ( 'should handle collecting more stats after clearing' , ( ) => { const profileName = 'profileName' ; const profiled = moize . profile ( profileName ) ( method ) ; profiled ( foo , bar ) ; profiled ( foo , bar ) ; expect ( profiled . getStats ( ) ) . toEqual ( { calls : 2 , hits : 1 , usage : '50.0000%' , } ) ; profiled . clearStats ( ) ; expect ( profiled . getStats ( ) ) . toEqual ( { calls : 0 , hits : 0 , usage : '0.0000%' , } ) ; profiled ( foo , bar ) ; profiled ( foo , bar ) ; expect ( profiled . getStats ( ) ) . toEqual ( { calls : 2 , hits : 2 , usage : '100.0000%' , } ) ; } ) ; it ( 'should profile a fallback name if one is not provided' , ( ) => { const originalError = global . Error ; global . Error = function ( ) { return { } ; } ; const memoized = moize ( method ) ; memoized ( foo , bar ) ; memoized ( foo , bar ) ; expect ( moize . getStats ( ) ) . toEqual ( { calls : 2 , hits : 1 , profiles : { [ memoized . options . profileName ] : { calls : 2 , hits : 1 , usage : '50.0000%' , } , } , usage : '50.0000%' , } ) ; global . Error = originalError ; } ) ; } ) ; describe ( 'moize.getStats' , ( ) => { beforeEach ( ( ) => { moize . collectStats ( ) ; } ) ; afterEach ( ( ) => { moize . collectStats ( false ) ; moize . clearStats ( ) ; } ) ; it ( 'should handle stats for all usages' , ( ) => { const profileName = 'profileName' ; const profiled = moize . profile ( profileName ) ( method ) ; profiled ( foo , bar ) ; profiled ( foo , bar ) ; expect ( moize . getStats ( profileName ) ) . toEqual ( { calls : 2 , hits : 1 , usage : '50.0000%' , } ) ; expect ( moize . getStats ( ) ) . toEqual ( { calls : 2 , hits : 1 , profiles : { [ profileName ] : { calls : 2 , hits : 1 , usage : '50.0000%' , } , } , usage : '50.0000%' , } ) ; moize . clearStats ( ) ; expect ( moize . getStats ( ) ) . toEqual ( { calls : 0 , hits : 0 , profiles : { } , usage : '0.0000%' , } ) ; } ) ; it ( 'should warn when getting stats and stats are not being collected' , ( ) => { moize . collectStats ( false ) ; const warn = jest . spyOn ( console , 'warn' ) ; moize . getStats ( ) ; expect ( warn ) . toHaveBeenCalledWith ( 'Stats are not currently being collected, please run "collectStats" to enable them.' ) ; warn . mockRestore ( ) ; } ) ; } ) ;