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