package com.codepoetics.octarine.joins; import com.codepoetics.octarine.functional.tuples.T2; import org.junit.Test; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.stream.Collectors; import java.util.stream.StreamSupport; import static org.hamcrest.CoreMatchers.hasItems; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; public class KeyMatchingSpliteratorTest { @Test public void returnsPairsWhereAllKeysMatch() { Map<String, Integer> left = new TreeMap<>(); left.put("b", 2); left.put("a", 1); left.put("c", 3); Map<String, String> right = new TreeMap<>(); right.put("a", "apple"); right.put("c", "carrot"); right.put("b", "banana"); KeyMatchingSpliterator<String, Integer, String> spliterator = KeyMatchingSpliterator.over( Comparator.naturalOrder(), left.entrySet().spliterator(), right.entrySet().spliterator(), 0, ""); List<T2<Integer, String>> tuples = StreamSupport.stream(spliterator, false).collect(Collectors.toList()); assertThat(tuples, hasItems(T2.of(1, "apple"), T2.of(2, "banana"), T2.of(3, "carrot"))); } @Test public void returnsPairsWhereKeysMismatch() { Map<String, Integer> left = new TreeMap<>(); left.put("b", 2); left.put("a", 1); left.put("d", 4); Map<String, String> right = new TreeMap<>(); right.put("a", "apple"); right.put("c", "carrot"); right.put("b", "banana"); KeyMatchingSpliterator<String, Integer, String> spliterator = KeyMatchingSpliterator.over( Comparator.naturalOrder(), left.entrySet().spliterator(), right.entrySet().spliterator(), 0, ""); List<T2<Integer, String>> tuples = StreamSupport.stream(spliterator, false).collect(Collectors.toList()); assertThat(tuples, hasItems(T2.of(1, "apple"), T2.of(2, "banana"), T2.of(0, "carrot"), T2.of(4, ""))); } @Test public void returnsPairsWhereMoreKeysOnLeft() { Map<String, Integer> left = new TreeMap<>(); left.put("a", 1); left.put("b", 2); left.put("c", 3); Map<String, String> right = new TreeMap<>(); right.put("b", "banana"); right.put("a", "apple"); KeyMatchingSpliterator<String, Integer, String> spliterator = KeyMatchingSpliterator.over( Comparator.naturalOrder(), left.entrySet().spliterator(), right.entrySet().spliterator(), 0, ""); List<T2<Integer, String>> tuples = StreamSupport.stream(spliterator, false).collect(Collectors.toList()); assertThat(tuples, hasItems(T2.of(1, "apple"), T2.of(2, "banana"), T2.of(3, ""))); } @Test public void returnsPairsWhereMoreKeysOnRight() { Map<String, Integer> left = new TreeMap<>(); left.put("a", 1); left.put("b", 2); Map<String, String> right = new TreeMap<>(); right.put("b", "banana"); right.put("a", "apple"); right.put("c", "carrot"); KeyMatchingSpliterator<String, Integer, String> spliterator = KeyMatchingSpliterator.over( Comparator.naturalOrder(), left.entrySet().spliterator(), right.entrySet().spliterator(), 0, ""); List<T2<Integer, String>> tuples = StreamSupport.stream(spliterator, false).collect(Collectors.toList()); assertThat(tuples, hasItems(T2.of(1, "apple"), T2.of(2, "banana"), T2.of(0, "carrot"))); } @Test public void returnsPairsWhereLeftEmpty() { Map<String, Integer> left = new TreeMap<>(); Map<String, String> right = new TreeMap<>(); right.put("b", "banana"); right.put("a", "apple"); right.put("c", "carrot"); KeyMatchingSpliterator<String, Integer, String> spliterator = KeyMatchingSpliterator.over( Comparator.naturalOrder(), left.entrySet().spliterator(), right.entrySet().spliterator(), 0, ""); List<T2<Integer, String>> tuples = StreamSupport.stream(spliterator, false).collect(Collectors.toList()); assertThat(tuples, hasItems(T2.of(0, "apple"), T2.of(0, "banana"), T2.of(0, "carrot"))); } @Test public void returnsPairsWhereRightEmpty() { Map<String, Integer> left = new TreeMap<>(); left.put("b", 2); left.put("a", 1); left.put("c", 3); Map<String, String> right = new TreeMap<>(); KeyMatchingSpliterator<String, Integer, String> spliterator = KeyMatchingSpliterator.over( Comparator.naturalOrder(), left.entrySet().spliterator(), right.entrySet().spliterator(), 0, ""); List<T2<Integer, String>> tuples = StreamSupport.stream(spliterator, false).collect(Collectors.toList()); assertThat(tuples, hasItems(T2.of(1, ""), T2.of(2, ""), T2.of(3, ""))); } @Test public void returnsEmptyWhereBothEmpty() { Map<String, Integer> left = new TreeMap<>(); Map<String, String> right = new TreeMap<>(); KeyMatchingSpliterator<String, Integer, String> spliterator = KeyMatchingSpliterator.over( Comparator.naturalOrder(), left.entrySet().spliterator(), right.entrySet().spliterator(), 0, ""); List<T2<Integer, String>> tuples = StreamSupport.stream(spliterator, false).collect(Collectors.toList()); assertThat(tuples.size(), is(0)); } }