timer: add hook for allocation functions.
[ccan] / junkcode / dongre.avinash@gmail.com-clibutils / test / t_c_array.c
1 /** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **\r
2  *  This file is part of clib library\r
3  *  Copyright (C) 2011 Avinash Dongre ( dongre.avinash@gmail.com )\r
4  *\r
5  *  Permission is hereby granted, free of charge, to any person obtaining a copy\r
6  *  of this software and associated documentation files (the "Software"), to deal\r
7  *  in the Software without restriction, including without limitation the rights\r
8  *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
9  *  copies of the Software, and to permit persons to whom the Software is\r
10  *  furnished to do so, subject to the following conditions:\r
11  * \r
12  *  The above copyright notice and this permission notice shall be included in\r
13  *  all copies or substantial portions of the Software.\r
14  * \r
15  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
16  *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
17  *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
18  *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
19  *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
20  *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
21  *  THE SOFTWARE.\r
22  ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/\r
23 \r
24 #include "c_lib.h"\r
25 \r
26 #include <stdlib.h>\r
27 #include <string.h>\r
28 #include <stdio.h>\r
29 #include <assert.h>\r
30 \r
31 static int \r
32 compare_e ( void *left, void *right ) {\r
33     int *l = (int*) left;\r
34     int *r = (int*) right;\r
35     return *l == *r ;\r
36 }\r
37 static void \r
38 free_e ( void *ptr ) {\r
39     if ( ptr )\r
40         free ( ptr);\r
41 }\r
42 static void\r
43 print_e ( void *ptr ){\r
44     if ( ptr ) \r
45         printf ( "%d\n", *(int*)ptr);\r
46 }\r
47 static void \r
48 test_with_int() {\r
49     int size = 10;\r
50     int i = 0;\r
51     int rc ;\r
52     void* p_rv = (void* )0;\r
53     int rv = 0;\r
54     struct clib_array* myArray  = new_clib_array (8,compare_e,NULL);\r
55     assert ( clib_true == empty_clib_array( myArray ));\r
56 \r
57     for ( i = 0; i <= size; i++) {\r
58         push_back_clib_array ( myArray, &i ,sizeof(int));\r
59     }\r
60     assert ( clib_false == empty_clib_array( myArray ));\r
61     assert ( size + 1  == size_clib_array( myArray ));\r
62         for ( i = 0; i <= size; i++) {      \r
63         rc = element_at_clib_array ( myArray, i , &p_rv );\r
64         rv = *(int*)p_rv;\r
65             assert ( rv == i );\r
66         free ( p_rv );\r
67     }   \r
68     rc = front_clib_array ( myArray, &p_rv );\r
69     rv = *(int*)p_rv;\r
70     assert ( rv == 0 );\r
71     free ( p_rv );\r
72 \r
73     rc = back_clib_array( myArray, &p_rv );\r
74     rv = *(int*)p_rv;\r
75     assert ( rv == size );\r
76     free ( p_rv );\r
77 \r
78     remove_clib_array( myArray, 0 );\r
79     assert ( size  == size_clib_array( myArray ));\r
80     rc = element_at_clib_array ( myArray, 0 , &p_rv );\r
81     rv = *(int*)p_rv;\r
82     assert ( rv == 1 );\r
83     free ( p_rv );\r
84 \r
85     size = size_clib_array( myArray );\r
86     remove_clib_array( myArray, size/2 );\r
87     assert ( size - 1  == size_clib_array( myArray ));\r
88     rc = element_at_clib_array ( myArray, size/2 , &p_rv );\r
89     rv = *(int*)p_rv;\r
90     assert ( rv == size/2 + 2 );\r
91     free ( p_rv );\r
92 \r
93     size = size_clib_array( myArray );\r
94     remove_clib_array( myArray, size - 1);\r
95     assert ( size - 1  == size_clib_array( myArray ));\r
96     size = size_clib_array( myArray );\r
97     rc = element_at_clib_array ( myArray, size - 1, &p_rv );\r
98     rv = *(int*)p_rv;\r
99     assert ( rv == 9 );\r
100     free ( p_rv );\r
101 \r
102     i = 900;\r
103     insert_at_clib_array ( myArray, 5, &i, sizeof(int));\r
104     rc = element_at_clib_array ( myArray, 5 , &p_rv );\r
105     rv = *(int*)p_rv;\r
106     assert ( rv == i );\r
107     free ( p_rv );\r
108 \r
109     rc = element_at_clib_array ( myArray, 6 , &p_rv );\r
110     rv = *(int*)p_rv;\r
111     assert ( rv == 7 );\r
112     free ( p_rv );   \r
113 \r
114     for ( i = 0; i < size_clib_array(myArray ); i++){\r
115         rc = element_at_clib_array ( myArray, i , &p_rv );\r
116         print_e ( p_rv);\r
117         free ( p_rv );\r
118         \r
119     }  \r
120     delete_clib_array ( myArray );\r
121 }\r
122 \r
123 static void \r
124 test_with_pointers() {\r
125     int size = 10;\r
126     int i = 0;\r
127     int *rv, rc ;\r
128     void* p_rv = (void* )0;\r
129     struct clib_array* myArray  = new_clib_array (8,compare_e,free_e);\r
130     assert ( clib_true == empty_clib_array( myArray ));\r
131 \r
132     for ( i = 0; i < size; i++) {\r
133         int *v = ( int*) malloc ( sizeof(int));\r
134         memcpy ( v, &i, sizeof(int));\r
135         push_back_clib_array ( myArray, v ,sizeof(int*));\r
136         free ( v );\r
137     }\r
138     assert ( clib_false == empty_clib_array( myArray ));\r
139     assert ( size  == size_clib_array( myArray ));\r
140         for ( i = 0; i < size; i++) {       \r
141         rc = element_at_clib_array ( myArray, i , &p_rv );\r
142         rv = (int*) p_rv;\r
143             assert ( *rv == i );\r
144         free ( p_rv);\r
145     }   \r
146     rc = front_clib_array ( myArray, &p_rv );\r
147     rv = (int*) p_rv;\r
148     assert ( *rv == 0 );\r
149     free ( p_rv);\r
150 \r
151     rc = back_clib_array( myArray, &p_rv );\r
152     rv = (int*) p_rv;\r
153     assert ( *rv == size - 1);\r
154     free ( p_rv);\r
155 \r
156     remove_clib_array( myArray, 0 );\r
157     assert ( size - 1  == size_clib_array( myArray ));\r
158 \r
159     rc = element_at_clib_array ( myArray, 0 , &p_rv );\r
160     rv = (int*) p_rv;\r
161     assert ( *rv == 1 );\r
162     free ( p_rv);\r
163 \r
164     size = size_clib_array( myArray );\r
165     remove_clib_array( myArray, size/2 );\r
166     assert ( size - 1  == size_clib_array( myArray ));\r
167     rc = element_at_clib_array ( myArray, size/2 , &p_rv );\r
168     rv = (int*) p_rv;\r
169     assert ( *rv == size/2 + 2 );\r
170     free ( p_rv);\r
171 \r
172     size = size_clib_array( myArray );\r
173     remove_clib_array( myArray, size - 1);\r
174     assert ( size - 1  == size_clib_array( myArray ));\r
175 \r
176     size = size_clib_array( myArray );\r
177 \r
178     rc = element_at_clib_array ( myArray, size - 1, &p_rv );\r
179     rv = (int*) p_rv;\r
180     assert ( *rv == 8 );\r
181     free ( p_rv);\r
182    \r
183     delete_clib_array ( myArray );\r
184 }\r
185 \r
186 static void \r
187 test_with_strings() {\r
188     int size = 10;\r
189     char *input_array[11];\r
190     int i = 0;\r
191     char *rv, rc ;\r
192     void* p_rv = (void* )0;\r
193     struct clib_array* myArray  = new_clib_array (8,compare_e,free_e);\r
194     assert ( clib_true == empty_clib_array( myArray ));\r
195 \r
196     input_array[0] = "STRING_0";\r
197     input_array[1] = "STRING_1";\r
198     input_array[2] = "STRING_2";\r
199     input_array[3] = "STRING_3";\r
200     input_array[4] = "STRING_4";\r
201     input_array[5] = "STRING_5";\r
202     input_array[6] = "STRING_6";\r
203     input_array[7] = "STRING_7";\r
204     input_array[8] = "STRING_8";\r
205     input_array[9] = "STRING_9";\r
206     input_array[10] = "STRING_10";\r
207 \r
208 \r
209     for ( i = 0; i < size; i++) {\r
210         char *v  = clib_strdup ( input_array[i]);\r
211         push_back_clib_array ( myArray ,v, strlen(v) + 1 );\r
212         free ( v );\r
213     }\r
214     assert ( clib_false == empty_clib_array( myArray ));\r
215     assert ( size == size_clib_array( myArray ));\r
216         for ( i = 0; i < size; i++) {     \r
217         rc = element_at_clib_array ( myArray, i , &p_rv );\r
218         rv = (char*)p_rv;\r
219             assert ( strcmp( rv, input_array[i]) == 0);\r
220         free ( p_rv );\r
221     }   \r
222     rc = front_clib_array ( myArray, &p_rv );\r
223     rv = (char*)p_rv;\r
224     assert ( strcmp( rv, input_array[0]) == 0);\r
225     free ( p_rv );\r
226 \r
227     rc = back_clib_array( myArray, &p_rv );\r
228     rv = (char*)p_rv;\r
229     assert ( strcmp( rv, input_array[size - 1]) == 0);\r
230     free ( p_rv );\r
231 \r
232     remove_clib_array( myArray, 0 );\r
233     assert ( size - 1  == size_clib_array( myArray ));\r
234 \r
235     rc = element_at_clib_array ( myArray, 0 , &p_rv );\r
236     rv = (char*)p_rv;\r
237     assert ( strcmp( rv, input_array[1]) == 0);\r
238     free ( p_rv );\r
239 \r
240     size = size_clib_array( myArray );\r
241     remove_clib_array( myArray, size/2 );\r
242 \r
243     rc = element_at_clib_array ( myArray, size/2 , &p_rv );\r
244     rv = (char*)p_rv;\r
245     assert ( strcmp( rv, input_array[size/2 + 2]) == 0);\r
246     free ( p_rv );\r
247 \r
248     size = size_clib_array( myArray );\r
249     remove_clib_array( myArray, size - 1);\r
250     assert ( size - 1  == size_clib_array( myArray ));\r
251     size = size_clib_array( myArray );\r
252 \r
253     rc = element_at_clib_array ( myArray, size - 1, &p_rv );\r
254     rv = (char*)p_rv;    \r
255     assert ( strcmp( rv, input_array[8]) == 0);\r
256     free ( p_rv );\r
257 \r
258     delete_clib_array ( myArray );\r
259 }\r
260 static struct clib_array*\r
261 create_array() {\r
262     int size = 10;\r
263     int i = 0;\r
264     int rc ;\r
265     void* p_rv = (void* )0;\r
266     int rv = 0;\r
267 \r
268     struct clib_array* myArray  = new_clib_array (8,compare_e,NULL);\r
269     assert ( clib_true == empty_clib_array( myArray ));\r
270 \r
271     for ( i = 0; i < size; i++) {\r
272         push_back_clib_array ( myArray, &i ,sizeof(int));\r
273     }\r
274     assert ( clib_false == empty_clib_array( myArray ));\r
275     assert ( size  == size_clib_array( myArray ));\r
276         for ( i = 0; i < size; i++) {       \r
277         rc = element_at_clib_array ( myArray, i , &p_rv );\r
278         rv = *(int*)p_rv;\r
279             assert ( rv == i );\r
280         free ( p_rv );\r
281     }   \r
282         return myArray;\r
283 }\r
284 static void\r
285 test_for_each_array(){\r
286         struct clib_array* pArray = create_array();\r
287         struct clib_object *temp;\r
288         for_each_clib_array( pArray, print_e);\r
289 \r
290         temp = pArray->pElements[5];\r
291         pArray->pElements[5] = pArray->pElements[8];\r
292         pArray->pElements[8] = temp;\r
293 \r
294         for_each_clib_array( pArray, print_e);\r
295         delete_clib_array ( pArray );\r
296 \r
297 }\r
298 void \r
299 test_clib_array(){\r
300     test_with_int();\r
301     test_with_pointers();\r
302     test_with_strings();\r
303         printf ( "---------------------------------\n");\r
304         test_for_each_array();\r
305 }\r