1 #include "TestDistribution.h"
2 #include "UniformDistribution.h"
3 #include "arrcmp.h"
4 #include <iostream>
5 #include <fstream>
6 #include <cstdio>
7 #include <cstdlib>
8 #include <cmath>
9 #include <string.h>
10 
11 using namespace std;
12 
TestDistribution()13 TestDistribution::TestDistribution()
14 {
15    // set the seed
16    seed = 779;
17    DistributionBase::setSeed( seed );
18 
19    // set lower and upper bounds
20    lb = 5;
21    ub = 10;
22 
23    //get the first deviate
24    Distribution distArg( UniformDistribution( lb, ub ) );
25    this->deviate = distArg.getDeviate();
26 }
27 
~TestDistribution()28 TestDistribution::~TestDistribution()
29 {
30 }
31 
run()32 void TestDistribution::run()
33 {
34     testDistributionDefault();
35     testDistributionArg();
36     testGetDeviateNoProb();
37     testGetDeviateWithProb();
38     testGetCDF();
39     testLowerBound();
40     testUpperBound();
41     testMean();
42     testStdDev();
43     testPrint();
44     testPrintAttributes();
45     testTypeName();
46     testUsePseudoRandom();
47 
48 }
49 
50 
testUsePseudoRandom()51 void TestDistribution::testUsePseudoRandom() {
52 
53 	DistributionBase::usePseudoRandom(true);
54 
55 	DistributionBase::setSeed(0);
56 	double number = DistributionBase::uniformUnitDeviate();
57 	_test(fabs(number - 0.000)<0.0001);
58 	number = DistributionBase::uniformUnitDeviate();
59 	_test(fabs(number - 0.001)<0.0001);
60 
61 	DistributionBase::setSeed(500);
62 	number = DistributionBase::uniformUnitDeviate();
63 	_test(fabs(number - 0.500)<0.0001);
64 	number = DistributionBase::uniformUnitDeviate();
65 	_test(fabs(number - 0.501)<0.0001);
66 
67 	DistributionBase::setSeed(998);
68 	number = DistributionBase::uniformUnitDeviate();
69 	_test(fabs(number - 0.998)<0.0001);
70 	number = DistributionBase::uniformUnitDeviate();
71 	_test(fabs(number - 0.999)<0.0001);
72 	number = DistributionBase::uniformUnitDeviate();
73 	_test(fabs(number - 0.0)<0.0001);
74 
75 	DistributionBase::usePseudoRandom(false);
76 	DistributionBase::setSeed(0);
77 	number = DistributionBase::uniformUnitDeviate();
78 	_test(number != 0);
79 
80 	DistributionBase::setSeed(0);
81 
82 }
83 
84 
testDistributionDefault()85 void TestDistribution::testDistributionDefault()
86 {
87    // use constructor Distribution();
88    Distribution distEmpty;
89 
90    try {
91      _test( distEmpty.lowerBound() == 0 );
92 
93      // if here then no exception was thrown, record failure.
94      _test( false );
95    } catch( std::exception& e ) {
96      // if here then exception was thrown, record success
97      _test( true );
98    }
99 }
100 
testDistributionArg()101 void TestDistribution::testDistributionArg()
102 {
103    // use constructor Distribution( DistributionBase& base );
104    Distribution distArg( UniformDistribution( lb, ub ) );
105 
106    _test( distArg.lowerBound() == lb );
107    _test( distArg.upperBound() == ub );
108 }
109 
testGetDeviateNoProb()110 void TestDistribution::testGetDeviateNoProb()
111 {
112    DistributionBase::setSeed( seed );
113    Distribution distArg( UniformDistribution( lb, ub ) );
114 
115    // test the returned deviate value
116    _test( fabs(distArg.getDeviate() - this->deviate)  < 0.001 );
117 }
118 
testGetDeviateWithProb()119 void TestDistribution::testGetDeviateWithProb()
120 {
121    DistributionBase::setSeed( seed );
122    Distribution distArg( UniformDistribution( lb, ub ) );
123 
124    // test the returned deviate value
125    _test( distArg.getDeviate( 0.5 ) == (lb + (ub-lb)*0.5) );
126 }
127 
testGetCDF()128 void TestDistribution::testGetCDF()
129 {
130    Distribution distArg( UniformDistribution( lb, ub ) );
131 
132    // test the returned CDF value
133 
134    double a = distArg.getCDF( 0.5 );
135    double b = ((0.5-lb)/(ub-lb));
136    _test( a == b );
137    // _test( distArg.getCDF( 0.5 ) == ((0.5-lb)/(ub-lb)) );
138 }
139 
testLowerBound()140 void TestDistribution::testLowerBound()
141 {
142    Distribution distArg( UniformDistribution( lb, ub ) );
143 
144    _test( distArg.lowerBound() == lb );
145 }
146 
testUpperBound()147 void TestDistribution::testUpperBound()
148 {
149    Distribution distArg( UniformDistribution( lb, ub ) );
150 
151    _test( distArg.upperBound() == ub );
152 }
153 
testMean()154 void TestDistribution::testMean()
155 {
156    Distribution distArg( UniformDistribution( lb, ub ) );
157 
158    _test( distArg.mean() == lb+(ub-lb)/2 );
159 }
160 
testStdDev()161 void TestDistribution::testStdDev()
162 {
163    Distribution distArg( UniformDistribution( lb, ub ) );
164 
165    _test( fabs(distArg.stdDev() - sqrt(pow(ub-lb,2)/12.0)) < 1.0e-10 );
166 }
167 
testPrint()168 void TestDistribution::testPrint()
169 {
170    char buf[128];
171 
172    Distribution distArg( UniformDistribution( lb, ub ) );
173 
174    ofstream fout;
175    ifstream fin;
176 
177    string data;
178    string test_str;
179 
180    // write the data to a file, then reopen the
181    // file and verify the data was written correctly
182    memset( buf, 0, 128 );
183 #ifdef HAVE_SNPRINTF
184    snprintf( buf, 128, "UNIFORM %d %d", (int)lb, (int)ub );
185 #else
186    int numberOfCharsRead = sprintf( buf, "UNIFORM %d %d", (int)lb, (int)ub );
187    assert(numberOfCharsRead <= 128);
188 #endif
189 
190    test_str = buf;
191 
192    fout.open( "TestDistribution_Log" );
193    if( fout )
194    {
195       distArg.print( fout );
196       fout << endl;
197       fout.close();
198    }
199    else
200    {
201       _test( false );
202    }
203 
204    fin.open( "TestDistribution_Log" );
205    if( fin )
206    {
207       fin.getline( buf, 128 );
208       data = buf;
209 
210       _test( data == test_str );
211       fin.close();
212    }
213    else
214    {
215       _test( false );
216    }
217 }
218 
219 
testPrintAttributes()220 void TestDistribution::testPrintAttributes()
221 {
222    char buf[128];
223 
224    Distribution distArg( UniformDistribution( lb, ub ) );
225 
226    ofstream fout;
227    ifstream fin;
228 
229    string data;
230    string test_str;
231 
232    // write the data to a file, then reopen the
233    // file and verify the data was written correctly
234    memset( buf, 0, 128 );
235 #ifdef HAVE_SNPRINTF
236    snprintf( buf, 128, "distribution=\"uniform\" lower=\"%d\" upper=\"%d\"", (int)lb, (int)ub );
237 #else
238    int numberOfCharsRead =
239      sprintf( buf, "distribution=\"uniform\" lower=\"%d\" upper=\"%d\"", (int)lb, (int)ub );
240    assert(numberOfCharsRead <= 128);
241 #endif
242    test_str = buf;
243 
244    fout.open( "TestDistribution_Log" );
245    if( fout )
246    {
247       distArg.printAttributes( fout );
248       fout << endl;
249       fout.close();
250    }
251    else
252    {
253       _test( false );
254    }
255 
256    fin.open( "TestDistribution_Log" );
257    if( fin )
258    {
259       fin.getline( buf, 128 );
260       data = buf;
261 
262       _test( data == test_str );
263       fin.close();
264    }
265    else
266    {
267       _test( false );
268    }
269 }
270 
testTypeName()271 void TestDistribution::testTypeName()
272 {
273    Distribution distArg( UniformDistribution( lb, ub ) );
274 
275    _test( distArg.typeName() == std::string( "UniformDistribution" ) );
276 }
277