Path: blob/master/test/jdk/java/util/Spliterator/SpliteratorCharacteristics.java
41149 views
/*1* Copyright (c) 2013, 2015, 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*/2223/**24* @test25* @bug 8020156 8020009 8022326 8012913 8024405 8024408 807147726* @run testng SpliteratorCharacteristics27*/2829import org.testng.annotations.Test;3031import java.util.Arrays;32import java.util.Collection;33import java.util.Comparator;34import java.util.HashMap;35import java.util.HashSet;36import java.util.LinkedHashMap;37import java.util.LinkedHashSet;38import java.util.List;39import java.util.Map;40import java.util.PrimitiveIterator;41import java.util.Set;42import java.util.SortedMap;43import java.util.SortedSet;44import java.util.Spliterator;45import java.util.Spliterators;46import java.util.TreeMap;47import java.util.TreeSet;48import java.util.WeakHashMap;49import java.util.concurrent.ConcurrentSkipListMap;50import java.util.concurrent.ConcurrentSkipListSet;51import java.util.function.Supplier;52import java.util.stream.DoubleStream;53import java.util.stream.IntStream;54import java.util.stream.LongStream;5556import static org.testng.Assert.*;5758@Test59public class SpliteratorCharacteristics {6061public void testSpliteratorFromCharSequence() {62class CharSequenceImpl implements CharSequence {63final String s;6465public CharSequenceImpl(String s) {66this.s = s;67}6869@Override70public int length() {71return s.length();72}7374@Override75public char charAt(int index) {76return s.charAt(index);77}7879@Override80public CharSequence subSequence(int start, int end) {81return s.subSequence(start, end);82}8384@Override85public String toString() {86return s;87}88}8990CharSequence cs = "A";91Spliterator.OfInt s = cs.chars().spliterator();92assertCharacteristics(s, Spliterator.IMMUTABLE | Spliterator.ORDERED |93Spliterator.SIZED | Spliterator.SUBSIZED);94assertHasNotCharacteristics(s, Spliterator.CONCURRENT);95s = cs.codePoints().spliterator();96assertCharacteristics(s, Spliterator.IMMUTABLE | Spliterator.ORDERED);97assertHasNotCharacteristics(s, Spliterator.CONCURRENT);9899for (CharSequence c : Arrays.asList(new CharSequenceImpl("A"),100new StringBuilder("A"),101new StringBuffer("A"))) {102s = cs.chars().spliterator();103assertCharacteristics(s, Spliterator.ORDERED |104Spliterator.SIZED | Spliterator.SUBSIZED);105assertHasNotCharacteristics(s, Spliterator.CONCURRENT);106s = cs.codePoints().spliterator();107assertCharacteristics(s, Spliterator.ORDERED);108assertHasNotCharacteristics(s, Spliterator.CONCURRENT);109}110}111112public void testSpliteratorFromCollection() {113List<Integer> l = Arrays.asList(1, 2, 3, 4);114115{116Spliterator<?> s = Spliterators.spliterator(l, 0);117assertCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);118assertHasNotCharacteristics(s, Spliterator.CONCURRENT);119}120121{122Spliterator<?> s = Spliterators.spliterator(l, Spliterator.CONCURRENT);123assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);124assertCharacteristics(s, Spliterator.CONCURRENT);125}126127{128Spliterator<?> s = Spliterators.spliterator(l.iterator(), 1, 0);129assertCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);130assertHasNotCharacteristics(s, Spliterator.CONCURRENT);131}132133{134Spliterator<?> s = Spliterators.spliterator(l.iterator(), 1, Spliterator.CONCURRENT);135assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);136assertCharacteristics(s, Spliterator.CONCURRENT);137}138139{140Spliterator<?> s = Spliterators.spliteratorUnknownSize(l.iterator(), 0);141assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);142}143144{145Spliterator<?> s = Spliterators.spliteratorUnknownSize(146l.iterator(), Spliterator.SIZED | Spliterator.SUBSIZED);147assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);148}149}150151public void testSpliteratorOfIntFromIterator() {152Supplier<PrimitiveIterator.OfInt> si = () -> IntStream.of(1, 2, 3, 4).iterator();153154{155Spliterator<?> s = Spliterators.spliterator(si.get(), 1, 0);156assertCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);157assertHasNotCharacteristics(s, Spliterator.CONCURRENT);158}159160{161Spliterator<?> s = Spliterators.spliterator(si.get(), 1, Spliterator.CONCURRENT);162assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);163assertCharacteristics(s, Spliterator.CONCURRENT);164}165166{167Spliterator<?> s = Spliterators.spliteratorUnknownSize(si.get(), 0);168assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);169}170171{172Spliterator<?> s = Spliterators.spliteratorUnknownSize(173si.get(), Spliterator.SIZED | Spliterator.SUBSIZED);174assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);175}176}177178public void testSpliteratorOfLongFromIterator() {179Supplier<PrimitiveIterator.OfLong> si = () -> LongStream.of(1, 2, 3, 4).iterator();180181{182Spliterator<?> s = Spliterators.spliterator(si.get(), 1, 0);183assertCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);184assertHasNotCharacteristics(s, Spliterator.CONCURRENT);185}186187{188Spliterator<?> s = Spliterators.spliterator(si.get(), 1, Spliterator.CONCURRENT);189assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);190assertCharacteristics(s, Spliterator.CONCURRENT);191}192193{194Spliterator<?> s = Spliterators.spliteratorUnknownSize(si.get(), 0);195assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);196}197198{199Spliterator<?> s = Spliterators.spliteratorUnknownSize(200si.get(), Spliterator.SIZED | Spliterator.SUBSIZED);201assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);202}203}204205public void testSpliteratorOfDoubleFromIterator() {206Supplier<PrimitiveIterator.OfDouble> si = () -> DoubleStream.of(1, 2, 3, 4).iterator();207208{209Spliterator<?> s = Spliterators.spliterator(si.get(), 1, 0);210assertCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);211assertHasNotCharacteristics(s, Spliterator.CONCURRENT);212}213214{215Spliterator<?> s = Spliterators.spliterator(si.get(), 1, Spliterator.CONCURRENT);216assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);217assertCharacteristics(s, Spliterator.CONCURRENT);218}219220{221Spliterator<?> s = Spliterators.spliteratorUnknownSize(si.get(), 0);222assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);223}224225{226Spliterator<?> s = Spliterators.spliteratorUnknownSize(227si.get(), Spliterator.SIZED | Spliterator.SUBSIZED);228assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);229}230}231232//233234public void testHashMap() {235assertMapCharacteristics(new HashMap<>(),236Spliterator.SIZED | Spliterator.DISTINCT);237}238239public void testWeakHashMap() {240assertMapCharacteristics(new WeakHashMap<>(),241Spliterator.DISTINCT);242}243244public void testHashSet() {245assertSetCharacteristics(new HashSet<>(),246Spliterator.SIZED | Spliterator.DISTINCT);247}248249public void testLinkedHashMap() {250assertMapCharacteristics(new LinkedHashMap<>(),251Spliterator.SIZED | Spliterator.DISTINCT |252Spliterator.ORDERED);253}254255public void testLinkedHashSet() {256assertSetCharacteristics(new LinkedHashSet<>(),257Spliterator.SIZED | Spliterator.DISTINCT |258Spliterator.ORDERED);259}260261public void testTreeMap() {262assertSortedMapCharacteristics(new TreeMap<>(),263Spliterator.SIZED | Spliterator.DISTINCT |264Spliterator.SORTED | Spliterator.ORDERED);265}266267public void testTreeMapWithComparator() {268assertSortedMapCharacteristics(new TreeMap<>(Comparator.reverseOrder()),269Spliterator.SIZED | Spliterator.DISTINCT |270Spliterator.SORTED | Spliterator.ORDERED);271}272273public void testTreeSet() {274assertSortedSetCharacteristics(new TreeSet<>(),275Spliterator.SIZED | Spliterator.DISTINCT |276Spliterator.SORTED | Spliterator.ORDERED);277}278279public void testTreeSetWithComparator() {280assertSortedSetCharacteristics(new TreeSet<>(Comparator.reverseOrder()),281Spliterator.SIZED | Spliterator.DISTINCT |282Spliterator.SORTED | Spliterator.ORDERED);283}284285public void testConcurrentSkipListMap() {286assertSortedMapCharacteristics(new ConcurrentSkipListMap<>(),287Spliterator.CONCURRENT | Spliterator.NONNULL |288Spliterator.DISTINCT | Spliterator.SORTED |289Spliterator.ORDERED);290}291292public void testConcurrentSkipListMapWithComparator() {293assertSortedMapCharacteristics(new ConcurrentSkipListMap<>(Comparator.<Integer>reverseOrder()),294Spliterator.CONCURRENT | Spliterator.NONNULL |295Spliterator.DISTINCT | Spliterator.SORTED |296Spliterator.ORDERED);297}298299public void testConcurrentSkipListSet() {300assertSortedSetCharacteristics(new ConcurrentSkipListSet<>(),301Spliterator.CONCURRENT | Spliterator.NONNULL |302Spliterator.DISTINCT | Spliterator.SORTED |303Spliterator.ORDERED);304}305306public void testConcurrentSkipListSetWithComparator() {307assertSortedSetCharacteristics(new ConcurrentSkipListSet<>(Comparator.reverseOrder()),308Spliterator.CONCURRENT | Spliterator.NONNULL |309Spliterator.DISTINCT | Spliterator.SORTED |310Spliterator.ORDERED);311}312313314//315316317void assertMapCharacteristics(Map<Integer, String> m, int keyCharacteristics) {318assertMapCharacteristics(m, keyCharacteristics, 0);319}320321void assertMapCharacteristics(Map<Integer, String> m, int keyCharacteristics, int notValueCharacteristics) {322initMap(m);323324assertCharacteristics(m.keySet(), keyCharacteristics);325326assertCharacteristics(m.values(),327keyCharacteristics & ~(Spliterator.DISTINCT | notValueCharacteristics));328329assertCharacteristics(m.entrySet(), keyCharacteristics);330331if ((keyCharacteristics & Spliterator.SORTED) == 0) {332assertISEComparator(m.keySet());333assertISEComparator(m.values());334assertISEComparator(m.entrySet());335}336}337338void assertSetCharacteristics(Set<Integer> s, int keyCharacteristics) {339initSet(s);340341assertCharacteristics(s, keyCharacteristics);342343if ((keyCharacteristics & Spliterator.SORTED) == 0) {344assertISEComparator(s);345}346}347348void assertSortedMapCharacteristics(SortedMap<Integer, String> m, int keyCharacteristics) {349assertMapCharacteristics(m, keyCharacteristics, Spliterator.SORTED);350351Set<Integer> keys = m.keySet();352if (m.comparator() != null) {353assertNotNullComparator(keys);354}355else {356assertNullComparator(keys);357}358359assertISEComparator(m.values());360361assertNotNullComparator(m.entrySet());362}363364void assertSortedSetCharacteristics(SortedSet<Integer> s, int keyCharacteristics) {365assertSetCharacteristics(s, keyCharacteristics);366367if (s.comparator() != null) {368assertNotNullComparator(s);369}370else {371assertNullComparator(s);372}373}374375void initMap(Map<Integer, String> m) {376m.put(1, "4");377m.put(2, "3");378m.put(3, "2");379m.put(4, "1");380}381382void initSet(Set<Integer> s) {383s.addAll(Arrays.asList(1, 2, 3, 4));384}385386void assertCharacteristics(Collection<?> c, int expectedCharacteristics) {387assertCharacteristics(c.spliterator(), expectedCharacteristics);388}389390void assertCharacteristics(Spliterator<?> s, int expectedCharacteristics) {391assertTrue(s.hasCharacteristics(expectedCharacteristics),392"Spliterator characteristics");393}394395void assertHasNotCharacteristics(Spliterator<?> s, int expectedCharacteristics) {396assertFalse(s.hasCharacteristics(expectedCharacteristics),397"Spliterator characteristics");398}399400void assertNullComparator(Collection<?> c) {401assertNull(c.spliterator().getComparator(),402"Comparator of Spliterator of Collection");403}404405void assertNotNullComparator(Collection<?> c) {406assertNotNull(c.spliterator().getComparator(),407"Comparator of Spliterator of Collection");408}409410void assertISEComparator(Collection<?> c) {411assertISEComparator(c.spliterator());412}413414void assertISEComparator(Spliterator<?> s) {415boolean caught = false;416try {417s.getComparator();418}419catch (IllegalStateException e) {420caught = true;421}422assertTrue(caught, "Throwing IllegalStateException");423}424}425426427