A Discrete-Event Network Simulator
API
average-test-suite.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2012 University of Washington
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Mitch Watrous (watrous@u.washington.edu)
19  */
20 
21 #include <cmath>
22 
23 #include "ns3/test.h"
24 #include "ns3/average.h"
25 
26 using namespace ns3;
27 
28 // Note, the rationale for this particular value of TOLERANCE is not
29 // documented. Current value is sufficient for all test platforms.
30 const double TOLERANCE = 2e-14;
31 
32 // ===========================================================================
33 // Test case for a single integer.
34 // ===========================================================================
35 
37 {
38 public:
40  virtual ~OneIntegerAverageTestCase ();
41 
42 private:
43  virtual void DoRun (void);
44 };
45 
47  : TestCase ("Average Object Test using One Integer")
48 
49 {
50 }
51 
53 {
54 }
55 
56 void
58 {
59  Average<int> calculator;
60 
61  long count = 1;
62 
63  double sum = 0;
64  double sqrSum = 0;
65  double min;
66  double max;
67  double mean;
68  double stddev;
69  double variance;
70 
71  // Put all of the values into the calculator.
72  int multiple = 5;
73  int value;
74  for (long i = 0; i < count; i++)
75  {
76  value = multiple * (i + 1);
77 
78  calculator.Update (value);
79 
80  sum += value;
81  sqrSum += value * value;
82  }
83 
84  // Calculate the expected values for the statistical functions.
85  min = multiple;
86  max = multiple * count;
87  mean = sum / count;
88  variance = 0;
89  stddev = std::sqrt (variance);
90 
91  // Test the calculator.
92  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Count (), count, TOLERANCE, "Count value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Count () - count);
93  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Min (), min, TOLERANCE, "Min value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Min () - min);
94  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Max (), max, TOLERANCE, "Max value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Max () - max);
95  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Mean (), mean, TOLERANCE, "Mean value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Mean () - mean);
96  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Stddev (), stddev, TOLERANCE, "Stddev value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Stddev () - stddev);
97  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Var (), variance, TOLERANCE, "Variance value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Var () - variance);
98 }
99 
100 
101 // ===========================================================================
102 // Test case for five integers.
103 // ===========================================================================
104 
106 {
107 public:
109  virtual ~FiveIntegersAverageTestCase ();
110 
111 private:
112  virtual void DoRun (void);
113 };
114 
116  : TestCase ("Average Object Test using Five Integers")
117 
118 {
119 }
120 
122 {
123 }
124 
125 void
127 {
128  Average<int> calculator;
129 
130  long count = 5;
131 
132  double sum = 0;
133  double sqrSum = 0;
134  double min;
135  double max;
136  double mean;
137  double stddev;
138  double variance;
139 
140  // Put all of the values into the calculator.
141  int multiple = 5;
142  int value;
143  for (long i = 0; i < count; i++)
144  {
145  value = multiple * (i + 1);
146 
147  calculator.Update (value);
148 
149  sum += value;
150  sqrSum += value * value;
151  }
152 
153  // Calculate the expected values for the statistical functions.
154  min = multiple;
155  max = multiple * count;
156  mean = sum / count;
157  variance = (count * sqrSum - sum * sum) / (count * (count - 1));
158  stddev = std::sqrt (variance);
159 
160  // Test the calculator.
161  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Count (), count, TOLERANCE, "Count value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Count () - count);
162  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Min (), min, TOLERANCE, "Min value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Min () - min);
163  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Max (), max, TOLERANCE, "Max value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Max () - max);
164  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Mean (), mean, TOLERANCE, "Mean value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Mean () - mean);
165  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Stddev (), stddev, TOLERANCE, "Stddev value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Stddev () - stddev);
166  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Var (), variance, TOLERANCE, "Variance value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Var () - variance);
167 }
168 
169 
170 // ===========================================================================
171 // Test case for five double values.
172 // ===========================================================================
173 
175 {
176 public:
178  virtual ~FiveDoublesAverageTestCase ();
179 
180 private:
181  virtual void DoRun (void);
182 };
183 
185  : TestCase ("Average Object Test using Five Double Values")
186 
187 {
188 }
189 
191 {
192 }
193 
194 void
196 {
197  Average<double> calculator;
198 
199  long count = 5;
200 
201  double sum = 0;
202  double sqrSum = 0;
203  double min;
204  double max;
205  double mean;
206  double stddev;
207  double variance;
208 
209  // Put all of the values into the calculator.
210  double multiple = 3.14;
211  double value;
212  for (long i = 0; i < count; i++)
213  {
214  value = multiple * (i + 1);
215 
216  calculator.Update (value);
217 
218  sum += value;
219  sqrSum += value * value;
220  }
221 
222  // Calculate the expected values for the statistical functions.
223  min = multiple;
224  max = multiple * count;
225  mean = sum / count;
226  variance = (count * sqrSum - sum * sum) / (count * (count - 1));
227  stddev = std::sqrt (variance);
228 
229  // Test the calculator.
230  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Count (), count, TOLERANCE, "Count value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Count () - count);
231  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Min (), min, TOLERANCE, "Min value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Min () - min);
232  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Max (), max, TOLERANCE, "Max value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Max () - max);
233  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Mean (), mean, TOLERANCE, "Mean value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Mean () - mean);
234  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Stddev (), stddev, TOLERANCE, "Stddev value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Stddev () - stddev);
235  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Var (), variance, TOLERANCE, "Variance value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Var () - variance);
236 }
237 
238 
240 {
241 public:
242  AverageTestSuite ();
243 };
244 
246  : TestSuite ("average", UNIT)
247 {
248  AddTestCase (new OneIntegerAverageTestCase, TestCase::QUICK);
249  AddTestCase (new FiveIntegersAverageTestCase, TestCase::QUICK);
250  AddTestCase (new FiveDoublesAverageTestCase, TestCase::QUICK);
251 }
252 
OneIntegerAverageTestCase
Definition: average-test-suite.cc:37
FiveIntegersAverageTestCase::FiveIntegersAverageTestCase
FiveIntegersAverageTestCase()
Definition: average-test-suite.cc:115
FiveIntegersAverageTestCase::DoRun
virtual void DoRun(void)
Implementation to actually run this TestCase.
Definition: average-test-suite.cc:126
ns3::Average
Simple average, min, max and std.
Definition: average.h:41
ns3::TestCase::AddTestCase
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
FiveIntegersAverageTestCase::~FiveIntegersAverageTestCase
virtual ~FiveIntegersAverageTestCase()
Definition: average-test-suite.cc:121
min
#define min(a, b)
Definition: 80211b.c:42
OneIntegerAverageTestCase::DoRun
virtual void DoRun(void)
Implementation to actually run this TestCase.
Definition: average-test-suite.cc:57
ns3
Every class exported by the ns3 library is enclosed in the ns3 namespace.
ns3::Average::Mean
double Mean() const
Estimate of mean, alias to Avg.
Definition: average.h:78
FiveDoublesAverageTestCase::FiveDoublesAverageTestCase
FiveDoublesAverageTestCase()
Definition: average-test-suite.cc:184
ns3::TestCase
encapsulates test code
Definition: test.h:1154
averageTestSuite
static AverageTestSuite averageTestSuite
Definition: average-test-suite.cc:253
TOLERANCE
const double TOLERANCE
Definition: average-test-suite.cc:30
max
#define max(a, b)
Definition: 80211b.c:43
NS_TEST_ASSERT_MSG_EQ_TOL
#define NS_TEST_ASSERT_MSG_EQ_TOL(actual, limit, tol, msg)
Test that actual and expected (limit) values are equal to plus or minus some tolerance and report and...
Definition: test.h:378
AverageTestSuite::AverageTestSuite
AverageTestSuite()
Definition: average-test-suite.cc:245
AverageTestSuite
Definition: average-test-suite.cc:240
FiveDoublesAverageTestCase
Definition: average-test-suite.cc:175
OneIntegerAverageTestCase::~OneIntegerAverageTestCase
virtual ~OneIntegerAverageTestCase()
Definition: average-test-suite.cc:52
ns3::TOLERANCE
static const double TOLERANCE
Tolerance used to check reciprocal of two numbers.
Definition: rtt-estimator.cc:42
ns3::Average::Max
T Max() const
Maximum.
Definition: average.h:74
ns3::Average::Count
uint32_t Count() const
Sample size.
Definition: average.h:70
ns3::Average::Stddev
double Stddev() const
Standard deviation.
Definition: average.h:82
ns3::TestSuite
A suite of tests to run.
Definition: test.h:1344
FiveIntegersAverageTestCase
Definition: average-test-suite.cc:106
FiveDoublesAverageTestCase::DoRun
virtual void DoRun(void)
Implementation to actually run this TestCase.
Definition: average-test-suite.cc:195
FiveDoublesAverageTestCase::~FiveDoublesAverageTestCase
virtual ~FiveDoublesAverageTestCase()
Definition: average-test-suite.cc:190
ns3::Average::Min
T Min() const
Minimum.
Definition: average.h:72
ns3::Average::Var
double Var() const
Unbiased estimate of variance.
Definition: average.h:80
OneIntegerAverageTestCase::OneIntegerAverageTestCase
OneIntegerAverageTestCase()
Definition: average-test-suite.cc:46
ns3::Average::Update
void Update(T const &x)
Add new sample.
Definition: average.h:49