Merge "Extract luni crypto tests into separate module"
diff --git a/luni/src/test/java/libcore/java/util/ArraysTest.java b/luni/src/test/java/libcore/java/util/ArraysTest.java
index b48e8ea..a0122b2 100644
--- a/luni/src/test/java/libcore/java/util/ArraysTest.java
+++ b/luni/src/test/java/libcore/java/util/ArraysTest.java
@@ -16,15 +16,30 @@
 
 package libcore.java.util;
 
-import java.util.Arrays;
-import java.util.Random;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
-public class ArraysTest extends junit.framework.TestCase {
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+import java.util.stream.Collectors;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class ArraysTest {
+    private static final int[] TEST_ARRAY_SIZES = { 0, 1, 2, 10, 100, 1000 };
+
 
     /**
      * java.util.Arrays#setAll(int[], java.util.function.IntUnaryOperator)
      */
-    public void test_setAll$I() {
+    @Test
+    public void setAll$I() {
         int[] list = new int[3];
         list[0] = 0;
         list[1] = 1;
@@ -51,7 +66,8 @@
     /**
      * java.util.Arrays#parallelSetAll(int[], java.util.function.IntUnaryOperator)
      */
-    public void test_parallelSetAll$I() {
+    @Test
+    public void parallelSetAll$I() {
         int[] list = new int[3];
         list[0] = 0;
         list[1] = 1;
@@ -78,7 +94,8 @@
     /**
      * java.util.Arrays#setAll(long[], java.util.function.IntToLongFunction)
      */
-    public void test_setAll$L() {
+    @Test
+    public void setAll$L() {
         long[] list = new long[3];
         list[0] = 0;
         list[1] = 1;
@@ -105,7 +122,8 @@
     /**
      * java.util.Arrays#parallelSetAll(long[], java.util.function.IntToLongFunction)
      */
-    public void test_parallelSetAll$L() {
+    @Test
+    public void parallelSetAll$L() {
         long[] list = new long[3];
         list[0] = 0;
         list[1] = 1;
@@ -132,16 +150,17 @@
     /**
      * java.util.Arrays#setAll(double[], java.util.function.IntToDoubleFunction)
      */
-    public void test_setAll$D() {
+    @Test
+    public void setAll$D() {
         double[] list = new double[3];
         list[0] = 0.0d;
         list[1] = 1.0d;
         list[2] = 2.0d;
 
         Arrays.setAll(list, x -> x + 0.5);
-        assertEquals(0.5d, list[0]);
-        assertEquals(1.5d, list[1]);
-        assertEquals(2.5d, list[2]);
+        assertEquals(0.5d, list[0], 0.0);
+        assertEquals(1.5d, list[1], 0.0);
+        assertEquals(2.5d, list[2], 0.0);
 
         try {
             Arrays.setAll(list, null);
@@ -159,16 +178,17 @@
     /**
      * java.util.Arrays#parallelSetAll(double[], java.util.function.IntToDoubleFunction)
      */
-    public void test_parallelSetAll$D() {
+    @Test
+    public void parallelSetAll$D() {
         double[] list = new double[3];
         list[0] = 0.0d;
         list[1] = 1.0d;
         list[2] = 2.0d;
 
         Arrays.parallelSetAll(list, x -> x + 0.5);
-        assertEquals(0.5d, list[0]);
-        assertEquals(1.5d, list[1]);
-        assertEquals(2.5d, list[2]);
+        assertEquals(0.5d, list[0], 0.0);
+        assertEquals(1.5d, list[1], 0.0);
+        assertEquals(2.5d, list[2], 0.0);
 
         try {
             Arrays.parallelSetAll(list, null);
@@ -186,7 +206,8 @@
     /**
      * java.util.Array#setAll(T[], java.util.function.IntFunction<\? extends T>)
      */
-    public void test_setAll$T() {
+    @Test
+    public void setAll$T() {
         String[] strings = new String[3];
         strings[0] = "a";
         strings[0] = "b";
@@ -213,7 +234,8 @@
     /**
      * java.util.Array#parallelSetAll(T[], java.util.function.IntFunction<\? extends T>)
      */
-    public void test_parallelSetAll$T() {
+    @Test
+    public void parallelSetAll$T() {
         String[] strings = new String[3];
         strings[0] = "a";
         strings[0] = "b";
@@ -240,7 +262,8 @@
     /**
      * java.util.Array#parallelPrefix(int[], java.util.function.IntBinaryOperator)
      */
-    public void test_parallelPrefix$I() {
+    @Test
+    public void parallelPrefix$I() {
         // Get an arbitrary array of ints.
         Random rand = new Random(0);
         int[] list = new int[1000];
@@ -256,7 +279,7 @@
         }
 
         Arrays.parallelPrefix(list, (x, y) -> x + y);
-        assertTrue(Arrays.equals(seqResult, list));
+        assertArrayEquals(seqResult, list);
 
         try {
             Arrays.parallelPrefix(list, null);
@@ -274,7 +297,8 @@
     /**
      * java.util.Array#parallelPrefix(int[], int, int, java.util.function.IntBinaryOperator)
      */
-    public void test_parallelPrefix$III() {
+    @Test
+    public void parallelPrefix$III() {
         // Get an arbitrary array of ints.
         Random rand = new Random(0);
         int[] list = new int[1000];
@@ -291,7 +315,7 @@
         }
 
         Arrays.parallelPrefix(list, begin, end, (x, y) -> x + y);
-        assertTrue(Arrays.equals(seqResult, list));
+        assertArrayEquals(seqResult, list);
 
         try {
             Arrays.parallelPrefix(list, begin, end, null);
@@ -315,7 +339,8 @@
     /**
      * java.util.Array#parallelPrefix(long[], java.util.function.LongBinaryOperator)
      */
-    public void test_parallelPrefix$L() {
+    @Test
+    public void parallelPrefix$L() {
         // Get an arbitrary array of ints.
         Random rand = new Random(0);
         long[] list = new long[1000];
@@ -331,7 +356,7 @@
         }
 
         Arrays.parallelPrefix(list, (x, y) -> x + y);
-        assertTrue(Arrays.equals(seqResult, list));
+        assertArrayEquals(seqResult, list);
 
         try {
             Arrays.parallelPrefix(list, null);
@@ -349,7 +374,8 @@
     /**
      * java.util.Array#parallelPrefix(long[], int, int, java.util.function.LongBinaryOperator)
      */
-    public void test_parallelPrefix$LII() {
+    @Test
+    public void parallelPrefix$LII() {
         // Get an arbitrary array of ints.
         Random rand = new Random(0);
         long[] list = new long[1000];
@@ -366,7 +392,7 @@
         }
 
         Arrays.parallelPrefix(list, begin, end, (x, y) -> x + y);
-        assertTrue(Arrays.equals(seqResult, list));
+        assertArrayEquals(seqResult, list);
 
         try {
             Arrays.parallelPrefix(list, begin, end, null);
@@ -390,7 +416,8 @@
     /**
      * java.util.Array#parallelPrefix(double[], java.util.function.DoubleBinaryOperator)
      */
-    public void test_parallelPrefix$D() {
+    @Test
+    public void parallelPrefix$D() {
         // Get an arbitrary array of ints.
         Random rand = new Random(0);
         double[] list = new double[1000];
@@ -410,7 +437,7 @@
         // Parallel double arithmetic contains error, reduce to integer for comparison.
         int[] listInInt = Arrays.stream(list).mapToInt(x -> (int) x).toArray();
         int[] seqResultInInt = Arrays.stream(seqResult).mapToInt(x -> (int) x).toArray();
-        assertTrue(Arrays.equals(seqResultInInt, listInInt));
+        assertArrayEquals(seqResultInInt, listInInt);
 
         try {
             Arrays.parallelPrefix(list, null);
@@ -428,7 +455,8 @@
     /**
      * java.util.Array#parallelPrefix(double[], int, int, java.util.function.DoubleBinaryOperator)
      */
-    public void test_parallelPrefix$DII() {
+    @Test
+    public void parallelPrefix$DII() {
         // Get an arbitrary array of ints.
         Random rand = new Random(0);
         double[] list = new double[1000];
@@ -449,7 +477,7 @@
         // Parallel double arithmetic contains error, reduce to integer for comparison.
         int[] listInInt = Arrays.stream(list).mapToInt(x -> (int) x).toArray();
         int[] seqResultInInt = Arrays.stream(seqResult).mapToInt(x -> (int) x).toArray();
-        assertTrue(Arrays.equals(seqResultInInt, listInInt));
+        assertArrayEquals(seqResultInInt, listInInt);
 
         try {
             Arrays.parallelPrefix(list, begin, end, null);
@@ -473,7 +501,8 @@
     /**
      * java.util.Array#parallelPrefix(T[], java.util.function.BinaryOperator<T>)
      */
-    public void test_parallelPrefix$T() {
+    @Test
+    public void parallelPrefix$T() {
         String[] strings = new String[3];
         strings[0] = "a";
         strings[1] = "b";
@@ -500,7 +529,8 @@
     /**
      * java.util.Array#parallelPrefix(T[], int, int, java.util.function.BinaryOperator<T>)
      */
-    public void test_parallelPrefix$TII() {
+    @Test
+    public void parallelPrefix$TII() {
         String[] strings = new String[5];
         strings[0] = "a";
         strings[1] = "b";
@@ -536,9 +566,293 @@
     }
 
     // http://b/74236526
-    public void test_deepEquals_nestedArraysOfDifferentTypesButEqualValues() {
+    @Test
+    public void deepEquals_nestedArraysOfDifferentTypesButEqualValues() {
         assertTrue(Arrays.deepEquals(
             new Object[] { new Object[] { "Hello", "world" } },
             new Object[] { new String[] { "Hello", "world" } }));
     }
+
+    @Test
+    public void streamInt() {
+        for (int size : TEST_ARRAY_SIZES) {
+            int[] sourceArray = intTestArray(size);
+
+            // Stream, map, accumulate
+            int sum = Arrays.stream(sourceArray)
+                .map(i -> i + i)
+                .sum();
+            assertEquals(size * (size - 1), sum);
+
+            // Stream, collect as array again
+            int[] destArray = Arrays.stream(sourceArray)
+                .toArray();
+            assertArrayEquals(sourceArray, destArray);
+            assertNotSame(sourceArray, destArray);
+
+            // Stream, box, collect as list
+            List<Integer> destList = Arrays.stream(sourceArray)
+                .boxed()
+                .collect(Collectors.toList());
+
+            for (int i = 0; i < size; i++) {
+                assertEquals((int) destList.get(i), i);
+            }
+        }
+    }
+
+    @Test
+    public void streamIntStartEnd() {
+        final int size = 10;
+        int[] sourceArray = intTestArray(size);
+        for (int start = 0; start < size - 1; start++) {
+            for (int end = start; end < size; end++) {
+                int[] destArray = Arrays.stream(sourceArray, start, end)
+                    .toArray();
+                int len = end - start;
+                assertEquals(len, destArray.length);
+                if (len > 0) {
+                    assertEquals(start, destArray[0]);
+                    assertEquals(end - 1, destArray[len - 1]);
+                }
+            }
+        }
+    }
+
+    @Test
+    public void streamIntStartEnd_Exceptions() {
+        int[] sourceArray = intTestArray(10);
+        try {
+            int unused = Arrays.stream(sourceArray, -1, 9)
+                .sum();
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            // Expected
+        }
+        try {
+            int unused = Arrays.stream(sourceArray, 0, 11)
+                .sum();
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            // Expected
+        }
+        try {
+            int unused = Arrays.stream(sourceArray, 11, 11)
+                .sum();
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            // Expected
+        }
+        try {
+            int unused = Arrays.stream(sourceArray, 0, -1)
+                .sum();
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            // Expected
+        }
+        try {
+            int unused = Arrays.stream(sourceArray, 4, 3)
+                .sum();
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            // Expected
+        }
+    }
+
+    @Test
+    public void streamLong() {
+        for (int size : TEST_ARRAY_SIZES) {
+            long[] sourceArray = longTestArray(size);
+
+            // Stream, map, accumulate
+            long sum = Arrays.stream(sourceArray)
+                .map(i -> i + i)
+                .sum();
+            assertEquals(size * (size - 1), sum);
+
+            // Stream, collect as array again
+            long[] destArray = Arrays.stream(sourceArray)
+                .toArray();
+            assertArrayEquals(sourceArray, destArray);
+            assertNotSame(sourceArray, destArray);
+
+            // Stream, box, collect as list
+            List<Long> destList = Arrays.stream(sourceArray)
+                .boxed()
+                .collect(Collectors.toList());
+
+            for (int i = 0; i < size; i++) {
+                assertEquals((long) destList.get(i), i);
+            }
+        }
+    }
+
+    @Test
+    public void streamLongStartEnd() {
+        final int size = 10;
+        long[] sourceArray = longTestArray(size);
+        for (int start = 0; start < size - 1; start++) {
+            for (int end = start; end < size; end++) {
+                long[] destArray = Arrays.stream(sourceArray, start, end)
+                    .toArray();
+                int len = end - start;
+                assertEquals(len, destArray.length);
+                if (len > 0) {
+                    assertEquals(start, destArray[0]);
+                    assertEquals(end - 1, destArray[len - 1]);
+                }
+            }
+        }
+    }
+
+    @Test
+    public void streamLongStartEnd_Exceptions() {
+        long[] sourceArray = longTestArray(10);
+        try {
+            long unused = Arrays.stream(sourceArray, -1, 9)
+                .sum();
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            // Expected
+        }
+        try {
+            long unused = Arrays.stream(sourceArray, 0, 11)
+                .sum();
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            // Expected
+        }
+        try {
+            long unused = Arrays.stream(sourceArray, 11, 11)
+                .sum();
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            // Expected
+        }
+        try {
+            long unused = Arrays.stream(sourceArray, 0, -1)
+                .sum();
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            // Expected
+        }
+        try {
+            long unused = Arrays.stream(sourceArray, 4, 3)
+                .sum();
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            // Expected
+        }
+    }
+
+    @Test
+    public void streamDouble() {
+        for (int size : TEST_ARRAY_SIZES) {
+            double[] sourceArray = doubleTestArray(size);
+
+            // Stream, map, accumulate
+            double sum = Arrays.stream(sourceArray)
+                .map(i -> i + i)
+                .sum();
+            assertEquals(size * (size - 1), sum, 0.001);
+
+            // Stream, collect as array again
+            double[] destArray = Arrays.stream(sourceArray)
+                .toArray();
+            assertArrayEquals(sourceArray, destArray, 0.001);
+            assertNotSame(sourceArray, destArray);
+
+            // Stream, box, collect as list
+            List<Double> destList = Arrays.stream(sourceArray)
+                .boxed()
+                .collect(Collectors.toList());
+
+            for (int i = 0; i < size; i++) {
+                assertEquals(destList.get(i), i, 0.001);
+            }
+        }
+    }
+
+    @Test
+    public void streamDoubleStartEnd() {
+        final int size = 10;
+        double[] sourceArray = doubleTestArray(size);
+        for (int start = 0; start < size - 1; start++) {
+            for (int end = start; end < size; end++) {
+                double[] destArray = Arrays.stream(sourceArray, start, end)
+                    .toArray();
+                int len = end - start;
+                assertEquals(len, destArray.length);
+                if (len > 0) {
+                    assertEquals(start, destArray[0], 0.0);
+                    assertEquals(end - 1, destArray[len - 1], 0.0);
+                }
+            }
+        }
+    }
+
+    @Test
+    public void streamDoubleStartEnd_Exceptions() {
+        double[] sourceArray = doubleTestArray(10);
+        try {
+            double unused = Arrays.stream(sourceArray, -1, 9)
+                .sum();
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            // Expected
+        }
+        try {
+            double unused = Arrays.stream(sourceArray, 0, 11)
+                .sum();
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            // Expected
+        }
+        try {
+            double unused = Arrays.stream(sourceArray, 11, 11)
+                .sum();
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            // Expected
+        }
+        try {
+            double unused = Arrays.stream(sourceArray, 0, -1)
+                .sum();
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            // Expected
+        }
+        try {
+            double unused = Arrays.stream(sourceArray, 4, 3)
+                .sum();
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            // Expected
+        }
+    }
+
+
+    private int[] intTestArray(int size) {
+        int[] array = new int[size];
+        for (int i = 0; i < size; i++) {
+            array[i] = i;
+        }
+        return array;
+    }
+
+    private long[] longTestArray(int size) {
+        long[] array = new long[size];
+        for (int i = 0; i < size; i++) {
+            array[i] = i;
+        }
+        return array;
+    }
+
+    private double[] doubleTestArray(int size) {
+        double[] array = new double[size];
+        for (int i = 0; i < size; i++) {
+            array[i] = i;
+        }
+        return array;
+    }
 }