1 /* 2 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 package org.openjdk.tests.java.util.stream; 26 27 import org.testng.annotations.Test; 28 29 import java.util.*; 30 import java.util.Spliterators; 31 import java.util.stream.*; 32 33 import static java.util.stream.LambdaTestHelpers.*; 34 35 /** 36 * SortedOpTest 37 * 38 * @author Brian Goetz 39 */ 40 @Test 41 public class SortedOpTest extends OpTestCase { 42 public void testSorted() { 43 assertCountSum(countTo(0).stream().sorted(), 0, 0); 44 assertCountSum(countTo(10).stream().sorted(), 10, 55); 45 assertCountSum(countTo(10).stream().sorted(cInteger.reverseOrder()), 10, 55); 46 47 List<Integer> to10 = countTo(10); 48 assertSorted(to10.stream().sorted(cInteger.reverseOrder()).iterator(), cInteger.reverseOrder()); 49 50 Collections.reverse(to10); 51 assertSorted(to10.stream().sorted().iterator()); 52 53 Spliterator<Integer> s = to10.stream().sorted().spliterator(); 54 assertTrue(s.hasCharacteristics(Spliterator.SORTED)); 55 56 s = to10.stream().sorted(cInteger.reverseOrder()).spliterator(); 57 assertFalse(s.hasCharacteristics(Spliterator.SORTED)); 58 } 59 60 @Test(groups = { "serialization-hostile" }) 61 public void testSequentialShortCircuitTerminal() { 62 // The sorted op for sequential evaluation will buffer all elements when accepting 63 // then at the end sort those elements and push those elements downstream 64 65 List<Integer> l = Arrays.asList(5, 4, 3, 2, 1); 66 67 // Find 68 assertEquals(l.stream().sorted().findFirst(), Optional.of(1)); 69 assertEquals(l.stream().sorted().findAny(), Optional.of(1)); 70 assertEquals(unknownSizeStream(l).sorted().findFirst(), Optional.of(1)); 71 assertEquals(unknownSizeStream(l).sorted().findAny(), Optional.of(1)); 72 73 // Match 74 assertEquals(l.stream().sorted().anyMatch(i -> i == 2), true); 75 assertEquals(l.stream().sorted().noneMatch(i -> i == 2), false); 76 assertEquals(l.stream().sorted().allMatch(i -> i == 2), false); 77 assertEquals(unknownSizeStream(l).sorted().anyMatch(i -> i == 2), true); 78 assertEquals(unknownSizeStream(l).sorted().noneMatch(i -> i == 2), false); 79 assertEquals(unknownSizeStream(l).sorted().allMatch(i -> i == 2), false); 80 } 81 82 private <T> Stream<T> unknownSizeStream(List<T> l) { 83 return StreamSupport.stream(Spliterators.spliteratorUnknownSize(l.iterator(), 0)); 84 } 85 86 @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class) 87 public void testOps(String name, TestData.OfRef<Integer> data) { 88 Collection<Integer> result = exerciseOpsInt(data, Stream::sorted, IntStream::sorted, LongStream::sorted, DoubleStream::sorted); 89 assertSorted(result.iterator()); 90 assertContentsUnordered(data, result); 91 92 result = exerciseOps(data, s -> s.sorted(cInteger.reverseOrder())); 93 assertSorted(result.iterator(), cInteger.reverseOrder()); 94 assertContentsUnordered(data, result); 95 } 96 97 @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class) 98 public void testSortSort(String name, TestData.OfRef<Integer> data) { 99 // For parallel cases ensure the size is known 100 Collection<Integer> result = withData(data) 101 .stream(s -> s.sorted().sorted(), 102 new CollectorOps.TestParallelSizedOp<Integer>()) 103 .exercise(); 104 105 assertSorted(result); 106 assertContentsUnordered(data, result); 107 108 result = withData(data) 109 .stream(s -> s.sorted(cInteger.reverseOrder()).sorted(cInteger.reverseOrder()), 110 new CollectorOps.TestParallelSizedOp<Integer>()) 111 .exercise(); 112 113 assertSorted(result, cInteger.reverseOrder()); 114 assertContentsUnordered(data, result); 115 116 result = withData(data) 117 .stream(s -> s.sorted().sorted(cInteger.reverseOrder()), 118 new CollectorOps.TestParallelSizedOp<Integer>()) 119 .exercise(); 120 121 assertSorted(result, cInteger.reverseOrder()); 122 assertContentsUnordered(data, result); 123 124 result = withData(data) 125 .stream(s -> s.sorted(cInteger.reverseOrder()).sorted(), 126 new CollectorOps.TestParallelSizedOp<Integer>()) 127 .exercise(); 128 129 assertSorted(result); 130 assertContentsUnordered(data, result); 131 } 132 133 // 134 135 @Test(groups = { "serialization-hostile" }) 136 public void testIntSequentialShortCircuitTerminal() { 137 int[] a = new int[]{5, 4, 3, 2, 1}; 138 139 // Find 140 assertEquals(Arrays.stream(a).sorted().findFirst(), OptionalInt.of(1)); 141 assertEquals(Arrays.stream(a).sorted().findAny(), OptionalInt.of(1)); 142 assertEquals(unknownSizeIntStream(a).sorted().findFirst(), OptionalInt.of(1)); 143 assertEquals(unknownSizeIntStream(a).sorted().findAny(), OptionalInt.of(1)); 144 145 // Match 146 assertEquals(Arrays.stream(a).sorted().anyMatch(i -> i == 2), true); 147 assertEquals(Arrays.stream(a).sorted().noneMatch(i -> i == 2), false); 148 assertEquals(Arrays.stream(a).sorted().allMatch(i -> i == 2), false); 149 assertEquals(unknownSizeIntStream(a).sorted().anyMatch(i -> i == 2), true); 150 assertEquals(unknownSizeIntStream(a).sorted().noneMatch(i -> i == 2), false); 151 assertEquals(unknownSizeIntStream(a).sorted().allMatch(i -> i == 2), false); 152 } 153 154 private IntStream unknownSizeIntStream(int[] a) { 155 return StreamSupport.intStream(Spliterators.spliteratorUnknownSize(Spliterators.iteratorFromSpliterator(Arrays.spliterator(a)), 0)); 156 } 157 158 @Test(dataProvider = "IntStreamTestData", dataProviderClass = IntStreamTestDataProvider.class) 159 public void testIntOps(String name, TestData.OfInt data) { 160 Collection<Integer> result = exerciseOps(data, s -> s.sorted()); 161 assertSorted(result); 162 assertContentsUnordered(data, result); 163 } 164 165 @Test(dataProvider = "IntStreamTestData", dataProviderClass = IntStreamTestDataProvider.class) 166 public void testIntSortSort(String name, TestData.OfInt data) { 167 // For parallel cases ensure the size is known 168 Collection<Integer> result = withData(data) 169 .stream(s -> s.sorted().sorted(), new CollectorOps.TestParallelSizedOp.OfInt()) 170 .exercise(); 171 172 assertSorted(result); 173 assertContentsUnordered(data, result); 174 } 175 176 // 177 178 @Test(groups = { "serialization-hostile" }) 179 public void testLongSequentialShortCircuitTerminal() { 180 long[] a = new long[]{5, 4, 3, 2, 1}; 181 182 // Find 183 assertEquals(Arrays.stream(a).sorted().findFirst(), OptionalLong.of(1)); 184 assertEquals(Arrays.stream(a).sorted().findAny(), OptionalLong.of(1)); 185 assertEquals(unknownSizeLongStream(a).sorted().findFirst(), OptionalLong.of(1)); 186 assertEquals(unknownSizeLongStream(a).sorted().findAny(), OptionalLong.of(1)); 187 188 // Match 189 assertEquals(Arrays.stream(a).sorted().anyMatch(i -> i == 2), true); 190 assertEquals(Arrays.stream(a).sorted().noneMatch(i -> i == 2), false); 191 assertEquals(Arrays.stream(a).sorted().allMatch(i -> i == 2), false); 192 assertEquals(unknownSizeLongStream(a).sorted().anyMatch(i -> i == 2), true); 193 assertEquals(unknownSizeLongStream(a).sorted().noneMatch(i -> i == 2), false); 194 assertEquals(unknownSizeLongStream(a).sorted().allMatch(i -> i == 2), false); 195 } 196 197 private LongStream unknownSizeLongStream(long[] a) { 198 return StreamSupport.longStream(Spliterators.spliteratorUnknownSize(Spliterators.iteratorFromSpliterator(Arrays.spliterator(a)), 0)); 199 } 200 201 @Test(dataProvider = "LongStreamTestData", dataProviderClass = LongStreamTestDataProvider.class) 202 public void testLongOps(String name, TestData.OfLong data) { 203 Collection<Long> result = exerciseOps(data, s -> s.sorted()); 204 assertSorted(result); 205 assertContentsUnordered(data, result); 206 } 207 208 @Test(dataProvider = "LongStreamTestData", dataProviderClass = LongStreamTestDataProvider.class) 209 public void testLongSortSort(String name, TestData.OfLong data) { 210 // For parallel cases ensure the size is known 211 Collection<Long> result = withData(data) 212 .stream(s -> s.sorted().sorted(), new CollectorOps.TestParallelSizedOp.OfLong()) 213 .exercise(); 214 215 assertSorted(result); 216 assertContentsUnordered(data, result); 217 } 218 219 // 220 221 @Test(groups = { "serialization-hostile" }) 222 public void testDoubleSequentialShortCircuitTerminal() { 223 double[] a = new double[]{5.0, 4.0, 3.0, 2.0, 1.0}; 224 225 // Find 226 assertEquals(Arrays.stream(a).sorted().findFirst(), OptionalDouble.of(1)); 227 assertEquals(Arrays.stream(a).sorted().findAny(), OptionalDouble.of(1)); 228 assertEquals(unknownSizeDoubleStream(a).sorted().findFirst(), OptionalDouble.of(1)); 229 assertEquals(unknownSizeDoubleStream(a).sorted().findAny(), OptionalDouble.of(1)); 230 231 // Match 232 assertEquals(Arrays.stream(a).sorted().anyMatch(i -> i == 2.0), true); 233 assertEquals(Arrays.stream(a).sorted().noneMatch(i -> i == 2.0), false); 234 assertEquals(Arrays.stream(a).sorted().allMatch(i -> i == 2.0), false); 235 assertEquals(unknownSizeDoubleStream(a).sorted().anyMatch(i -> i == 2.0), true); 236 assertEquals(unknownSizeDoubleStream(a).sorted().noneMatch(i -> i == 2.0), false); 237 assertEquals(unknownSizeDoubleStream(a).sorted().allMatch(i -> i == 2.0), false); 238 } 239 240 private DoubleStream unknownSizeDoubleStream(double[] a) { 241 return StreamSupport.doubleStream(Spliterators.spliteratorUnknownSize(Spliterators.iteratorFromSpliterator(Arrays.spliterator(a)), 0)); 242 } 243 244 @Test(dataProvider = "DoubleStreamTestData", dataProviderClass = DoubleStreamTestDataProvider.class) 245 public void testDoubleOps(String name, TestData.OfDouble data) { 246 Collection<Double> result = exerciseOps(data, s -> s.sorted()); 247 assertSorted(result); 248 assertContentsUnordered(data, result); 249 } 250 251 @Test(dataProvider = "DoubleStreamTestData", dataProviderClass = DoubleStreamTestDataProvider.class) 252 public void testDoubleSortSort(String name, TestData.OfDouble data) { 253 // For parallel cases ensure the size is known 254 Collection<Double> result = withData(data) 255 .stream(s -> s.sorted().sorted(), new CollectorOps.TestParallelSizedOp.OfDouble()) 256 .exercise(); 257 258 assertSorted(result); 259 assertContentsUnordered(data, result); 260 } 261 }