Logo AND Algorithmique Numérique Distribuée

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