package com.nurkiewicz.lazyseq.samples;
import com.nurkiewicz.lazyseq.AbstractBaseTestCase;
import com.nurkiewicz.lazyseq.LazySeq;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import static com.nurkiewicz.lazyseq.LazySeq.numbers;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.verify;
/**
* @author Tomasz Nurkiewicz
* @since 5/12/13, 4:36 PM
*/
public class LazyPagingTest extends AbstractBaseTestCase {
@Mock
private Consumer<String> pageConsumer;
private static final int PAGE_SIZE = 5;
@Test
public void shouldLoadOnlyFirstPageWhenInitiated() throws Exception {
records(0);
verify(pageConsumer).accept("0,5");
}
@Test
public void shouldReturnFirstFewRecords() throws Exception {
//given
final LazySeq<Record> records = records(0);
//when
//then
records.startsWith(Arrays.asList(new Record(0), new Record(1), new Record(2), new Record(3)));
verify(pageConsumer).accept("0,5");
}
@Test
public void shouldNotLoadSubsequentPagesIfOneRecordLeftInCurrentBatch() throws Exception {
//given
final LazySeq<Record> records = records(0);
//when
records.drop(PAGE_SIZE - 1);
//then
verify(pageConsumer).accept("0,5");
}
@Test
public void shouldLoadSecondPageWhenAllElementsFromFirstDropped() throws Exception {
//given
final LazySeq<Record> records = records(0);
//when
final Record record = records.drop(PAGE_SIZE).head();
//then
verify(pageConsumer).accept("0,5");
verify(pageConsumer).accept("5,5");
assertThat(record).isEqualTo(new Record(5));
}
@Test
public void shouldLoadAllPreviousPageWhenAccessingArbitraryRecord() throws Exception {
//given
final LazySeq<Record> records = records(0);
//when
final Record record = records.get(17);
//then
final InOrder order = Mockito.inOrder(pageConsumer);
order.verify(pageConsumer).accept("0,5");
order.verify(pageConsumer).accept("5,5");
order.verify(pageConsumer).accept("10,5");
order.verify(pageConsumer).accept("15,5");
assertThat(record).isEqualTo(new Record(17));
}
private LazySeq<Record> records(int from) {
return LazySeq.concat(loadPage(from, PAGE_SIZE), () -> records(from + PAGE_SIZE));
}
public List<Record> loadPage(int offset, int max) {
pageConsumer.accept(offset + "," + max);
return numbers(offset).
take(max).
map(Record::new).
toList();
}
}