package de.is24.guava;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import org.junit.Before;
import org.junit.Test;
import javax.annotation.Nullable;
import static com.google.common.base.Optional.of;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
public final class A_SequentialLoadingCacheTest {
private SequenceFunction sequenceFunction;
private SequentialLoadingCache<Object, Integer> objectUnderTest;
@Before
public void setUp() throws Exception {
sequenceFunction = new SequenceFunction();
objectUnderTest = new SequentialLoadingCache<Object, Integer>(sequenceFunction);
}
@Test
public void usesFunctionToLoadValues() {
Optional<Integer> result = objectUnderTest.getUnchecked("foo");
assertThat(result.isPresent(), is(true));
assertThat(result.get(), is(0));
}
@Test
public void cachesValues() {
objectUnderTest.getUnchecked("foo");
Optional<Integer> result = objectUnderTest.getUnchecked("foo");
assertThat(result.isPresent(), is(true));
assertThat(result.get(), is(0));
}
@Test
public void usesKeysToCache() {
objectUnderTest.getUnchecked("foo");
Optional<Integer> result = objectUnderTest.getUnchecked("bar");
assertThat(result.isPresent(), is(true));
assertThat(result.get(), is(1));
}
@Test
public void usesCacheOnlyIfRequested() {
Optional<Integer> result = objectUnderTest.getIfPresent("foo");
assertThat(result.isPresent(), is(false));
assertThat(sequenceFunction.sequence, is(0));
}
@Test
public void cachesOnlyOneValue() {
objectUnderTest = SequentialLoadingCache.createSingleValueCache(sequenceFunction);
objectUnderTest.getUnchecked("foo");
objectUnderTest.getUnchecked("foo");
objectUnderTest.getUnchecked("bar");
objectUnderTest.getUnchecked("bar");
Optional<Integer> result = objectUnderTest.getUnchecked("foo");
assertThat(result.isPresent(), is(true));
assertThat(result.get(), is(2));
}
private static class SequenceFunction implements Function<Object, Optional<Integer>> {
public int sequence = 0;
@Nullable
@Override
public Optional<Integer> apply(@Nullable Object input) {
return of(sequence++);
}
}
}