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

#include "pack.h"

typedef bool test_func(void);

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

#define TEST(name) bool test_##name(void)
#define TEST_ENTRY(name, description) { test_##name, description }
#define TEST_ENTRY_END { NULL, NULL }
#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 s = unpack(data, fmt, __VA_ARGS__); \
	if (s != PACK_OK) { \
		printf(__FILE__ ":%d unpack(" #data ", " #fmt ", ...) -> %s (%d)\n", __LINE__, pack_strerror(s), s); \
		return false; \
	} \
} while (0)
#define CHECK_EQUAL(a, b) if (a != b) { printf(__FILE__ ":%d %d != %d\n", __LINE__, a, b); return false; }

TEST(schar)
{
	signed char c = __LINE__;
	fprintf(stderr, "Address of c: %p\n", (void *)&c);
	CHECK_UNPACK(DATA(0), "b", &c);
	CHECK_EQUAL(c, 0);
	CHECK_UNPACK(DATA(1), "b", &c);
	CHECK_EQUAL(c, 1);
	CHECK_UNPACK(DATA(127), "b", &c);
	CHECK_EQUAL(c, 127);
	CHECK_UNPACK(DATA(255), "b", &c);
	CHECK_EQUAL(c, -1);
	CHECK_UNPACK(DATA(128), "b", &c);
	CHECK_EQUAL(c, -128);
	return true;
}

TEST(uchar)
{
	unsigned char c = __LINE__;
	fprintf(stderr, "Address of c: %p\n", (void *)&c);
	CHECK_UNPACK(DATA(0), "B", &c);
	CHECK_EQUAL(c, 0);
	CHECK_UNPACK(DATA(1), "B", &c);
	CHECK_EQUAL(c, 1);
	CHECK_UNPACK(DATA(255), "B", &c);
	CHECK_EQUAL(c, 255);
	return true;
}

TEST(sshort)
{
	short s = __LINE__;
	fprintf(stderr, "Address of s: %p\n", (void *)&s);
	CHECK_UNPACK(DATA(0, 0), "h", &s);
	CHECK_EQUAL(s, 0);
	CHECK_UNPACK(DATA(0, 0), ">h", &s);
	CHECK_EQUAL(s, 0);
	CHECK_UNPACK(DATA(0, 0), "<h", &s);
	CHECK_EQUAL(s, 0);
	CHECK_UNPACK(DATA(0, 1), "h", &s);
	CHECK_EQUAL(s, 1);
	CHECK_UNPACK(DATA(0, 1), ">h", &s);
	CHECK_EQUAL(s, 1);
	CHECK_UNPACK(DATA(1, 0), "<h", &s);
	CHECK_EQUAL(s, 1);
	CHECK_UNPACK(DATA(0x7f, 0xff), "h", &s);
	CHECK_EQUAL(s, 32767);
	CHECK_UNPACK(DATA(0x7f, 0xff), ">h", &s);
	CHECK_EQUAL(s, 32767);
	CHECK_UNPACK(DATA(0xff, 0x7f), "<h", &s);
	CHECK_EQUAL(s, 32767);
	CHECK_UNPACK(DATA(0xff, 0xff), "h", &s);
	CHECK_EQUAL(s, -1);
	CHECK_UNPACK(DATA(0xff, 0xff), ">h", &s);
	CHECK_EQUAL(s, -1);
	CHECK_UNPACK(DATA(0xff, 0xff), "<h", &s);
	CHECK_EQUAL(s, -1);
	CHECK_UNPACK(DATA(0x80, 0x00), "h", &s);
	CHECK_EQUAL(s, -32768);
	CHECK_UNPACK(DATA(0x80, 0x00), ">h", &s);
	CHECK_EQUAL(s, -32768);
	CHECK_UNPACK(DATA(0x00, 0x80), "<h", &s);
	CHECK_EQUAL(s, -32768);
}

TEST(ushort)
{
	unsigned short s;
}

int main(void)
{
	struct test tests[] = {
		TEST_ENTRY(schar, "schar unpacking"),
		TEST_ENTRY(uchar, "uchar unpacking"),
		TEST_ENTRY(sshort, "sshort unpacking"),
		TEST_ENTRY_END
	};

	for (int i = 0; tests[i].func != NULL; i++)
		printf("%s %s\n", tests[i].func() ? " OK " : "FAIL", tests[i].desc);
}