/*
* Copyright 2014 Goldman Sachs.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.gs.collections.impl.set.sorted.immutable;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.TreeSet;
import com.gs.collections.api.set.sorted.ImmutableSortedSet;
import com.gs.collections.api.set.sorted.SortedSetIterable;
import com.gs.collections.impl.block.factory.Comparators;
import com.gs.collections.impl.block.factory.PrimitiveFunctions;
import com.gs.collections.impl.factory.Sets;
import com.gs.collections.impl.factory.SortedSets;
import com.gs.collections.impl.list.mutable.FastList;
import com.gs.collections.impl.list.mutable.primitive.BooleanArrayList;
import com.gs.collections.impl.list.mutable.primitive.ByteArrayList;
import com.gs.collections.impl.list.mutable.primitive.CharArrayList;
import com.gs.collections.impl.list.mutable.primitive.DoubleArrayList;
import com.gs.collections.impl.list.mutable.primitive.FloatArrayList;
import com.gs.collections.impl.list.mutable.primitive.IntArrayList;
import com.gs.collections.impl.list.mutable.primitive.LongArrayList;
import com.gs.collections.impl.list.mutable.primitive.ShortArrayList;
import com.gs.collections.impl.set.sorted.mutable.TreeSortedSet;
import com.gs.collections.impl.test.Verify;
import org.junit.Assert;
import org.junit.Test;
public class ImmutableTreeSetTest
extends AbstractImmutableSortedSetTestCase
{
@Override
protected ImmutableSortedSet<Integer> classUnderTest()
{
return ImmutableTreeSet.newSetWith(1, 2, 3, 4);
}
@Override
protected ImmutableSortedSet<Integer> classUnderTest(Comparator<? super Integer> comparator)
{
return ImmutableTreeSet.newSetWith(comparator, 1, 2, 3, 4);
}
@Test
public void constructWithNull()
{
Verify.assertThrows(ClassCastException.class, () -> new TreeSet<>(Arrays.asList(new Object())));
Verify.assertThrows(NullPointerException.class, () -> new TreeSet<>(Arrays.asList(null, null)));
Verify.assertThrows(NullPointerException.class, () -> new TreeSet<>(Arrays.asList((Object) null)));
Verify.assertThrows(ClassCastException.class, () -> SortedSets.immutable.of(new Object()));
Verify.assertThrows(NullPointerException.class, () -> SortedSets.immutable.of((Object) null, null));
Verify.assertThrows(NullPointerException.class, () -> SortedSets.immutable.of((Object) null));
}
@Override
@Test
public void equalsAndHashCode()
{
super.equalsAndHashCode();
Assert.assertNotEquals(
new TreeSet<>(Arrays.asList("1", "2", "3")),
new TreeSet<>(Arrays.asList(1, 2, 3)));
Assert.assertNotEquals(
new TreeSet<>(Arrays.asList("1", "2", "3")),
Sets.immutable.of("1", "2", null));
Assert.assertNotEquals(
SortedSets.immutable.of("1", "2", "3"),
SortedSets.immutable.of(1, 2, 3));
}
@Test
public void serialization()
{
ImmutableSortedSet<Integer> set = this.classUnderTest();
Verify.assertPostSerializedEqualsAndHashCode(set);
}
@Override
@Test(expected = UnsupportedOperationException.class)
public void subSet()
{
this.classUnderTest().castToSortedSet().subSet(1, 4);
}
@Override
@Test(expected = UnsupportedOperationException.class)
public void headSet()
{
this.classUnderTest().castToSortedSet().headSet(4);
}
@Override
@Test(expected = UnsupportedOperationException.class)
public void tailSet()
{
this.classUnderTest().castToSortedSet().tailSet(1);
}
@Override
@Test
public void powerSet()
{
ImmutableSortedSet<SortedSetIterable<Integer>> intPowerSet = SortedSets.immutable.of(1, 2, 3).powerSet();
ImmutableSortedSet<SortedSetIterable<Integer>> revPowerSet = SortedSets.immutable.of(Comparators.<Integer>reverseNaturalOrder(), 1, 2, 3).powerSet();
FastList<TreeSortedSet<Integer>> expectedSortedSet = FastList.newListWith(TreeSortedSet.<Integer>newSet(), TreeSortedSet.newSetWith(1), TreeSortedSet.newSetWith(2),
TreeSortedSet.newSetWith(3), TreeSortedSet.newSetWith(1, 2), TreeSortedSet.newSetWith(1, 3), TreeSortedSet.newSetWith(2, 3), TreeSortedSet.newSetWith(1, 2, 3));
FastList<TreeSortedSet<Integer>> expectedRevSortedSet = FastList.newListWith(TreeSortedSet.<Integer>newSet(), TreeSortedSet.newSetWith(Comparators.<Integer>reverseNaturalOrder(), 3),
TreeSortedSet.newSetWith(Comparators.<Integer>reverseNaturalOrder(), 2), TreeSortedSet.newSetWith(Comparators.<Integer>reverseNaturalOrder(), 1),
TreeSortedSet.newSetWith(Comparators.<Integer>reverseNaturalOrder(), 2, 3), TreeSortedSet.newSetWith(Comparators.<Integer>reverseNaturalOrder(), 1, 3),
TreeSortedSet.newSetWith(Comparators.<Integer>reverseNaturalOrder(), 1, 2), TreeSortedSet.newSetWith(Comparators.<Integer>reverseNaturalOrder(), 1, 2, 3));
Verify.assertListsEqual(expectedSortedSet, intPowerSet.toList());
Verify.assertListsEqual(expectedRevSortedSet, revPowerSet.toList());
}
@Test
public void compareTo()
{
ImmutableSortedSet<Integer> set = SortedSets.immutable.of(1, 2, 3);
Assert.assertEquals(0, set.compareTo(set));
Assert.assertEquals(-1, set.compareTo(SortedSets.immutable.of(1, 2, 3, 4)));
Assert.assertEquals(1, set.compareTo(SortedSets.immutable.of(1, 2)));
Assert.assertEquals(-1, set.compareTo(SortedSets.immutable.of(1, 2, 4)));
Assert.assertEquals(1, set.compareTo(SortedSets.immutable.of(1, 2, 2)));
}
@Override
@Test
public void collectBoolean()
{
ImmutableSortedSet<Integer> integers = this.classUnderTest(Collections.<Integer>reverseOrder());
Assert.assertEquals(BooleanArrayList.newListWith(true, true, true, true), integers.collectBoolean(PrimitiveFunctions.integerIsPositive()));
}
@Override
@Test
public void collectByte()
{
ImmutableSortedSet<Integer> integers = this.classUnderTest(Collections.<Integer>reverseOrder());
Assert.assertEquals(ByteArrayList.newListWith((byte) 4, (byte) 3, (byte) 2, (byte) 1), integers.collectByte(PrimitiveFunctions.unboxIntegerToByte()));
}
@Override
@Test
public void collectChar()
{
ImmutableSortedSet<Integer> integers = this.classUnderTest(Collections.<Integer>reverseOrder());
Assert.assertEquals(CharArrayList.newListWith('D', 'C', 'B', 'A'), integers.collectChar(integer -> (char) (integer.intValue() + 64)));
}
@Override
@Test
public void collectDouble()
{
ImmutableSortedSet<Integer> integers = this.classUnderTest(Collections.<Integer>reverseOrder());
Assert.assertEquals(DoubleArrayList.newListWith(4.0d, 3.0d, 2.0d, 1.0d), integers.collectDouble(PrimitiveFunctions.unboxIntegerToDouble()));
}
@Override
@Test
public void collectFloat()
{
ImmutableSortedSet<Integer> integers = this.classUnderTest(Collections.<Integer>reverseOrder());
Assert.assertEquals(FloatArrayList.newListWith(4.0f, 3.0f, 2.0f, 1.0f), integers.collectFloat(PrimitiveFunctions.unboxIntegerToFloat()));
}
@Override
@Test
public void collectInt()
{
ImmutableSortedSet<Integer> integers = this.classUnderTest(Collections.<Integer>reverseOrder());
Assert.assertEquals(IntArrayList.newListWith(4, 3, 2, 1), integers.collectInt(PrimitiveFunctions.unboxIntegerToInt()));
}
@Override
@Test
public void collectLong()
{
ImmutableSortedSet<Integer> integers = this.classUnderTest(Collections.<Integer>reverseOrder());
Assert.assertEquals(LongArrayList.newListWith(4, 3, 2, 1), integers.collectLong(PrimitiveFunctions.unboxIntegerToLong()));
}
@Override
@Test
public void collectShort()
{
ImmutableSortedSet<Integer> integers = this.classUnderTest(Collections.<Integer>reverseOrder());
Assert.assertEquals(ShortArrayList.newListWith((short) 4, (short) 3, (short) 2, (short) 1), integers.collectShort(PrimitiveFunctions.unboxIntegerToShort()));
}
}