Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Swag : another name for O(1) set
[simgrid.git] / testsuite / xbt / dict_usage.c
1 /* $Id$ */
2
3 /* dict_usage - A test of normal usage of a dictionnary                     */
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 <assert.h>
13
14 #include <gras.h>
15
16 XBT_LOG_EXTERNAL_CATEGORY(dict);
17 XBT_LOG_NEW_DEFAULT_CATEGORY(test,"Logging specific to this test");
18
19 static void fill(xbt_dict_t *head);
20 static void debuged_add(xbt_dict_t head,const char*key);
21 static xbt_error_t search(xbt_dict_t head,const char*key);
22 static xbt_error_t debuged_remove(xbt_dict_t head,const char*key);
23 static xbt_error_t traverse(xbt_dict_t head);
24
25 static void print_str(void *str);
26 static void print_str(void *str) {
27   printf("%s",(char*)str);
28 }
29
30 static void fill(xbt_dict_t *head) {
31   printf("\n Fill in the dictionnary\n");
32
33   *head = xbt_dict_new();
34   debuged_add(*head,"12");
35   debuged_add(*head,"12a");
36   debuged_add(*head,"12b");
37   debuged_add(*head,"123");
38   debuged_add(*head,"123456");
39   /* Child becomes child of what to add */
40   debuged_add(*head,"1234");
41   /* Need of common ancestor */
42   debuged_add(*head,"123457");
43
44 }
45
46 static void debuged_add(xbt_dict_t head,const char*key)
47 {
48   char *data=xbt_strdup(key);
49
50   printf("   - Add %s\n",key);
51   xbt_dict_set(head,key,data,&free);
52   if (XBT_LOG_ISENABLED(dict,xbt_log_priority_debug)) {
53     xbt_dict_dump(head,(void (*)(void*))&printf);
54     fflush(stdout);
55   }
56 }
57
58 static xbt_error_t search(xbt_dict_t head,const char*key) {
59   void *data;
60   xbt_error_t errcode;
61
62   
63   errcode=xbt_dict_get(head,key,&data);
64   printf("   - Search %s. Found %s\n",key,data?(char*)data:"(null)");fflush(stdout);
65   if (strcmp((char*)data,key)) 
66     return mismatch_error;
67   return errcode;
68 }
69
70 static xbt_error_t debuged_remove(xbt_dict_t head,const char*key)
71 {
72   xbt_error_t errcode;
73
74   printf("   Remove '%s'\n",key);fflush(stdout);
75   errcode=xbt_dict_remove(head,key);
76   /*  xbt_dict_dump(head,(void (*)(void*))&printf); */
77   return errcode;
78 }
79
80
81 static xbt_error_t traverse(xbt_dict_t head) {
82   xbt_dict_cursor_t cursor=NULL;
83   char *key;
84   char *data;
85
86   xbt_dict_foreach(head,cursor,key,data) {
87     printf("   - Seen:  %s->%s\n",key,data);
88     xbt_assert2(!strcmp(key,data),
89                  "Key(%s) != value(%s). Abording\n",key,data);
90   }
91   return no_error;
92 }
93
94 int main(int argc,char **argv) {
95   xbt_error_t errcode;
96   xbt_dict_t head=NULL;
97   char *data;
98
99   xbt_init_defaultlog(&argc,argv,"dict.thresh=verbose");
100    
101   printf("\nGeneric dictionnary: USAGE test:\n");
102
103   printf(" Traverse the empty dictionnary\n");
104   TRYFAIL(traverse(head));
105
106   fill(&head);
107   printf(" Free the dictionnary (twice)\n");
108   xbt_dict_free(&head);
109   xbt_dict_free(&head);
110   
111   fill(&head);
112
113   printf(" - Change some values\n");
114   printf("   - Change 123 to 'Changed 123'\n");
115   xbt_dict_set(head,"123",strdup("Changed 123"),&free);
116   printf("   - Change 123 back to '123'\n");
117   xbt_dict_set(head,"123",strdup("123"),&free);
118   printf("   - Change 12a to 'Dummy 12a'\n");
119   xbt_dict_set(head,"12a",strdup("Dummy 12a"),&free);
120   printf("   - Change 12a to '12a'\n");
121   xbt_dict_set(head,"12a",strdup("12a"),&free);
122
123   /*  xbt_dict_dump(head,(void (*)(void*))&printf); */
124   printf(" - Traverse the resulting dictionnary\n");
125   TRYFAIL(traverse(head));
126
127   printf(" - Retrive values\n");
128   TRYFAIL(xbt_dict_get(head,"123",(void**)&data));
129   assert(data);
130   TRYFAIL(strcmp("123",data));
131
132   TRYEXPECT(xbt_dict_get(head,"Can't be found",(void**)&data),mismatch_error);
133   TRYEXPECT(xbt_dict_get(head,"123 Can't be found",(void**)&data),mismatch_error);
134   TRYEXPECT(xbt_dict_get(head,"12345678 NOT",(void**)&data),mismatch_error);
135
136   TRYFAIL(search(head,"12a"));
137   TRYFAIL(search(head,"12b"));
138   TRYFAIL(search(head,"12"));
139   TRYFAIL(search(head,"123456"));
140   TRYFAIL(search(head,"1234"));
141   TRYFAIL(search(head,"123457"));
142
143   printf(" - Traverse the resulting dictionnary\n");
144   TRYFAIL(traverse(head));
145
146   /*  xbt_dict_dump(head,(void (*)(void*))&printf); */
147
148   printf(" Free the dictionnary twice\n");
149   xbt_dict_free(&head);
150   xbt_dict_free(&head);
151
152   printf(" - Traverse the resulting dictionnary\n");
153   TRYFAIL(traverse(head));
154
155   printf("\n");
156   fill(&head);
157   printf(" - Remove the data (traversing the resulting dictionnary each time)\n");
158   TRYEXPECT(debuged_remove(head,"Does not exist"),mismatch_error);
159   TRYFAIL(traverse(head));
160
161   xbt_dict_free(&head);
162
163   printf(" - Remove data from the NULL dict (error message expected)\n");
164   TRYCATCH(debuged_remove(head,"12345"),mismatch_error);
165
166   printf(" - Remove each data manually (traversing the resulting dictionnary each time)\n");
167   fill(&head);
168   TRYFAIL(debuged_remove(head,"12a"));    TRYFAIL(traverse(head));
169   TRYFAIL(debuged_remove(head,"12b"));    TRYFAIL(traverse(head));
170   TRYFAIL(debuged_remove(head,"12"));     TRYFAIL(traverse(head));
171   TRYFAIL(debuged_remove(head,"123456")); TRYFAIL(traverse(head));
172   TRYEXPECT(debuged_remove(head,"12346"),mismatch_error);  TRYFAIL(traverse(head));
173   TRYFAIL(debuged_remove(head,"1234"));   TRYFAIL(traverse(head));
174   TRYFAIL(debuged_remove(head,"123457")); TRYFAIL(traverse(head));
175   TRYFAIL(debuged_remove(head,"123"));    TRYFAIL(traverse(head));
176   TRYEXPECT(debuged_remove(head,"12346"),mismatch_error);  TRYFAIL(traverse(head));
177   
178   printf(" - Free the dictionnary twice\n");
179   xbt_dict_free(&head);
180   xbt_dict_free(&head);
181   xbt_exit();
182   return 0;
183 }