license import { ChainedIterator , iteratorFromItems } from './lazy_iterator' ; import { iteratorFromConcatenatedFunction } from './lazy_iterator' ; import { ShuffleIterator } from './lazy_iterator' ; import { TestIntegerIterator } from './lazy_iterator_test' ; const LONG_STREAM_LENGTH = 100 ; const SHORT_STREAM_LENGTH = 15 ; describe ( 'ShuffleIterator' , ( ) => { it ( 'shuffles a stream without replacement' , async ( ) => { const baseIterator = new TestIntegerIterator ( LONG_STREAM_LENGTH ) ; const shuffleIterator = new ShuffleIterator ( baseIterator , 1000 ) ; const notExpectedResult = [ ] ; for ( let i = 0 ; i < 1 ; i ++ ) { for ( let j = 0 ; j < LONG_STREAM_LENGTH ; j ++ ) { notExpectedResult [ i * LONG_STREAM_LENGTH + j ] = j ; } } const result = await shuffleIterator . toArrayForTest ( ) ; expect ( result ) . not . toEqual ( notExpectedResult ) ; expect ( result . length ) . toEqual ( LONG_STREAM_LENGTH ) ; const counts = new Array < number > ( LONG_STREAM_LENGTH ) ; result . forEach ( ( x ) => { counts [ x ] = ( counts [ x ] || 0 ) + 1 ; } ) ; for ( let i = 0 ; i < LONG_STREAM_LENGTH ; i ++ ) { expect ( counts [ i ] ) . toEqual ( 1 ) ; } } ) ; it ( 'shuffles a single chained stream without replacement' , async ( ) => { const baseIterator = new ChainedIterator ( iteratorFromItems ( [ new TestIntegerIterator ( SHORT_STREAM_LENGTH ) ] ) ) ; const shuffleIterator = new ShuffleIterator ( baseIterator , 1000 ) ; const notExpectedResult = [ ] ; for ( let i = 0 ; i < 1 ; i ++ ) { for ( let j = 0 ; j < SHORT_STREAM_LENGTH ; j ++ ) { notExpectedResult [ i * SHORT_STREAM_LENGTH + j ] = j ; } } const result = await shuffleIterator . toArrayForTest ( ) ; expect ( result ) . not . toEqual ( notExpectedResult ) ; expect ( result . length ) . toEqual ( SHORT_STREAM_LENGTH ) ; const counts = new Array < number > ( SHORT_STREAM_LENGTH ) ; result . forEach ( ( x ) => { counts [ x ] = ( counts [ x ] || 0 ) + 1 ; } ) ; for ( let i = 0 ; i < SHORT_STREAM_LENGTH ; i ++ ) { expect ( counts [ i ] ) . toEqual ( 1 ) ; } } ) ; it ( 'shuffles multiple chained streams without replacement' , async ( ) => { const baseIterator = iteratorFromConcatenatedFunction ( ( ) => ( { value : new TestIntegerIterator ( SHORT_STREAM_LENGTH ) , done : false } ) , 3 ) ; const shuffleIterator = new ShuffleIterator ( baseIterator , 1000 ) ; const notExpectedResult = [ ] ; for ( let i = 0 ; i < 3 ; i ++ ) { for ( let j = 0 ; j < SHORT_STREAM_LENGTH ; j ++ ) { notExpectedResult [ i * SHORT_STREAM_LENGTH + j ] = j ; } } const result = await shuffleIterator . toArrayForTest ( ) ; expect ( result ) . not . toEqual ( notExpectedResult ) ; expect ( result . length ) . toEqual ( 3 * SHORT_STREAM_LENGTH ) ; const counts = new Array < number > ( SHORT_STREAM_LENGTH ) ; result . forEach ( ( x ) => { counts [ x ] = ( counts [ x ] || 0 ) + 1 ; } ) ; for ( let i = 0 ; i < SHORT_STREAM_LENGTH ; i ++ ) { expect ( counts [ i ] ) . toEqual ( 3 ) ; } } ) ; } ) ;