Skip to content

Commit 69b815b

Browse files
committed
remove requirement that types be totally ordered in order to evaluate equality on them
1 parent 0bdd36a commit 69b815b

File tree

7 files changed

+97
-24
lines changed

7 files changed

+97
-24
lines changed

CHANGELOG.md

+2
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 initialization 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

+13-9
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

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()
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

+16-13
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

+3
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; }

spec/cpp_library_spec.rb

+4-2
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,11 @@ def verified_install(backend, path)
8585
header_dirs: [Pathname.new("DoSomething")],
8686
arduino_library_src_dirs: [],
8787
test_files: [
88-
"DoSomething/test/good-null.cpp",
89-
"DoSomething/test/good-library.cpp",
88+
"DoSomething/test/bad-errormessages.cpp",
9089
"DoSomething/test/bad-null.cpp",
90+
"DoSomething/test/good-assert.cpp",
91+
"DoSomething/test/good-library.cpp",
92+
"DoSomething/test/good-null.cpp",
9193
].map { |f| Pathname.new(f) }
9294
},
9395
OnePointOhDummy: {

0 commit comments

Comments
 (0)