/*
* Copyright 2015, 2016 Tagir Valeev
*
* 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 one.util.streamex;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.Spliterator;
import java.util.stream.IntStream;
import one.util.streamex.DistinctSpliterator;
import org.junit.Test;
import static one.util.streamex.TestHelpers.*;
import static org.junit.Assert.*;
/**
* @author Tagir Valeev
*/
public class DistinctSpliteratorTest {
@Test
public void testSpliterator() {
checkSpliterator("Distinct2", Arrays.asList("b"), () -> new DistinctSpliterator<>(Arrays.asList("a", null, "b",
"c", "b", null, "c", "b").spliterator(), 3));
checkSpliterator("Distinct34", Arrays.asList(0), () -> new DistinctSpliterator<>(IntStream.range(0, 100).map(
x -> x % 3).boxed().spliterator(), 34));
assertEquals(Spliterator.DISTINCT | Spliterator.ORDERED, new DistinctSpliterator<>(Arrays.asList("a", null,
"b", "c", "b", null, "c", "b").spliterator(), 3).characteristics());
assertEquals(Spliterator.DISTINCT | Spliterator.ORDERED | Spliterator.IMMUTABLE | Spliterator.SORTED
| Spliterator.NONNULL, new DistinctSpliterator<>(IntStream.range(0, 100).spliterator(), 3)
.characteristics());
assertEquals(100, new DistinctSpliterator<>(IntStream.range(0, 100).spliterator(), 3).estimateSize());
}
@Test
public void testAdvanceSplit() {
DistinctSpliterator<String> ds = new DistinctSpliterator<>(Arrays.asList("a", null, "b", "c", "b", null, "c",
"b").spliterator(), 2);
Set<String> result = new HashSet<>();
assertTrue(ds.tryAdvance(result::add));
assertTrue(ds.tryAdvance(result::add));
Spliterator<String> prefix = ds.trySplit();
prefix.forEachRemaining(result::add);
ds.forEachRemaining(result::add);
assertEquals(StreamEx.of(null, "b", "c").toSet(), result);
}
}