Path: blob/master/test/jdk/java/util/Spliterator/IteratorFromSpliteratorTest.java
41149 views
/*1* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223import org.testng.annotations.Test;2425import java.util.ArrayList;26import java.util.Arrays;27import java.util.Iterator;28import java.util.List;29import java.util.NoSuchElementException;30import java.util.PrimitiveIterator;31import java.util.Spliterators;32import java.util.function.DoubleConsumer;33import java.util.function.IntConsumer;34import java.util.function.LongConsumer;3536import static org.testng.Assert.assertEquals;37import static org.testng.Assert.assertFalse;38import static org.testng.Assert.assertThrows;39import static org.testng.Assert.fail;4041/**42* @test43* @summary Spliterator.iterator traversing tests44* @library /lib/testlibrary/bootlib45* @run testng IteratorFromSpliteratorTest46* @bug 826745247*/48public class IteratorFromSpliteratorTest {49@Test50public void testIteratorFromSpliterator() {51List<Integer> input = List.of(1, 2, 3, 4, 5);52for (int i = 0; i < input.size(); i++) {53Iterator<Integer> iterator = Spliterators.iterator(input.spliterator());54List<Integer> result = new ArrayList<>();55int j = i;56while (j++ < input.size() && iterator.hasNext()) {57result.add(iterator.next());58}59// While SpliteratorTraversingAndSplittingTest tests some scenarios with Spliterators.iterator60// it always wraps the resulting iterator into spliterator again, and this limits the use patterns.61// In particular, calling hasNext() right before forEachRemaining() is not tested.62// Here we cover such a scenario.63assertEquals(iterator.hasNext(), result.size() < input.size());64iterator.forEachRemaining(result::add);65iterator.forEachRemaining(x -> fail("Should not be called"));66assertFalse(iterator.hasNext());67assertThrows(NoSuchElementException.class, iterator::next);68iterator.forEachRemaining(x -> fail("Should not be called"));69assertEquals(result, input);70}71}7273@Test74public void testIteratorFromSpliteratorInt() {75int[] input = {1, 2, 3, 4, 5};76for (int i = 0; i < input.length; i++) {77PrimitiveIterator.OfInt iterator = Spliterators.iterator(Arrays.spliterator(input));78List<Integer> result = new ArrayList<>();79int j = i;80while (j++ < input.length && iterator.hasNext()) {81result.add(iterator.nextInt());82}83assertEquals(iterator.hasNext(), result.size() < input.length);84iterator.forEachRemaining((IntConsumer) result::add);85iterator.forEachRemaining((IntConsumer) (x -> fail("Should not be called")));86assertFalse(iterator.hasNext());87assertThrows(NoSuchElementException.class, iterator::next);88iterator.forEachRemaining((IntConsumer) (x -> fail("Should not be called")));89assertEquals(result.stream().mapToInt(x -> x).toArray(), input);90}91}9293@Test94public void testIteratorFromSpliteratorLong() {95long[] input = {1, 2, 3, 4, 5};96for (int i = 0; i < input.length; i++) {97PrimitiveIterator.OfLong iterator = Spliterators.iterator(Arrays.spliterator(input));98List<Long> result = new ArrayList<>();99int j = i;100while (j++ < input.length && iterator.hasNext()) {101result.add(iterator.nextLong());102}103assertEquals(iterator.hasNext(), result.size() < input.length);104iterator.forEachRemaining((LongConsumer) result::add);105iterator.forEachRemaining((LongConsumer) (x -> fail("Should not be called")));106assertFalse(iterator.hasNext());107assertThrows(NoSuchElementException.class, iterator::next);108iterator.forEachRemaining((LongConsumer) (x -> fail("Should not be called")));109assertEquals(result.stream().mapToLong(x -> x).toArray(), input);110}111}112113@Test114public void testIteratorFromSpliteratorDouble() {115double[] input = {1, 2, 3, 4, 5};116for (int i = 0; i < input.length; i++) {117PrimitiveIterator.OfDouble iterator = Spliterators.iterator(Arrays.spliterator(input));118List<Double> result = new ArrayList<>();119int j = i;120while (j++ < input.length && iterator.hasNext()) {121result.add(iterator.nextDouble());122}123assertEquals(iterator.hasNext(), result.size() < input.length);124iterator.forEachRemaining((DoubleConsumer) result::add);125iterator.forEachRemaining((DoubleConsumer) (x -> fail("Should not be called")));126assertFalse(iterator.hasNext());127assertThrows(NoSuchElementException.class, iterator::next);128iterator.forEachRemaining((DoubleConsumer) (x -> fail("Should not be called")));129assertEquals(result.stream().mapToDouble(x -> x).toArray(), input);130}131}132133@Test134public void testIteratorFromSpliteratorEmpty() {135Iterator<?>[] iterators = {136Spliterators.iterator(Spliterators.emptySpliterator()),137Spliterators.iterator(Spliterators.emptyIntSpliterator()),138Spliterators.iterator(Spliterators.emptyLongSpliterator()),139Spliterators.iterator(Spliterators.emptyDoubleSpliterator())140};141for (Iterator<?> iterator : iterators) {142iterator.forEachRemaining(x -> fail("Should not be called"));143assertFalse(iterator.hasNext());144iterator.forEachRemaining(x -> fail("Should not be called"));145assertThrows(NoSuchElementException.class, iterator::next);146}147}148}149150151