1 /*
2 * Copyright (c) 2018 Hanspeter Portner (dev@open-music-kontrollers.ch)
3 *
4 * This is free software: you can redistribute it and/or modify
5 * it under the terms of the Artistic License 2.0 as published by
6 * The Perl Foundation.
7 *
8 * This source is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * Artistic License 2.0 for more details.
12 *
13 * You should have received a copy of the Artistic License 2.0
14 * along the source as a COPYING file. If not, obtain it from
15 * http://www.perlfoundation.org/artistic_license_2_0.
16 */
17
18 #include <assert.h>
19 #include <inttypes.h>
20 #include <stdio.h>
21
22 #define SER_ATOM_IMPLEMENTATION
23 #include <ser_atom.lv2/ser_atom.h>
24
25 #define MAX_ITEMS 0x100000
26
27 static uint32_t
_map(void * data,const char * uri)28 _map(void *data, const char *uri)
29 {
30 (void)uri;
31
32 uint32_t *urid = data;
33
34 return ++(*urid);
35 }
36
37 static void *
_realloc(void * data,void * buf,size_t size)38 _realloc(void *data, void *buf, size_t size)
39 {
40 (void)data;
41 (void)buf;
42 (void)size;
43
44 return NULL;
45 }
46
47 static void
_free(void * data,void * buf)48 _free(void *data, void *buf)
49 {
50 (void)data;
51 (void)buf;
52 }
53
54 int
main(int argc,char ** argv)55 main(int argc, char **argv)
56 {
57 (void)argc;
58 (void)argv;
59
60 ser_atom_t ser;
61 LV2_Atom_Forge forge;
62
63 uint32_t urid = 0;
64 LV2_URID_Map map = {
65 .handle = &urid,
66 .map = _map
67 };
68
69 lv2_atom_forge_init(&forge, &map);
70
71 assert(ser_atom_init(NULL) != 0);
72 assert(ser_atom_init(&ser) == 0);
73
74 assert(ser.size == 0);
75 assert(ser.offset == 0);
76 assert(ser.buf == NULL);
77
78 assert(ser_atom_funcs(NULL, NULL, NULL, NULL) != 0);
79 assert(ser_atom_funcs(&ser, _realloc, _free, NULL) == 0);
80 assert(ser_atom_reset(&ser, &forge) == 0);
81 assert(lv2_atom_forge_bool(&forge, true) == 0);
82 _free(NULL, NULL);
83
84 assert(ser_atom_init(&ser) == 0);
85
86 assert(ser.realloc == _ser_atom_realloc);
87 assert(ser.free == _ser_atom_free);
88 assert(ser.data == NULL);
89
90 assert(ser.size == 0);
91 assert(ser.offset == 0);
92 assert(ser.buf == NULL);
93
94 assert(ser_atom_reset(NULL, &forge) != 0);
95 assert(ser_atom_reset(&ser, NULL) != 0);
96 assert(ser_atom_reset(NULL, NULL) != 0);
97 assert(ser_atom_reset(&ser, &forge) == 0);
98
99 LV2_Atom_Forge_Frame frame;
100 int64_t i;
101
102 assert(lv2_atom_forge_tuple(&forge, &frame) != 0);
103 for(i = 0; i < MAX_ITEMS; i++)
104 {
105 assert(lv2_atom_forge_long(&forge, i) != 0);
106 }
107 lv2_atom_forge_pop(&forge, &frame);
108
109 i = 0;
110 LV2_ATOM_TUPLE_FOREACH((const LV2_Atom_Tuple *)ser.buf, atom)
111 {
112 assert(atom->size == sizeof(int64_t));
113 assert(atom->type == forge.Long);
114
115 const int64_t *i64 = LV2_ATOM_BODY_CONST(atom);
116 assert(*i64 == i++);
117 }
118
119 const size_t tot_size = MAX_ITEMS*sizeof(LV2_Atom_Long) + sizeof(LV2_Atom_Tuple);
120 assert(ser.offset == tot_size);
121 assert(ser.size >= tot_size);
122
123 assert(lv2_atom_forge_deref(&forge, 0) == NULL);
124
125 assert(ser_atom_get(NULL) == NULL);
126 assert(ser_atom_get(&ser) == ser.atom);
127
128 assert(ser_atom_deinit(NULL) != 0);
129 assert(ser_atom_deinit(&ser) == 0);
130
131 assert(ser.size == 0);
132 assert(ser.offset == 0);
133 assert(ser.buf == NULL);
134
135 return 0;
136 }
137