package org.gridkit.jvmtool.event; import static org.gridkit.jvmtool.event.ExcludeIterator.exclude; import static org.gridkit.jvmtool.event.MergeIterator.merge; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import org.assertj.core.api.Assertions; import org.junit.Test; public class MergeExcludeIteratorTest { Iterable<String> NO_STR = seq(new String[0]); Iterable<Integer> NO_INT = seq(new Integer[0]); @SuppressWarnings({ "unchecked", "rawtypes" }) Comparator<String> SCMP = (Comparator)new ReverseComparator(); @SuppressWarnings({ "unchecked", "rawtypes" }) Comparator<Integer> ICMP = (Comparator)new ReverseComparator(); public <T> Iterable<T> seq(T... values) { return Arrays.asList(values); } @SuppressWarnings("unchecked") public <T> Iterable<T> empty(Class<T> c) { return Collections.EMPTY_LIST; } @Test public void simple_string_merge() { Assertions.assertThat(merge(seq("A", "B", "C"), NO_STR)).containsExactly("A", "B", "C"); Assertions.assertThat(merge(NO_STR, seq("A", "B", "C"))).containsExactly("A", "B", "C"); Assertions.assertThat(merge(NO_STR, NO_STR)).containsExactly(); Assertions.assertThat(merge(seq("A"), seq("B"))).containsExactly("A", "B"); Assertions.assertThat(merge(seq("B"), seq("A"))).containsExactly("A", "B"); Assertions.assertThat(merge(seq("A", "B"), seq("A"))).containsExactly("A", "B"); Assertions.assertThat(merge(seq("A", "B"), seq("A", "B"))).containsExactly("A", "B"); Assertions.assertThat(merge(seq("B"), seq("A", "B"))).containsExactly("A", "B"); Assertions.assertThat(merge(seq("A", "B"), seq("B"))).containsExactly("A", "B"); Assertions.assertThat(merge(seq("A"), seq("B", "C"))).containsExactly("A", "B", "C"); Assertions.assertThat(merge(seq("B"), seq("A", "C"))).containsExactly("A", "B", "C"); Assertions.assertThat(merge(seq("A", "B"), seq("B", "C"))).containsExactly("A", "B", "C"); Assertions.assertThat(merge(seq("A", "B", "C"), seq("B", "C"))).containsExactly("A", "B", "C"); Assertions.assertThat(merge(seq("A", "B", "C"), seq("A", "B", "C"))).containsExactly("A", "B", "C"); } @Test public void simple_int_merge() { Assertions.assertThat(merge(seq(1, 2, 3), NO_INT)).containsExactly(1, 2, 3); Assertions.assertThat(merge(NO_INT, seq(1, 2, 3))).containsExactly(1, 2, 3); Assertions.assertThat(merge(NO_INT, NO_INT)).containsExactly(); Assertions.assertThat(merge(seq(1), seq(2))).containsExactly(1, 2); Assertions.assertThat(merge(seq(2), seq(1))).containsExactly(1, 2); Assertions.assertThat(merge(seq(1, 2), seq(1))).containsExactly(1, 2); Assertions.assertThat(merge(seq(1, 2), seq(1, 2))).containsExactly(1, 2); Assertions.assertThat(merge(seq(2), seq(1, 2))).containsExactly(1, 2); Assertions.assertThat(merge(seq(1, 2), seq(2))).containsExactly(1, 2); Assertions.assertThat(merge(seq(1), seq(2, 3))).containsExactly(1, 2, 3); Assertions.assertThat(merge(seq(1, 2), seq(2, 3))).containsExactly(1, 2, 3); Assertions.assertThat(merge(seq(1, 2, 3), seq(2, 3))).containsExactly(1, 2, 3); Assertions.assertThat(merge(seq(1, 2, 3), seq(1, 2, 3))).containsExactly(1, 2, 3); } @Test public void simple_int_merge_with_comparator() { Assertions.assertThat(merge(seq(3, 2, 1), NO_INT, ICMP)).containsExactly(3, 2, 1); Assertions.assertThat(merge(NO_INT, seq(3, 2, 1), ICMP)).containsExactly(3, 2, 1); Assertions.assertThat(merge(NO_INT, NO_INT, ICMP)).containsExactly(); Assertions.assertThat(merge(seq(1), seq(2), ICMP)).containsExactly(2, 1); Assertions.assertThat(merge(seq(2), seq(1), ICMP)).containsExactly(2, 1); Assertions.assertThat(merge(seq(2, 1), seq(1), ICMP)).containsExactly(2, 1); Assertions.assertThat(merge(seq(2, 1), seq(2, 1), ICMP)).containsExactly(2, 1); Assertions.assertThat(merge(seq(2), seq(2, 1), ICMP)).containsExactly(2, 1); Assertions.assertThat(merge(seq(2, 1), seq(2), ICMP)).containsExactly(2, 1); Assertions.assertThat(merge(seq(1), seq(3, 2), ICMP)).containsExactly(3, 2, 1); Assertions.assertThat(merge(seq(2, 1), seq(3, 2), ICMP)).containsExactly(3, 2, 1); Assertions.assertThat(merge(seq(3, 2, 1), seq(3, 2), ICMP)).containsExactly(3, 2, 1); Assertions.assertThat(merge(seq(3, 2, 1), seq(3, 2, 1), ICMP)).containsExactly(3, 2, 1); } @Test public void simple_string_merge_with_comparator() { Assertions.assertThat(merge(seq("C", "B", "A"), NO_STR, SCMP)).containsExactly("C", "B", "A"); Assertions.assertThat(merge(NO_STR, seq("C", "B", "A"), SCMP)).containsExactly("C", "B", "A"); Assertions.assertThat(merge(NO_STR, NO_STR, SCMP)).containsExactly(); Assertions.assertThat(merge(seq("A"), seq("B"), SCMP)).containsExactly("B", "A"); Assertions.assertThat(merge(seq("B"), seq("A"), SCMP)).containsExactly("B", "A"); Assertions.assertThat(merge(seq("B", "A"), seq("A"), SCMP)).containsExactly("B", "A"); Assertions.assertThat(merge(seq("B", "A"), seq("B", "A"), SCMP)).containsExactly("B", "A"); Assertions.assertThat(merge(seq("B"), seq("B", "A"), SCMP)).containsExactly("B", "A"); Assertions.assertThat(merge(seq("B", "A"), seq("B"), SCMP)).containsExactly("B", "A"); Assertions.assertThat(merge(seq("A"), seq("C", "B"), SCMP)).containsExactly("C", "B", "A"); Assertions.assertThat(merge(seq("B", "A"), seq("C", "B"), SCMP)).containsExactly("C", "B", "A"); Assertions.assertThat(merge(seq("C", "B", "A"), seq("C", "B"), SCMP)).containsExactly("C", "B", "A"); Assertions.assertThat(merge(seq("C", "B", "A"), seq("C", "B", "A"), SCMP)).containsExactly("C", "B", "A"); } @Test public void simple_string_exclude() { Assertions.assertThat(exclude(seq("A", "B", "C"), NO_STR)).containsExactly("A", "B", "C"); Assertions.assertThat(exclude(seq("A", "B", "C"), seq("D"))).containsExactly("A", "B", "C"); Assertions.assertThat(exclude(NO_STR, seq("A", "B", "C"))).containsExactly(); Assertions.assertThat(exclude(NO_STR, NO_STR)).containsExactly(); Assertions.assertThat(exclude(seq("A"), seq("B"))).containsExactly("A"); Assertions.assertThat(exclude(seq("B"), seq("A"))).containsExactly("B"); Assertions.assertThat(exclude(seq("A", "B"), seq("A"))).containsExactly("B"); Assertions.assertThat(exclude(seq("A", "B"), seq("A", "B"))).containsExactly(); Assertions.assertThat(exclude(seq("B"), seq("A", "B"))).containsExactly(); Assertions.assertThat(exclude(seq("A", "B"), seq("B"))).containsExactly("A"); Assertions.assertThat(exclude(seq("A"), seq("B", "C"))).containsExactly("A"); Assertions.assertThat(exclude(seq("B"), seq("A", "C"))).containsExactly("B"); Assertions.assertThat(exclude(seq("A", "B"), seq("B", "C"))).containsExactly("A"); Assertions.assertThat(exclude(seq("A", "B", "C"), seq("B", "C"))).containsExactly("A"); Assertions.assertThat(exclude(seq("A", "B", "C"), seq("A"))).containsExactly("B", "C"); Assertions.assertThat(exclude(seq("A", "B", "C"), seq("B"))).containsExactly("A", "C"); Assertions.assertThat(exclude(seq("A", "B", "C"), seq("C"))).containsExactly("A", "B"); Assertions.assertThat(exclude(seq("A", "B", "C"), seq("A", "C"))).containsExactly("B"); } @Test public void simple_int_exclude() { Assertions.assertThat(exclude(seq(1, 2, 3), NO_INT)).containsExactly(1, 2, 3); Assertions.assertThat(exclude(seq(1, 2, 3), seq(4))).containsExactly(1, 2, 3); Assertions.assertThat(exclude(NO_INT, seq(1, 2, 3))).containsExactly(); Assertions.assertThat(exclude(NO_INT, NO_INT)).containsExactly(); Assertions.assertThat(exclude(seq(1), seq(2))).containsExactly(1); Assertions.assertThat(exclude(seq(2), seq(1))).containsExactly(2); Assertions.assertThat(exclude(seq(1, 2), seq(1))).containsExactly(2); Assertions.assertThat(exclude(seq(1, 2), seq(1, 2))).containsExactly(); Assertions.assertThat(exclude(seq(2), seq(1, 2))).containsExactly(); Assertions.assertThat(exclude(seq(1, 2), seq(2))).containsExactly(1); Assertions.assertThat(exclude(seq(1), seq(2, 3))).containsExactly(1); Assertions.assertThat(exclude(seq(2), seq(1, 3))).containsExactly(2); Assertions.assertThat(exclude(seq(1, 2), seq(2, 3))).containsExactly(1); Assertions.assertThat(exclude(seq(1, 2, 3), seq(2, 3))).containsExactly(1); Assertions.assertThat(exclude(seq(1, 2, 3), seq(1))).containsExactly(2, 3); Assertions.assertThat(exclude(seq(1, 2, 3), seq(2))).containsExactly(1, 3); Assertions.assertThat(exclude(seq(1, 2, 3), seq(3))).containsExactly(1, 2); Assertions.assertThat(exclude(seq(1, 2, 3), seq(1, 3))).containsExactly(2); } @Test public void simple_string_exclude_with_comparator() { Assertions.assertThat(exclude(seq("C", "B", "A"), NO_STR, SCMP)).containsExactly("C", "B", "A"); Assertions.assertThat(exclude(seq("C", "B", "A"), seq("D"), SCMP)).containsExactly("C", "B", "A"); Assertions.assertThat(exclude(NO_STR, seq("C", "B", "A"), SCMP)).containsExactly(); Assertions.assertThat(exclude(NO_STR, NO_STR, SCMP)).containsExactly(); Assertions.assertThat(exclude(seq("A"), seq("B"), SCMP)).containsExactly("A"); Assertions.assertThat(exclude(seq("B"), seq("A"), SCMP)).containsExactly("B"); Assertions.assertThat(exclude(seq("B", "A"), seq("A"), SCMP)).containsExactly("B"); Assertions.assertThat(exclude(seq("B", "A"), seq("B", "A"), SCMP)).containsExactly(); Assertions.assertThat(exclude(seq("B"), seq("B", "A"), SCMP)).containsExactly(); Assertions.assertThat(exclude(seq("B", "A"), seq("B"), SCMP)).containsExactly("A"); Assertions.assertThat(exclude(seq("A"), seq("C", "B"), SCMP)).containsExactly("A"); Assertions.assertThat(exclude(seq("B"), seq("C", "A"), SCMP)).containsExactly("B"); Assertions.assertThat(exclude(seq("B", "A"), seq("C", "B"), SCMP)).containsExactly("A"); Assertions.assertThat(exclude(seq("C", "B", "A"), seq("C", "B"), SCMP)).containsExactly("A"); Assertions.assertThat(exclude(seq("C", "B", "A"), seq("A"), SCMP)).containsExactly("C", "B"); Assertions.assertThat(exclude(seq("C", "B", "A"), seq("B"), SCMP)).containsExactly("C", "A"); Assertions.assertThat(exclude(seq("C", "B", "A"), seq("C"), SCMP)).containsExactly("B", "A"); Assertions.assertThat(exclude(seq("C", "B", "A"), seq("C", "A"), SCMP)).containsExactly("B"); } public static class ReverseComparator implements Comparator<Comparable<Object>> { @Override public int compare(Comparable<Object> o1, Comparable<Object> o2) { return o2.compareTo(o1); } } }