EFL 1.7 svn doobies
[profile/ivi/eina.git] / src / tests / eina_test_strbuf.c
1 /* EINA - EFL data type library
2  * Copyright (C) 2010 Sebastian Dransfeld
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library;
16  * if not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #ifdef HAVE_CONFIG_H
20 # include "config.h"
21 #endif
22
23 #include <stdio.h>
24
25 #include "eina_suite.h"
26 #include "Eina.h"
27
28 START_TEST(strbuf_simple)
29 {
30    Eina_Strbuf *buf;
31    char *txt;
32 #define TEXT \
33    "This test should be so long that it is longer than the initial size of strbuf"
34
35    eina_init();
36
37    buf = eina_strbuf_new();
38    fail_if(!buf);
39
40    eina_strbuf_append(buf, TEXT);
41    fail_if(strcmp(eina_strbuf_string_get(buf), TEXT));
42    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
43    eina_strbuf_append(buf, TEXT);
44    fail_if(strcmp(eina_strbuf_string_get(buf), TEXT TEXT));
45    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
46    txt = eina_strbuf_string_steal(buf);
47    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
48    fail_if(strcmp(txt, TEXT TEXT));
49    free(txt);
50    fail_if(eina_strbuf_length_get(buf) != 0);
51    fail_if(!strcmp(eina_strbuf_string_get(buf), TEXT TEXT));
52    eina_strbuf_append(buf, TEXT);
53    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
54    eina_strbuf_reset(buf);
55    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
56    fail_if(eina_strbuf_length_get(buf) != 0);
57    fail_if(!strcmp(eina_strbuf_string_get(buf), TEXT));
58
59    eina_strbuf_free(buf);
60
61    eina_shutdown();
62 #undef TEXT
63 }
64 END_TEST
65
66 START_TEST(strbuf_manage_simple)
67 {
68    Eina_Strbuf *buf;
69    char *txt;
70 #define TEXT \
71    "This test should be so long that it is longer than the initial size of strbuf"
72
73    eina_init();
74
75    txt = strdup(TEXT);
76
77    buf = eina_strbuf_manage_new(txt);
78    fail_if(!buf);
79
80    fail_if(strcmp(eina_strbuf_string_get(buf), TEXT));
81    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
82    eina_strbuf_append(buf, TEXT);
83    fail_if(strcmp(eina_strbuf_string_get(buf), TEXT TEXT));
84    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
85    txt = eina_strbuf_string_steal(buf);
86    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
87    fail_if(strcmp(txt, TEXT TEXT));
88    free(txt);
89    fail_if(eina_strbuf_length_get(buf) != 0);
90    fail_if(!strcmp(eina_strbuf_string_get(buf), TEXT TEXT));
91    eina_strbuf_append(buf, TEXT);
92    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
93    eina_strbuf_reset(buf);
94    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
95    fail_if(eina_strbuf_length_get(buf) != 0);
96    fail_if(!strcmp(eina_strbuf_string_get(buf), TEXT));
97
98    eina_strbuf_free(buf);
99
100    eina_shutdown();
101 #undef TEXT
102 }
103 END_TEST
104
105 START_TEST(strbuf_remove)
106 {
107    Eina_Strbuf *buf;
108
109    eina_init();
110
111    buf = eina_strbuf_new();
112    fail_if(!buf);
113
114    eina_strbuf_append(buf, "123 456 789 abc");
115    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
116    eina_strbuf_remove(buf, 0, 4);
117    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
118    fail_if(strcmp(eina_strbuf_string_get(buf), "456 789 abc"));
119    eina_strbuf_remove(buf, 8, 1000);
120    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
121    fail_if(strcmp(eina_strbuf_string_get(buf), "456 789 "));
122    eina_strbuf_remove(buf, 7, eina_strbuf_length_get(buf));
123    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
124    fail_if(strcmp(eina_strbuf_string_get(buf), "456 789"));
125    eina_strbuf_remove(buf, 2, 4);
126    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
127    fail_if(strcmp(eina_strbuf_string_get(buf), "45789"));
128    eina_strbuf_remove(buf, 4, 1);
129    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
130    fail_if(strcmp(eina_strbuf_string_get(buf), "45789"));
131    eina_strbuf_remove(buf, 0, eina_strbuf_length_get(buf));
132    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
133    fail_if(strcmp(eina_strbuf_string_get(buf), ""));
134
135 #define TEXT \
136    "This test should be so long that it is longer than the initial size of strbuf"
137    eina_strbuf_append(buf, TEXT TEXT);
138    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
139    eina_strbuf_remove(buf, 0, eina_strbuf_length_get(buf) - 1);
140    fail_if(strcmp(eina_strbuf_string_get(buf), "f"));
141 #undef TEXT
142
143    eina_strbuf_free(buf);
144
145    eina_shutdown();
146 }
147 END_TEST
148
149 START_TEST(strbuf_append)
150 {
151    Eina_Strbuf *buf;
152
153    eina_init();
154
155    buf = eina_strbuf_new();
156    fail_if(!buf);
157
158    eina_strbuf_append(buf, "abc");
159    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
160    fail_if(strcmp(eina_strbuf_string_get(buf), "abc"));
161    eina_strbuf_reset(buf);
162
163    eina_strbuf_append_escaped(buf, "abc");
164    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
165    fail_if(strcmp(eina_strbuf_string_get(buf), "abc"));
166    eina_strbuf_reset(buf);
167
168    eina_strbuf_append_escaped(buf, "abc '\\");
169    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
170    fail_if(strcmp(eina_strbuf_string_get(buf), "abc\\ \\'\\\\"));
171    eina_strbuf_reset(buf);
172
173    eina_strbuf_append_n(buf, "abc", 2);
174    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
175    fail_if(strcmp(eina_strbuf_string_get(buf), "ab"));
176    eina_strbuf_reset(buf);
177
178    eina_strbuf_append_char(buf, 'a');
179    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
180    fail_if(strcmp(eina_strbuf_string_get(buf), "a"));
181    eina_strbuf_reset(buf);
182
183    eina_strbuf_append_length(buf, "something", strlen("something"));
184    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
185    fail_if(strcmp(eina_strbuf_string_get(buf), "something"));
186    eina_strbuf_reset(buf);
187
188    eina_strbuf_append_length(buf, "somethingELSE", strlen("something"));
189    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
190    fail_if(strcmp(eina_strbuf_string_get(buf), "something"));
191    eina_strbuf_reset(buf);
192
193    eina_strbuf_free(buf);
194
195    eina_shutdown();
196 }
197 END_TEST
198
199 START_TEST(strbuf_insert)
200 {
201    Eina_Strbuf *buf;
202
203    eina_init();
204
205    buf = eina_strbuf_new();
206    fail_if(!buf);
207
208    eina_strbuf_insert(buf, "abc", 10);
209    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
210    fail_if(strcmp(eina_strbuf_string_get(buf), "abc"));
211
212    eina_strbuf_insert(buf, "123", 0);
213    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
214    fail_if(strcmp(eina_strbuf_string_get(buf), "123abc"));
215
216    eina_strbuf_insert(buf, "xyz", eina_strbuf_length_get(buf));
217    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
218    fail_if(strcmp(eina_strbuf_string_get(buf), "123abcxyz"));
219
220    eina_strbuf_insert(buf, "xyz", 1);
221    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
222    fail_if(strcmp(eina_strbuf_string_get(buf), "1xyz23abcxyz"));
223
224    eina_strbuf_insert_n(buf, "ABCDEF", 2, 1);
225    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
226    fail_if(strcmp(eina_strbuf_string_get(buf), "1ABxyz23abcxyz"));
227
228    eina_strbuf_insert_n(buf, "EINA", 2, 3);
229    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
230    fail_if(strcmp(eina_strbuf_string_get(buf), "1ABEIxyz23abcxyz"));
231
232    eina_strbuf_insert_escaped(buf, "678", 3);
233    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
234    fail_if(strncmp(eina_strbuf_string_get(buf) + 3, "678", 3));
235
236    eina_strbuf_insert_escaped(buf, "089 '\\", 9);
237                    fail_if(strlen(eina_strbuf_string_get(
238                      buf)) != eina_strbuf_length_get(buf));
239                    fail_if(strncmp(eina_strbuf_string_get(buf) + 9,
240                    "089\\ \\'\\\\",
241                    strlen("089\\ \\'\\\\")));
242    eina_strbuf_reset(buf);
243
244    eina_strbuf_free(buf);
245
246    eina_shutdown();
247 }
248 END_TEST
249
250 START_TEST(strbuf_replace)
251 {
252    Eina_Strbuf *buf;
253
254    eina_init();
255
256    buf = eina_strbuf_new();
257    fail_if(!buf);
258
259    eina_strbuf_append(buf, "aaa");
260    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
261    fail_if(strcmp(eina_strbuf_string_get(buf), "aaa"));
262
263    fail_if(!eina_strbuf_replace(buf, "a", "b", 1));
264    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
265    fail_if(strcmp(eina_strbuf_string_get(buf), "baa"));
266
267    fail_if(eina_strbuf_replace_all(buf, "a", "b") != 2);
268    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
269    fail_if(strcmp(eina_strbuf_string_get(buf), "bbb"));
270
271    fail_if(!eina_strbuf_replace(buf, "b", "cc", 2));
272    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
273    fail_if(strcmp(eina_strbuf_string_get(buf), "bccb"));
274
275    fail_if(eina_strbuf_replace_all(buf, "c", "aa") != 2);
276    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
277    fail_if(strcmp(eina_strbuf_string_get(buf), "baaaab"));
278
279    fail_if(eina_strbuf_replace(buf, "c", "aa", 0));
280    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
281    fail_if(strcmp(eina_strbuf_string_get(buf), "baaaab"));
282
283    fail_if(eina_strbuf_replace(buf, "c", "aa", 2));
284    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
285    fail_if(strcmp(eina_strbuf_string_get(buf), "baaaab"));
286
287    fail_if(eina_strbuf_replace_all(buf, "c", "aa") != 0);
288    fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
289    fail_if(strcmp(eina_strbuf_string_get(buf), "baaaab"));
290
291
292    eina_strbuf_free(buf);
293
294    eina_shutdown();
295 }
296 END_TEST
297
298 START_TEST(strbuf_realloc)
299 {
300    Eina_Strbuf *buf;
301    char pattern[1024 * 16];
302    unsigned int i;
303    size_t sz;
304
305    for (i = 0; i < sizeof(pattern) - 1; i++)
306       pattern[i] = 'a' + (i % 26);
307    pattern[i] = '\0';
308
309    eina_init();
310
311    buf = eina_strbuf_new();
312    fail_if(!buf);
313
314    sz = 0;
315
316    eina_strbuf_append_length(buf, pattern, 1);
317    fail_if(eina_strbuf_length_get(buf) != sz + 1);
318    fail_if(memcmp(eina_strbuf_string_get(buf) + sz, pattern, 1));
319    sz += 1;
320
321    eina_strbuf_append_length(buf, pattern, 32);
322    fail_if(eina_strbuf_length_get(buf) != sz + 32);
323    fail_if(memcmp(eina_strbuf_string_get(buf) + sz, pattern, 32));
324    sz += 32;
325
326    eina_strbuf_append_length(buf, pattern, 64);
327    fail_if(eina_strbuf_length_get(buf) != sz + 64);
328    fail_if(memcmp(eina_strbuf_string_get(buf) + sz, pattern, 64));
329    sz += 64;
330
331    eina_strbuf_append_length(buf, pattern, 128);
332    fail_if(eina_strbuf_length_get(buf) != sz + 128);
333    fail_if(memcmp(eina_strbuf_string_get(buf) + sz, pattern, 128));
334    sz += 128;
335
336    eina_strbuf_append_length(buf, pattern, 4096);
337    fail_if(eina_strbuf_length_get(buf) != sz + 4096);
338    fail_if(memcmp(eina_strbuf_string_get(buf) + sz, pattern, 4096));
339    sz += 4096;
340
341    eina_strbuf_append_length(buf, pattern, sizeof(pattern) - 1);
342    fail_if(eina_strbuf_length_get(buf) != sz + sizeof(pattern) - 1);
343    fail_if(memcmp(eina_strbuf_string_get(buf) + sz, pattern, sizeof(pattern) -
344                   1));
345    sz += sizeof(pattern) - 1;
346
347
348    eina_strbuf_remove(buf, 1024, 1024 + 1234);
349    fail_if(eina_strbuf_length_get(buf) != sz - 1234);
350    sz -= 1234;
351
352    eina_strbuf_remove(buf, 0, 0 + 8192);
353    fail_if(eina_strbuf_length_get(buf) != sz - 8192);
354    sz -= 8192;
355
356    eina_strbuf_remove(buf, 0, 0 + 32);
357    fail_if(eina_strbuf_length_get(buf) != sz - 32);
358    sz -= 32;
359
360
361    eina_strbuf_free(buf);
362
363    eina_shutdown();
364 }
365 END_TEST
366
367 START_TEST(strbuf_append_realloc)
368 {
369    Eina_Strbuf *buf;
370    const size_t runs = 40960;
371    const char target_pattern[] = "stringstrsstr";
372    const char *str;
373    size_t i, target_pattern_size;
374
375    eina_init();
376
377    buf = eina_strbuf_new();
378         fail_if(!buf);
379
380    for (i = 0; i < runs; i++)
381      {
382         fail_if(!eina_strbuf_append(buf, "string"));
383         fail_if(!eina_strbuf_append_n(buf, "string", 3));
384         fail_if(!eina_strbuf_append_char(buf, 's'));
385         fail_if(!eina_strbuf_append_length(buf, "string", 3));
386      }
387
388    target_pattern_size = strlen(target_pattern);
389         fail_if(eina_strbuf_length_get(buf) != (runs * target_pattern_size));
390
391    str = eina_strbuf_string_get(buf);
392         fail_if(str == NULL);
393    for (i = 0; i < runs; i++, str += target_pattern_size)
394         fail_if(memcmp(str, target_pattern, target_pattern_size));
395
396         eina_strbuf_free(buf);
397
398    eina_shutdown();
399 }
400 END_TEST
401
402 START_TEST(strbuf_prepend_realloc)
403 {
404    Eina_Strbuf *buf;
405    const size_t runs = 40960;
406    const char target_pattern[] = "strsstrstring";
407    const char *str;
408    size_t i, target_pattern_size;
409
410    eina_init();
411
412    buf = eina_strbuf_new();
413         fail_if(!buf);
414
415    for (i = 0; i < runs; i++)
416      {
417         fail_if(!eina_strbuf_prepend(buf, "string"));
418         fail_if(!eina_strbuf_prepend_n(buf, "string", 3));
419         fail_if(!eina_strbuf_prepend_char(buf, 's'));
420         fail_if(!eina_strbuf_prepend_length(buf, "string", 3));
421      }
422
423    target_pattern_size = strlen(target_pattern);
424         fail_if(eina_strbuf_length_get(buf) != (runs * target_pattern_size));
425
426    str = eina_strbuf_string_get(buf);
427         fail_if(str == NULL);
428    for (i = 0; i < runs; i++, str += target_pattern_size)
429         fail_if(memcmp(str, target_pattern, target_pattern_size));
430
431         eina_strbuf_free(buf);
432
433    eina_shutdown();
434 }
435 END_TEST
436
437 void
438 eina_test_strbuf(TCase *tc)
439 {
440    tcase_add_test(tc, strbuf_simple);
441    tcase_add_test(tc, strbuf_remove);
442    tcase_add_test(tc, strbuf_append);
443    tcase_add_test(tc, strbuf_insert);
444    tcase_add_test(tc, strbuf_replace);
445    tcase_add_test(tc, strbuf_realloc);
446    tcase_add_test(tc, strbuf_append_realloc);
447    tcase_add_test(tc, strbuf_prepend_realloc);
448    tcase_add_test(tc, strbuf_manage_simple);
449 }