package com.codepoetics.protonpack;
import com.codepoetics.protonpack.selectors.Selectors;
import org.junit.Test;
import java.util.Comparator;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
public class InterleaveTest {
@Test public void
round_robin_interleaving() {
Stream<String> streamA = Stream.of("Peter", "Paul", "Mary");
Stream<String> streamB = Stream.of("A", "B", "C", "D", "E");
Stream<String> streamC = Stream.of("foo", "bar", "baz", "xyzzy");
Stream<String> interleaved = StreamUtils.interleave(Selectors.roundRobin(), streamA, streamB, streamC);
assertThat(interleaved.collect(Collectors.toList()), contains(
"Peter", "A", "foo",
"Paul", "B", "bar",
"Mary", "C", "baz",
"D", "xyzzy",
"E"));
}
@Test public void
sorted_interleaving() {
Stream<String> streamA = Stream.of("Peter", "B", "xyzzy");
Stream<String> streamB = Stream.of("A", "Paul", "C", "baz", "E");
Stream<String> streamC = Stream.of("foo", "bar", "D", "Mary");
Stream<String> interleaved = StreamUtils.interleave(Selectors.takeMin(),
streamA.sorted(), streamB.sorted(), streamC.sorted());
List<String> collected = interleaved.collect(Collectors.toList());
assertThat(collected, contains("A", "B", "C", "D", "E", "Mary", "Paul", "Peter", "bar", "baz", "foo", "xyzzy"));
}
@Test public void
prioritised_interleaving() {
Stream<String> streamA = Stream.of("1 A1", "1 A2", "2 A3");
Stream<String> streamB = Stream.of("2 B1", "1 B2", "1 B3");
Function<String, Integer> priority = s -> Integer.valueOf(s.substring(0, 1));
Stream<String> interleaved = StreamUtils.interleave(Selectors.takeMax(Comparator.comparing(priority)),
streamA, streamB);
List<String> collected = interleaved.collect(Collectors.toList());
assertThat(collected, contains("2 B1", "1 A1", "1 B2", "1 A2", "2 A3", "1 B3"));
}
}