Skip to content

Commit aa12986

Browse files
committed
remove requirement that types be totally ordered in order to evaluate equality on them
1 parent 1dbb6fb commit aa12986

File tree

6 files changed

+93
-22
lines changed

6 files changed

+93
-22
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
99
### Added
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`
12+
- `assertComparativeEqual()` and `assertComparativeNotEqual()` to evaluate equality on an `a - b == 0` basis (and/or `!(a > b) && !(a < b)`)
1213

1314
### Changed
1415
- Rubocop expected syntax downgraded from ruby 2.6 to 2.5
16+
- `assertEqual()` and `assertNotEqual()` use actual `==` and `!=` -- they no longer require a type to be totally ordered just to do equality tests
1517

1618
### Deprecated
1719

REFERENCE.md

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -208,15 +208,19 @@ This test defines one `unittest` (a macro provided by `ArduinoUnitTests.h`), cal
208208

209209
The following assertion functions are available in unit tests.
210210

211-
* `assertEqual(expected, actual)`
212-
* `assertNotEqual(expected, actual)`
213-
* `assertLess(expected, actual)`
214-
* `assertMore(expected, actual)`
215-
* `assertLessOrEqual(expected, actual)`
216-
* `assertMoreOrEqual(expected, actual)`
217-
* `assertTrue(actual)`
218-
* `assertFalse(actual)`
219-
* `assertNull(actual)`
211+
```c++
212+
assertEqual(expected, actual); // a == b
213+
assertNotEqual(unwanted, actual); // a != b
214+
assertComparativeEqual(expected, actual); // abs(a - b) == 0 or (!(a > b) && !(a < b))
215+
assertComparativeNotEqual(unwanted, actual); // abs(a - b) > 0 or ((a > b) || (a < b))
216+
assertLess(upperBound, actual); // a < b
217+
assertMore(lowerBound, actual); // a > b
218+
assertLessOrEqual(upperBound, actual); // a <= b
219+
assertMoreOrEqual(lowerBound, actual); // a >= b
220+
assertTrue(actual);
221+
assertFalse(actual);
222+
assertNull(actual);
223+
```
220224

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#include <ArduinoUnitTests.h>
2+
3+
4+
#pragma once
5+
6+
7+
8+
unittest(check_that_assertion_error_messages_are_comprehensible)
9+
{
10+
assertEqual(1 ,2);
11+
assertNotEqual(2, 2);
12+
assertComparativeEqual(1, 2);
13+
assertComparativeNotEqual(2, 2);
14+
assertLess(2, 1);
15+
assertMore(1, 2);
16+
assertLessOrEqual(2, 1);
17+
assertMoreOrEqual(1, 2);
18+
assertTrue(false);
19+
assertFalse(true);
20+
assertNull(3);
21+
assertNotNull(NULL);
22+
}
23+
24+
unittest_main()
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#include <ArduinoUnitTests.h>
2+
#include "../do-something.h"
3+
4+
class NonOrderedType {
5+
public:
6+
int x; // ehh why not
7+
NonOrderedType(int some_x) : x(some_x) {}
8+
9+
bool operator==(const NonOrderedType &that) const {
10+
return that.x == x;
11+
}
12+
13+
bool operator!=(const NonOrderedType &that) const {
14+
return that.x != x;
15+
}
16+
};
17+
inline std::ostream& operator << ( std::ostream& out, const NonOrderedType& n ) {
18+
out << "NonOrderedType(" << n.x << ")";
19+
return out;
20+
}
21+
22+
23+
unittest(assert_equal_without_total_ordering)
24+
{
25+
NonOrderedType a(3);
26+
NonOrderedType b(3);
27+
NonOrderedType c(4);
28+
29+
assertEqual(a, b);
30+
assertEqual(a, a);
31+
assertNotEqual(a, c);
32+
33+
}
34+
35+
unittest_main()

cpp/unittest/Assertion.h

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,26 +30,29 @@
3030

3131

3232
/** macro generates optional output and calls fail() but does not return if false. */
33-
#define assertEqual(arg1,arg2) assertOp("assertEqual","expected",arg1,compareEqual,"==","actual",arg2)
34-
#define assertNotEqual(arg1,arg2) assertOp("assertNotEqual","unwanted",arg1,compareNotEqual,"!=","actual",arg2)
35-
#define assertLess(arg1,arg2) assertOp("assertLess","lowerBound",arg1,compareLess,"<","upperBound",arg2)
36-
#define assertMore(arg1,arg2) assertOp("assertMore","upperBound",arg1,compareMore,">","lowerBound",arg2)
37-
#define assertLessOrEqual(arg1,arg2) assertOp("assertLessOrEqual","lowerBound",arg1,compareLessOrEqual,"<=","upperBound",arg2)
38-
#define assertMoreOrEqual(arg1,arg2) assertOp("assertMoreOrEqual","upperBound",arg1,compareMoreOrEqual,">=","lowerBound",arg2)
33+
#define assertEqual(arg1,arg2) assertOp("assertEqual","expected",arg1,evaluateDoubleEqual,"==","actual",arg2)
34+
#define assertNotEqual(arg1,arg2) assertOp("assertNotEqual","unwanted",arg1,evaluateNotEqual,"!=","actual",arg2)
35+
#define assertComparativeEqual(arg1,arg2) assertOp("assertEqual","expected",arg1,compareEqual,"!<>","actual",arg2)
36+
#define assertComparativeNotEqual(arg1,arg2) assertOp("assertEqual","unwanted",arg1,compareNotEqual,"<>","actual",arg2)
37+
#define assertLess(arg1,arg2) assertOp("assertLess","lowerBound",arg1,compareLess,"<","upperBound",arg2)
38+
#define assertMore(arg1,arg2) assertOp("assertMore","upperBound",arg1,compareMore,">","lowerBound",arg2)
39+
#define assertLessOrEqual(arg1,arg2) assertOp("assertLessOrEqual","lowerBound",arg1,compareLessOrEqual,"<=","upperBound",arg2)
40+
#define assertMoreOrEqual(arg1,arg2) assertOp("assertMoreOrEqual","upperBound",arg1,compareMoreOrEqual,">=","lowerBound",arg2)
3941
#define assertTrue(arg) assertEqual(true, arg)
4042
#define assertFalse(arg) assertEqual(false, arg)
4143
#define assertNull(arg) assertEqual((void*)NULL, (void*)arg)
4244
#define assertNotNull(arg) assertNotEqual((void*)NULL, (void*)arg)
4345

4446
/** macro generates optional output and calls fail() followed by a return if false. */
45-
#define assureEqual(arg1,arg2) assureOp("assureEqual","expected",arg1,compareEqual,"==","actual",arg2)
46-
#define assureNotEqual(arg1,arg2) assureOp("assureNotEqual","unwanted",arg1,compareNotEqual,"!=","actual",arg2)
47-
#define assureLess(arg1,arg2) assureOp("assureLess","lowerBound",arg1,compareLess,"<","upperBound",arg2)
48-
#define assureMore(arg1,arg2) assureOp("assureMore","upperBound",arg1,compareMore,">","lowerBound",arg2)
49-
#define assureLessOrEqual(arg1,arg2) assureOp("assureLessOrEqual","lowerBound",arg1,compareLessOrEqual,"<=","upperBound",arg2)
50-
#define assureMoreOrEqual(arg1,arg2) assureOp("assureMoreOrEqual","upperBound",arg1,compareMoreOrEqual,">=","lowerBound",arg2)
47+
#define assureEqual(arg1,arg2) assureOp("assureEqual","expected",arg1,evaluateDoubleEqual,"==","actual",arg2)
48+
#define assureNotEqual(arg1,arg2) assureOp("assureNotEqual","unwanted",arg1,evaluateNotEqual,"!=","actual",arg2)
49+
#define assureComparativeEqual(arg1,arg2) assertOp("assureEqual","expected",arg1,compareEqual,"!<>","actual",arg2)
50+
#define assureComparativeNotEqual(arg1,arg2) assertOp("assertEqual","unwanted",arg1,compareNotEqual,"<>","actual",arg2)
51+
#define assureLess(arg1,arg2) assureOp("assureLess","lowerBound",arg1,compareLess,"<","upperBound",arg2)
52+
#define assureMore(arg1,arg2) assureOp("assureMore","upperBound",arg1,compareMore,">","lowerBound",arg2)
53+
#define assureLessOrEqual(arg1,arg2) assureOp("assureLessOrEqual","lowerBound",arg1,compareLessOrEqual,"<=","upperBound",arg2)
54+
#define assureMoreOrEqual(arg1,arg2) assureOp("assureMoreOrEqual","upperBound",arg1,compareMoreOrEqual,">=","lowerBound",arg2)
5155
#define assureTrue(arg) assureEqual(true, arg)
5256
#define assureFalse(arg) assureEqual(false, arg)
5357
#define assureNull(arg) assureEqual((void*)NULL, (void*)arg)
5458
#define assureNotNull(arg) assureNotEqual((void*)NULL, (void*)arg)
55-

cpp/unittest/Compare.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,6 @@ template <typename A, typename B> bool compareLess( const A &a, const B &b
110110
template <typename A, typename B> bool compareMore( const A &a, const B &b) { return Compare<A, B>::more( a, b); }
111111
template <typename A, typename B> bool compareLessOrEqual(const A &a, const B &b) { return Compare<A, B>::lessOrEqual(a, b); }
112112
template <typename A, typename B> bool compareMoreOrEqual(const A &a, const B &b) { return Compare<A, B>::moreOrEqual(a, b); }
113+
114+
template <typename A, typename B> bool evaluateDoubleEqual(const A &a, const B &b) { return a == b; }
115+
template <typename A, typename B> bool evaluateNotEqual( const A &a, const B &b) { return a != b; }

0 commit comments

Comments
 (0)