Skip to content

Commit 36be6ca

Browse files
committed
Fix nullptr and its assertions
1 parent e707c9e commit 36be6ca

File tree

6 files changed

+55
-11
lines changed

6 files changed

+55
-11
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,19 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
88
## [Unreleased]
99
### Added
1010
- Added rspec sensitivity to the environment variable `$ARDUINO_CI_SELECT_CPP_TESTS=<glob>` (for `arduino_ci` gem hackers)
11+
- `assertNotNull()` and `assureNotNull()` C++ comparisons
1112

1213
### Changed
1314
- `CiConfig::allowable_unittest_files` now uses `Pathname` to full effect
15+
- `nullptr` now defined in its own class
1416

1517
### Deprecated
1618

1719
### Removed
1820

1921
### Fixed
22+
- Assertions on `nullptr`
23+
- The defintion of `nullptr`
2024

2125
### Security
2226

SampleProjects/TestSomething/test/null.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,30 @@ unittest(nothing)
2222
unittest(nullpointer)
2323
{
2424
int* myPointer = NULL;
25+
int **notNullPointer = &myPointer;
26+
2527
assertNull(myPointer);
2628
assertNull(nullptr);
29+
assertEqual(myPointer, nullptr);
30+
assertNotEqual(nullptr, notNullPointer);
31+
assertNotNull(notNullPointer);
32+
}
33+
34+
unittest(nullpointer_equal)
35+
{
36+
int* myPointer = NULL;
37+
int **notNullPointer = &myPointer;
38+
assertEqual(nullptr, myPointer);
39+
assertNotEqual(nullptr, notNullPointer);
40+
41+
assertLessOrEqual(nullptr, myPointer);
42+
assertMoreOrEqual(myPointer, nullptr);
43+
assertLessOrEqual(nullptr, notNullPointer);
44+
assertMoreOrEqual(notNullPointer, nullptr);
45+
assertLessOrEqual(myPointer, nullptr);
46+
assertMoreOrEqual(notNullPointer, nullptr);
47+
assertLess(nullptr, notNullPointer);
48+
assertMore(notNullPointer, nullptr);
2749
}
2850

2951
unittest_main()

cpp/arduino/Arduino.h

+1-4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Where possible, variable names from the Arduino library are used to avoid confli
1515
#include "Stream.h"
1616
#include "HardwareSerial.h"
1717
#include "SPI.h"
18+
#include "Nullptr.h"
1819

1920
typedef bool boolean;
2021
typedef uint8_t byte;
@@ -72,7 +73,3 @@ inline unsigned int makeWord(unsigned char h, unsigned char l) { return (h << 8)
7273
#define word(...) makeWord(__VA_ARGS__)
7374

7475

75-
// Define C++11 nullptr
76-
#define nullptr (std::nullptr_t)NULL
77-
78-

cpp/arduino/Nullptr.h

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#pragma once
2+
3+
// Define C++11 nullptr
4+
typedef void * my_nullptr_t;
5+
#define nullptr (my_nullptr_t)NULL
6+
7+
inline std::ostream& operator << (std::ostream& out, const my_nullptr_t &np) { return out << "nullptr"; }

cpp/unittest/Assertion.h

+2
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#define assertTrue(arg) assertEqual(true, arg)
4040
#define assertFalse(arg) assertEqual(false, arg)
4141
#define assertNull(arg) assertEqual((void*)NULL, (void*)arg)
42+
#define assertNotNull(arg) assertNotEqual((void*)NULL, (void*)arg)
4243

4344
/** macro generates optional output and calls fail() followed by a return if false. */
4445
#define assureEqual(arg1,arg2) assureOp("assureEqual","expected",arg1,compareEqual,"==","actual",arg2)
@@ -50,4 +51,5 @@
5051
#define assureTrue(arg) assureEqual(true, arg)
5152
#define assureFalse(arg) assureEqual(false, arg)
5253
#define assureNull(arg) assureEqual((void*)NULL, (void*)arg)
54+
#define assureNotNull(arg) assureNotEqual((void*)NULL, (void*)arg)
5355

cpp/unittest/Compare.h

+19-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22
#include <avr/pgmspace.h>
33
#include <WString.h>
4+
#include <Nullptr.h>
45

56
template < typename A, typename B > struct Compare
67
{
@@ -897,10 +898,21 @@ template < size_t N, size_t M > struct Compare<char [N],char [M]>
897898
return between(a,b) >= 0;
898899
} // moreOrEqual
899900
};
900-
template <typename A, typename B> int compareBetween(const A &a, const B &b) { return Compare<A,B>::between(a,b); }
901-
template <typename A, typename B> bool compareEqual(const A &a, const B &b) { return Compare<A,B>::equal(a,b); }
902-
template <typename A, typename B> bool compareNotEqual(const A &a, const B &b) { return Compare<A,B>::notEqual(a,b); }
903-
template <typename A, typename B> bool compareLess(const A &a, const B &b) { return Compare<A,B>::less(a,b); }
904-
template <typename A, typename B> bool compareMore(const A &a, const B &b) { return Compare<A,B>::more(a,b); }
905-
template <typename A, typename B> bool compareLessOrEqual(const A &a, const B &b) { return Compare<A,B>::lessOrEqual(a,b); }
906-
template <typename A, typename B> bool compareMoreOrEqual(const A &a, const B &b) { return Compare<A,B>::moreOrEqual(a,b); }
901+
902+
// null pointer comparisons
903+
template <typename B> int compareBetween( const my_nullptr_t &a, const B &b) { return Compare<my_nullptr_t,B>::between( a, b); }
904+
template <typename B> bool compareEqual( const my_nullptr_t &a, const B &b) { return Compare<my_nullptr_t,B>::equal( a, b); }
905+
template <typename B> bool compareNotEqual( const my_nullptr_t &a, const B &b) { return Compare<my_nullptr_t,B>::notEqual( a, b); }
906+
template <typename B> bool compareLess( const my_nullptr_t &a, const B &b) { return Compare<my_nullptr_t,B>::less( a, b); }
907+
template <typename B> bool compareMore( const my_nullptr_t &a, const B &b) { return Compare<my_nullptr_t,B>::more( a, b); }
908+
template <typename B> bool compareLessOrEqual(const my_nullptr_t &a, const B &b) { return Compare<my_nullptr_t,B>::lessOrEqual(a, b); }
909+
template <typename B> bool compareMoreOrEqual(const my_nullptr_t &a, const B &b) { return Compare<my_nullptr_t,B>::moreOrEqual(a, b); }
910+
911+
// super general comparisons
912+
template <typename A, typename B> int compareBetween( const A &a, const B &b) { return Compare<A,B>::between( a, b); }
913+
template <typename A, typename B> bool compareEqual( const A &a, const B &b) { return Compare<A,B>::equal( a, b); }
914+
template <typename A, typename B> bool compareNotEqual( const A &a, const B &b) { return Compare<A,B>::notEqual( a, b); }
915+
template <typename A, typename B> bool compareLess( const A &a, const B &b) { return Compare<A,B>::less( a, b); }
916+
template <typename A, typename B> bool compareMore( const A &a, const B &b) { return Compare<A,B>::more( a, b); }
917+
template <typename A, typename B> bool compareLessOrEqual(const A &a, const B &b) { return Compare<A,B>::lessOrEqual(a, b); }
918+
template <typename A, typename B> bool compareMoreOrEqual(const A &a, const B &b) { return Compare<A,B>::moreOrEqual(a, b); }

0 commit comments

Comments
 (0)