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 const double TOLERANCE = 1e-14;
29 
30 // ===========================================================================
31 // Test case for a single integer.
32 // ===========================================================================
33 
35 {
36 public:
38  virtual ~OneIntegerAverageTestCase ();
39 
40 private:
41  virtual void DoRun (void);
42 };
43 
45  : TestCase ("Average Object Test using One Integer")
46 
47 {
48 }
49 
51 {
52 }
53 
54 void
56 {
57  Average<int> calculator;
58 
59  long count = 1;
60 
61  double sum = 0;
62  double sqrSum = 0;
63  double min;
64  double max;
65  double mean;
66  double stddev;
67  double variance;
68 
69  // Put all of the values into the calculator.
70  int multiple = 5;
71  int value;
72  for (long i = 0; i < count; i++)
73  {
74  value = multiple * (i + 1);
75 
76  calculator.Update (value);
77 
78  sum += value;
79  sqrSum += value * 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 wrong");
91  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Min (), min, TOLERANCE, "Min value wrong");
92  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Max (), max, TOLERANCE, "Max value wrong");
93  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Mean (), mean, TOLERANCE, "Mean value wrong");
94  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Stddev (), stddev, TOLERANCE, "Stddev value wrong");
95  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Var (), variance, TOLERANCE, "Variance value wrong");
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 wrong");
160  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Min (), min, TOLERANCE, "Min value wrong");
161  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Max (), max, TOLERANCE, "Max value wrong");
162  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Mean (), mean, TOLERANCE, "Mean value wrong");
163  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Stddev (), stddev, TOLERANCE, "Stddev value wrong");
164  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Var (), variance, TOLERANCE, "Variance value wrong");
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 wrong");
229  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Min (), min, TOLERANCE, "Min value wrong");
230  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Max (), max, TOLERANCE, "Max value wrong");
231  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Mean (), mean, TOLERANCE, "Mean value wrong");
232  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Stddev (), stddev, TOLERANCE, "Stddev value wrong");
233  NS_TEST_ASSERT_MSG_EQ_TOL (calculator.Var (), variance, TOLERANCE, "Variance value wrong");
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 
T Max() const
Maximum.
Definition: average.h:74
#define min(a, b)
Definition: 80211b.c:44
double Stddev() const
Standard deviation.
Definition: average.h:82
double Mean() const
Estimate of mean, alias to Avg.
Definition: average.h:78
A suite of tests to run.
Definition: test.h:1333
encapsulates test code
Definition: test.h:1147
virtual void DoRun(void)
Implementation to actually run this TestCase.
static AverageTestSuite averageTestSuite
#define max(a, b)
Definition: 80211b.c:45
void AddTestCase(TestCase *testCase, enum TestDuration duration)
Add an individual child TestCase to this test suite.
Definition: test.cc:298
#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:373
T Min() const
Minimum.
Definition: average.h:72
virtual void DoRun(void)
Implementation to actually run this TestCase.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
const double TOLERANCE
Simple average, min, max and std.
Definition: average.h:40
virtual void DoRun(void)
Implementation to actually run this TestCase.
static const double TOLERANCE
Tolerance used to check reciprocal of two numbers.
uint32_t Count() const
Sample size.
Definition: average.h:70
double Var() const
Unbiased estimate of variance.
Definition: average.h:80
void Update(T const &x)
Add new sample.
Definition: average.h:49