package de.axone.cache.ng; import static org.assertj.core.api.Assertions.*; import static org.testng.Assert.*; import org.testng.annotations.Test; import de.axone.tools.E; @Test( groups="cacheng.tools" ) public class RandomMapperTest { private static final int RUNS = 1_000_000; public void checkDistributionAndSpeedOfMappedValues(){ long start = System.currentTimeMillis(); int c = 0; for( int i=0; i<RUNS; i++ ){ int rnd = RandomMapper.integer( i ); if( rnd > 0 ) c++; else if( rnd < 0 ) c--; } long end = System.currentTimeMillis(); E.rr( RUNS + " values (" + c + ") in " + (end-start) + " ms" ); assertThat( c ).isBetween( -100, 100 ); assertThat( end-start ).isLessThan( 1000 ); // 1s } public void checkThatSameValuesLeadToSameRandoms(){ for( int i=0; i<RUNS; i++ ){ // Distribute test values deterministically int j = RandomMapper.integer( i ); assertThat( RandomMapper.integer( j ) ) .isEqualTo( RandomMapper.integer( j ) ); } } public void checkAverageValueAndAverageSpacing(){ long sum = 0; long posSum = 0; for( int i=0; i<RUNS; i++ ){ sum += RandomMapper.integer( i ); posSum += RandomMapper.positiveInteger( i ); } // These are experimental values. But they guarantee some assumption // and are good enough. // Just make sure changes on RandomMapper don't make this worse. assertThat( sum ).isBetween( -10L*Integer.MAX_VALUE, 10L*Integer.MAX_VALUE ); long posAvg = posSum / RUNS; assertThat( posAvg ).isBetween( Integer.MAX_VALUE/2-2000L, Integer.MAX_VALUE/2+2000L ); } public void checkThatWeAreStableBetweenRuns(){ assertEquals( RandomMapper.integer( 0 ), 1033096058 ); assertEquals( RandomMapper.integer( 1 ), 1761283695 ); assertEquals( RandomMapper.integer( -1 ), 52699159 ); assertEquals( RandomMapper.integer( Integer.MAX_VALUE ), -649748457 ); assertEquals( RandomMapper.integer( Integer.MIN_VALUE ), 1735543674 ); } public void checkThatWeAreUsingTheSameMethodAsRandom(){ for( int i=0; i<RUNS; i++ ){ // Distribute test values deterministically int j = RandomMapper.integer( i ); assertEquals( RandomMapper.integer( j ), RandomMapper.integerUsingRandom( j ) ); } } }