Code-Eli  0.3.6
tolerance_test_suite.hpp
Go to the documentation of this file.
1 /*********************************************************************************
2 * Copyright (c) 2013 David D. Marshall <ddmarsha@calpoly.edu>
3 *
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *
9 * Contributors:
10 * David D. Marshall - initial code and implementation
11 ********************************************************************************/
12 
13 #ifndef tolerance_test_suite_hpp
14 #define tolerance_test_suite_hpp
15 
16 #include <limits> // numeric_limits
17 
18 #include "eli/util/tolerance.hpp"
19 
20 template<typename data__>
21 class tolerance_test_suite : public Test::Suite
22 {
23  protected:
24  void AddTests(const float &)
25  {
29  }
30 
31  void AddTests(const double &)
32  {
36  }
37 
38  void AddTests(const long double &)
39  {
43  }
44 
45  public:
47  {
48  // add the tests
49  AddTests(data__());
50  }
52  {
53  }
54 
55  private:
56  typedef data__ data_type;
57  typedef std::numeric_limits<data_type> limits_type;
58 
59  private:
61  {
62  eli::util::tolerance<data_type> tol(static_cast<data_type>(1e-6), static_cast<data_type>(1e-3));
63  data__ rel_tol(tol.get_relative_tolerance());
64 
65  // test same type comparisons
66  {
67  data_type d1, d2;
68 
69  d1=1;
70  d2=1;
71  TEST_ASSERT(tol.exactly_equal(d1, d2));
72  TEST_ASSERT(tol.exactly_equal(d2, d1));
73  d1=1;
74  d2=1+rel_tol;
75  TEST_ASSERT(!tol.exactly_equal(d1, d2));
76  TEST_ASSERT(!tol.exactly_equal(d2, d1));
77  d1=2;
78  d2=1;
79  TEST_ASSERT(!tol.exactly_equal(d1, d2));
80  TEST_ASSERT(!tol.exactly_equal(d2, d1));
81  }
82 
83  // test mixed type comparisons
84  {
85  data_type d2;
86  int i1;
87 
88  i1=1;
89  d2=1;
90  TEST_ASSERT(tol.exactly_equal(i1, d2));
91  TEST_ASSERT(tol.exactly_equal(d2, i1));
92  i1=1;
93  d2=1+rel_tol;
94  TEST_ASSERT(!tol.exactly_equal(i1, d2));
95  TEST_ASSERT(!tol.exactly_equal(d2, i1));
96  i1=2;
97  d2=1;
98  TEST_ASSERT(!tol.exactly_equal(i1, d2));
99  TEST_ASSERT(!tol.exactly_equal(d2, i1));
100  }
101  }
102 
104  {
105  eli::util::tolerance<data_type> tol(static_cast<data_type>(1e-6), static_cast<data_type>(1e-3));
106  data__ rel_tol(tol.get_relative_tolerance()), abs_tol(tol.get_absolute_tolerance());
107 
108  // test same type comparisons
109  {
110  data_type d1, d2;
111 
112  // less than absolute error
113  d1=1;
114  d2=1+static_cast<data_type>(0.09)*abs_tol;
115  TEST_ASSERT(tol.approximately_equal(d1, d2));
116  TEST_ASSERT(tol.approximately_equal(d2, d1));
117  d1=1;
118  d2=1+static_cast<data_type>(0.99)*abs_tol;
119  TEST_ASSERT(tol.approximately_equal(d1, d2));
120  TEST_ASSERT(tol.approximately_equal(d2, d1));
121  d1=0;
122  d2=static_cast<data_type>(0.99)*abs_tol;
123  TEST_ASSERT(tol.approximately_equal(d1, d2));
124  TEST_ASSERT(tol.approximately_equal(d2, d1));
125  d1=0;
126  d2=static_cast<data_type>(1.01)*abs_tol;
127  TEST_ASSERT(!tol.approximately_equal(d1, d2));
128  TEST_ASSERT(!tol.approximately_equal(d2, d1));
129 
130  // less than relative error
131  d1=1;
132  d2=1+static_cast<data_type>(1.1)*abs_tol;
133  TEST_ASSERT(tol.approximately_equal(d1, d2));
134  TEST_ASSERT(tol.approximately_equal(d2, d1));
135  d1=1;
136  d2=1+static_cast<data_type>(0.99)*rel_tol;
137  TEST_ASSERT(tol.approximately_equal(d1, d2));
138  TEST_ASSERT(tol.approximately_equal(d2, d1));
139  d1=1;
140  d2=1+static_cast<data_type>(1.01)*rel_tol;
141  TEST_ASSERT(!tol.approximately_equal(d1, d2));
142  TEST_ASSERT(!tol.approximately_equal(d2, d1));
143  }
144 
145  // test mixed type comparisons
146  {
147  data_type d2;
148  int i1;
149 
150  // less than absolute error
151  i1=1;
152  d2=1+static_cast<data_type>(0.09)*abs_tol;
153  TEST_ASSERT(tol.approximately_equal(i1, d2));
154  TEST_ASSERT(tol.approximately_equal(d2, i1));
155  i1=1;
156  d2=1+static_cast<data_type>(0.99)*abs_tol;
157  TEST_ASSERT(tol.approximately_equal(i1, d2));
158  TEST_ASSERT(tol.approximately_equal(d2, i1));
159  i1=0;
160  d2=static_cast<data_type>(0.99)*abs_tol;
161  TEST_ASSERT(tol.approximately_equal(i1, d2));
162  TEST_ASSERT(tol.approximately_equal(d2, i1));
163  i1=0;
164  d2=static_cast<data_type>(1.01)*abs_tol;
165  TEST_ASSERT(!tol.approximately_equal(i1, d2));
166  TEST_ASSERT(!tol.approximately_equal(d2, i1));
167 
168  // less than relative error
169  i1=1;
170  d2=1+static_cast<data_type>(1.1)*abs_tol;
171  TEST_ASSERT(tol.approximately_equal(i1, d2));
172  TEST_ASSERT(tol.approximately_equal(d2, i1));
173  i1=1;
174  d2=1+static_cast<data_type>(0.99)*rel_tol;
175  TEST_ASSERT(tol.approximately_equal(i1, d2));
176  TEST_ASSERT(tol.approximately_equal(d2, i1));
177  i1=1;
178  d2=1+static_cast<data_type>(1.01)*rel_tol;
179  TEST_ASSERT(!tol.approximately_equal(i1, d2));
180  TEST_ASSERT(!tol.approximately_equal(d2, i1));
181  }
182  }
183 
185  {
186  eli::util::tolerance<data_type> tol(static_cast<data_type>(1e-6), static_cast<data_type>(1e-3));
187  data__ rel_tol(tol.get_relative_tolerance());
188 
189  // test same type comparisons
190  {
191  data_type d1, d2;
192 
193  d1=1;
194  d2=1+static_cast<data_type>(0.99)*rel_tol;
195  TEST_ASSERT(!tol.approximately_less_than(d1, d2));
196  TEST_ASSERT(!tol.approximately_less_than(d2, d1));
197  d1=1;
198  d2=2;
199  TEST_ASSERT(tol.approximately_less_than(d1, d2));
200  TEST_ASSERT(!tol.approximately_less_than(d2, d1));
201  d1=1;
202  d2=1+static_cast<data_type>(1.01)*rel_tol;
203  TEST_ASSERT(tol.approximately_less_than(d1, d2));
204  TEST_ASSERT(!tol.approximately_less_than(d2, d1));
205  }
206 
207  // test mixed type comparisons
208  {
209  data_type d2;
210  int i1;
211 
212  i1=1;
213  d2=1+static_cast<data_type>(0.99)*rel_tol;
214  TEST_ASSERT(!tol.approximately_less_than(i1, d2));
215  TEST_ASSERT(!tol.approximately_less_than(d2, i1));
216  i1=1;
217  d2=2;
218  TEST_ASSERT(tol.approximately_less_than(i1, d2));
219  TEST_ASSERT(!tol.approximately_less_than(d2, i1));
220  i1=1;
221  d2=1+static_cast<data_type>(1.01)*rel_tol;
222  TEST_ASSERT(tol.approximately_less_than(i1, d2));
223  TEST_ASSERT(!tol.approximately_less_than(d2, i1));
224  }
225  }
226 };
227 
228 #endif
tolerance_test_suite()
Definition: tolerance_test_suite.hpp:46
data__ data_type
Definition: tolerance_test_suite.hpp:56
std::numeric_limits< data_type > limits_type
Definition: tolerance_test_suite.hpp:57
bool approximately_equal(const Eigen::MatrixBase< Derived1 > &m1, const Eigen::MatrixBase< Derived2 > &m2) const
Definition: tolerance.hpp:99
void AddTests(const long double &)
Definition: tolerance_test_suite.hpp:38
data__ get_absolute_tolerance() const
Definition: tolerance.hpp:68
void exactly_equal_test()
Definition: tolerance_test_suite.hpp:60
bool approximately_less_than(const data__ &t1, const data__ &t2) const
Definition: tolerance.hpp:151
~tolerance_test_suite()
Definition: tolerance_test_suite.hpp:51
Definition: tolerance_test_suite.hpp:21
void AddTests(const double &)
Definition: tolerance_test_suite.hpp:31
void approximately_equal_test()
Definition: tolerance_test_suite.hpp:103
void AddTests(const float &)
Definition: tolerance_test_suite.hpp:24
bool exactly_equal(const Eigen::MatrixBase< Derived1 > &m1, const Eigen::MatrixBase< Derived2 > &m2) const
Definition: tolerance.hpp:71
void approximately_less_than_test()
Definition: tolerance_test_suite.hpp:184
data__ get_relative_tolerance() const
Definition: tolerance.hpp:67