1 /*
  2  * Copyright (c) 2014, 2026, 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.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  */
 23 
 24 /*
 25  * @test
 26  * @bug 8037857
 27  * @summary tests for stream and spliterator factory methods
 28  * @run junit StreamAndSpliterator
 29  */
 30 
 31 import java.time.LocalDate;
 32 import java.util.Arrays;
 33 import java.util.Optional;
 34 import java.util.Spliterators;
 35 
 36 import static org.junit.jupiter.api.Assertions.assertThrows;
 37 import org.junit.jupiter.api.Test;
 38 import org.junit.jupiter.api.function.Executable;
 39 
 40 public class StreamAndSpliterator {
 41     @Test
 42     public void testStreamNPEs() {
 43         assertThrowsNPE(() -> Arrays.stream((int[]) null, 0, 0));
 44         assertThrowsNPE(() -> Arrays.stream((long[]) null, 0, 0));
 45         assertThrowsNPE(() -> Arrays.stream((double[]) null, 0, 0));
 46         assertThrowsNPE(() -> Arrays.stream((String[]) null, 0, 0));
 47 
 48         assertThrowsNPE(() -> Arrays.stream((Integer[]) null, 0, 0));
 49         assertThrowsNPE(() -> Arrays.stream((Long[]) null, 0, 0));
 50         assertThrowsNPE(() -> Arrays.stream((Optional[]) null, 0, 0));
 51         assertThrowsNPE(() -> Arrays.stream((LocalDate[]) null, 0, 0));
 52     }
 53 
 54     @Test
 55     public void testStreamAIOBEs() {
 56         // origin > fence
 57         assertThrowsAIOOB(() -> Arrays.stream(new int[]{}, 1, 0));
 58         assertThrowsAIOOB(() -> Arrays.stream(new long[]{}, 1, 0));
 59         assertThrowsAIOOB(() -> Arrays.stream(new double[]{}, 1, 0));
 60         assertThrowsAIOOB(() -> Arrays.stream(new String[]{}, 1, 0));
 61 
 62         assertThrowsAIOOB(() -> Arrays.stream(new Integer[]{}, 1, 0));
 63         assertThrowsAIOOB(() -> Arrays.stream(new Long[]{}, 1, 0));
 64         assertThrowsAIOOB(() -> Arrays.stream(new Optional[]{}, 1, 0));
 65         assertThrowsAIOOB(() -> Arrays.stream(new LocalDate[]{}, 1, 0));
 66 
 67         // bad origin
 68         assertThrowsAIOOB(() -> Arrays.stream(new int[]{}, -1, 0));
 69         assertThrowsAIOOB(() -> Arrays.stream(new long[]{}, -1, 0));
 70         assertThrowsAIOOB(() -> Arrays.stream(new double[]{}, -1, 0));
 71         assertThrowsAIOOB(() -> Arrays.stream(new String[]{}, -1, 0));
 72 
 73         assertThrowsAIOOB(() -> Arrays.stream(new Integer[]{}, -1, 0));
 74         assertThrowsAIOOB(() -> Arrays.stream(new Long[]{}, -1, 0));
 75         assertThrowsAIOOB(() -> Arrays.stream(new Optional[]{}, -1, 0));
 76         assertThrowsAIOOB(() -> Arrays.stream(new LocalDate[]{}, -1, 0));
 77 
 78         // bad fence
 79         assertThrowsAIOOB(() -> Arrays.stream(new int[]{}, 0, 1));
 80         assertThrowsAIOOB(() -> Arrays.stream(new long[]{}, 0, 1));
 81         assertThrowsAIOOB(() -> Arrays.stream(new double[]{}, 0, 1));
 82         assertThrowsAIOOB(() -> Arrays.stream(new String[]{}, 0, 1));
 83 
 84         assertThrowsAIOOB(() -> Arrays.stream(new Integer[]{}, 0, 1));
 85         assertThrowsAIOOB(() -> Arrays.stream(new Long[]{}, 0, 1));
 86         assertThrowsAIOOB(() -> Arrays.stream(new Optional[]{}, 0, 1));
 87         assertThrowsAIOOB(() -> Arrays.stream(new LocalDate[]{}, 0, 1));
 88     }
 89 
 90 
 91     @Test
 92     public void testSpliteratorNPEs() {
 93         assertThrowsNPE(() -> Arrays.spliterator((int[]) null, 0, 0));
 94         assertThrowsNPE(() -> Arrays.spliterator((long[]) null, 0, 0));
 95         assertThrowsNPE(() -> Arrays.spliterator((double[]) null, 0, 0));
 96         assertThrowsNPE(() -> Arrays.spliterator((String[]) null, 0, 0));
 97 
 98         assertThrowsNPE(() -> Arrays.spliterator((Integer[]) null, 0, 0));
 99         assertThrowsNPE(() -> Arrays.spliterator((Long[]) null, 0, 0));
100         assertThrowsNPE(() -> Arrays.spliterator((Optional[]) null, 0, 0));
101         assertThrowsNPE(() -> Arrays.spliterator((LocalDate[]) null, 0, 0));
102     }
103 
104     @Test
105     public void testSpliteratorAIOBEs() {
106         // origin > fence
107         assertThrowsAIOOB(() -> Arrays.spliterator(new int[]{}, 1, 0));
108         assertThrowsAIOOB(() -> Arrays.spliterator(new long[]{}, 1, 0));
109         assertThrowsAIOOB(() -> Arrays.spliterator(new double[]{}, 1, 0));
110         assertThrowsAIOOB(() -> Arrays.spliterator(new String[]{}, 1, 0));
111 
112         // bad origin
113         assertThrowsAIOOB(() -> Arrays.spliterator(new int[]{}, -1, 0));
114         assertThrowsAIOOB(() -> Arrays.spliterator(new long[]{}, -1, 0));
115         assertThrowsAIOOB(() -> Arrays.spliterator(new double[]{}, -1, 0));
116         assertThrowsAIOOB(() -> Arrays.spliterator(new String[]{}, -1, 0));
117 
118         // bad fence
119         assertThrowsAIOOB(() -> Arrays.spliterator(new int[]{}, 0, 1));
120         assertThrowsAIOOB(() -> Arrays.spliterator(new long[]{}, 0, 1));
121         assertThrowsAIOOB(() -> Arrays.spliterator(new double[]{}, 0, 1));
122         assertThrowsAIOOB(() -> Arrays.spliterator(new String[]{}, 0, 1));
123     }
124 
125 
126     @Test
127     public void testSpliteratorNPEsFromSpliterators() {
128         assertThrowsNPE(() -> Spliterators.spliterator((int[]) null, 0, 0, 0));
129         assertThrowsNPE(() -> Spliterators.spliterator((long[]) null, 0, 0, 0));
130         assertThrowsNPE(() -> Spliterators.spliterator((double[]) null, 0, 0, 0));
131         assertThrowsNPE(() -> Spliterators.spliterator((String[]) null, 0, 0, 0));
132 
133         assertThrowsNPE(() -> Spliterators.spliterator((Integer[]) null, 0, 0, 0));
134         assertThrowsNPE(() -> Spliterators.spliterator((Long[]) null, 0, 0, 0));
135         assertThrowsNPE(() -> Spliterators.spliterator((Optional[]) null, 0, 0, 0));
136         assertThrowsNPE(() -> Spliterators.spliterator((LocalDate[]) null, 0, 0, 0));
137     }
138 
139     @Test
140     public void testSpliteratorAIOBEsFromSpliterators() {
141         // origin > fence
142         assertThrowsAIOOB(() -> Spliterators.spliterator(new int[]{}, 1, 0, 0));
143         assertThrowsAIOOB(() -> Spliterators.spliterator(new long[]{}, 1, 0, 0));
144         assertThrowsAIOOB(() -> Spliterators.spliterator(new double[]{}, 1, 0, 0));
145         assertThrowsAIOOB(() -> Spliterators.spliterator(new String[]{}, 1, 0, 0));
146 
147         // bad origin
148         assertThrowsAIOOB(() -> Spliterators.spliterator(new int[]{}, -1, 0, 0));
149         assertThrowsAIOOB(() -> Spliterators.spliterator(new long[]{}, -1, 0, 0));
150         assertThrowsAIOOB(() -> Spliterators.spliterator(new double[]{}, -1, 0, 0));
151         assertThrowsAIOOB(() -> Spliterators.spliterator(new String[]{}, -1, 0, 0));
152 
153         // bad fence
154         assertThrowsAIOOB(() -> Spliterators.spliterator(new int[]{}, 0, 1, 0));
155         assertThrowsAIOOB(() -> Spliterators.spliterator(new long[]{}, 0, 1, 0));
156         assertThrowsAIOOB(() -> Spliterators.spliterator(new double[]{}, 0, 1, 0));
157         assertThrowsAIOOB(() -> Spliterators.spliterator(new String[]{}, 0, 1, 0));
158     }
159 
160     void assertThrowsNPE(Executable r) {
161         assertThrows(NullPointerException.class, r);
162     }
163 
164     void assertThrowsAIOOB(Executable r) {
165         assertThrows(ArrayIndexOutOfBoundsException.class, r);
166     }
167 }