1 /*******************************/
2 /* GENERATED FILE, DO NOT EDIT */
3 /*******************************/
7 /*******************************/
8 /* GENERATED FILE, DO NOT EDIT */
9 /*******************************/
11 #line 754 "xbt/dynar.c"
15 XBT_LOG_EXTERNAL_CATEGORY(xbt_dyn);
16 XBT_LOG_DEFAULT_CATEGORY(xbt_dyn);
18 XBT_TEST_UNIT("int", test_dynar_int, "Dynars of integers")
20 /* Vars_decl [doxygen cruft] */
26 xbt_test_add0("==== Traverse the empty dynar");
27 d = xbt_dynar_new(sizeof(int), NULL);
28 xbt_dynar_foreach(d, cursor, i) {
29 xbt_assert0(0, "Damnit, there is something in the empty dynar");
31 xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */
32 xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */
33 /* in your code is naturally the way to go outside a regression test */
36 ("==== Push %d int, set them again 3 times, traverse them, shift them",
38 /* Populate_ints [doxygen cruft] */
39 /* 1. Populate the dynar */
40 d = xbt_dynar_new(sizeof(int), NULL);
41 for (cpt = 0; cpt < NB_ELEM; cpt++) {
42 xbt_dynar_push_as(d, int, cpt); /* This is faster (and possible only with scalars) */
43 /* xbt_dynar_push(d,&cpt); This would also work */
44 xbt_test_log2("Push %d, length=%lu", cpt, xbt_dynar_length(d));
47 /* 2. Traverse manually the dynar */
48 for (cursor = 0; cursor < NB_ELEM; cursor++) {
49 iptr = xbt_dynar_get_ptr(d, cursor);
50 xbt_test_assert2(cursor == *iptr,
51 "The retrieved value is not the same than the injected one (%d!=%d)",
55 /* 3. Traverse the dynar using the neat macro to that extend */
56 xbt_dynar_foreach(d, cursor, cpt) {
57 xbt_test_assert2(cursor == cpt,
58 "The retrieved value is not the same than the injected one (%d!=%d)",
61 /* end_of_traversal */
63 for (cpt = 0; cpt < NB_ELEM; cpt++)
64 *(int *) xbt_dynar_get_ptr(d, cpt) = cpt;
66 for (cpt = 0; cpt < NB_ELEM; cpt++)
67 *(int *) xbt_dynar_get_ptr(d, cpt) = cpt;
68 /* xbt_dynar_set(d,cpt,&cpt); */
70 for (cpt = 0; cpt < NB_ELEM; cpt++)
71 *(int *) xbt_dynar_get_ptr(d, cpt) = cpt;
74 xbt_dynar_foreach(d, cursor, i) {
75 xbt_test_assert2(i == cpt,
76 "The retrieved value is not the same than the injected one (%d!=%d)",
80 xbt_test_assert2(cpt == NB_ELEM,
81 "Cannot retrieve my %d values. Last got one is %d",
84 /* shifting [doxygen cruft] */
85 /* 4. Shift all the values */
86 for (cpt = 0; cpt < NB_ELEM; cpt++) {
87 xbt_dynar_shift(d, &i);
88 xbt_test_assert2(i == cpt,
89 "The retrieved value is not the same than the injected one (%d!=%d)",
91 xbt_test_log2("Pop %d, length=%lu", cpt, xbt_dynar_length(d));
94 /* 5. Free the resources */
95 xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */
96 xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */
97 /* in your code is naturally the way to go outside a regression test */
99 xbt_test_add1("==== Unshift/pop %d int", NB_ELEM);
100 d = xbt_dynar_new(sizeof(int), NULL);
101 for (cpt = 0; cpt < NB_ELEM; cpt++) {
102 xbt_dynar_unshift(d, &cpt);
103 DEBUG2("Push %d, length=%lu", cpt, xbt_dynar_length(d));
105 for (cpt = 0; cpt < NB_ELEM; cpt++) {
106 i = xbt_dynar_pop_as(d, int);
107 xbt_test_assert2(i == cpt,
108 "The retrieved value is not the same than the injected one (%d!=%d)",
110 xbt_test_log2("Pop %d, length=%lu", cpt, xbt_dynar_length(d));
112 xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */
113 xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */
114 /* in your code is naturally the way to go outside a regression test */
118 ("==== Push %d int, insert 1000 int in the middle, shift everything",
120 d = xbt_dynar_new(sizeof(int), NULL);
121 for (cpt = 0; cpt < NB_ELEM; cpt++) {
122 xbt_dynar_push_as(d, int, cpt);
123 DEBUG2("Push %d, length=%lu", cpt, xbt_dynar_length(d));
125 for (cpt = 0; cpt < NB_ELEM/5; cpt++) {
126 xbt_dynar_insert_at_as(d, NB_ELEM/2, int, cpt);
127 DEBUG2("Push %d, length=%lu", cpt, xbt_dynar_length(d));
130 for (cpt = 0; cpt < NB_ELEM/2; cpt++) {
131 xbt_dynar_shift(d, &i);
132 xbt_test_assert2(i == cpt,
133 "The retrieved value is not the same than the injected one at the begining (%d!=%d)",
135 DEBUG2("Pop %d, length=%lu", cpt, xbt_dynar_length(d));
137 for (cpt = 999; cpt >= 0; cpt--) {
138 xbt_dynar_shift(d, &i);
139 xbt_test_assert2(i == cpt,
140 "The retrieved value is not the same than the injected one in the middle (%d!=%d)",
143 for (cpt = 2500; cpt < NB_ELEM; cpt++) {
144 xbt_dynar_shift(d, &i);
145 xbt_test_assert2(i == cpt,
146 "The retrieved value is not the same than the injected one at the end (%d!=%d)",
149 xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */
150 xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */
151 /* in your code is naturally the way to go outside a regression test */
153 xbt_test_add1("==== Push %d int, remove 2000-4000. free the rest",
155 d = xbt_dynar_new(sizeof(int), NULL);
156 for (cpt = 0; cpt < NB_ELEM; cpt++)
157 xbt_dynar_push_as(d, int, cpt);
159 for (cpt = 2000; cpt < 4000; cpt++) {
160 xbt_dynar_remove_at(d, 2000, &i);
161 xbt_test_assert2(i == cpt,
162 "Remove a bad value. Got %d, expected %d", i, cpt);
163 DEBUG2("remove %d, length=%lu", cpt, xbt_dynar_length(d));
165 xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */
166 xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */
167 /* in your code is naturally the way to go outside a regression test */
170 /*******************************************************************************/
171 /*******************************************************************************/
172 /*******************************************************************************/
173 XBT_TEST_UNIT("insert",test_dynar_insert,"Using the xbt_dynar_insert and xbt_dynar_remove functions")
175 xbt_dynar_t d = xbt_dynar_new(sizeof(int), NULL);
178 xbt_test_add1("==== Insert %d int, traverse them, remove them",NB_ELEM);
179 /* Populate_ints [doxygen cruft] */
180 /* 1. Populate the dynar */
181 for (cpt = 0; cpt < NB_ELEM; cpt++) {
182 xbt_dynar_insert_at(d, cpt, &cpt);
183 xbt_test_log2("Push %d, length=%lu", cpt, xbt_dynar_length(d));
186 /* 3. Traverse the dynar */
187 xbt_dynar_foreach(d, cursor, cpt) {
188 xbt_test_assert2(cursor == cpt,
189 "The retrieved value is not the same than the injected one (%d!=%d)",
192 /* end_of_traversal */
194 for (cpt = 0; cpt < NB_ELEM; cpt++) {
196 xbt_dynar_remove_at(d,0,&val);
197 xbt_test_assert2(cpt == val,
198 "The retrieved value is not the same than the injected one (%d!=%d)",
201 xbt_test_assert1(xbt_dynar_length(d) == 0,
202 "There is still %d elements in the dynar after removing everything",
203 xbt_dynar_length(d));
206 /* ********************* */
207 xbt_test_add1("==== Insert %d int in reverse order, traverse them, remove them",NB_ELEM);
208 d = xbt_dynar_new(sizeof(int), NULL);
209 for (cpt = NB_ELEM-1; cpt >=0; cpt--) {
210 xbt_dynar_replace(d, cpt, &cpt);
211 xbt_test_log2("Push %d, length=%lu", cpt, xbt_dynar_length(d));
214 /* 3. Traverse the dynar */
215 xbt_dynar_foreach(d, cursor, cpt) {
216 xbt_test_assert2(cursor == cpt,
217 "The retrieved value is not the same than the injected one (%d!=%d)",
220 /* end_of_traversal */
222 for (cpt =NB_ELEM-1; cpt >=0; cpt--) {
224 xbt_dynar_remove_at(d,xbt_dynar_length(d)-1,&val);
225 xbt_test_assert2(cpt == val,
226 "The retrieved value is not the same than the injected one (%d!=%d)",
229 xbt_test_assert1(xbt_dynar_length(d) == 0,
230 "There is still %d elements in the dynar after removing everything",
231 xbt_dynar_length(d));
235 /*******************************************************************************/
236 /*******************************************************************************/
237 /*******************************************************************************/
238 XBT_TEST_UNIT("double", test_dynar_double, "Dynars of doubles")
245 xbt_test_add0("==== Traverse the empty dynar");
246 d = xbt_dynar_new(sizeof(int), NULL);
247 xbt_dynar_foreach(d, cursor, cpt) {
248 xbt_test_assert0(FALSE,
249 "Damnit, there is something in the empty dynar");
251 xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */
252 xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */
253 /* in your code is naturally the way to go outside a regression test */
255 xbt_test_add0("==== Push/shift 5000 doubles");
256 d = xbt_dynar_new(sizeof(double), NULL);
257 for (cpt = 0; cpt < 5000; cpt++) {
259 xbt_dynar_push(d, &d1);
261 xbt_dynar_foreach(d, cursor, d2) {
262 d1 = (double) cursor;
263 xbt_test_assert2(d1 == d2,
264 "The retrieved value is not the same than the injected one (%f!=%f)",
267 for (cpt = 0; cpt < 5000; cpt++) {
269 xbt_dynar_shift(d, &d2);
270 xbt_test_assert2(d1 == d2,
271 "The retrieved value is not the same than the injected one (%f!=%f)",
274 xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */
275 xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */
276 /* in your code is naturally the way to go outside a regression test */
278 xbt_test_add0("==== Unshift/pop 5000 doubles");
279 d = xbt_dynar_new(sizeof(double), NULL);
280 for (cpt = 0; cpt < 5000; cpt++) {
282 xbt_dynar_unshift(d, &d1);
284 for (cpt = 0; cpt < 5000; cpt++) {
286 xbt_dynar_pop(d, &d2);
287 xbt_test_assert2(d1 == d2,
288 "The retrieved value is not the same than the injected one (%f!=%f)",
291 xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */
292 xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */
293 /* in your code is naturally the way to go outside a regression test */
298 ("==== Push 5000 doubles, insert 1000 doubles in the middle, shift everything");
299 d = xbt_dynar_new(sizeof(double), NULL);
300 for (cpt = 0; cpt < 5000; cpt++) {
302 xbt_dynar_push(d, &d1);
304 for (cpt = 0; cpt < 1000; cpt++) {
306 xbt_dynar_insert_at(d, 2500, &d1);
309 for (cpt = 0; cpt < 2500; cpt++) {
311 xbt_dynar_shift(d, &d2);
312 xbt_test_assert2(d1 == d2,
313 "The retrieved value is not the same than the injected one at the begining (%f!=%f)",
315 DEBUG2("Pop %d, length=%lu", cpt, xbt_dynar_length(d));
317 for (cpt = 999; cpt >= 0; cpt--) {
319 xbt_dynar_shift(d, &d2);
320 xbt_test_assert2(d1 == d2,
321 "The retrieved value is not the same than the injected one in the middle (%f!=%f)",
324 for (cpt = 2500; cpt < 5000; cpt++) {
326 xbt_dynar_shift(d, &d2);
327 xbt_test_assert2(d1 == d2,
328 "The retrieved value is not the same than the injected one at the end (%f!=%f)",
331 xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */
332 xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */
333 /* in your code is naturally the way to go outside a regression test */
336 xbt_test_add0("==== Push 5000 double, remove 2000-4000. free the rest");
337 d = xbt_dynar_new(sizeof(double), NULL);
338 for (cpt = 0; cpt < 5000; cpt++) {
340 xbt_dynar_push(d, &d1);
342 for (cpt = 2000; cpt < 4000; cpt++) {
344 xbt_dynar_remove_at(d, 2000, &d2);
345 xbt_test_assert2(d1 == d2,
346 "Remove a bad value. Got %f, expected %f", d2, d1);
348 xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */
349 xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */
350 /* in your code is naturally the way to go outside a regression test */
354 /* doxygen_string_cruft */
356 /*******************************************************************************/
357 /*******************************************************************************/
358 /*******************************************************************************/
359 XBT_TEST_UNIT("string", test_dynar_string, "Dynars of strings")
367 xbt_test_add0("==== Traverse the empty dynar");
368 d = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
369 xbt_dynar_foreach(d, iter, s1) {
370 xbt_test_assert0(FALSE,
371 "Damnit, there is something in the empty dynar");
373 xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */
374 xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */
375 /* in your code is naturally the way to go outside a regression test */
377 xbt_test_add1("==== Push %d strings, set them again 3 times, shift them",
379 /* Populate_str [doxygen cruft] */
380 d = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
381 /* 1. Populate the dynar */
382 for (cpt = 0; cpt < NB_ELEM; cpt++) {
383 sprintf(buf, "%d", cpt);
385 xbt_dynar_push(d, &s1);
387 for (cpt = 0; cpt < NB_ELEM; cpt++) {
388 sprintf(buf, "%d", cpt);
390 xbt_dynar_replace(d, cpt, &s1);
392 for (cpt = 0; cpt < NB_ELEM; cpt++) {
393 sprintf(buf, "%d", cpt);
395 xbt_dynar_replace(d, cpt, &s1);
397 for (cpt = 0; cpt < NB_ELEM; cpt++) {
398 sprintf(buf, "%d", cpt);
400 xbt_dynar_replace(d, cpt, &s1);
402 for (cpt = 0; cpt < NB_ELEM; cpt++) {
403 sprintf(buf, "%d", cpt);
404 xbt_dynar_shift(d, &s2);
405 xbt_test_assert2(!strcmp(buf, s2),
406 "The retrieved value is not the same than the injected one (%s!=%s)",
410 xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */
411 xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */
412 /* in your code is naturally the way to go outside a regression test */
414 xbt_test_add1("==== Unshift, traverse and pop %d strings", NB_ELEM);
415 d = xbt_dynar_new(sizeof(char **), &xbt_free_ref);
416 for (cpt = 0; cpt < NB_ELEM; cpt++) {
417 sprintf(buf, "%d", cpt);
419 xbt_dynar_unshift(d, &s1);
421 /* 2. Traverse the dynar with the macro */
422 xbt_dynar_foreach(d, iter, s1) {
423 sprintf(buf, "%d", NB_ELEM - iter - 1);
424 xbt_test_assert2(!strcmp(buf, s1),
425 "The retrieved value is not the same than the injected one (%s!=%s)",
428 /* 3. Traverse the dynar with the macro */
429 for (cpt = 0; cpt < NB_ELEM; cpt++) {
430 sprintf(buf, "%d", cpt);
431 xbt_dynar_pop(d, &s2);
432 xbt_test_assert2(!strcmp(buf, s2),
433 "The retrieved value is not the same than the injected one (%s!=%s)",
437 /* 4. Free the resources */
438 xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */
439 xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */
440 /* in your code is naturally the way to go outside a regression test */
444 ("==== Push %d strings, insert %d strings in the middle, shift everything",
445 NB_ELEM, NB_ELEM / 5);
446 d = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
447 for (cpt = 0; cpt < NB_ELEM; cpt++) {
448 sprintf(buf, "%d", cpt);
450 xbt_dynar_push(d, &s1);
452 for (cpt = 0; cpt < NB_ELEM / 5; cpt++) {
453 sprintf(buf, "%d", cpt);
455 xbt_dynar_insert_at(d, NB_ELEM / 2, &s1);
458 for (cpt = 0; cpt < NB_ELEM / 2; cpt++) {
459 sprintf(buf, "%d", cpt);
460 xbt_dynar_shift(d, &s2);
461 xbt_test_assert2(!strcmp(buf, s2),
462 "The retrieved value is not the same than the injected one at the begining (%s!=%s)",
466 for (cpt = (NB_ELEM / 5) - 1; cpt >= 0; cpt--) {
467 sprintf(buf, "%d", cpt);
468 xbt_dynar_shift(d, &s2);
469 xbt_test_assert2(!strcmp(buf, s2),
470 "The retrieved value is not the same than the injected one in the middle (%s!=%s)",
474 for (cpt = NB_ELEM / 2; cpt < NB_ELEM; cpt++) {
475 sprintf(buf, "%d", cpt);
476 xbt_dynar_shift(d, &s2);
477 xbt_test_assert2(!strcmp(buf, s2),
478 "The retrieved value is not the same than the injected one at the end (%s!=%s)",
482 xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */
483 xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */
484 /* in your code is naturally the way to go outside a regression test */
487 xbt_test_add3("==== Push %d strings, remove %d-%d. free the rest",
488 NB_ELEM, 2 * (NB_ELEM / 5), 4 * (NB_ELEM / 5));
489 d = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
490 for (cpt = 0; cpt < NB_ELEM; cpt++) {
491 sprintf(buf, "%d", cpt);
493 xbt_dynar_push(d, &s1);
495 for (cpt = 2 * (NB_ELEM / 5); cpt < 4 * (NB_ELEM / 5); cpt++) {
496 sprintf(buf, "%d", cpt);
497 xbt_dynar_remove_at(d, 2 * (NB_ELEM / 5), &s2);
498 xbt_test_assert2(!strcmp(buf, s2),
499 "Remove a bad value. Got %s, expected %s", s2, buf);
502 xbt_dynar_free(&d); /* end_of_doxygen */
506 /*******************************************************************************/
507 /*******************************************************************************/
508 /*******************************************************************************/
509 #include "xbt/synchro.h"
510 static void pusher_f(void *a)
512 xbt_dynar_t d = (xbt_dynar_t) a;
514 for (i = 0; i < 500; i++) {
515 xbt_dynar_push(d, &i);
519 static void poper_f(void *a)
521 xbt_dynar_t d = (xbt_dynar_t) a;
526 for (i = 0; i < 500; i++) {
528 xbt_dynar_pop(d, &data);
531 if (e.category == bound_error) {
542 XBT_TEST_UNIT("synchronized int", test_dynar_sync_int, "Synchronized dynars of integers")
544 /* Vars_decl [doxygen cruft] */
546 xbt_thread_t pusher, poper;
548 xbt_test_add0("==== Have a pusher and a popper on the dynar");
549 d = xbt_dynar_new_sync(sizeof(int), NULL);
550 pusher = xbt_thread_create("pusher", pusher_f, d, 0 /*not joinable */ );
551 poper = xbt_thread_create("poper", poper_f, d, 0 /*not joinable */ );
552 xbt_thread_join(pusher);
553 xbt_thread_join(poper);
557 /*******************************/
558 /* GENERATED FILE, DO NOT EDIT */
559 /*******************************/