#include #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}; // }