11e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes/*
21e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes * Copyright (C) 2010 The Android Open Source Project
3f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
41e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
51e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes * you may not use this file except in compliance with the License.
61e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes * You may obtain a copy of the License at
7f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
81e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
9f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
101e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes * Unless required by applicable law or agreed to in writing, software
111e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
121e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes * See the License for the specific language governing permissions and
141e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes * limitations under the License.
151e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes */
161e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes
174557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonpackage libcore.java.util;
181e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes
192c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kongimport java.util.Arrays;
204557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.util.Random;
211e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes
221e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughespublic class RandomTest extends junit.framework.TestCase {
231e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes    public void test_subclassing() throws Exception {
241e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes        // http://b/2502231
251e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes        // Ensure that Random's constructors call setSeed by emulating the active ingredient
261e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes        // from the bug: the subclass' setSeed had a side-effect necessary for the correct
271e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes        // functioning of next.
281e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes        class MyRandom extends Random {
291e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes            public String state;
301e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes            public MyRandom() { super(); }
311e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes            public MyRandom(long l) { super(l); }
321e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes            @Override protected synchronized int next(int bits) { return state.length(); }
331e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes            @Override public synchronized void setSeed(long seed) { state = Long.toString(seed); }
341e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes        }
351e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes        // Test the 0-argument constructor...
361e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes        MyRandom r1 = new MyRandom();
371e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes        r1.nextInt();
381e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes        assertNotNull(r1.state);
391e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes        // Test the 1-argument constructor...
401e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes        MyRandom r2 = new MyRandom(123L);
411e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes        r2.nextInt();
421e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes        assertNotNull(r2.state);
431e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes    }
442c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
452c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    public void test_ints$() {
462c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        final int limit = 128; // We can't test for every element in an infinite stream.
472c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
482c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        Random rand = new Random(0);
492c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        int[] rands = new int[limit];
502c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        for(int i = 0; i < limit; ++i) {
512c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            rands[i] = rand.nextInt();
522c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        }
532c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
542c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        int[] streamRands = new Random(0).ints().limit(limit).toArray();
552c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        assertTrue(Arrays.equals(rands, streamRands));
562c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    }
572c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
582c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    public void test_ints$L() {
592c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        final int size = 32;
602c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
612c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        Random rand = new Random(0);
622c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        int[] rands = new int[size];
632c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        for(int i = 0; i < size; ++i) {
642c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            rands[i] = rand.nextInt();
652c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        }
662c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
672c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        int[] streamRands = new Random(0).ints(size).toArray();
682c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        assertTrue(Arrays.equals(rands, streamRands));
692c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        assertEquals(size, new Random(0).ints(size).count());
702c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
712c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        try {
722c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            new Random(0).ints(-1);
732c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            fail();
742c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        } catch (IllegalArgumentException expected) {}
752c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    }
762c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
772c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    public void test_ints$II() {
782c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        final int limit = 128; // We can't test for every element in an infinite stream.
792c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        final int origin = 128, bound = 256;
802c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
812c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        Random rand = new Random(0);
822c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        int[] rands = new int[limit];
832c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        for(int i = 0; i < limit; ++i) {
842c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            rands[i] = rand.nextInt(bound - origin) + origin;
852c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        }
862c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
872c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        int[] streamRands = new Random(0).ints(origin, bound).limit(limit).toArray();
882c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        assertTrue(Arrays.equals(rands, streamRands));
892c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
902c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        try {
912c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            new Random(0).ints(100, 0);
922c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            fail();
932c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        } catch (IllegalArgumentException expected) {}
942c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    }
952c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
962c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    public void test_ints$LII() {
972c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        final int size = 32;
982c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        final int origin = 128, bound = 256;
992c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1002c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        Random rand = new Random(0);
1012c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        int[] rands = new int[size];
1022c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        for(int i = 0; i < size; ++i) {
1032c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            rands[i] = rand.nextInt(bound - origin) + origin;
1042c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        }
1052c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1062c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        int[] streamRands = new Random(0).ints(size, origin, bound).toArray();
1072c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        assertTrue(Arrays.equals(rands, streamRands));
1082c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        assertEquals(size, new Random(0).ints(size, origin, bound).count());
1092c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1102c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        try {
1112c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            new Random(0).ints(-1, 10, 20);
1122c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            fail();
1132c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        } catch (IllegalArgumentException expected) {}
1142c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        try {
1152c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            new Random(0).ints(10, 100, 0);
1162c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            fail();
1172c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        } catch (IllegalArgumentException expected) {}
1182c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    }
1192c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1202c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    public void test_longs$() {
1212c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        final int limit = 128; // We can't test for every element in an infinite stream.
1222c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1232c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        Random rand = new Random(0);
1242c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        long[] rands = new long[limit];
1252c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        for(int i = 0; i < limit; ++i) {
1262c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            rands[i] = rand.nextLong();
1272c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        }
1282c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1292c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        long[] streamRands = new Random(0).longs().limit(limit).toArray();
1302c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        assertTrue(Arrays.equals(rands, streamRands));
1312c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    }
1322c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1332c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    public void test_longs$L() {
1342c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        final int size = 32;
1352c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1362c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        Random rand = new Random(0);
1372c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        long[] rands = new long[size];
1382c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        for(int i = 0; i < size; ++i) {
1392c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            rands[i] = rand.nextLong();
1402c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        }
1412c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1422c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        long[] streamRands = new Random(0).longs(size).toArray();
1432c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        assertTrue(Arrays.equals(rands, streamRands));
1442c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        assertEquals(size, new Random(0).longs(size).count());
1452c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1462c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        try {
1472c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            new Random(0).longs(-1);
1482c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            fail();
1492c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        } catch (IllegalArgumentException expected) {}
1502c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    }
1512c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1522c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    public void test_longs$II() {
1532c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        final int limit = 128; // We can't test for every element in an infinite stream.
1542c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        final int origin = 128, bound = 256;
1552c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1562c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        Random rand = new Random(0);
1572c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        long[] rands = new long[limit];
1582c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        for(int i = 0; i < limit; ++i) {
1592c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            rands[i] = (rand.nextLong() & 127) + origin;
1602c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        }
1612c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1622c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        long[] streamRands = new Random(0).longs(origin, bound).limit(limit).toArray();
1632c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        assertTrue(Arrays.equals(rands, streamRands));
1642c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1652c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        try {
1662c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            new Random(0).longs(100, 0);
1672c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            fail();
1682c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        } catch (IllegalArgumentException expected) {}
1692c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    }
1702c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1712c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    public void test_longs$LII() {
1722c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        final int size = 32;
1732c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        final int origin = 128, bound = 256;
1742c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1752c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        Random rand = new Random(0);
1762c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        long[] rands = new long[size];
1772c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        for(int i = 0; i < size; ++i) {
1782c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            rands[i] = (rand.nextLong() & 127) + origin;
1792c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        }
1802c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1812c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        long[] streamRands = new Random(0).longs(size, origin, bound).toArray();
1822c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        assertTrue(Arrays.equals(rands, streamRands));
1832c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        assertEquals(size, new Random(0).longs(size, origin, bound).count());
1842c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1852c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        try {
1862c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            new Random(0).longs(-1, 10, 20);
1872c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            fail();
1882c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        } catch (IllegalArgumentException expected) {}
1892c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        try {
1902c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            new Random(0).longs(10, 100, 0);
1912c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            fail();
1922c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        } catch (IllegalArgumentException expected) {}
1932c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    }
1942c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1952c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    public void test_doubles$() {
1962c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        final int limit = 128; // We can't test for every element in an infinite stream.
1972c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
1982c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        Random rand = new Random(0);
1992c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        double[] rands = new double[limit];
2002c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        for(int i = 0; i < limit; ++i) {
2012c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            rands[i] = rand.nextDouble();
2022c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        }
2032c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
2042c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        double[] streamRands = new Random(0).doubles().limit(limit).toArray();
2052c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        assertTrue(Arrays.equals(rands, streamRands));
2062c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    }
2072c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
2082c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    public void test_doubles$L() {
2092c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        final int size = 32;
2102c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
2112c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        Random rand = new Random(0);
2122c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        double[] rands = new double[size];
2132c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        for(int i = 0; i < size; ++i) {
2142c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            rands[i] = rand.nextDouble();
2152c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        }
2162c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
2172c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        double[] streamRands = new Random(0).doubles(size).toArray();
2182c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        assertTrue(Arrays.equals(rands, streamRands));
2192c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        assertEquals(size, new Random(0).doubles(size).count());
2202c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
2212c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        try {
2222c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            new Random(0).ints(-1);
2232c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            fail();
2242c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        } catch (IllegalArgumentException expected) {}
2252c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    }
2262c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
2272c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    public void test_doubles$II() {
2282c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        final int limit = 128; // We can't test for every element in an infinite stream.
2292c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        final int origin = 128, bound = 256;
2302c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
2312c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        Random rand = new Random(0);
2322c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        double[] rands = new double[limit];
2332c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        for(int i = 0; i < limit; ++i) {
2342c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            double r = rand.nextDouble() * (bound - origin) + origin;
2352c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            if (r >= bound) {
2362c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong                r = Math.nextDown(r);
2372c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            }
2382c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            rands[i] = r;
2392c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        }
2402c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
2412c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        double[] streamRands = new Random(0).doubles(origin, bound).limit(limit).toArray();
2422c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        assertTrue(Arrays.equals(rands, streamRands));
2432c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
2442c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        try {
2452c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            new Random(0).doubles(100, 0);
2462c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            fail();
2472c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        } catch (IllegalArgumentException expected) {}
2482c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    }
2492c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
2502c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    public void test_doubles$LII() {
2512c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        final int size = 32;
2522c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        final int origin = 128, bound = 256;
2532c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
2542c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        Random rand = new Random(0);
2552c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        double[] rands = new double[size];
2562c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        for(int i = 0; i < size; ++i) {
2572c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            double r = rand.nextDouble() * (bound - origin) + origin;
2582c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            if (r >= bound) {
2592c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong                r = Math.nextDown(r);
2602c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            }
2612c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            rands[i] = r;
2622c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        }
2632c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
2642c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        double[] streamRands = new Random(0).doubles(size, origin, bound).toArray();
2652c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        assertTrue(Arrays.equals(rands, streamRands));
2662c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        assertEquals(size, new Random(0).doubles(size, origin, bound).count());
2672c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong
2682c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        try {
2692c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            new Random(0).doubles(-1, 10, 20);
2702c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            fail();
2712c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        } catch (IllegalArgumentException expected) {}
2722c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        try {
2732c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            new Random(0).doubles(10, 100, 0);
2742c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong            fail();
2752c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong        } catch (IllegalArgumentException expected) {}
2762c4230d24a2349039b4d7d513d0fb61542bc4cb7Yi Kong    }
2771e8bd6143140f44337d6f567335afeb48b263d95Elliott Hughes}
278