package com.codepoetics.protonpack;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
import static java.util.Arrays.asList;
import static java.util.stream.Collectors.toList;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.equalTo;
public class AggregateTest {
@Test public void
aggregate_on_bi_element_predicate() {
Stream<String> stream = Stream.of("a1", "b1", "b2", "c1");
Stream<List<String>> aggregated = StreamUtils.aggregate(stream, (e1, e2) -> e1.charAt(0) == e2.charAt(0));
assertThat(aggregated.collect(toList()), contains(
asList("a1"),
asList("b1", "b2"),
asList("c1")));
}
@Test public void
aggregate_on_size1() {
Stream<String> stream = Stream.of("a1", "b1", "b2", "c1");
Stream<List<String>> aggregated = StreamUtils.aggregate(stream, 1);
assertThat(aggregated.collect(toList()), contains(
asList("a1"), asList("b1"), asList("b2"), asList("c1")));
}
@Test public void
aggregate_on_size2() {
Stream<String> stream = Stream.of("a1", "b1", "b2", "c1");
Stream<List<String>> aggregated = StreamUtils.aggregate(stream, 2);
assertThat(aggregated.collect(toList()), contains(
asList("a1", "b1"), asList("b2", "c1")));
}
@Test public void
aggregate_on_size3() {
Stream<String> stream = Stream.of("a1", "b1", "b2", "c1");
Stream<List<String>> aggregated = StreamUtils.aggregate(stream, 3);
assertThat(aggregated.collect(toList()), contains(
asList("a1", "b1", "b2"), asList("c1")));
}
@Test public void
find_first_on_size2() {
Stream<String> stream = Stream.of("a1");
Stream<List<String>> aggregated = StreamUtils.aggregate(stream, 2);
assertThat(aggregated.findFirst().get(), equalTo(asList("a1")));
}
@Test public void
works_with_iterator() throws Exception {
Stream<String> stream = Stream.of("a", "a", "a", "b", "b", "c", "c", "c");
Stream<List<String>> aggregated = StreamUtils.aggregate(stream, (a, b) -> a.equals(b));
List<List<String>> list = new ArrayList<>();
aggregated.iterator().forEachRemaining(list::add);
assertThat(list, contains(
asList("a", "a", "a"),
asList("b", "b"),
asList("c", "c", "c")
));
stream = Stream.of("a", "a", "a", "b", "b", "c", "c", "c");
aggregated = StreamUtils.aggregate(stream, 3);
list = new ArrayList<>();
aggregated.iterator().forEachRemaining(list::add);
assertThat(list, contains(
asList("a", "a", "a"),
asList("b", "b", "c"),
asList("c", "c")
));
}
}