Skip to content

Commit 5a1a42a

Browse files
committed
Add float comparison operators
1 parent aa12986 commit 5a1a42a

File tree

5 files changed

+44
-0
lines changed

5 files changed

+44
-0
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1010
- Environment variable to run a custom initiialization script during CI testing: `CUSTOM_INIT_SCRIPT`
1111
- Environment variable to run from a subdirectory during CI testing: `USE_SUBDIR`
1212
- `assertComparativeEqual()` and `assertComparativeNotEqual()` to evaluate equality on an `a - b == 0` basis (and/or `!(a > b) && !(a < b)`)
13+
- `assertEqualFloat()` and `assertNotEqualFloat()` for comparing floats with epsilon
14+
- `assertEqualINF()` and `assertNotEqualINF()` for comparing floats to infinity
15+
- `assertEqualNAN()` and `assertNotEqualNAN()` for comparing floats to `NaN`
1316

1417
### Changed
1518
- Rubocop expected syntax downgraded from ruby 2.6 to 2.5

REFERENCE.md

+8
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,14 @@ assertMoreOrEqual(lowerBound, actual); // a >= b
220220
assertTrue(actual);
221221
assertFalse(actual);
222222
assertNull(actual);
223+
224+
// special cases for floats
225+
assertEqualFloat(expected, actual, epsilon); // fabs(a - b) <= epsilon
226+
assertNotEqualFloat(unwanted, actual, epsilon); // fabs(a - b) >= epsilon
227+
assertEqualINF(actual);
228+
assertNotEqualINF(actual);
229+
assertEqualNAN(arg);
230+
assertNotEqualNAN(arg);
223231
```
224232

225233
These functions will report the result of the test to the console, and the testing will continue if they fail.

SampleProjects/DoSomething/test/bad-errormessages.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@ unittest(check_that_assertion_error_messages_are_comprehensible)
1919
assertFalse(true);
2020
assertNull(3);
2121
assertNotNull(NULL);
22+
23+
assertEqualFloat(1.2, 1.0, 0.01);
24+
assertNotEqualFloat(1.0, 1.02, 0.1);
25+
assertEqualINF(42);
26+
assertNotEqualINF(INFINITY);
27+
assertEqualNAN(42);
28+
assertNotEqualNAN(0.0/0.0);
2229
}
2330

2431
unittest_main()

SampleProjects/DoSomething/test/good-assert.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,15 @@ unittest(assert_equal_without_total_ordering)
3232

3333
}
3434

35+
unittest(float_assertions)
36+
{
37+
assertEqualINF(exp(800));
38+
assertEqualINF(0.0/0.0);
39+
assertNotEqualINF(42);
40+
41+
assertEqualNAN(INFINITY - INFINITY);
42+
assertEqualNAN(0.0/0.0);
43+
assertNotEqualNAN(42);
44+
}
45+
3546
unittest_main()

cpp/unittest/Assertion.h

+15
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@
4343
#define assertNull(arg) assertEqual((void*)NULL, (void*)arg)
4444
#define assertNotNull(arg) assertNotEqual((void*)NULL, (void*)arg)
4545

46+
#define assertEqualFloat(arg1, arg2, arg3) assertOp("assertEqualFloat", "upperBound", arg3, compareMoreOrEqual, ">=", "actual", fabs(arg1 - arg2))
47+
#define assertNotEqualFloat(arg1, arg2, arg3) assertOp("assertNotEqualFloat", "lowerBound", arg3, compareLessOrEqual, "<=", "actual", fabs(arg1 - arg2))
48+
#define assertEqualINF(arg) assertOp("assertEqualINF", "expected", INFINITY, compareEqual, "==", "actual", arg)
49+
#define assertNotEqualINF(arg) assertOp("assertNotEqualINF", "unwanted", INFINITY, compareNotEqual, "!=", "actual", arg)
50+
#define assertEqualNAN(arg) assertOp("assertEqualNAN", "expected", true, compareEqual, "==", "actual", isnan(arg))
51+
#define assertNotEqualNAN(arg) assertOp("assertNotEqualNAN", "unwanted", true, compareNotEqual, "!=", "actual", isnan(arg))
52+
53+
4654
/** macro generates optional output and calls fail() followed by a return if false. */
4755
#define assureEqual(arg1,arg2) assureOp("assureEqual","expected",arg1,evaluateDoubleEqual,"==","actual",arg2)
4856
#define assureNotEqual(arg1,arg2) assureOp("assureNotEqual","unwanted",arg1,evaluateNotEqual,"!=","actual",arg2)
@@ -56,3 +64,10 @@
5664
#define assureFalse(arg) assureEqual(false, arg)
5765
#define assureNull(arg) assureEqual((void*)NULL, (void*)arg)
5866
#define assureNotNull(arg) assureNotEqual((void*)NULL, (void*)arg)
67+
68+
#define assureEqualFloat(arg1, arg2, arg3) assureOp("assertEqualFloat", "upperBound", arg3, compareMoreOrEqual, ">=", "actual", fabs(arg1 - arg2))
69+
#define assureNotEqualFloat(arg1, arg2, arg3) assureOp("assertNotEqualFloat", "lowerBound", arg3, compareLessOrEqual, "<=", "actual", fabs(arg1 - arg2))
70+
#define assureEqualINF(arg) assureOp("assertEqualINF", "expected", INFINITY, compareEqual, "==", "actual", arg)
71+
#define assureNotEqualINF(arg) assureOp("assertNotEqualINF", "unwanted", INFINITY, compareNotEqual, "!=", "actual", arg)
72+
#define assureEqualNAN(arg) assureOp("assertEqualNAN", "expected", true, compareEqual, "==", "actual", isnan(arg))
73+
#define assureNotEqualNAN(arg) assureOp("assertNotEqualNAN", "unwanted", true, compareNotEqual, "!=", "actual", isnan(arg))

0 commit comments

Comments
 (0)