/* __ __ __ __ __ ___
* \ \ / / \ \ / / __/
* \ \/ / /\ \ \/ / /
* \____/__/ \__\____/__/.ɪᴏ
* ᶜᵒᵖʸʳᶦᵍʰᵗ ᵇʸ ᵛᵃᵛʳ ⁻ ˡᶦᶜᵉⁿˢᵉᵈ ᵘⁿᵈᵉʳ ᵗʰᵉ ᵃᵖᵃᶜʰᵉ ˡᶦᶜᵉⁿˢᵉ ᵛᵉʳˢᶦᵒⁿ ᵗʷᵒ ᵈᵒᵗ ᶻᵉʳᵒ
*/
package io.vavr.collection;
import io.vavr.Value;
import org.junit.Ignore;
import org.junit.Test;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;
import static java.util.Comparator.nullsFirst;
import static io.vavr.TestComparators.toStringComparator;
public class TreeSetTest extends AbstractSortedSetTest {
@Override
protected <T> Collector<T, ArrayList<T>, ? extends TreeSet<T>> collector() {
return TreeSet.collector(Comparators.naturalComparator());
}
@Override
protected <T> TreeSet<T> empty() {
return TreeSet.empty(Comparators.naturalComparator());
}
@Override
protected <T> TreeSet<T> emptyWithNull() {
return TreeSet.empty(nullsFirst(Comparators.naturalComparator()));
}
@Override
protected boolean emptyShouldBeSingleton() {
return false;
}
@Override
protected <T> TreeSet<T> of(T element) {
return TreeSet.of(Comparators.naturalComparator(), element);
}
@Override
protected <T> TreeSet<T> of(Comparator<? super T> comparator, T element) {
return TreeSet.of(comparator, element);
}
@Override
@SafeVarargs
@SuppressWarnings("varargs")
protected final <T> TreeSet<T> of(Comparator<? super T> comparator, T... elements) {
return TreeSet.of(comparator, elements);
}
@Override
@SafeVarargs
@SuppressWarnings("varargs")
protected final <T> TreeSet<T> of(T... elements) {
return TreeSet.<T> of(Comparators.naturalComparator(), elements);
}
@Override
protected <T> TreeSet<T> ofAll(Iterable<? extends T> elements) {
return TreeSet.ofAll(Comparators.naturalComparator(), elements);
}
@Override
protected <T extends Comparable<? super T>> TreeSet<T> ofJavaStream(java.util.stream.Stream<? extends T> javaStream) {
return TreeSet.ofAll(javaStream);
}
@Override
protected TreeSet<Boolean> ofAll(boolean... elements) {
return TreeSet.ofAll(elements);
}
@Override
protected TreeSet<Byte> ofAll(byte... elements) {
return TreeSet.ofAll(elements);
}
@Override
protected TreeSet<Character> ofAll(char... elements) {
return TreeSet.ofAll(elements);
}
@Override
protected TreeSet<Double> ofAll(double... elements) {
return TreeSet.ofAll(elements);
}
@Override
protected TreeSet<Float> ofAll(float... elements) {
return TreeSet.ofAll(elements);
}
@Override
protected TreeSet<Integer> ofAll(int... elements) {
return TreeSet.ofAll(elements);
}
@Override
protected TreeSet<Long> ofAll(long... elements) {
return TreeSet.ofAll(elements);
}
@Override
protected TreeSet<Short> ofAll(short... elements) {
return TreeSet.ofAll(elements);
}
@Override
protected <T> TreeSet<T> tabulate(int n, Function<? super Integer, ? extends T> f) {
return TreeSet.tabulate(Comparators.naturalComparator(), n, f);
}
@Override
protected <T> TreeSet<T> fill(int n, Supplier<? extends T> s) {
return TreeSet.fill(Comparators.naturalComparator(), n, s);
}
@Override
protected boolean useIsEqualToInsteadOfIsSameAs() {
return true;
}
@Override
protected int getPeekNonNilPerformingAnAction() {
return 1;
}
@Override
protected TreeSet<Character> range(char from, char toExclusive) {
return TreeSet.range(from, toExclusive);
}
@Override
protected TreeSet<Character> rangeBy(char from, char toExclusive, int step) {
return TreeSet.rangeBy(from, toExclusive, step);
}
@Override
protected TreeSet<Double> rangeBy(double from, double toExclusive, double step) {
return TreeSet.rangeBy(from, toExclusive, step);
}
@Override
protected TreeSet<Integer> range(int from, int toExclusive) {
return TreeSet.range(from, toExclusive);
}
@Override
protected TreeSet<Integer> rangeBy(int from, int toExclusive, int step) {
return TreeSet.rangeBy(from, toExclusive, step);
}
@Override
protected TreeSet<Long> range(long from, long toExclusive) {
return TreeSet.range(from, toExclusive);
}
@Override
protected TreeSet<Long> rangeBy(long from, long toExclusive, long step) {
return TreeSet.rangeBy(from, toExclusive, step);
}
@Override
protected TreeSet<Character> rangeClosed(char from, char toInclusive) {
return TreeSet.rangeClosed(from, toInclusive);
}
@Override
protected TreeSet<Character> rangeClosedBy(char from, char toInclusive, int step) {
return TreeSet.rangeClosedBy(from, toInclusive, step);
}
@Override
protected TreeSet<Double> rangeClosedBy(double from, double toInclusive, double step) {
return TreeSet.rangeClosedBy(from, toInclusive, step);
}
@Override
protected TreeSet<Integer> rangeClosed(int from, int toInclusive) {
return TreeSet.rangeClosed(from, toInclusive);
}
@Override
protected TreeSet<Integer> rangeClosedBy(int from, int toInclusive, int step) {
return TreeSet.rangeClosedBy(from, toInclusive, step);
}
@Override
protected TreeSet<Long> rangeClosed(long from, long toInclusive) {
return TreeSet.rangeClosed(from, toInclusive);
}
@Override
protected TreeSet<Long> rangeClosedBy(long from, long toInclusive, long step) {
return TreeSet.rangeClosedBy(from, toInclusive, step);
}
// -- collector
@Test
public void shouldCollectEmpty() {
final TreeSet<Integer> actual = java.util.stream.Stream.<Integer>empty().collect(TreeSet.collector());
assertThat(actual).isEmpty();
}
@Test
public void shouldCollectNonEmpty() {
final TreeSet<Integer> actual = java.util.stream.Stream.of(1, 2, 3).collect(TreeSet.collector());
final TreeSet<Integer> expected = of(1, 2, 3);
assertThat(actual).isEqualTo(expected);
}
// -- construct
@Test
public void shouldConstructStreamFromEmptyJavaStream() {
final TreeSet<Integer> actual = ofJavaStream(java.util.stream.Stream.<Integer>empty());
final TreeSet<Integer> expected = empty();
assertThat(actual).isEqualTo(expected);
}
@Test
public void shouldConstructStreamFromNonEmptyJavaStream() {
final TreeSet<Integer> actual = TreeSet.ofAll(Comparators.naturalComparator(), java.util.stream.Stream.of(1, 2, 3));
final TreeSet<Integer> expected = of(1, 2, 3);
assertThat(actual).isEqualTo(expected);
}
@Test
public void shouldConstructStreamFromNonEmptyJavaStreamWithoutComparator() {
final TreeSet<Integer> actual = ofJavaStream(java.util.stream.Stream.of(1, 2, 3));
final TreeSet<Integer> expected = of(1, 2, 3);
assertThat(actual).isEqualTo(expected);
}
@Test
public void shouldConstructFromTreeSetWithoutComparator() {
final TreeSet<Integer> actual = TreeSet.ofAll(TreeSet.of(1));
final TreeSet<Integer> expected = of(1);
assertThat(actual).isEqualTo(expected);
}
// -- static narrow
@Test
public void shouldNarrowTreeSet() {
final TreeSet<Double> doubles = TreeSet.of(toStringComparator(), 1.0d);
final TreeSet<Number> numbers = TreeSet.narrow(doubles);
final int actual = numbers.add(new BigDecimal("2.0")).sum().intValue();
assertThat(actual).isEqualTo(3);
}
// -- addAll
@Test
public void shouldKeepComparator() {
final List<Integer> actual = TreeSet.empty(inverseIntComparator()).addAll(TreeSet.of(1, 2, 3)).toList();
final List<Integer> expected = List.of(3, 2, 1);
assertThat(actual).isEqualTo(expected);
}
// -- diff
@Test
public void shouldCalculateDiffIfNotTreeSet() {
final TreeSet<Integer> actual = of(1, 2, 3).diff(HashSet.of(1, 2));
final TreeSet<Integer> expected = of(3);
assertThat(actual).isEqualTo(expected);
}
// -- union
@Test
public void shouldCalculateUnionIfNotTreeSet() {
final TreeSet<Integer> actual = of(1, 2, 3).union(HashSet.of(4));
final TreeSet<Integer> expected = of(1, 2, 3, 4);
assertThat(actual).isEqualTo(expected);
}
// -- intersect
@Test
public void shouldCalculateEmptyIntersectIfNotTreeSet() {
final TreeSet<Integer> actual = of(1, 2, 3).intersect(HashSet.of(4));
assertThat(actual).isEmpty();
}
@Test
public void shouldCalculateIntersectIfNotTreeSet() {
final TreeSet<Integer> actual = of(1, 2, 3).intersect(HashSet.of(3));
final TreeSet<Integer> expected = of(3);
assertThat(actual).isEqualTo(expected);
}
// -- fill
@Test
public void shouldFillWithoutComparator() {
final TreeSet<Integer> actual = TreeSet.fill(3, () -> 1);
final TreeSet<Integer> expected = of(1, 1, 1);
assertThat(actual).isEqualTo(expected);
}
// -- tabulate
@Test
public void shouldTabulateWithoutComparator() {
final TreeSet<Integer> actual = TreeSet.tabulate(3, Function.identity());
final TreeSet<Integer> expected = of(0, 1, 2);
assertThat(actual).isEqualTo(expected);
}
// -- toSortedSet
@Test
public void shouldReturnSelfOnConvertToSortedSet() {
final Value<Integer> value = of(1, 2, 3);
assertThat(value.toSortedSet()).isSameAs(value);
}
@Test
public void shouldReturnSelfOnConvertToSortedSetWithSameComparator() {
final TreeSet<Integer> value = of(1, 2, 3);
assertThat(value.toSortedSet(value.comparator())).isSameAs(value);
}
@Test
public void shouldNotReturnSelfOnConvertToSortedSetWithDifferentComparator() {
final Value<Integer> value = of(1, 2, 3);
assertThat(value.toSortedSet(Integer::compareTo)).isNotSameAs(value);
}
@Test
public void shouldPreserveComparatorOnConvertToSortedSetWithoutDistinctComparator() {
final Value<Integer> value = TreeSet.of(Comparators.naturalComparator().reversed(), 1, 2, 3);
assertThat(value.toSortedSet().mkString(",")).isEqualTo("3,2,1");
}
// -- transform()
@Test
public void shouldTransform() {
final String transformed = of(42).transform(v -> String.valueOf(v.get()));
assertThat(transformed).isEqualTo("42");
}
// -- helpers
private static Comparator<Integer> inverseIntComparator() {
return (i1, i2) -> Integer.compare(i2, i1);
}
@Override
@Test
@Ignore
public void shouldZipAllEmptyAndNonNil() {
}
@Override
@Test
@Ignore
public void shouldZipAllNonEmptyAndNil() {
}
}