import 'mocha' ; import { expect } from 'chai' ; import { AsyncLazy } from '@/infrastructure/Threading/AsyncLazy' ; import { sleep } from '@/infrastructure/Threading/AsyncSleep' ; describe ( 'AsyncLazy' , ( ) => { it ( 'returns value from lambda' , async ( ) => { const expected = 'test' ; const lambda = ( ) => Promise . resolve ( expected ) ; const sut = new AsyncLazy ( lambda ) ; const actual = await sut . getValue ( ) ; expect ( actual ) . to . equal ( expected ) ; } ) ; describe ( 'when running multiple times' , ( ) => { let totalExecuted = 0 ; beforeEach ( ( ) => { totalExecuted = 0 ; } ) ; it ( 'when running sync' , async ( ) => { const sut = new AsyncLazy ( ( ) => { totalExecuted ++ ; return Promise . resolve ( totalExecuted ) ; } ) ; const results = new Array < number > ( ) ; for ( let i = 0 ; i < 5 ; i ++ ) { results . push ( await sut . getValue ( ) ) ; } expect ( totalExecuted ) . to . equal ( 1 ) ; expect ( results ) . to . deep . equal ( [ 1 , 1 , 1 , 1 , 1 ] ) ; } ) ; it ( 'when running long-running task in parallel' , async ( ) => { const sut = new AsyncLazy ( async ( ) => { await sleep ( 100 ) ; totalExecuted ++ ; return Promise . resolve ( totalExecuted ) ; } ) ; const results = await Promise . all ( [ sut . getValue ( ) , sut . getValue ( ) , sut . getValue ( ) , sut . getValue ( ) , sut . getValue ( ) ] ) ; expect ( totalExecuted ) . to . equal ( 1 ) ; expect ( results ) . to . deep . equal ( [ 1 , 1 , 1 , 1 , 1 ] ) ; } ) ; } ) ; } ) ;