14c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin/* 24c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. 34c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 44c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * 54c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * This code is free software; you can redistribute it and/or modify it 64c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * under the terms of the GNU General Public License version 2 only, as 74c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * published by the Free Software Foundation. 84c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * 94c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * This code is distributed in the hope that it will be useful, but WITHOUT 104c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 114c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 124c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * version 2 for more details (a copy is included in the LICENSE file that 134c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * accompanied this code). 144c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * 154c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * You should have received a copy of the GNU General Public License version 164c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * 2 along with this work; if not, write to the Free Software Foundation, 174c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 184c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * 194c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 204c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * or visit www.oracle.com if you need additional information or have any 214c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin * questions. 224c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin */ 234c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkinpackage java.util.stream; 244c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 254c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkinimport org.testng.annotations.DataProvider; 264c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkinimport org.testng.annotations.Test; 274c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 284c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkinimport java.util.*; 294c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkinimport java.util.function.DoubleConsumer; 304c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkinimport java.util.function.IntConsumer; 314c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkinimport java.util.function.LongConsumer; 324c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 334c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkinimport static org.testng.Assert.assertEquals; 344c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkinimport static org.testng.Assert.assertFalse; 354c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 364c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin@Test 374c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkinpublic class SpinedBufferTest { 384c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 394c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin // Create sizes around the boundary of spines 404c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin static List<Integer> sizes; 414c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin static { 424c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin try { 434c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin sizes = IntStream.range(0, 15) 444c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin .map(i -> 1 << i) 454c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin .flatMap(i -> Arrays.stream(new int[] { i-2, i-1, i, i+1, i+2 })) 464c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin .filter(i -> i >= 0) 474c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin .boxed() 484c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin .distinct() 494c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin .collect(Collectors.toList()); 504c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 514c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin catch (Exception e) { 524c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin e.printStackTrace(); 534c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 544c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 554c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 564c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin private static final int TEST_SIZE = 5000; 574c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 584c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin // SpinedBuffer 594c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 604c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin @DataProvider(name = "SpinedBuffer") 614c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin public Object[][] createSpinedBuffer() { 624c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Object[]> params = new ArrayList<>(); 634c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 644c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (int size : sizes) { 654c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin int[] array = IntStream.range(0, size).toArray(); 664c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 674c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin SpinedBuffer<Integer> sb = new SpinedBuffer<>(); 684c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin Arrays.stream(array).boxed().forEach(sb); 694c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin params.add(new Object[]{array, sb}); 704c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 714c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin sb = new SpinedBuffer<>(size / 2); 724c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin Arrays.stream(array).boxed().forEach(sb); 734c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin params.add(new Object[]{array, sb}); 744c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 754c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin sb = new SpinedBuffer<>(size); 764c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin Arrays.stream(array).boxed().forEach(sb); 774c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin params.add(new Object[]{array, sb}); 784c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 794c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin sb = new SpinedBuffer<>(size * 2); 804c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin Arrays.stream(array).boxed().forEach(sb); 814c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin params.add(new Object[]{array, sb}); 824c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 834c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 844c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin return params.toArray(new Object[0][]); 854c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 864c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 874c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin @Test(dataProvider = "SpinedBuffer") 884c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin public void testSpliterator(int[] array, SpinedBuffer<Integer> sb) { 894c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(sb.count(), array.length); 904c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(sb.count(), sb.spliterator().getExactSizeIfKnown()); 914c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 924c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin SpliteratorTestHelper.testSpliterator(sb::spliterator); 934c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 944c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 954c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin @Test(dataProvider = "SpinedBuffer", groups = { "serialization-hostile" }) 964c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin public void testLastSplit(int[] array, SpinedBuffer<Integer> sb) { 974c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin Spliterator<Integer> spliterator = sb.spliterator(); 984c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin Spliterator<Integer> split = spliterator.trySplit(); 994c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin long splitSizes = (split == null) ? 0 : split.getExactSizeIfKnown(); 1004c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin long lastSplitSize = spliterator.getExactSizeIfKnown(); 1014c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin splitSizes += lastSplitSize; 1024c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1034c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(splitSizes, array.length); 1044c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1054c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Integer> contentOfLastSplit = new ArrayList<>(); 1064c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin spliterator.forEachRemaining(contentOfLastSplit::add); 1074c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1084c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(contentOfLastSplit.size(), lastSplitSize); 1094c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1104c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Integer> end = Arrays.stream(array) 1114c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin .boxed() 1124c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin .skip(array.length - lastSplitSize) 1134c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin .collect(Collectors.toList()); 1144c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(contentOfLastSplit, end); 1154c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 1164c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1174c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin @Test(groups = { "serialization-hostile" }) 1184c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin public void testSpinedBuffer() { 1194c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Integer> list1 = new ArrayList<>(); 1204c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Integer> list2 = new ArrayList<>(); 1214c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin SpinedBuffer<Integer> sb = new SpinedBuffer<>(); 1224c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (int i = 0; i < TEST_SIZE; i++) { 1234c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list1.add(i); 1244c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin sb.accept(i); 1254c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 1264c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin Iterator<Integer> it = sb.iterator(); 1274c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (int i = 0; i < TEST_SIZE; i++) 1284c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list2.add(it.next()); 1294c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertFalse(it.hasNext()); 1304c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(list1, list2); 1314c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1324c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (int i = 0; i < TEST_SIZE; i++) 1334c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(sb.get(i), (Integer) i, Integer.toString(i)); 1344c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1354c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list2.clear(); 1364c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin sb.forEach(list2::add); 1374c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(list1, list2); 1384c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin Integer[] array = sb.asArray(LambdaTestHelpers.integerArrayGenerator); 1394c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list2.clear(); 1404c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (Integer i : array) 1414c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list2.add(i); 1424c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(list1, list2); 1434c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 1444c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1454c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin // IntSpinedBuffer 1464c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1474c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin @DataProvider(name = "IntSpinedBuffer") 1484c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin public Object[][] createIntSpinedBuffer() { 1494c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Object[]> params = new ArrayList<>(); 1504c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1514c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (int size : sizes) { 1524c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin int[] array = IntStream.range(0, size).toArray(); 1534c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin SpinedBuffer.OfInt sb = new SpinedBuffer.OfInt(); 1544c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin Arrays.stream(array).forEach(sb); 1554c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1564c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin params.add(new Object[]{array, sb}); 1574c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 1584c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1594c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin return params.toArray(new Object[0][]); 1604c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 1614c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1624c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin @Test(dataProvider = "IntSpinedBuffer") 1634c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin public void testIntSpliterator(int[] array, SpinedBuffer.OfInt sb) { 1644c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(sb.count(), array.length); 1654c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(sb.count(), sb.spliterator().getExactSizeIfKnown()); 1664c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1674c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin SpliteratorTestHelper.testIntSpliterator(sb::spliterator); 1684c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 1694c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1704c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin @Test(dataProvider = "IntSpinedBuffer", groups = { "serialization-hostile" }) 1714c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin public void testIntLastSplit(int[] array, SpinedBuffer.OfInt sb) { 1724c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin Spliterator.OfInt spliterator = sb.spliterator(); 1734c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin Spliterator.OfInt split = spliterator.trySplit(); 1744c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin long splitSizes = (split == null) ? 0 : split.getExactSizeIfKnown(); 1754c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin long lastSplitSize = spliterator.getExactSizeIfKnown(); 1764c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin splitSizes += lastSplitSize; 1774c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1784c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(splitSizes, array.length); 1794c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1804c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Integer> contentOfLastSplit = new ArrayList<>(); 1814c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin spliterator.forEachRemaining((IntConsumer) contentOfLastSplit::add); 1824c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1834c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(contentOfLastSplit.size(), lastSplitSize); 1844c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1854c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Integer> end = Arrays.stream(array) 1864c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin .boxed() 1874c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin .skip(array.length - lastSplitSize) 1884c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin .collect(Collectors.toList()); 1894c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(contentOfLastSplit, end); 1904c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 1914c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 1924c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin @Test(groups = { "serialization-hostile" }) 1934c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin public void testIntSpinedBuffer() { 1944c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Integer> list1 = new ArrayList<>(); 1954c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Integer> list2 = new ArrayList<>(); 1964c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin SpinedBuffer.OfInt sb = new SpinedBuffer.OfInt(); 1974c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (int i = 0; i < TEST_SIZE; i++) { 1984c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list1.add(i); 1994c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin sb.accept(i); 2004c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 2014c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin PrimitiveIterator.OfInt it = sb.iterator(); 2024c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (int i = 0; i < TEST_SIZE; i++) 2034c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list2.add(it.nextInt()); 2044c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertFalse(it.hasNext()); 2054c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(list1, list2); 2064c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2074c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (int i = 0; i < TEST_SIZE; i++) 2084c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(sb.get(i), i, Integer.toString(i)); 2094c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2104c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list2.clear(); 2114c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin sb.forEach((int i) -> list2.add(i)); 2124c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(list1, list2); 2134c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin int[] array = sb.asPrimitiveArray(); 2144c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list2.clear(); 2154c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (int i : array) 2164c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list2.add(i); 2174c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(list1, list2); 2184c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 2194c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2204c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin // LongSpinedBuffer 2214c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2224c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin @DataProvider(name = "LongSpinedBuffer") 2234c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin public Object[][] createLongSpinedBuffer() { 2244c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Object[]> params = new ArrayList<>(); 2254c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2264c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (int size : sizes) { 2274c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin long[] array = LongStream.range(0, size).toArray(); 2284c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin SpinedBuffer.OfLong sb = new SpinedBuffer.OfLong(); 2294c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin Arrays.stream(array).forEach(sb); 2304c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2314c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin params.add(new Object[]{array, sb}); 2324c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 2334c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2344c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin return params.toArray(new Object[0][]); 2354c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 2364c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2374c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin @Test(dataProvider = "LongSpinedBuffer") 2384c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin public void testLongSpliterator(long[] array, SpinedBuffer.OfLong sb) { 2394c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(sb.count(), array.length); 2404c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(sb.count(), sb.spliterator().getExactSizeIfKnown()); 2414c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2424c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin SpliteratorTestHelper.testLongSpliterator(sb::spliterator); 2434c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 2444c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2454c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin @Test(dataProvider = "LongSpinedBuffer", groups = { "serialization-hostile" }) 2464c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin public void testLongLastSplit(long[] array, SpinedBuffer.OfLong sb) { 2474c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin Spliterator.OfLong spliterator = sb.spliterator(); 2484c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin Spliterator.OfLong split = spliterator.trySplit(); 2494c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin long splitSizes = (split == null) ? 0 : split.getExactSizeIfKnown(); 2504c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin long lastSplitSize = spliterator.getExactSizeIfKnown(); 2514c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin splitSizes += lastSplitSize; 2524c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2534c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(splitSizes, array.length); 2544c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2554c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Long> contentOfLastSplit = new ArrayList<>(); 2564c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin spliterator.forEachRemaining((LongConsumer) contentOfLastSplit::add); 2574c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2584c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(contentOfLastSplit.size(), lastSplitSize); 2594c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2604c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Long> end = Arrays.stream(array) 2614c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin .boxed() 2624c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin .skip(array.length - lastSplitSize) 2634c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin .collect(Collectors.toList()); 2644c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(contentOfLastSplit, end); 2654c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 2664c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2674c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin @Test(groups = { "serialization-hostile" }) 2684c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin public void testLongSpinedBuffer() { 2694c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Long> list1 = new ArrayList<>(); 2704c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Long> list2 = new ArrayList<>(); 2714c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin SpinedBuffer.OfLong sb = new SpinedBuffer.OfLong(); 2724c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (long i = 0; i < TEST_SIZE; i++) { 2734c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list1.add(i); 2744c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin sb.accept(i); 2754c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 2764c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin PrimitiveIterator.OfLong it = sb.iterator(); 2774c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (int i = 0; i < TEST_SIZE; i++) 2784c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list2.add(it.nextLong()); 2794c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertFalse(it.hasNext()); 2804c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(list1, list2); 2814c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2824c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (int i = 0; i < TEST_SIZE; i++) 2834c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(sb.get(i), i, Long.toString(i)); 2844c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2854c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list2.clear(); 2864c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin sb.forEach((long i) -> list2.add(i)); 2874c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(list1, list2); 2884c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin long[] array = sb.asPrimitiveArray(); 2894c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list2.clear(); 2904c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (long i : array) 2914c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list2.add(i); 2924c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(list1, list2); 2934c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 2944c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2954c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin // DoubleSpinedBuffer 2964c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 2974c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin @DataProvider(name = "DoubleSpinedBuffer") 2984c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin public Object[][] createDoubleSpinedBuffer() { 2994c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Object[]> params = new ArrayList<>(); 3004c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 3014c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (int size : sizes) { 3024c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin // @@@ replace with double range when implemented 3034c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin double[] array = LongStream.range(0, size).asDoubleStream().toArray(); 3044c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin SpinedBuffer.OfDouble sb = new SpinedBuffer.OfDouble(); 3054c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin Arrays.stream(array).forEach(sb); 3064c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 3074c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin params.add(new Object[]{array, sb}); 3084c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 3094c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 3104c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin return params.toArray(new Object[0][]); 3114c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 3124c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 3134c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin @Test(dataProvider = "DoubleSpinedBuffer") 3144c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin public void testDoubleSpliterator(double[] array, SpinedBuffer.OfDouble sb) { 3154c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(sb.count(), array.length); 3164c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(sb.count(), sb.spliterator().getExactSizeIfKnown()); 3174c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 3184c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin SpliteratorTestHelper.testDoubleSpliterator(sb::spliterator); 3194c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 3204c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 3214c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin @Test(dataProvider = "DoubleSpinedBuffer", groups = { "serialization-hostile" }) 3224c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin public void testLongLastSplit(double[] array, SpinedBuffer.OfDouble sb) { 3234c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin Spliterator.OfDouble spliterator = sb.spliterator(); 3244c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin Spliterator.OfDouble split = spliterator.trySplit(); 3254c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin long splitSizes = (split == null) ? 0 : split.getExactSizeIfKnown(); 3264c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin long lastSplitSize = spliterator.getExactSizeIfKnown(); 3274c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin splitSizes += lastSplitSize; 3284c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 3294c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(splitSizes, array.length); 3304c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 3314c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Double> contentOfLastSplit = new ArrayList<>(); 3324c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin spliterator.forEachRemaining((DoubleConsumer) contentOfLastSplit::add); 3334c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 3344c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(contentOfLastSplit.size(), lastSplitSize); 3354c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 3364c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Double> end = Arrays.stream(array) 3374c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin .boxed() 3384c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin .skip(array.length - lastSplitSize) 3394c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin .collect(Collectors.toList()); 3404c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(contentOfLastSplit, end); 3414c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 3424c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 3434c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin @Test(groups = { "serialization-hostile" }) 3444c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin public void testDoubleSpinedBuffer() { 3454c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Double> list1 = new ArrayList<>(); 3464c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin List<Double> list2 = new ArrayList<>(); 3474c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin SpinedBuffer.OfDouble sb = new SpinedBuffer.OfDouble(); 3484c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (long i = 0; i < TEST_SIZE; i++) { 3494c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list1.add((double) i); 3504c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin sb.accept((double) i); 3514c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 3524c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin PrimitiveIterator.OfDouble it = sb.iterator(); 3534c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (int i = 0; i < TEST_SIZE; i++) 3544c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list2.add(it.nextDouble()); 3554c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertFalse(it.hasNext()); 3564c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(list1, list2); 3574c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 3584c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (int i = 0; i < TEST_SIZE; i++) 3594c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(sb.get(i), (double) i, Double.toString(i)); 3604c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin 3614c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list2.clear(); 3624c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin sb.forEach((double i) -> list2.add(i)); 3634c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(list1, list2); 3644c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin double[] array = sb.asPrimitiveArray(); 3654c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list2.clear(); 3664c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin for (double i : array) 3674c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin list2.add(i); 3684c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin assertEquals(list1, list2); 3694c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin } 3704c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin} 371