aboutsummaryrefslogtreecommitdiff
path: root/test.c
blob: b8fd68b38e37aacd3694952059de689c98060b22 (plain)
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};
// }