arduino_ci 0.3.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +125 -69
- data/REFERENCE.md +711 -0
- data/cpp/arduino/Arduino.h +1 -7
- data/cpp/arduino/ArduinoDefines.h +3 -0
- data/cpp/arduino/AvrMath.h +117 -17
- data/cpp/arduino/Client.h +27 -0
- data/cpp/arduino/EEPROM.h +64 -0
- data/cpp/arduino/Godmode.cpp +7 -0
- data/cpp/arduino/Godmode.h +121 -15
- data/cpp/arduino/HardwareSerial.h +4 -4
- data/cpp/arduino/IPAddress.h +59 -0
- data/cpp/arduino/Print.h +9 -12
- data/cpp/arduino/Printable.h +8 -0
- data/cpp/arduino/SPI.h +11 -3
- data/cpp/arduino/Server.h +5 -0
- data/cpp/arduino/Udp.h +27 -0
- data/cpp/arduino/Wire.h +197 -77
- data/cpp/arduino/avr/io.h +10 -1
- data/cpp/arduino/avr/pgmspace.h +76 -46
- data/cpp/unittest/ArduinoUnitTests.h +32 -0
- data/cpp/unittest/Assertion.h +54 -26
- data/cpp/unittest/Compare.h +58 -51
- data/cpp/unittest/OstreamHelpers.h +4 -0
- data/exe/arduino_ci.rb +538 -0
- data/exe/arduino_ci_remote.rb +2 -393
- data/exe/arduino_library_location.rb +2 -2
- data/exe/ensure_arduino_installation.rb +7 -1
- data/lib/arduino_ci.rb +1 -0
- data/lib/arduino_ci/arduino_backend.rb +238 -0
- data/lib/arduino_ci/arduino_downloader.rb +43 -73
- data/lib/arduino_ci/arduino_downloader_linux.rb +17 -55
- data/lib/arduino_ci/arduino_downloader_osx.rb +21 -33
- data/lib/arduino_ci/arduino_downloader_windows.rb +11 -53
- data/lib/arduino_ci/arduino_installation.rb +18 -80
- data/lib/arduino_ci/ci_config.rb +8 -11
- data/lib/arduino_ci/cpp_library.rb +250 -59
- data/lib/arduino_ci/host.rb +59 -4
- data/lib/arduino_ci/library_properties.rb +101 -0
- data/lib/arduino_ci/version.rb +1 -1
- data/misc/default.yml +57 -6
- metadata +19 -87
- data/cpp/arduino/Arduino.h.orig +0 -143
- data/exe/libasan.rb +0 -29
- data/lib/arduino_ci/arduino_cmd.rb +0 -332
- data/lib/arduino_ci/arduino_cmd_linux.rb +0 -17
- data/lib/arduino_ci/arduino_cmd_linux_builder.rb +0 -19
- data/lib/arduino_ci/arduino_cmd_osx.rb +0 -17
- data/lib/arduino_ci/arduino_cmd_windows.rb +0 -17
data/cpp/arduino/avr/io.h
CHANGED
@@ -96,7 +96,16 @@
|
|
96
96
|
#ifndef _AVR_IO_H_
|
97
97
|
#define _AVR_IO_H_
|
98
98
|
|
99
|
-
#
|
99
|
+
#include <stdint.h>
|
100
|
+
|
101
|
+
// hardware mocks
|
102
|
+
// this set of macros is all we need from the sfr file
|
103
|
+
extern volatile uint8_t __ARDUINO_CI_SFR_MOCK[1024];
|
104
|
+
#define _SFR_IO8(io_addr) (*(volatile uint8_t *)(__ARDUINO_CI_SFR_MOCK + io_addr))
|
105
|
+
#define _SFR_IO16(io_addr) (*(volatile uint16_t *)(__ARDUINO_CI_SFR_MOCK + io_addr))
|
106
|
+
#define _SFR_MEM8(io_addr) (*(volatile uint8_t *)(__ARDUINO_CI_SFR_MOCK + io_addr))
|
107
|
+
#define _SFR_MEM16(io_addr) (*(volatile uint16_t *)(__ARDUINO_CI_SFR_MOCK + io_addr))
|
108
|
+
#define _SFR_MEM32(io_addr) (*(volatile uint32_t *)(__ARDUINO_CI_SFR_MOCK + io_addr))
|
100
109
|
|
101
110
|
#if defined (__AVR_AT94K__)
|
102
111
|
# include "ioat94k.h"
|
data/cpp/arduino/avr/pgmspace.h
CHANGED
@@ -14,8 +14,10 @@ out = externs.map {|l| l.split("(")[0].split(" ")[-1].gsub("*", "") }.uniq
|
|
14
14
|
out.each { |l| puts d(l) }
|
15
15
|
*/
|
16
16
|
|
17
|
-
#include <avr/io.h>
|
18
17
|
#include <string.h>
|
18
|
+
#include <stdio.h>
|
19
|
+
#include <stdint.h>
|
20
|
+
#include <stdarg.h>
|
19
21
|
|
20
22
|
#define PROGMEM
|
21
23
|
|
@@ -27,6 +29,11 @@ out.each { |l| puts d(l) }
|
|
27
29
|
#define PGM_VOID_P const void *
|
28
30
|
#endif
|
29
31
|
|
32
|
+
// These are normally 32-bit, but here use (u)intptr_t to ensure a pointer can
|
33
|
+
// always be safely cast to these types.
|
34
|
+
typedef intptr_t int_farptr_t;
|
35
|
+
typedef uintptr_t uint_farptr_t;
|
36
|
+
|
30
37
|
// everything's a no-op
|
31
38
|
#define PSTR(s) ((const char *)(s))
|
32
39
|
|
@@ -34,13 +41,13 @@ out.each { |l| puts d(l) }
|
|
34
41
|
#define pgm_read_word_near(address_short) (* (const uint16_t *) (address_short) )
|
35
42
|
#define pgm_read_dword_near(address_short) (* (const uint32_t *) (address_short) )
|
36
43
|
#define pgm_read_float_near(address_short) (* (const float *) (address_short) )
|
37
|
-
#define pgm_read_ptr_near(address_short) (* (const void
|
44
|
+
#define pgm_read_ptr_near(address_short) (* (const void **) (address_short) )
|
38
45
|
|
39
46
|
#define pgm_read_byte_far(address_long) (* (const uint8_t *) (address_long) )
|
40
47
|
#define pgm_read_word_far(address_long) (* (const uint16_t *) (address_long) )
|
41
48
|
#define pgm_read_dword_far(address_long) (* (const uint32_t *) (address_long) )
|
42
49
|
#define pgm_read_float_far(address_long) (* (const float *) (address_long) )
|
43
|
-
#define pgm_read_ptr_far(address_long) (* (const void
|
50
|
+
#define pgm_read_ptr_far(address_long) (* (const void **) (address_long) )
|
44
51
|
|
45
52
|
#define pgm_read_byte(address_short) pgm_read_byte_near(address_short)
|
46
53
|
#define pgm_read_word(address_short) pgm_read_word_near(address_short)
|
@@ -50,46 +57,69 @@ out.each { |l| puts d(l) }
|
|
50
57
|
|
51
58
|
#define pgm_get_far_address(var) ( (uint_farptr_t) (&(var)) )
|
52
59
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
60
|
+
inline const void * memchr_P(const void *s, int val, size_t len) { return memchr(s, val, len); }
|
61
|
+
inline int memcmp_P(const void *s1, const void *s2, size_t len) { return memcmp(s1, s2, len); }
|
62
|
+
inline void *memcpy_P(void *dest, const void *src, size_t n) { return memcpy(dest, src, n); }
|
63
|
+
inline char *strcat_P(char *dest, const char *src) { return strcat(dest, src); }
|
64
|
+
inline const char *strchr_P(const char *s, int val) { return strchr(s, val); }
|
65
|
+
inline int strcmp_P(const char *s1, const char *s2) { return strcmp(s1, s2); }
|
66
|
+
inline char *strcpy_P(char *dest, const char *src) { return strcpy(dest, src); }
|
67
|
+
inline size_t strcspn_P(const char *s, const char *reject) { return strcspn(s, reject); }
|
68
|
+
// strlcat and strlcpy are AVR-specific and not entirely trivial to reimplement using strncat it seems
|
69
|
+
//inline size_t strlcat_P(char *dst, const char *src, size_t siz) { return strlcat(dst, src, siz); }
|
70
|
+
//inline size_t strlcpy_P(char *dst, const char *src, size_t siz) { return strlcpy(dst, src, siz); }
|
71
|
+
//inline size_t strlcat_PF(char *dst, uint_farptr_t src, size_t n) { return strlcat(dst, (const char*)src, n); }
|
72
|
+
//inline size_t strlcpy_PF(char *dst, uint_farptr_t src, size_t siz) { return strlcpy(dst, (const char*)src, siz); }
|
73
|
+
inline int strncmp_P(const char *s1, const char *s2, size_t n) { return strncmp(s1, s2, n); }
|
74
|
+
inline char *strncat_P(char *dest, const char *src, size_t len) { return strncat(dest, src, len); }
|
75
|
+
inline char *strncpy_P(char *dest, const char *src, size_t n) { return strncpy(dest, src, n); }
|
76
|
+
inline char *strpbrk_P(const char *s, const char *accept) { return (char*)strpbrk(s, accept); }
|
77
|
+
inline const char *strrchr_P(const char *s, int val) { return strrchr(s, val); }
|
78
|
+
inline size_t strspn_P(const char *s, const char *accept) { return strspn(s, accept); }
|
79
|
+
inline char *strstr_P(const char *s1, const char *s2) { return (char*)strstr(s1, s2); }
|
80
|
+
inline char *strtok_P(char *s, const char * delim) { return strtok(s, delim); }
|
81
|
+
inline size_t strlen_PF(uint_farptr_t s) { return strlen((char*)s); }
|
82
|
+
inline void *memcpy_PF(void *dest, uint_farptr_t src, size_t n) { return memcpy(dest, (const char*)src, n); }
|
83
|
+
inline char *strcpy_PF(char *dst, uint_farptr_t src) { return strcpy(dst, (const char*)src); }
|
84
|
+
inline char *strncpy_PF(char *dst, uint_farptr_t src, size_t n) { return strncpy(dst, (const char*)src, n); }
|
85
|
+
inline char *strcat_PF(char *dst, uint_farptr_t src) { return strcat(dst, (const char*)src); }
|
86
|
+
inline char *strncat_PF(char *dst, uint_farptr_t src, size_t n) { return strncat(dst, (const char*)src, n); }
|
87
|
+
inline int strcmp_PF(const char *s1, uint_farptr_t s2) { return strcmp(s1, (const char*)s2); }
|
88
|
+
inline int strncmp_PF(const char *s1, uint_farptr_t s2, size_t n) { return strncmp(s1, (const char*)s2, n); }
|
89
|
+
inline char *strstr_PF(const char *s1, uint_farptr_t s2) { return (char*)strstr(s1, (const char*)s2); }
|
90
|
+
inline int memcmp_PF(const void *s1, uint_farptr_t s2, size_t len) { return memcmp(s1, (const char*)s2, len); }
|
91
|
+
inline size_t strlen_P(const char *src) { return strlen(src); }
|
92
|
+
|
93
|
+
// TODO: These functions cannot be found on the CYGWIN test build for
|
94
|
+
// some reason, so disable them for now. Most of these are less common
|
95
|
+
// and/or GNU-specific addons anyway
|
96
|
+
//inline void *memccpy_P(void *dest, const void *src, int val, size_t len) { return memccpy(dest, src, val, len); }
|
97
|
+
//inline void *memmem_P(const void *s1, size_t len1, const void *s2, size_t len2) { return memmem(s1, len1, s2, len2); }
|
98
|
+
//inline const void *memrchr_P(const void *src, int val, size_t len) { return memrchr(src, val, len); }
|
99
|
+
//inline const char *strchrnul_P(const char *s, int c) { return strchrnul(s, c); }
|
100
|
+
//inline int strcasecmp_P(const char *s1, const char *s2) { return strcasecmp(s1, s2); }
|
101
|
+
//inline char *strcasestr_P(const char *s1, const char *s2) { return (char*)strcasestr(s1, s2); }
|
102
|
+
//inline int strncasecmp_P(const char *s1, const char *s2, size_t n) { return strncasecmp(s1, s2, n); }
|
103
|
+
//inline char *strsep_P(char **sp, const char *delim) { return strsep(sp, delim); }
|
104
|
+
//inline char *strtok_r_P(char *string, const char *delim, char **last) { return strtok_r(string, delim, last); }
|
105
|
+
//inline int strcasecmp_PF(const char *s1, uint_farptr_t s2) { return strcasecmp(s1, (const char*)s2); }
|
106
|
+
//inline int strncasecmp_PF(const char *s1, uint_farptr_t s2, size_t n) { return strncasecmp(s1, (const char*)s2, n); }
|
107
|
+
//inline size_t strnlen_P(uint_farptr_t s, size_t len) { return strnlen((char*)s, len); }
|
108
|
+
|
109
|
+
// These are normally defined by stdio.h on AVR, but we cannot override that
|
110
|
+
// include file (at least not without no longer being able to include the
|
111
|
+
// original as well), so just define these here. It seems likely that any
|
112
|
+
// sketch that uses these progmem-stdio functions will also include pgmspace.h
|
113
|
+
inline int vfprintf_P(FILE *stream, const char *__fmt, va_list __ap) { return vfprintf(stream, __fmt, __ap); }
|
114
|
+
inline int printf_P(const char *__fmt, ...) { va_list args; va_start(args, __fmt); return vprintf(__fmt, args); va_end(args); }
|
115
|
+
inline int sprintf_P(char *s, const char *__fmt, ...) { va_list args; va_start(args, __fmt); return sprintf(s, __fmt, args); va_end(args); }
|
116
|
+
inline int snprintf_P(char *s, size_t __n, const char *__fmt, ...) { va_list args; va_start(args, __fmt); return vsnprintf(s, __n, __fmt, args); va_end(args); }
|
117
|
+
inline int vsprintf_P(char *s, const char *__fmt, va_list ap) { return vsprintf(s, __fmt, ap); }
|
118
|
+
inline int vsnprintf_P(char *s, size_t __n, const char *__fmt, va_list ap) { return vsnprintf(s, __n, __fmt, ap); }
|
119
|
+
inline int fprintf_P(FILE *stream, const char *__fmt, ...) { va_list args; va_start(args, __fmt); return vfprintf(stream, __fmt, args); va_end(args); }
|
120
|
+
inline int fputs_P(const char *str, FILE *__stream) { return fputs(str, __stream); }
|
121
|
+
inline int puts_P(const char *str) { return puts(str); }
|
122
|
+
inline int vfscanf_P(FILE *stream, const char *__fmt, va_list __ap) { return vfscanf(stream, __fmt, __ap); }
|
123
|
+
inline int fscanf_P(FILE *stream, const char *__fmt, ...) { va_list args; va_start(args, __fmt); return vfscanf(stream, __fmt, args); va_end(args); }
|
124
|
+
inline int scanf_P(const char *__fmt, ...) { va_list args; va_start(args, __fmt); return vscanf(__fmt, args); va_end(args); }
|
125
|
+
inline int sscanf_P(const char *buf, const char *__fmt, ...) { va_list args; va_start(args, __fmt); return vsscanf(buf, __fmt, args); va_end(args); }
|
@@ -69,6 +69,23 @@ class Test
|
|
69
69
|
}
|
70
70
|
}
|
71
71
|
|
72
|
+
// non-comparative assert
|
73
|
+
void onAssert(
|
74
|
+
const char* file,
|
75
|
+
int line,
|
76
|
+
const char* description,
|
77
|
+
bool pass
|
78
|
+
) {
|
79
|
+
cerr << " " << (pass ? "" : "not ") << "ok " << ++mAssertCounter << " - " << description << endl;
|
80
|
+
if (!pass) {
|
81
|
+
cerr << " ---" << endl;
|
82
|
+
cerr << " at:" << endl;
|
83
|
+
cerr << " file: " << file << endl;
|
84
|
+
cerr << " line: " << line << endl;
|
85
|
+
cerr << " ..." << endl;
|
86
|
+
}
|
87
|
+
}
|
88
|
+
|
72
89
|
template <typename A, typename B> void onAssert(
|
73
90
|
const char* file,
|
74
91
|
int line,
|
@@ -194,6 +211,21 @@ class Test
|
|
194
211
|
excise();
|
195
212
|
}
|
196
213
|
|
214
|
+
bool assertion(
|
215
|
+
const char *file,
|
216
|
+
int line,
|
217
|
+
const char *description,
|
218
|
+
bool ok)
|
219
|
+
{
|
220
|
+
if (mReporter) {
|
221
|
+
mReporter->onAssert(file, line, description, ok);
|
222
|
+
}
|
223
|
+
|
224
|
+
if (!ok)
|
225
|
+
fail();
|
226
|
+
return ok;
|
227
|
+
}
|
228
|
+
|
197
229
|
template <typename A, typename B>
|
198
230
|
bool assertion(
|
199
231
|
const char *file,
|
data/cpp/unittest/Assertion.h
CHANGED
@@ -6,9 +6,19 @@
|
|
6
6
|
|
7
7
|
#include "Compare.h"
|
8
8
|
|
9
|
-
#define
|
9
|
+
#define arduinoCITestBehaviorExp(die, desc, pass) \
|
10
|
+
do \
|
11
|
+
{ \
|
12
|
+
if (!assertion(__FILE__, __LINE__, \
|
13
|
+
desc, pass)) \
|
14
|
+
{ \
|
15
|
+
if (die) return; \
|
16
|
+
} \
|
17
|
+
} while (0)
|
18
|
+
|
19
|
+
#define arduinoCITestBehaviorOp(die, desc, rel1, arg1, op, op_name, rel2, arg2) \
|
10
20
|
do \
|
11
|
-
|
21
|
+
{ \
|
12
22
|
if (!assertion<typeof(arg1), typeof(arg2)>(__FILE__, __LINE__, \
|
13
23
|
desc, \
|
14
24
|
rel1, #arg1, (arg1), \
|
@@ -22,34 +32,52 @@
|
|
22
32
|
|
23
33
|
|
24
34
|
// helper define for the operators below
|
25
|
-
#define
|
26
|
-
|
35
|
+
#define arduinoCIAssertOp(desc, rel1, arg1, op, op_name, rel2, arg2) \
|
36
|
+
arduinoCITestBehaviorOp(false, "assert" desc, rel1, arg1, op, op_name, rel2, arg2)
|
27
37
|
|
28
|
-
#define
|
29
|
-
|
38
|
+
#define arduinoCIAssureOp(desc, rel1, arg1, op, op_name, rel2, arg2) \
|
39
|
+
arduinoCITestBehaviorOp(true, "assure" desc, rel1, arg1, op, op_name, rel2, arg2)
|
30
40
|
|
31
41
|
|
32
42
|
/** macro generates optional output and calls fail() but does not return if false. */
|
33
|
-
#define
|
34
|
-
#define
|
35
|
-
#define
|
36
|
-
#define
|
37
|
-
#define
|
38
|
-
#define
|
39
|
-
#define
|
40
|
-
#define
|
41
|
-
#define
|
42
|
-
#define
|
43
|
+
#define assertTrue(arg) arduinoCITestBehaviorExp(false, "True " #arg, (arg))
|
44
|
+
#define assertFalse(arg) arduinoCITestBehaviorExp(false, "False " #arg, !(arg))
|
45
|
+
#define assertNull(arg) arduinoCITestBehaviorExp(false, "Null " #arg, ((void*)NULL == (void*)(arg)))
|
46
|
+
#define assertNotNull(arg) arduinoCITestBehaviorExp(false, "NotNull " #arg, ((void*)NULL != (void*)(arg)))
|
47
|
+
#define assertEqual(arg1,arg2) arduinoCIAssertOp("Equal","expected",arg1,compareEqual,"==","actual",arg2)
|
48
|
+
#define assertNotEqual(arg1,arg2) arduinoCIAssertOp("NotEqual","unwanted",arg1,compareNotEqual,"!=","actual",arg2)
|
49
|
+
#define assertComparativeEquivalent(arg1,arg2) arduinoCIAssertOp("ComparativeEquivalent","expected",arg1,compareEquivalent,"!<>","actual",arg2)
|
50
|
+
#define assertComparativeNotEquivalent(arg1,arg2) arduinoCIAssertOp("ComparativeNotEquivalent","unwanted",arg1,compareNotEquivalent,"<>","actual",arg2)
|
51
|
+
#define assertLess(arg1,arg2) arduinoCIAssertOp("Less","lowerBound",arg1,compareLess,"<","actual",arg2)
|
52
|
+
#define assertMore(arg1,arg2) arduinoCIAssertOp("More","upperBound",arg1,compareMore,">","actual",arg2)
|
53
|
+
#define assertLessOrEqual(arg1,arg2) arduinoCIAssertOp("LessOrEqual","lowerBound",arg1,compareLessOrEqual,"<=","actual",arg2)
|
54
|
+
#define assertMoreOrEqual(arg1,arg2) arduinoCIAssertOp("MoreOrEqual","upperBound",arg1,compareMoreOrEqual,">=","actual",arg2)
|
55
|
+
|
56
|
+
#define assertEqualFloat(arg1, arg2, arg3) arduinoCIAssertOp("EqualFloat", "epsilon", arg3, compareMoreOrEqual, ">=", "actualDifference", fabs(arg1 - arg2))
|
57
|
+
#define assertNotEqualFloat(arg1, arg2, arg3) arduinoCIAssertOp("NotEqualFloat", "epsilon", arg3, compareLessOrEqual, "<=", "insufficientDifference", fabs(arg1 - arg2))
|
58
|
+
#define assertInfinity(arg) arduinoCITestBehaviorExp(false, "Infinity " #arg, isinf(arg))
|
59
|
+
#define assertNotInfinity(arg) arduinoCITestBehaviorExp(false, "NotInfinity " #arg, !isinf(arg))
|
60
|
+
#define assertNAN(arg) arduinoCITestBehaviorExp(false, "NAN " #arg, isnan(arg))
|
61
|
+
#define assertNotNAN(arg) arduinoCITestBehaviorExp(false, "NotNAN " #arg, !isnan(arg))
|
62
|
+
|
43
63
|
|
44
64
|
/** macro generates optional output and calls fail() followed by a return if false. */
|
45
|
-
#define
|
46
|
-
#define
|
47
|
-
#define
|
48
|
-
#define
|
49
|
-
#define
|
50
|
-
#define
|
51
|
-
#define
|
52
|
-
#define
|
53
|
-
#define
|
54
|
-
#define
|
65
|
+
#define assureTrue(arg) arduinoCITestBehaviorExp(true, "True " #arg, (arg))
|
66
|
+
#define assureFalse(arg) arduinoCITestBehaviorExp(true, "False " #arg, !(arg))
|
67
|
+
#define assureNull(arg) arduinoCITestBehaviorExp(true, "Null " #arg, ((void*)NULL == (void*)(arg)))
|
68
|
+
#define assureNotNull(arg) arduinoCITestBehaviorExp(true, "NotNull " #arg, ((void*)NULL != (void*)(arg)))
|
69
|
+
#define assureEqual(arg1,arg2) arduinoCIAssureOp("Equal","expected",arg1,compareEqual,"==","actual",arg2)
|
70
|
+
#define assureNotEqual(arg1,arg2) arduinoCIAssureOp("NotEqual","unwanted",arg1,compareNotEqual,"!=","actual",arg2)
|
71
|
+
#define assureComparativeEquivalent(arg1,arg2) arduinoCIAssureOp("ComparativeEquivalent","expected",arg1,compareEquivalent,"!<>","actual",arg2)
|
72
|
+
#define assureComparativeNotEquivalent(arg1,arg2) arduinoCIAssureOp("ComparativeNotEquivalent","unwanted",arg1,compareNotEquivalent,"<>","actual",arg2)
|
73
|
+
#define assureLess(arg1,arg2) arduinoCIAssureOp("Less","lowerBound",arg1,compareLess,"<","actual",arg2)
|
74
|
+
#define assureMore(arg1,arg2) arduinoCIAssureOp("More","upperBound",arg1,compareMore,">","actual",arg2)
|
75
|
+
#define assureLessOrEqual(arg1,arg2) arduinoCIAssureOp("LessOrEqual","lowerBound",arg1,compareLessOrEqual,"<=","actual",arg2)
|
76
|
+
#define assureMoreOrEqual(arg1,arg2) arduinoCIAssureOp("MoreOrEqual","upperBound",arg1,compareMoreOrEqual,">=","actual",arg2)
|
55
77
|
|
78
|
+
#define assureEqualFloat(arg1, arg2, arg3) arduinoCIAssureOp("EqualFloat", "epsilon", arg3, compareMoreOrEqual, ">=", "actualDifference", fabs(arg1 - arg2))
|
79
|
+
#define assureNotEqualFloat(arg1, arg2, arg3) arduinoCIAssureOp("NotEqualFloat", "epsilon", arg3, compareLessOrEqual, "<=", "insufficientDifference", fabs(arg1 - arg2))
|
80
|
+
#define assureInfinity(arg) arduinoCITestBehaviorExp(true, "Infinity " #arg, isinf(arg))
|
81
|
+
#define assureNotInfinity(arg) arduinoCITestBehaviorExp(true, "NotInfinity " #arg, !isinf(arg))
|
82
|
+
#define assureNAN(arg) arduinoCITestBehaviorExp(true, "NAN " #arg, isnan(arg))
|
83
|
+
#define assureNotNAN(arg) arduinoCITestBehaviorExp(true, "NotNAN " #arg, !isnan(arg))
|
data/cpp/unittest/Compare.h
CHANGED
@@ -10,12 +10,14 @@ template < typename A, typename B > struct Compare
|
|
10
10
|
if (b<a) return 1;
|
11
11
|
return 0;
|
12
12
|
}
|
13
|
-
inline static bool equal(const A &a,const B &b)
|
14
|
-
inline static bool notEqual(const A &a,const B &b)
|
15
|
-
inline static bool
|
16
|
-
inline static bool
|
17
|
-
inline static bool
|
18
|
-
inline static bool
|
13
|
+
inline static bool equal(const A &a,const B &b) { return a==b; }
|
14
|
+
inline static bool notEqual(const A &a,const B &b) { return a!=b; }
|
15
|
+
inline static bool equivalent(const A &a,const B &b) { return (!(a < b)) && (!(b < a)); }
|
16
|
+
inline static bool notEquivalent(const A &a,const B &b) { return (a<b) || (b<a); }
|
17
|
+
inline static bool less(const A &a,const B &b) { return a<b; }
|
18
|
+
inline static bool more(const A &a,const B &b) { return b<a; }
|
19
|
+
inline static bool lessOrEqual(const A &a,const B &b) { return !(b<a); }
|
20
|
+
inline static bool moreOrEqual(const A &a,const B &b) { return !(a<b); }
|
19
21
|
};
|
20
22
|
|
21
23
|
// helpers for macros
|
@@ -57,56 +59,61 @@ inline static int arduinoCICompareBetween(const __FlashStringHelper * const &a,c
|
|
57
59
|
|
58
60
|
|
59
61
|
// this macro works for all the string-based comparisons
|
62
|
+
// note that it substitutes equivalence for equality
|
60
63
|
// but just in case, https://stackoverflow.com/a/13842784/2063546
|
61
|
-
#define
|
62
|
-
template < __VA_ARGS__ > struct Compare<T1 T1m, T2 T2m>;
|
63
|
-
template < __VA_ARGS__ > struct Compare<T1 T1m, T2 T2m>
|
64
|
-
{
|
65
|
-
inline static int between(
|
66
|
-
inline static bool equal(
|
67
|
-
inline static bool notEqual(
|
68
|
-
inline static bool
|
69
|
-
inline static bool
|
70
|
-
inline static bool
|
71
|
-
inline static bool
|
64
|
+
#define eqComparisonTemplateMacro(T1, T1m, T2, T2m, betweenImpl, ...) \
|
65
|
+
template < __VA_ARGS__ > struct Compare<T1 T1m, T2 T2m>; \
|
66
|
+
template < __VA_ARGS__ > struct Compare<T1 T1m, T2 T2m> \
|
67
|
+
{ \
|
68
|
+
inline static int between( T1 const (&a)T1m, T2 const (&b)T2m) { return betweenImpl; } \
|
69
|
+
inline static bool equal( T1 const (&a)T1m, T2 const (&b)T2m) { return between(a, b) == 0; } \
|
70
|
+
inline static bool notEqual( T1 const (&a)T1m, T2 const (&b)T2m) { return between(a, b) != 0; } \
|
71
|
+
inline static bool equivalent( T1 const (&a)T1m, T2 const (&b)T2m) { return between(a, b) == 0; } \
|
72
|
+
inline static bool notEquivalent(T1 const (&a)T1m, T2 const (&b)T2m) { return between(a, b) != 0; } \
|
73
|
+
inline static bool less( T1 const (&a)T1m, T2 const (&b)T2m) { return between(a, b) < 0; } \
|
74
|
+
inline static bool more( T1 const (&a)T1m, T2 const (&b)T2m) { return between(a, b) > 0; } \
|
75
|
+
inline static bool lessOrEqual( T1 const (&a)T1m, T2 const (&b)T2m) { return between(a, b) <= 0; } \
|
76
|
+
inline static bool moreOrEqual( T1 const (&a)T1m, T2 const (&b)T2m) { return between(a, b) >= 0; } \
|
72
77
|
};
|
73
78
|
|
74
|
-
|
75
|
-
|
79
|
+
eqComparisonTemplateMacro(String, , String, , a.compareTo(b))
|
80
|
+
eqComparisonTemplateMacro(String, , const char *, , a.compareTo(b))
|
76
81
|
#if defined(F)
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
82
|
+
eqComparisonTemplateMacro(String, , const __FlashStringHelper *, , arduinoCICompareBetween(a, b))
|
83
|
+
eqComparisonTemplateMacro(const char *,, const __FlashStringHelper *, , strcmp_P(a,(const char *)b))
|
84
|
+
eqComparisonTemplateMacro(const __FlashStringHelper *, , String, , -arduinoCICompareBetween(b, a))
|
85
|
+
eqComparisonTemplateMacro(const __FlashStringHelper *, , const char *, , -strcmp_P(b,(const char *)a))
|
86
|
+
eqComparisonTemplateMacro(const __FlashStringHelper *, , const __FlashStringHelper *, , arduinoCICompareBetween(a, b))
|
87
|
+
eqComparisonTemplateMacro(const __FlashStringHelper *, , char *, , -strcmp_P(b,(const char *)a))
|
88
|
+
eqComparisonTemplateMacro(char *, , const __FlashStringHelper *, , strcmp_P(a,(const char *)b))
|
89
|
+
eqComparisonTemplateMacro(const __FlashStringHelper *, , char, [M], -strcmp_P(b,(const char *)a), size_t M)
|
90
|
+
eqComparisonTemplateMacro(char, [N], const __FlashStringHelper *, , strcmp_P(a,(const char *)b), size_t N)
|
86
91
|
#endif
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
92
|
+
eqComparisonTemplateMacro(String, , char *, , a.compareTo(b))
|
93
|
+
eqComparisonTemplateMacro(const char *, , String, , -b.compareTo(a))
|
94
|
+
eqComparisonTemplateMacro(const char *, , const char *, , strcmp(a,b))
|
95
|
+
eqComparisonTemplateMacro(const char *, , char *, , strcmp(a,b))
|
96
|
+
eqComparisonTemplateMacro(char *, , String, , -b.compareTo(a))
|
97
|
+
eqComparisonTemplateMacro(char *, , const char *, , strcmp(a,b))
|
98
|
+
eqComparisonTemplateMacro(char *, , char *, , strcmp(a,b))
|
99
|
+
eqComparisonTemplateMacro(String, , char, [M], a.compareTo(b), size_t M)
|
100
|
+
eqComparisonTemplateMacro(const char *, , char, [M], strcmp(a,b), size_t M)
|
101
|
+
eqComparisonTemplateMacro(char *, , char, [M], strcmp(a,b), size_t M)
|
102
|
+
eqComparisonTemplateMacro(char, [N], String, , -b.compareTo(a), size_t N)
|
103
|
+
eqComparisonTemplateMacro(char, [N], const char *, , strcmp(a,b), size_t N)
|
104
|
+
eqComparisonTemplateMacro(char, [N], char *, , strcmp(a,b), size_t N)
|
105
|
+
eqComparisonTemplateMacro(char, [N], char, [M], strcmp(a,b), size_t N, size_t M)
|
101
106
|
|
102
|
-
|
103
|
-
|
107
|
+
eqComparisonTemplateMacro(A, , std::nullptr_t, , a ? 1 : 0, typename A)
|
108
|
+
eqComparisonTemplateMacro(std::nullptr_t, , B, , b ? -1 : 0, typename B)
|
104
109
|
|
105
110
|
// super general comparisons
|
106
|
-
template <typename A, typename B> int compareBetween(
|
107
|
-
template <typename A, typename B> bool compareEqual(
|
108
|
-
template <typename A, typename B> bool compareNotEqual(
|
109
|
-
template <typename A, typename B> bool
|
110
|
-
template <typename A, typename B> bool
|
111
|
-
template <typename A, typename B> bool
|
112
|
-
template <typename A, typename B> bool
|
111
|
+
template <typename A, typename B> int compareBetween( const A &a, const B &b) { return Compare<A, B>::between( a, b); }
|
112
|
+
template <typename A, typename B> bool compareEqual( const A &a, const B &b) { return Compare<A, B>::equal( a, b); }
|
113
|
+
template <typename A, typename B> bool compareNotEqual( const A &a, const B &b) { return Compare<A, B>::notEqual( a, b); }
|
114
|
+
template <typename A, typename B> bool compareEquivalent( const A &a, const B &b) { return Compare<A, B>::equivalent( a, b); }
|
115
|
+
template <typename A, typename B> bool compareNotEquivalent(const A &a, const B &b) { return Compare<A, B>::notEquivalent(a, b); }
|
116
|
+
template <typename A, typename B> bool compareLess( const A &a, const B &b) { return Compare<A, B>::less( a, b); }
|
117
|
+
template <typename A, typename B> bool compareMore( const A &a, const B &b) { return Compare<A, B>::more( a, b); }
|
118
|
+
template <typename A, typename B> bool compareLessOrEqual( const A &a, const B &b) { return Compare<A, B>::lessOrEqual( a, b); }
|
119
|
+
template <typename A, typename B> bool compareMoreOrEqual( const A &a, const B &b) { return Compare<A, B>::moreOrEqual( a, b); }
|
@@ -2,4 +2,8 @@
|
|
2
2
|
|
3
3
|
#include <ostream>
|
4
4
|
|
5
|
+
#if (defined __apple_build_version__) && (__apple_build_version__ >= 12000000)
|
6
|
+
// defined in /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ostream:223:20
|
7
|
+
#else
|
5
8
|
inline std::ostream& operator << (std::ostream& out, const std::nullptr_t &np) { return out << "nullptr"; }
|
9
|
+
#endif
|