Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
2004-04-09 Martin Quinson <martin.quinson@tuxfamily.org>
[simgrid.git] / testsuite / xbt / dynar_string.c
1 /* $Id$ */
2
3 /* dynar_string: A test case for the dynar using strings as content         */
4
5 /* Authors: Martin Quinson                                                  */
6 /* Copyright (C) 2003 the OURAGAN project.                                  */
7
8 /* This program is free software; you can redistribute it and/or modify it
9    under the terms of the license (GNU LGPL) which comes with this package. */
10
11 #include <stdio.h>
12 #include <gras.h>
13
14 /* NB_ELEM HAS to be a multiple of 5 */
15 #define NB_ELEM 5000
16
17 void free_string(void *d);
18
19 void free_string(void *d){
20   free(*(void**)d);
21 }
22
23 int main(int argc,char *argv[]) {
24    gras_dynar_t *d;
25    gras_error_t errcode;
26    int cpt,i;
27    char buf[1024];
28    char *s1,*s2;
29    
30    gras_init_defaultlog(argc,argv,"dynar.thresh=debug");
31    
32    fprintf(stderr,"==== Traverse the empty dynar\n");
33    TRYFAIL(gras_dynar_new(&d,sizeof(char *),&free_string));
34    gras_dynar_foreach(d,cpt,i){
35      fprintf(stderr,
36              "Damnit, there is something in the empty dynar\n");
37      abort();
38    }
39    gras_dynar_free(d);
40
41    fprintf(stderr,"==== Push %d strings, set them again 3 times, shift them\n",NB_ELEM);
42    TRYFAIL(gras_dynar_new(&d,sizeof(char*),&free_string));
43    for (cpt=0; cpt< NB_ELEM; cpt++) {
44      sprintf(buf,"%d",cpt);
45      s1=strdup(buf);
46      TRYFAIL(gras_dynar_push(d,&s1));
47    }
48    for (cpt=0; cpt< NB_ELEM; cpt++) {
49      sprintf(buf,"%d",cpt);
50      s1=strdup(buf);
51      TRYFAIL(gras_dynar_remplace(d,cpt,&s1));
52    }
53    for (cpt=0; cpt< NB_ELEM; cpt++) {
54      sprintf(buf,"%d",cpt);
55      s1=strdup(buf);
56      TRYFAIL(gras_dynar_remplace(d,cpt,&s1));
57    }
58    for (cpt=0; cpt< NB_ELEM; cpt++) {
59      sprintf(buf,"%d",cpt);
60      s1=strdup(buf);
61      TRYFAIL(gras_dynar_remplace(d,cpt,&s1));
62    }
63    for (cpt=0; cpt< NB_ELEM; cpt++) {
64      sprintf(buf,"%d",cpt);
65      gras_dynar_shift(d,&s2);
66      if (strcmp(buf,s2)) {
67        fprintf(stderr,
68             "The retrieved value is not the same than the injected one (%s!=%s)\n",
69                buf,s2);
70        abort();
71      }
72      free(s2);
73    }
74    gras_dynar_free(d);
75
76
77    fprintf(stderr,"==== Unshift/pop %d strings\n",NB_ELEM);
78    TRYFAIL(gras_dynar_new(&d,sizeof(char**),&free_string));
79    for (cpt=0; cpt< NB_ELEM; cpt++) {
80      sprintf(buf,"%d",cpt);
81      s1=strdup(buf);
82      TRYFAIL(gras_dynar_unshift(d,&s1));
83    }
84    for (cpt=0; cpt< NB_ELEM; cpt++) {
85      sprintf(buf,"%d",cpt);
86      gras_dynar_pop(d,&s2);
87      if (strcmp(buf,s2)) {
88        fprintf(stderr,
89            "The retrieved value is not the same than the injected one (%s!=%s)\n",
90                buf,s2);
91        abort();
92      }
93      free(s2);
94    }
95    gras_dynar_free(d);
96
97
98
99    fprintf(stderr,"==== Push %d strings, insert %d strings in the middle, shift everything\n",NB_ELEM,NB_ELEM/5);
100    TRYFAIL(gras_dynar_new(&d,sizeof(char*),&free_string));
101    for (cpt=0; cpt< NB_ELEM; cpt++) {
102      sprintf(buf,"%d",cpt);
103      s1=strdup(buf);
104      TRYFAIL(gras_dynar_push(d,&s1));
105    }
106    for (cpt=0; cpt< NB_ELEM/5; cpt++) {
107      sprintf(buf,"%d",cpt);
108      s1=strdup(buf);
109      TRYFAIL(gras_dynar_insert_at(d,NB_ELEM/2,&s1));
110    }
111
112    for (cpt=0; cpt< NB_ELEM/2; cpt++) {
113      sprintf(buf,"%d",cpt);
114      gras_dynar_shift(d,&s2);
115      if (strcmp(buf,s2)) {
116        fprintf(stderr,
117            "The retrieved value is not the same than the injected one at the begining (%s!=%s)\n",
118                buf,s2);
119        abort();
120      }
121      free(s2);
122    }
123    for (cpt=(NB_ELEM/5)-1; cpt>=0; cpt--) {
124      sprintf(buf,"%d",cpt);
125      gras_dynar_shift(d,&s2);
126      if (strcmp(buf,s2)) {
127        fprintf(stderr,
128            "The retrieved value is not the same than the injected one in the middle (%s!=%s)\n",
129                buf,s2);
130        abort();
131      }
132      free(s2);
133    }
134    for (cpt=NB_ELEM/2; cpt< NB_ELEM; cpt++) {
135      sprintf(buf,"%d",cpt);
136      gras_dynar_shift(d,&s2);
137      if (strcmp(buf,s2)) {
138        fprintf(stderr,
139            "The retrieved value is not the same than the injected one at the end (%s!=%s)\n",
140                buf,s2);
141        abort();
142      }
143      free(s2);
144    }
145    gras_dynar_free(d);
146
147
148    fprintf(stderr,"==== Push %d strings, remove %d-%d. free the rest\n",NB_ELEM,2*(NB_ELEM/5),4*(NB_ELEM/5));
149    TRYFAIL(gras_dynar_new(&d,sizeof(char*),&free_string));
150    for (cpt=0; cpt< NB_ELEM; cpt++) {
151      sprintf(buf,"%d",cpt);
152      s1=strdup(buf);
153      TRYFAIL(gras_dynar_push(d,&s1));
154    }
155    for (cpt=2*(NB_ELEM/5); cpt< 4*(NB_ELEM/5); cpt++) {
156      sprintf(buf,"%d",cpt);
157      gras_dynar_remove_at(d,2*(NB_ELEM/5),&s2);
158      if (strcmp(buf,s2)) {
159        fprintf(stderr,
160            "Remove a bad value. Got %s, expected %s\n",
161                s2,buf);
162        abort();
163      }
164      free(s2);
165    }
166    gras_dynar_free(d);
167
168    return 0;
169 }