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