Home | History | Annotate | Download | only in util
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package libcore.java.util;
     18 
     19 import java.util.Arrays;
     20 import java.util.Random;
     21 
     22 public class RandomTest extends junit.framework.TestCase {
     23     public void test_subclassing() throws Exception {
     24         // http://b/2502231
     25         // Ensure that Random's constructors call setSeed by emulating the active ingredient
     26         // from the bug: the subclass' setSeed had a side-effect necessary for the correct
     27         // functioning of next.
     28         class MyRandom extends Random {
     29             public String state;
     30             public MyRandom() { super(); }
     31             public MyRandom(long l) { super(l); }
     32             @Override protected synchronized int next(int bits) { return state.length(); }
     33             @Override public synchronized void setSeed(long seed) { state = Long.toString(seed); }
     34         }
     35         // Test the 0-argument constructor...
     36         MyRandom r1 = new MyRandom();
     37         r1.nextInt();
     38         assertNotNull(r1.state);
     39         // Test the 1-argument constructor...
     40         MyRandom r2 = new MyRandom(123L);
     41         r2.nextInt();
     42         assertNotNull(r2.state);
     43     }
     44 
     45     public void test_ints$() {
     46         final int limit = 128; // We can't test for every element in an infinite stream.
     47 
     48         Random rand = new Random(0);
     49         int[] rands = new int[limit];
     50         for(int i = 0; i < limit; ++i) {
     51             rands[i] = rand.nextInt();
     52         }
     53 
     54         int[] streamRands = new Random(0).ints().limit(limit).toArray();
     55         assertTrue(Arrays.equals(rands, streamRands));
     56     }
     57 
     58     public void test_ints$L() {
     59         final int size = 32;
     60 
     61         Random rand = new Random(0);
     62         int[] rands = new int[size];
     63         for(int i = 0; i < size; ++i) {
     64             rands[i] = rand.nextInt();
     65         }
     66 
     67         int[] streamRands = new Random(0).ints(size).toArray();
     68         assertTrue(Arrays.equals(rands, streamRands));
     69         assertEquals(size, new Random(0).ints(size).count());
     70 
     71         try {
     72             new Random(0).ints(-1);
     73             fail();
     74         } catch (IllegalArgumentException expected) {}
     75     }
     76 
     77     public void test_ints$II() {
     78         final int limit = 128; // We can't test for every element in an infinite stream.
     79         final int origin = 128, bound = 256;
     80 
     81         Random rand = new Random(0);
     82         int[] rands = new int[limit];
     83         for(int i = 0; i < limit; ++i) {
     84             rands[i] = rand.nextInt(bound - origin) + origin;
     85         }
     86 
     87         int[] streamRands = new Random(0).ints(origin, bound).limit(limit).toArray();
     88         assertTrue(Arrays.equals(rands, streamRands));
     89 
     90         try {
     91             new Random(0).ints(100, 0);
     92             fail();
     93         } catch (IllegalArgumentException expected) {}
     94     }
     95 
     96     public void test_ints$LII() {
     97         final int size = 32;
     98         final int origin = 128, bound = 256;
     99 
    100         Random rand = new Random(0);
    101         int[] rands = new int[size];
    102         for(int i = 0; i < size; ++i) {
    103             rands[i] = rand.nextInt(bound - origin) + origin;
    104         }
    105 
    106         int[] streamRands = new Random(0).ints(size, origin, bound).toArray();
    107         assertTrue(Arrays.equals(rands, streamRands));
    108         assertEquals(size, new Random(0).ints(size, origin, bound).count());
    109 
    110         try {
    111             new Random(0).ints(-1, 10, 20);
    112             fail();
    113         } catch (IllegalArgumentException expected) {}
    114         try {
    115             new Random(0).ints(10, 100, 0);
    116             fail();
    117         } catch (IllegalArgumentException expected) {}
    118     }
    119 
    120     public void test_longs$() {
    121         final int limit = 128; // We can't test for every element in an infinite stream.
    122 
    123         Random rand = new Random(0);
    124         long[] rands = new long[limit];
    125         for(int i = 0; i < limit; ++i) {
    126             rands[i] = rand.nextLong();
    127         }
    128 
    129         long[] streamRands = new Random(0).longs().limit(limit).toArray();
    130         assertTrue(Arrays.equals(rands, streamRands));
    131     }
    132 
    133     public void test_longs$L() {
    134         final int size = 32;
    135 
    136         Random rand = new Random(0);
    137         long[] rands = new long[size];
    138         for(int i = 0; i < size; ++i) {
    139             rands[i] = rand.nextLong();
    140         }
    141 
    142         long[] streamRands = new Random(0).longs(size).toArray();
    143         assertTrue(Arrays.equals(rands, streamRands));
    144         assertEquals(size, new Random(0).longs(size).count());
    145 
    146         try {
    147             new Random(0).longs(-1);
    148             fail();
    149         } catch (IllegalArgumentException expected) {}
    150     }
    151 
    152     public void test_longs$II() {
    153         final int limit = 128; // We can't test for every element in an infinite stream.
    154         final int origin = 128, bound = 256;
    155 
    156         Random rand = new Random(0);
    157         long[] rands = new long[limit];
    158         for(int i = 0; i < limit; ++i) {
    159             rands[i] = (rand.nextLong() & 127) + origin;
    160         }
    161 
    162         long[] streamRands = new Random(0).longs(origin, bound).limit(limit).toArray();
    163         assertTrue(Arrays.equals(rands, streamRands));
    164 
    165         try {
    166             new Random(0).longs(100, 0);
    167             fail();
    168         } catch (IllegalArgumentException expected) {}
    169     }
    170 
    171     public void test_longs$LII() {
    172         final int size = 32;
    173         final int origin = 128, bound = 256;
    174 
    175         Random rand = new Random(0);
    176         long[] rands = new long[size];
    177         for(int i = 0; i < size; ++i) {
    178             rands[i] = (rand.nextLong() & 127) + origin;
    179         }
    180 
    181         long[] streamRands = new Random(0).longs(size, origin, bound).toArray();
    182         assertTrue(Arrays.equals(rands, streamRands));
    183         assertEquals(size, new Random(0).longs(size, origin, bound).count());
    184 
    185         try {
    186             new Random(0).longs(-1, 10, 20);
    187             fail();
    188         } catch (IllegalArgumentException expected) {}
    189         try {
    190             new Random(0).longs(10, 100, 0);
    191             fail();
    192         } catch (IllegalArgumentException expected) {}
    193     }
    194 
    195     public void test_doubles$() {
    196         final int limit = 128; // We can't test for every element in an infinite stream.
    197 
    198         Random rand = new Random(0);
    199         double[] rands = new double[limit];
    200         for(int i = 0; i < limit; ++i) {
    201             rands[i] = rand.nextDouble();
    202         }
    203 
    204         double[] streamRands = new Random(0).doubles().limit(limit).toArray();
    205         assertTrue(Arrays.equals(rands, streamRands));
    206     }
    207 
    208     public void test_doubles$L() {
    209         final int size = 32;
    210 
    211         Random rand = new Random(0);
    212         double[] rands = new double[size];
    213         for(int i = 0; i < size; ++i) {
    214             rands[i] = rand.nextDouble();
    215         }
    216 
    217         double[] streamRands = new Random(0).doubles(size).toArray();
    218         assertTrue(Arrays.equals(rands, streamRands));
    219         assertEquals(size, new Random(0).doubles(size).count());
    220 
    221         try {
    222             new Random(0).ints(-1);
    223             fail();
    224         } catch (IllegalArgumentException expected) {}
    225     }
    226 
    227     public void test_doubles$II() {
    228         final int limit = 128; // We can't test for every element in an infinite stream.
    229         final int origin = 128, bound = 256;
    230 
    231         Random rand = new Random(0);
    232         double[] rands = new double[limit];
    233         for(int i = 0; i < limit; ++i) {
    234             double r = rand.nextDouble() * (bound - origin) + origin;
    235             if (r >= bound) {
    236                 r = Math.nextDown(r);
    237             }
    238             rands[i] = r;
    239         }
    240 
    241         double[] streamRands = new Random(0).doubles(origin, bound).limit(limit).toArray();
    242         assertTrue(Arrays.equals(rands, streamRands));
    243 
    244         try {
    245             new Random(0).doubles(100, 0);
    246             fail();
    247         } catch (IllegalArgumentException expected) {}
    248     }
    249 
    250     public void test_doubles$LII() {
    251         final int size = 32;
    252         final int origin = 128, bound = 256;
    253 
    254         Random rand = new Random(0);
    255         double[] rands = new double[size];
    256         for(int i = 0; i < size; ++i) {
    257             double r = rand.nextDouble() * (bound - origin) + origin;
    258             if (r >= bound) {
    259                 r = Math.nextDown(r);
    260             }
    261             rands[i] = r;
    262         }
    263 
    264         double[] streamRands = new Random(0).doubles(size, origin, bound).toArray();
    265         assertTrue(Arrays.equals(rands, streamRands));
    266         assertEquals(size, new Random(0).doubles(size, origin, bound).count());
    267 
    268         try {
    269             new Random(0).doubles(-1, 10, 20);
    270             fail();
    271         } catch (IllegalArgumentException expected) {}
    272         try {
    273             new Random(0).doubles(10, 100, 0);
    274             fail();
    275         } catch (IllegalArgumentException expected) {}
    276     }
    277 }
    278