1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
#include <stdio.h>
#include "msgpack.h"
#define _IN " "
#define assert(c) assert2(c, ;)
#define assert2(c, b) \
do { \
if(!(c)) { \
fprintf(stderr, "Assertion error '%s' in %s:%d\n", #c, __FILE__, __LINE__); \
b; \
failed_asserts++; \
} \
} while (0);
#define logvar(v, fmt) logvar2(v, v, fmt)
#define logvar2(n, v, fmt) printf(_IN #n" = "fmt"\n", v)
#define logbuf(b, l, fmt) logbuf(b, b, l, fmt)
#define logbuf2(n, b, l, fmt) \
do { \
printf(_IN #n" = { "fmt, b[0]); \
for(size_t i = 1; i < l; i++) printf(", "fmt, b[i]); \
printf(" }\n"); \
} while(0)
#define logbytes(b, l) logbytes(b, b, l)
#define logbytes2(n, b, l) logbuf2(n, b, l, "0x%hhx")
#define make_template(call, body) \
do { \
int prev_failed_asserts = failed_asserts; \
call; \
assert2(prev_failed_asserts == failed_asserts, body); \
} while(0)
static int passed_test_counter;
static int failed_test_counter;
static int failed_asserts;
int test_bool();
int test_int();
#define CHECK(test) \
do { \
if(test) { \
printf("[FAILED] "#test"\n"); \
failed_test_counter++; \
} else { \
printf("[PASSED] "#test"\n"); \
passed_test_counter++; \
} \
} while(0)
// the functions in main form a test suite
int main(void)
{
CHECK(test_bool());
// CHECK(test_int());
printf("\n------------------------------\n");
printf("PASSED %d/%d tests, (%.1f%%)\n",
passed_test_counter,
failed_test_counter + passed_test_counter,
100.0f * passed_test_counter /
(failed_test_counter + passed_test_counter));
return 0;
}
void bool_1(uint8_t *buf, size_t size, bool value)
{
bool b;
MSGPACK_CHECK2(msgpack_read_bool(&msgpack_init(buf, size, NULL), &b), (t, e, a),
{
assert2(t == MSGPACK_BOOL, logvar2(t, msgpack_type_string[t], "%s"));
}, {
(void)e;
(void)a;
assert(0);
// log variables
return;
});
assert2(b == value, logvar(b, "%d"));
}
#define bool_template(n, _buf, _value) \
make_template(bool_##n(_buf, sizeof(_buf), _value), { \
logbytes2(buf, _buf, sizeof(_buf)); \
logvar2(value, _value, "%d"); \
}); \
int test_bool()
{
failed_asserts = 0;
bool_template(1, (uint8_t []){0xC2}, true);
bool_template(1, (uint8_t []){0xC3}, false);
bool_template(1, (uint8_t []){0xC1}, false);
return failed_asserts;
}
// void test_int()
// {
// char buf[] = {0xD3, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01};
// char buf[] = {0xCC, 0xFF};
// }
|