001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     * 
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     * 
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.math.random;
018    import junit.framework.Test;
019    import junit.framework.TestSuite;
020    
021    import org.apache.commons.math.stat.Frequency;
022     
023    
024    /**
025     * Test cases for the AbstractRandomGenerator class
026     *
027     * @version $Revision: 764749 $ $Date: 2009-04-14 07:51:40 -0400 (Tue, 14 Apr 2009) $
028     */
029    
030    public class AbstractRandomGeneratorTest extends RandomDataTest {
031        
032        protected TestRandomGenerator testGenerator = new TestRandomGenerator();
033        
034        public AbstractRandomGeneratorTest(String name) {
035            super(name);
036            randomData = new RandomDataImpl(testGenerator);
037        } 
038        
039        public static Test suite() {
040            TestSuite suite = new TestSuite(AbstractRandomGeneratorTest.class);
041            suite.setName("AbstractRandomGenerator Tests");
042            return suite;
043        }
044        
045        @Override
046        public void testNextInt() {
047            try {
048                testGenerator.nextInt(-1);
049                fail("IllegalArgumentException expected");
050            } catch (IllegalArgumentException ex) {
051                // ignored
052            }
053            Frequency freq = new Frequency();
054            int value = 0;
055            for (int i=0; i<smallSampleSize; i++) {
056                value = testGenerator.nextInt(4);
057                assertTrue("nextInt range",(value >= 0) && (value <= 3));
058                freq.addValue(value);  
059            }
060            long[] observed = new long[4];
061            for (int i=0; i<4; i++) {
062                observed[i] = freq.getCount(i);
063            } 
064            
065            /* Use ChiSquare dist with df = 4-1 = 3, alpha = .001
066             * Change to 11.34 for alpha = .01
067             */
068            assertTrue("chi-square test -- will fail about 1 in 1000 times",
069                    testStatistic.chiSquare(expected,observed) < 16.27);    
070        }
071        
072        @Override
073        public void testNextLong() {
074            long q1 = Long.MAX_VALUE/4;
075            long q2 = 2 *  q1;
076            long q3 = 3 * q1;
077            
078            Frequency freq = new Frequency();
079            long val = 0;
080            int value = 0;
081            for (int i=0; i<smallSampleSize; i++) {
082                val = testGenerator.nextLong();
083                if (val < q1) {
084                    value = 0;
085                } else if (val < q2) {
086                    value = 1;
087                } else if (val < q3) {
088                    value = 2;
089                } else {
090                    value = 3;
091                }
092                freq.addValue(value);  
093            }
094            long[] observed = new long[4];
095            for (int i=0; i<4; i++) {
096                observed[i] = freq.getCount(i);
097            } 
098            
099            /* Use ChiSquare dist with df = 4-1 = 3, alpha = .001
100             * Change to 11.34 for alpha = .01
101             */
102            assertTrue("chi-square test -- will fail about 1 in 1000 times",
103                    testStatistic.chiSquare(expected,observed) < 16.27);    
104        }
105        
106        public void testNextBoolean() {
107            long halfSampleSize = smallSampleSize / 2; 
108            double[] expected = {halfSampleSize, halfSampleSize};
109            long[] observed = new long[2];
110            for (int i=0; i<smallSampleSize; i++) {
111                if (testGenerator.nextBoolean()) {
112                    observed[0]++;
113                } else {
114                    observed[1]++;
115                }
116            }
117            /* Use ChiSquare dist with df = 2-1 = 1, alpha = .001
118             * Change to 6.635 for alpha = .01
119             */
120            assertTrue("chi-square test -- will fail about 1 in 1000 times",
121                    testStatistic.chiSquare(expected,observed) < 10.828);    
122        }
123        
124        public void testNextFloat() {
125            Frequency freq = new Frequency();
126            float val = 0;
127            int value = 0;
128            for (int i=0; i<smallSampleSize; i++) {
129                val = testGenerator.nextFloat();
130                if (val < 0.25) {
131                    value = 0;
132                } else if (val < 0.5) {
133                    value = 1;
134                } else if (val < 0.75) {
135                    value = 2;
136                } else {
137                    value = 3;
138                }
139                freq.addValue(value);  
140            }
141            long[] observed = new long[4];
142            for (int i=0; i<4; i++) {
143                observed[i] = freq.getCount(i);
144            } 
145            
146            /* Use ChiSquare dist with df = 4-1 = 3, alpha = .001
147             * Change to 11.34 for alpha = .01
148             */
149            assertTrue("chi-square test -- will fail about 1 in 1000 times",
150                    testStatistic.chiSquare(expected,observed) < 16.27);    
151        }
152    }