Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 5a1a42a

Browse filesBrowse files
committed
Add float comparison operators
1 parent aa12986 commit 5a1a42a
Copy full SHA for 5a1a42a

File tree

5 files changed

+44
-0
lines changed
Filter options

5 files changed

+44
-0
lines changed

‎CHANGELOG.md

Copy file name to clipboardExpand all lines: CHANGELOG.md
+3Lines changed: 3 additions & 0 deletions
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

Copy file name to clipboardExpand all lines: REFERENCE.md
+8Lines changed: 8 additions & 0 deletions
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

Copy file name to clipboardExpand all lines: SampleProjects/DoSomething/test/bad-errormessages.cpp
+7Lines changed: 7 additions & 0 deletions
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

Copy file name to clipboardExpand all lines: SampleProjects/DoSomething/test/good-assert.cpp
+11Lines changed: 11 additions & 0 deletions
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

Copy file name to clipboardExpand all lines: cpp/unittest/Assertion.h
+15Lines changed: 15 additions & 0 deletions
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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.