package de.axone.cache.ng; import static de.axone.cache.ng.CacheNGAssert.*; import static de.axone.cache.ng.CacheNGTestHelpers.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.testng.annotations.Test; import de.axone.cache.ng.CacheNGTestHelpers.Aid; import de.axone.cache.ng.CacheNGTestHelpers.TestRealm; import de.axone.tools.Mapper; @Test( groups="cacheng.twostep" ) public class CacheNGTest_AutomaticTwoStepClient { private Map<String,List<Aid>> map1 = new HashMap<>(); { map1.put( "A", Arrays.asList( aid( "a1" ), aid( "a2" ) ) ); map1.put( "B", Arrays.asList( aid( "b1" ), aid( "b2" ) ) ); map1.put( "C", Arrays.asList( aid( "c1" ) ) ); map1.put( "D", null ); } private Map<Aid,String> map2 = new HashMap<>(); { map2.put( aid( "a1" ), "Art A1" ); map2.put( aid( "a2" ), "Art A2" ); map2.put( aid( "a3" ), "Art A3" ); map2.put( aid( "b1" ), "Art B1" ); map2.put( aid( "c1" ), null ); map2.put( aid( "d1" ), null ); } private CacheNG.UniversalAccessor<String,List<Aid>> String2AidList = CacheNG.single2universal( key -> map1.get( key ) ); private CacheNG.UniversalAccessor<Aid, String> Aid2String = CacheNG.single2universal( key -> map2.get( key ) ); public void stringToListBasicOperations(){ CacheNG.AutomaticClient<String, List<Aid>> aidListForString = new AutomaticClientImpl<>( new CacheHashMap<>( new TestRealm<String,List<Aid>>( "S->L:S" ) ) ); assertThat( aidListForString ).hasNotCached( "A" ); assertThat( aidListForString.fetch( "A", String2AidList ) ) .contains( aid("a1"), aid("a2") ) .hasSize( 2 ); assertThat( aidListForString ).hasCached( "A" ); aidListForString.invalidateAll( false ); assertThat( aidListForString ).hasNotCached( "A" ); } public void aidToStringBasicOperations(){ CacheNG.AutomaticClient<Aid, String> stringForAid = new AutomaticClientImpl<>( new CacheHashMap<>( new TestRealm<Aid,String>( "S->S" ) ) ); assertThat( stringForAid ).hasNotCached( aid("a1" ) ); assertThat( stringForAid.fetch( aid( "a1" ), Aid2String ) ) .isEqualTo( "Art A1" ); assertThat( stringForAid ).hasCached( aid( "a1" ) ); stringForAid.invalidateAll( false ); assertThat( stringForAid ).hasNotCached( aid( "a1" ) ); } public void combinedOperationsHaveCorrectResult(){ CacheNG.AutomaticClient<String, List<Aid>> aidListForString = spy( new AutomaticClientImpl<>( new CacheHashMap<>( new TestRealm<String,List<Aid>>( "S->L:S" ) ) ) ); CacheNG.AutomaticClient<Aid, String> stringForAid = spy( new AutomaticClientImpl<>( new CacheHashMap<>( new TestRealm<Aid,String>( "S->S" ) ) ) ); AutomaticTwoStepCache<String, Aid, String> atsc = new AutomaticTwoStepCache<>( aidListForString, stringForAid ); List<String> arts = atsc.fetch( "A", String2AidList, Aid2String ); assertThat( arts ) .contains( "Art A1", "Art A2" ) .doesNotContain( "Art A3", "Art B1" ) .hasSize( 2 ); arts = atsc.fetch( "B", String2AidList, Aid2String ); assertThat( arts ) .contains( "Art B1" ) .hasSize( 1 ); arts = atsc.fetch( "C", String2AidList, Aid2String ); assertThat( arts ) .hasSize( 0 ); arts = atsc.fetch( "D", String2AidList, Aid2String ); assertThat( arts ) .hasSize( 0 ); arts = atsc.fetch( "E", String2AidList, Aid2String ); assertThat( arts ) .hasSize( 0 ); } public void combinedOperationsUseTheRightCaches(){ CacheNG.AutomaticClient<String, List<Aid>> aidListForString = spy( new AutomaticClientImpl<>( new CacheHashMap<>( new TestRealm<String,List<Aid>>( "S->L:S" ) ) ) ); CacheNG.AutomaticClient<Aid, String> stringForAid = spy( new AutomaticClientImpl<>( new CacheHashMap<>( new TestRealm<Aid,String>( "S->S" ) ) ) ); AutomaticTwoStepCache<String, Aid, String> atsc = new AutomaticTwoStepCache<>( aidListForString, stringForAid ); assertThat( aidListForString ).hasNotCached( "A" ); assertThat( stringForAid ).hasNotCached( aid("a1") ) .hasNotCached( aid("a2") ); atsc.fetch( "A", String2AidList, Aid2String ); assertThat( aidListForString ).hasCached( "A" ); assertThat( stringForAid ).hasCached( aid("a1") ) .hasCached( aid("a2") ); } public void combinedOperationsAndAccessorUsage(){ CacheNG.AutomaticClient<String, List<Aid>> aidListForString = spy( new AutomaticClientImpl<>( new CacheHashMap<>( new TestRealm<String,List<Aid>>( "S->L:S" ) ) ) ); CacheNG.AutomaticClient<Aid, String> stringForAid = spy( new AutomaticClientImpl<>( new CacheHashMap<>( new TestRealm<Aid,String>( "S->S" ) ) ) ); CacheNG.UniversalAccessor<String,List<Aid>> string2AidList = spy( String2AidList ); CacheNG.UniversalAccessor<Aid, String> aid2String = spy( Aid2String ); AutomaticTwoStepCache<String, Aid, String> atsc = new AutomaticTwoStepCache<>( aidListForString, stringForAid ); verify( aidListForString, never() ).fetch( "A", string2AidList ); verify( stringForAid, never() ).fetch( aid( "a1" ), aid2String ); verify( string2AidList, never() ).fetch( "A" ); verify( aid2String, never() ).fetch( Arrays.asList( aid( "a1" ), aid( "a2" ) ) ); atsc.fetch( "A", string2AidList, aid2String ); verify( aidListForString, times( 1 ) ).fetch( "A", string2AidList ); verify( stringForAid, times( 1 ) ).fetch( Arrays.asList( aid( "a1" ), aid( "a2" ) ), aid2String ); verify( string2AidList, times( 1 ) ).fetch( "A" ); verify( aid2String, times( 1 ) ).fetch( Mapper.hashSet( aid( "a1" ), aid( "a2" ) ) ); atsc.fetch( "A", string2AidList, aid2String ); // Not more accessor usage verify( aidListForString, times( 2 ) ).fetch( "A", string2AidList ); verify( stringForAid, times( 2 ) ).fetch( Arrays.asList( aid( "a1" ), aid( "a2" ) ), aid2String ); verify( string2AidList, times( 1 ) ).fetch( "A" ); verify( aid2String, times( 1 ) ).fetch( Mapper.hashSet( aid( "a1" ), aid( "a2" ) ) ); atsc.fetch( "B", string2AidList, aid2String ); verify( aidListForString, times( 1 ) ).fetch( "B", string2AidList ); verify( stringForAid, times( 1 ) ).fetch( Arrays.asList( aid( "b1" ), aid( "b2" ) ), aid2String ); verify( string2AidList, times( 1 ) ).fetch( "B" ); verify( aid2String, times( 1 ) ).fetch( Mapper.hashSet( aid( "b1" ), aid( "b2" ) ) ); } }