aboutsummaryrefslogtreecommitdiffstats
path: root/unpack_test.c
blob: 1d7ea4cbc5df21f7fa143ef99d1587cd29395cf5 (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
/*
 * 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"

TEST(simple0_float, "simple unpack float")
{
	float v[1] = { __LINE__ };

	CHECK_UNPACK(DATA(0x00, 0x00, 0x00, 0x00), "f", &v);
	CHECK_EQUAL("f", v[0], 0.0f);
	CHECK_UNPACK(DATA(0x3f, 0x80, 0x00, 0x00), "f", &v);
	CHECK_EQUAL("f", v[0], 1.0f);
	CHECK_UNPACK(DATA(0x41, 0x00, 0x00, 0x00), "f", &v);
	CHECK_EQUAL("f", v[0], 8.0f);

	return true;
}

TEST(simple0_double, "simple unpack double")
{
	double v[1] = { __LINE__ };

	CHECK_UNPACK(DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), "d", &v);
	CHECK_EQUAL("f", v[0], 0.0f);
	CHECK_UNPACK(DATA(0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), "d", &v);
	CHECK_EQUAL("f", v[0], 1.0f);
	CHECK_UNPACK(DATA(0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), "d", &v);
	CHECK_EQUAL("f", v[0], 8.0f);

	return true;
}

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++) {
		if (t->func()) {
			printf(" OK %s\n", t->desc);
			continue;
		}
		pack_trace = PACK_TRACE_ALL;
		fprintf(stderr, ">>> Test failure trace for '%s'\n", t->desc);
		t->func();
		fprintf(stderr, "<<<\n");
		pack_trace = PACK_TRACE_OFF;
		printf("FAIL %s\n", t->desc);
	}
}