summaryrefslogtreecommitdiff
path: root/test/val.c
blob: 743a977915861f27525c7725d4c786281061e80d (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
115
116
117
118
119
#include "../lib/ypc.h"
#include "../lib/util/bin2hex.c"
#include <math.h>
#include <stdio.h>

#ifdef NDEBUG
#undef NDEBUG
#endif
#include <assert.h>


#define T_MSG\
    C("\x0a",                               ypc_add_array(v))\
    C("\x00",                                 ypc_add_null(v))\
    C("\x02",                                 ypc_add_bool(v, true))\
    C("\x01",                                 ypc_add_bool(v, false))\
    C("\x03\x01",                             ypc_add_int(v, 1))\
    C("\x03\xff",                             ypc_add_int(v, -1))\
    C("\x04\x01\xf4",                         ypc_add_int(v, 500))\
    C("\x04\xfe\x0c",                         ypc_add_int(v, -500))\
    C("\x05\x00\x07\xa1\x20",                 ypc_add_int(v, 500000))\
    C("\x05\xff\xf8\x5e\xe0",                 ypc_add_int(v, -500000))\
    C("\x06\x7f\xff\xff\xff\xff\xff\xff\xff", ypc_add_int(v, INT64_MAX))\
    C("\x06\x80\x00\x00\x00\x00\x00\x00\x00", ypc_add_int(v, INT64_MIN))\
    C("\x07\x00\x00\x00\x00\x00\x00\x00\x00", ypc_add_float(v, 0.0))\
    C("\x07\x40\x09\x21\xfb\x54\x44\x2d\x18", ypc_add_float(v, M_PI))\
    C("\x07\x7f\xf0\x00\x00\x00\x00\x00\x00", ypc_add_float(v, HUGE_VAL))\
    C("\x0b",                                 ypc_add_map(v))\
    C("\x0c",                                 ypc_add_close(v))\
    C("\x0b",                                 ypc_add_map(v))\
    C("\x09""abc\0",                            ypc_add_text(v, "abc"))\
    C("\x09""foob\0",                           ypc_add_textn(v, "foobar", 4))\
    C("\x08\0\0\5\0\1\2\3\xff",                 ypc_add_bin(v, (const uint8_t *)"\0\1\2\3\xff", 5))\
    C("\x08\0\0\0",                             ypc_add_bin(v, (const uint8_t *)"", 0))\
    C("\x0c",                                 ypc_add_close(v))\
    C("\x0c",                               ypc_add_close(v))

#define C(s, x) s
static const char msg[] = T_MSG;
#undef C

#define STR(x) #x

static void t_create(ypc_val *v) {
    assert(ypc_val_init(v, 32) == 0);
#define C(s, x) do {\
        size_t l = v->len;\
        if(x != 0) {\
            fputs(STR(x)" failed\n", stderr);\
            exit(1);\
        }\
        l = v->len - l;\
        if(l != sizeof s - 1 || memcmp(v->buf + v->len - l, s, l) != 0) {\
            char exp[2*sizeof s];\
            ypc__bin2hex(exp, (const uint8_t *)s, sizeof s - 1);\
            char got[2*l+1];\
            ypc__bin2hex(got, v->buf + v->len - l, l);\
            fprintf(stderr, "%s produced wrong output\n  Got: %s\n  Expected: %s\n", STR(x), got, exp);\
            exit(1);\
        }\
    } while(0);
    T_MSG
#undef C

    assert(v->len == sizeof msg - 1);
    assert(memcmp(v->buf, msg, v->len) == 0);
}


static void t_read(ypc_get g) {
    assert(ypc_get_type(g) == YPC_ARRAY);
    assert(ypc_get_size(g) == sizeof msg - 1);
    ypc_iter i = ypc_get_iter(g);
    ypc_iter m;

#define V(i, t, x) do {\
        assert(!ypc_iter_end(i));\
        g = ypc_iter_next(&i);\
        assert(ypc_get_type(g) == t);\
        assert(x);\
    } while(0)

    V(i, YPC_NULL, 1);
    V(i, YPC_BOOL, ypc_get_bool(g) == true);
    V(i, YPC_BOOL, ypc_get_bool(g) == false);
    V(i, YPC_INT, ypc_get_int(g) == 1);
    V(i, YPC_INT, ypc_get_int(g) == -1);
    V(i, YPC_INT, ypc_get_int(g) == 500);
    V(i, YPC_INT, ypc_get_int(g) == -500);
    V(i, YPC_INT, ypc_get_int(g) == 500000);
    V(i, YPC_INT, ypc_get_int(g) == -500000);
    V(i, YPC_INT, ypc_get_int(g) == INT64_MAX);
    V(i, YPC_INT, ypc_get_int(g) == INT64_MIN);
    V(i, YPC_FLOAT, ypc_get_float(g) == 0.0);
    V(i, YPC_FLOAT, ypc_get_float(g) == M_PI);
    V(i, YPC_FLOAT, ypc_get_float(g) == HUGE_VAL);

    V(i, YPC_MAP, ypc_iter_end(ypc_get_iter(g)));

    V(i, YPC_MAP, 1);
    m = ypc_get_iter(g);
    V(m, YPC_TEXT, strcmp(ypc_get_text(g), "abc") == 0);
    V(m, YPC_TEXT, strcmp(ypc_get_text(g), "foob") == 0);
    V(m, YPC_BIN, ypc_get_bin_len(g) == 5 && memcmp(ypc_get_bin(g), "\0\1\2\3\xff", 5) == 0);
    V(m, YPC_BIN, ypc_get_bin_len(g) == 0);
    assert(ypc_iter_end(m));
#undef V

    assert(ypc_iter_end(i));
}


int main(int argc, char **argv) {
    ypc_val v;
    t_create(&v);
    t_read(ypc_val_get(&v));
    ypc_val_free(&v);
    return 0;
}