package com.nurkiewicz.lazyseq;
import org.mockito.Mock;
import org.testng.annotations.Test;
import java.util.function.Supplier;
import static com.nurkiewicz.lazyseq.LazySeq.numbers;
import static com.nurkiewicz.lazyseq.LazySeq.of;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.verifyZeroInteractions;
/**
* @author Tomasz Nurkiewicz
* @since 5/11/13, 4:15 PM
*/
public class LazySeqFlatMapTest extends AbstractBaseTestCase {
@Mock
private Supplier<LazySeq<Integer>> supplierMock;
@Test
public void shouldReturnEmptySequenceWhenEmptyAsInput() throws Exception {
//given
final LazySeq<Integer> empty = LazySeq.empty();
//when
final LazySeq<Integer> flat = empty.flatMap(i -> asList(i, -i));
//then
assertThat(flat.isEmpty());
}
@Test
public void shouldFlattenHead() throws Exception {
//given
final LazySeq<Integer> raw = of(1, 2);
//when
final LazySeq<Integer> flat = raw.flatMap(i -> asList(i, -i));
//then
assertThat(flat).isEqualTo(of(1, -1, 2, -2));
}
@Test
public void shouldLazilyFlattenInfiniteStream() throws Exception {
//given
final LazySeq<Integer> raw = numbers(1);
//when
final LazySeq<Integer> flat = raw.flatMap(i -> asList(i, 0, -i));
//then
assertThat(flat.take(10)).isEqualTo(of(1, 0, -1, 2, 0, -2, 3, 0, -3, 4));
}
@Test
public void shouldFlattenHeadOnlyAndNotEvaluateTail() throws Exception {
//given
final LazySeq<Integer> raw = LazySeq.of(1, supplierMock);
//when
final LazySeq<Integer> flat = raw.flatMap(i -> asList(i, 0, -i));
//then
assertThat(flat.get(0)).isEqualTo(1);
assertThat(flat.get(1)).isEqualTo(0);
assertThat(flat.get(2)).isEqualTo(-1);
verifyZeroInteractions(supplierMock);
}
@Test
public void shouldKeepEvaluatingIfFirstFlatMapResultIsEmpty() throws Exception {
//given
int from = -10;
final LazySeq<Integer> raw = numbers(from);
//when
final LazySeq<Integer> flat = raw.flatMap(LazySeqFlatMapTest::flatMapFun);
//then
assertThat(flat.take(10)).isEqualTo(of(2, 3, 4, 5, 6, 7, 0, 0, 0, 0));
}
private static Iterable<Integer> flatMapFun(int i) {
if (i <= 0) {
return emptyList();
}
switch (i) {
case 1:
return asList(2);
case 2:
return asList(3, 4);
case 3:
return asList(5, 6, 7);
default:
return asList(0, 0);
}
}
}