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 min;
65  double max;
66  double mean;
67  double stddev;
68  double variance;
69 
70  // Put all of the values into the calculator.
71  int multiple = 5;
72  int value;
73  for (long i = 0; i < count; i++)
74  {
75  value = multiple * (i + 1);
76 
77  calculator.Update (value);
78 
79  sum += value;
80  }
81 
82  // Calculate the expected values for the statistical functions.
83  min = multiple;
84  max = multiple * count;
85  mean = sum / count;
86  variance = 0;
87  stddev = std::sqrt (variance);
88 
89  // Test the calculator.
90  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Count (), count, TOLERANCE, "Count value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Count () - count);
91  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Min (), min, TOLERANCE, "Min value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Min () - min);
92  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Max (), max, TOLERANCE, "Max value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Max () - max);
93  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Mean (), mean, TOLERANCE, "Mean value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Mean () - mean);
94  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Stddev (), stddev, TOLERANCE, "Stddev value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Stddev () - stddev);
95  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Var (), variance, TOLERANCE, "Variance value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Var () - variance);
96 }
97 
98 
99 // ===========================================================================
100 // Test case for five integers.
101 // ===========================================================================
102 
104 {
105 public:
107  virtual ~FiveIntegersAverageTestCase ();
108 
109 private:
110  virtual void DoRun (void);
111 };
112 
114  : TestCase ("Average Object Test using Five Integers")
115 
116 {
117 }
118 
120 {
121 }
122 
123 void
125 {
126  Average<int> calculator;
127 
128  long count = 5;
129 
130  double sum = 0;
131  double sqrSum = 0;
132  double min;
133  double max;
134  double mean;
135  double stddev;
136  double variance;
137 
138  // Put all of the values into the calculator.
139  int multiple = 5;
140  int value;
141  for (long i = 0; i < count; i++)
142  {
143  value = multiple * (i + 1);
144 
145  calculator.Update (value);
146 
147  sum += value;
148  sqrSum += value * value;
149  }
150 
151  // Calculate the expected values for the statistical functions.
152  min = multiple;
153  max = multiple * count;
154  mean = sum / count;
155  variance = (count * sqrSum - sum * sum) / (count * (count - 1));
156  stddev = std::sqrt (variance);
157 
158  // Test the calculator.
159  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Count (), count, TOLERANCE, "Count value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Count () - count);
160  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Min (), min, TOLERANCE, "Min value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Min () - min);
161  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Max (), max, TOLERANCE, "Max value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Max () - max);
162  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Mean (), mean, TOLERANCE, "Mean value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Mean () - mean);
163  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Stddev (), stddev, TOLERANCE, "Stddev value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Stddev () - stddev);
164  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Var (), variance, TOLERANCE, "Variance value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Var () - variance);
165 }
166 
167 
168 // ===========================================================================
169 // Test case for five double values.
170 // ===========================================================================
171 
173 {
174 public:
176  virtual ~FiveDoublesAverageTestCase ();
177 
178 private:
179  virtual void DoRun (void);
180 };
181 
183  : TestCase ("Average Object Test using Five Double Values")
184 
185 {
186 }
187 
189 {
190 }
191 
192 void
194 {
195  Average<double> calculator;
196 
197  long count = 5;
198 
199  double sum = 0;
200  double sqrSum = 0;
201  double min;
202  double max;
203  double mean;
204  double stddev;
205  double variance;
206 
207  // Put all of the values into the calculator.
208  double multiple = 3.14;
209  double value;
210  for (long i = 0; i < count; i++)
211  {
212  value = multiple * (i + 1);
213 
214  calculator.Update (value);
215 
216  sum += value;
217  sqrSum += value * value;
218  }
219 
220  // Calculate the expected values for the statistical functions.
221  min = multiple;
222  max = multiple * count;
223  mean = sum / count;
224  variance = (count * sqrSum - sum * sum) / (count * (count - 1));
225  stddev = std::sqrt (variance);
226 
227  // Test the calculator.
228  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Count (), count, TOLERANCE, "Count value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Count () - count);
229  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Min (), min, TOLERANCE, "Min value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Min () - min);
230  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Max (), max, TOLERANCE, "Max value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Max () - max);
231  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Mean (), mean, TOLERANCE, "Mean value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Mean () - mean);
232  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Stddev (), stddev, TOLERANCE, "Stddev value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Stddev () - stddev);
233  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Var (), variance, TOLERANCE, "Variance value outside of tolerance " << TOLERANCE << "; difference: " << calculator.Var () - variance);
234 }
235 
236 
238 {
239 public:
240  AverageTestSuite ();
241 };
242 
244  : TestSuite ("average", UNIT)
245 {
246  AddTestCase (new OneIntegerAverageTestCase, TestCase::QUICK);
247  AddTestCase (new FiveIntegersAverageTestCase, TestCase::QUICK);
248  AddTestCase (new FiveDoublesAverageTestCase, TestCase::QUICK);
249 }
250 
OneIntegerAverageTestCase
Definition: average-test-suite.cc:37
FiveIntegersAverageTestCase::FiveIntegersAverageTestCase
FiveIntegersAverageTestCase()
Definition: average-test-suite.cc:113
FiveIntegersAverageTestCase::DoRun
virtual void DoRun(void)
Implementation to actually run this TestCase.
Definition: average-test-suite.cc:124
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:119
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:182
ns3::TestCase
encapsulates test code
Definition: test.h:1154
averageTestSuite
static AverageTestSuite averageTestSuite
Definition: average-test-suite.cc:251
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:243
AverageTestSuite
Definition: average-test-suite.cc:238
FiveDoublesAverageTestCase
Definition: average-test-suite.cc:173
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:104
FiveDoublesAverageTestCase::DoRun
virtual void DoRun(void)
Implementation to actually run this TestCase.
Definition: average-test-suite.cc:193
FiveDoublesAverageTestCase::~FiveDoublesAverageTestCase
virtual ~FiveDoublesAverageTestCase()
Definition: average-test-suite.cc:188
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