3 /* dict_usage - A test of normal usage of a dictionnary */
5 /* Copyright (c) 2003,2004 Martin Quinson. All rights reserved. */
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. */
14 XBT_LOG_EXTERNAL_CATEGORY(dict);
15 XBT_LOG_NEW_DEFAULT_CATEGORY(test,"Logging specific to this test");
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);
23 static void print_str(void *str);
24 static void print_str(void *str) {
25 printf("%s",(char*)str);
28 static void fill(xbt_dict_t *head) {
29 printf("\n Fill in the dictionnary\n");
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");
44 static void debuged_add(xbt_dict_t head,const char*key)
46 char *data=xbt_strdup(key);
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);
56 static xbt_error_t search(xbt_dict_t head,const char*key) {
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;
68 static xbt_error_t debuged_remove(xbt_dict_t head,const char*key)
72 printf(" Remove '%s'\n",key);fflush(stdout);
73 errcode=xbt_dict_remove(head,key);
74 /* xbt_dict_dump(head,(void (*)(void*))&printf); */
79 static xbt_error_t traverse(xbt_dict_t head) {
80 xbt_dict_cursor_t cursor=NULL;
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);
92 int main(int argc,char **argv) {
97 xbt_init_defaultlog(&argc,argv,"dict.thresh=verbose");
99 printf("\nGeneric dictionnary: USAGE test:\n");
101 printf(" Traverse the empty dictionnary\n");
102 TRYFAIL(traverse(head));
105 printf(" Free the dictionnary (twice)\n");
106 xbt_dict_free(&head);
107 xbt_dict_free(&head);
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);
121 /* xbt_dict_dump(head,(void (*)(void*))&printf); */
122 printf(" - Traverse the resulting dictionnary\n");
123 TRYFAIL(traverse(head));
125 printf(" - Retrive values\n");
126 TRYFAIL(xbt_dict_get(head,"123",(void**)&data));
128 TRYFAIL(strcmp("123",data));
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);
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"));
141 printf(" - Traverse the resulting dictionnary\n");
142 TRYFAIL(traverse(head));
144 /* xbt_dict_dump(head,(void (*)(void*))&printf); */
146 printf(" Free the dictionnary twice\n");
147 xbt_dict_free(&head);
148 xbt_dict_free(&head);
150 printf(" - Traverse the resulting dictionnary\n");
151 TRYFAIL(traverse(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));
159 xbt_dict_free(&head);
161 printf(" - Remove data from the NULL dict (error message expected)\n");
162 TRYCATCH(debuged_remove(head,"12345"),mismatch_error);
164 printf(" - Remove each data manually (traversing the resulting dictionnary each time)\n");
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));
176 printf(" - Free the dictionnary twice\n");
177 xbt_dict_free(&head);
178 xbt_dict_free(&head);