aboutsummaryrefslogtreecommitdiffstats
path: root/unpack_test.c
blob: a9e599b27c513abfec3bf788d267345ee64b70e6 (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
/*
 * Copyright (C) 2020 Tomasz Kramkowski <tk@the-tk.com>
 * SPDX-License-Identifier: MIT
 */
#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdbool.h>

#include "pack.h"

typedef bool test_func(void);

struct test {
	test_func *func;
	char *desc;
};

#define TEST(name, desc) static bool test_##name(void); \
	static struct test testinfo_##name \
	__attribute__((__section__("tests"))) \
	__attribute__((__used__)) = \
		{ test_##name, desc }; \
	static bool test_##name(void)
#define DATA(...) (unsigned char []){ __VA_ARGS__ }, sizeof (unsigned char []){ __VA_ARGS__ }
#define CHECK(test) if (!(test)) { puts("! " #test); return false; }

#define CHECK_UNPACK(data, fmt, ...) do { \
	enum pack_status CHECK_UNPACK_s = unpack(data, fmt, __VA_ARGS__); \
	if (CHECK_UNPACK_s != PACK_OK) { \
		printf(__FILE__ ":%d unpack(" #data ", " #fmt ", ...) -> %s (%d)\n", __LINE__, pack_strerror(CHECK_UNPACK_s), CHECK_UNPACK_s); \
		return false; \
	} \
} while (0)
#define CHECK_EQUAL(f, a, b) if (a != b) { printf(__FILE__ ":%d %"f" != %"f"\n", __LINE__, a, b); return false; }

#include "unpack_test.inc"

int main(void)
{
	extern struct test __start_tests, __stop_tests;

	pack_trace = PACK_TRACE_OFF;

	for (struct test *t = &__start_tests; t < &__stop_tests; t++)
		printf("%s %s\n", t->func() ? " OK " : "FAIL", t->desc);
}