EFL 1.7 svn doobies
[profile/ivi/eina.git] / src / tests / eina_test_matrixsparse.c
1 #ifdef HAVE_CONFIG_H
2 # include "config.h"
3 #endif
4
5 #include <stdio.h>
6
7 #include "eina_suite.h"
8 #include "Eina.h"
9
10 #define MAX_ROWS 10
11 #define MAX_COLS 10
12
13 static void eina_matrixsparse_free_cell_cb(void *user_data __UNUSED__,
14                                            void *cell_data __UNUSED__)
15 {
16 }
17
18 static void matrixsparse_initialize(Eina_Matrixsparse *matrix,
19                                     long data[MAX_ROWS][MAX_COLS],
20                                     unsigned long nrows,
21                                     unsigned long ncols)
22 {
23    unsigned long i, j;
24    Eina_Bool r;
25
26    for (i = 0; i < nrows; i++)
27       for (j = 0; j < ncols; j++)
28          if (data[i][j] != 0)
29            {
30               r = eina_matrixsparse_data_idx_set(matrix, i, j, &data[i][j]);
31                 fail_if(r == EINA_FALSE);
32            }
33
34 }
35
36 static void matrixsparse_check(Eina_Matrixsparse *matrix,
37                                long data[MAX_ROWS][MAX_COLS],
38                                unsigned long nrows __UNUSED__,
39                                unsigned long ncols __UNUSED__)
40 {
41    unsigned long i, j;
42    long *test1;
43
44    for (i = 0; i < MAX_ROWS; i++)
45       for (j = 0; j < MAX_COLS; j++)
46         {
47            if (data[i][j] != 0)
48              {
49                 test1 = eina_matrixsparse_data_idx_get(matrix, i, j);
50                 fail_if(test1 == NULL || *test1 != data[i][j]);
51              }
52            else
53              {
54                 test1 = eina_matrixsparse_data_idx_get(matrix, i, j);
55                 fail_if(test1 != NULL);
56              }
57         }
58 }
59
60 START_TEST(eina_test_simple)
61 {
62    Eina_Matrixsparse *matrix = NULL;
63    Eina_Matrixsparse_Cell *cell = NULL;
64    Eina_Bool r;
65    long *test1, value, value2, value3, value4;
66    unsigned long i, j;
67    unsigned long row, col;
68
69    long data[MAX_ROWS][MAX_COLS];
70
71    for (i = 0; i < MAX_ROWS; i++)
72       for (j = 0; j < MAX_COLS; j++)
73          data[i][j] = 0;
74
75    data[0][3] = 3;
76    data[1][3] = 13;
77    data[1][6] = 16;
78    data[1][9] = 19;
79    data[1][8] = 18;
80    data[1][7] = 17;
81    data[2][8] = 28;
82    data[2][7] = 27;
83    data[2][6] = 26;
84    data[3][5] = 35;
85    data[3][6] = 36;
86    data[3][7] = 37;
87    data[3][9] = 39;
88    data[3][0] = 30;
89    data[4][6] = 46;
90    data[4][8] = 48;
91    data[4][2] = 42;
92    data[4][3] = 43;
93    data[4][7] = 47;
94    data[5][3] = 53;
95    data[6][3] = 63;
96    data[6][4] = 64;
97    data[6][6] = 66;
98    data[7][3] = 73;
99    data[7][7] = 77;
100    data[8][8] = 88;
101
102    value = -1;
103    value2 = -2;
104    value3 = -3;
105    value4 = -4;
106
107    eina_init();
108
109    matrix = eina_matrixsparse_new(MAX_ROWS, MAX_COLS,
110                                   eina_matrixsparse_free_cell_cb, data);
111    fail_if(matrix == NULL);
112
113    r = eina_matrixsparse_cell_idx_get(matrix, 3, 5, &cell);
114    fail_if(r == EINA_FALSE);
115    fail_if(cell != NULL);
116
117    matrixsparse_initialize(matrix, data, MAX_ROWS, MAX_COLS);
118
119    /* data fetching */
120    test1 = eina_matrixsparse_data_idx_get(matrix, 3, 0);
121    fail_if(test1 == NULL);
122    fail_if(*test1 != data[3][0]);
123
124    test1 = eina_matrixsparse_data_idx_get(matrix, 3, 5);
125    fail_if(test1 == NULL);
126    fail_if(*test1 != data[3][5]);
127
128    test1 = eina_matrixsparse_data_idx_get(matrix, 3, 6);
129    fail_if(test1 == NULL);
130    fail_if(*test1 != data[3][6]);
131
132    test1 = eina_matrixsparse_data_idx_get(matrix, 3, 1);
133    fail_if(test1 != NULL);
134
135    r = eina_matrixsparse_cell_idx_get(matrix, 3, 5, &cell);
136    fail_if(r == EINA_FALSE);
137    fail_if(cell == NULL);
138
139    test1 = eina_matrixsparse_cell_data_get(cell);
140    fail_if(test1 == NULL);
141    fail_if(*test1 != data[3][5]);
142
143    r = eina_matrixsparse_cell_position_get(cell, &row, &col);
144    fail_if(r == EINA_FALSE);
145    fail_if(row != 3 || col != 5);
146
147    test1 = eina_matrixsparse_data_idx_get(matrix, 4, 3);
148    fail_if(*test1 != data[4][3]);
149
150    test1 = eina_matrixsparse_data_idx_get(matrix, 1, 3);
151    fail_if(*test1 != data[1][3]);
152
153    /* data changing */
154    r = eina_matrixsparse_data_idx_set(matrix, 1, 9, &data[1][9]);
155    fail_if(r == EINA_FALSE);
156
157    r = eina_matrixsparse_data_idx_replace(matrix, 4, 3, &value, (void **)&test1);
158    fail_if(r == EINA_FALSE);
159    fail_if(test1 == NULL);
160    fail_if(*test1 != data[4][3]);
161    data[4][3] = value;
162
163    test1 = eina_matrixsparse_data_idx_get(matrix, 4, 3);
164    fail_if(test1 == NULL || *test1 != value);
165
166    r = eina_matrixsparse_cell_data_replace(cell, &value2, (void **)&test1);
167    fail_if(r == EINA_FALSE);
168    fail_if(test1 == NULL);
169    fail_if(*test1 != data[3][5]);
170    data[3][5] = value2;
171
172    test1 = eina_matrixsparse_data_idx_get(matrix, 3, 5);
173    fail_if(test1 == NULL);
174    fail_if(*test1 != value2);
175
176    r = eina_matrixsparse_cell_idx_get(matrix, 4, 2, &cell);
177    fail_if(r == EINA_FALSE || cell == NULL);
178
179    r = eina_matrixsparse_cell_data_set(cell, &value3);
180    fail_if(r == EINA_FALSE);
181    data[4][2] = value3;
182
183    test1 = eina_matrixsparse_data_idx_get(matrix, 4, 2);
184    fail_if(test1 == NULL || *test1 != value3);
185
186    r = eina_matrixsparse_data_idx_replace(matrix,
187                                           6,
188                                           5,
189                                           &value4,
190                                           (void **)&test1);
191    fail_if(r == EINA_FALSE || test1 != NULL);
192    data[6][5] = value4;
193
194
195    /* cell deletion */
196    r = eina_matrixsparse_row_idx_clear(matrix, 4);
197    fail_if(r == EINA_FALSE);
198    data[4][6] = 0;
199    data[4][8] = 0;
200    data[4][2] = 0;
201    data[4][3] = 0;
202    data[4][7] = 0;
203
204    test1 = eina_matrixsparse_data_idx_get(matrix, 4, 3);
205    fail_if(test1 != NULL);
206
207    test1 = eina_matrixsparse_data_idx_get(matrix, 4, 8);
208    fail_if(test1 != NULL);
209
210    test1 = eina_matrixsparse_data_idx_get(matrix, 5, 3);
211    fail_if(*test1 != data[5][3]);
212
213    r = eina_matrixsparse_column_idx_clear(matrix, 3);
214    fail_if(r != EINA_TRUE);
215    data[0][3] = 0;
216    data[1][3] = 0;
217    data[4][3] = 0;
218    data[5][3] = 0;
219    data[6][3] = 0;
220    data[7][3] = 0;
221
222    r = eina_matrixsparse_cell_idx_clear(matrix, 3, 5);
223    fail_if(r != EINA_TRUE);
224    data[3][5] = 0;
225
226    r = eina_matrixsparse_cell_idx_clear(matrix, 3, 9);
227    fail_if(r != EINA_TRUE);
228    data[3][9] = 0;
229
230    r = eina_matrixsparse_cell_idx_clear(matrix, 4, 3);
231    fail_if(r != EINA_TRUE);
232    data[4][3] = 0;
233
234    r = eina_matrixsparse_cell_idx_get(matrix, 3, 7, &cell);
235    fail_if(r == EINA_FALSE);
236    fail_if(cell == NULL);
237
238    r = eina_matrixsparse_cell_clear(cell);
239    fail_if(r == EINA_FALSE);
240    data[3][7] = 0;
241
242    r = eina_matrixsparse_cell_idx_get(matrix, 2, 7, &cell);
243    fail_if(r == EINA_FALSE);
244
245    r = eina_matrixsparse_cell_idx_clear(matrix, 2, 8);
246    fail_if(r == EINA_FALSE);
247    data[2][8] = 0;
248
249    r = eina_matrixsparse_cell_idx_clear(matrix, 2, 7);
250    fail_if(r == EINA_FALSE);
251    data[2][7] = 0;
252
253    r = eina_matrixsparse_cell_idx_get(matrix, 7, 7, &cell);
254    fail_if(r == EINA_FALSE);
255
256    r = eina_matrixsparse_row_idx_clear(matrix, 8);
257    fail_if(r == EINA_FALSE);
258    data[8][8] = 0;
259
260    r = eina_matrixsparse_row_idx_clear(matrix, 7);
261    fail_if(r == EINA_FALSE);
262    data[7][3] = 0;
263    data[7][7] = 0;
264
265    matrixsparse_check(matrix, data, MAX_ROWS, MAX_COLS);
266    eina_matrixsparse_free(matrix);
267
268    eina_shutdown();
269 }
270 END_TEST
271
272 START_TEST(eina_test_resize)
273 {
274    Eina_Matrixsparse *matrix = NULL;
275    Eina_Bool r;
276    unsigned long i, j;
277    unsigned long nrows, ncols;
278
279    long data[MAX_ROWS][MAX_COLS];
280
281    for (i = 0; i < MAX_ROWS; i++)
282       for (j = 0; j < MAX_COLS; j++)
283          data[i][j] = 0;
284
285    eina_init();
286
287    matrix = eina_matrixsparse_new(MAX_ROWS, MAX_COLS,
288                                   eina_matrixsparse_free_cell_cb, data);
289    fail_if(matrix == NULL);
290
291    /* cell insertion */
292    data[0][5] = 5;
293    data[1][0] = 10;
294    data[1][3] = 13;
295    data[1][6] = 16;
296    data[1][9] = 19;
297    data[1][8] = 18;
298    data[1][7] = 17;
299    data[2][8] = 28;
300    data[2][7] = 27;
301    data[2][6] = 26;
302    data[3][0] = 30;
303    data[3][5] = 35;
304    data[3][6] = 36;
305    data[3][7] = 37;
306    data[3][9] = 39;
307    data[3][0] = 30;
308    data[4][8] = 48;
309    data[4][2] = 42;
310    data[4][3] = 43;
311    data[4][7] = 47;
312    data[4][6] = 46;
313    data[5][3] = 53;
314    data[6][3] = 63;
315    data[6][4] = 64;
316    data[6][6] = 66;
317    data[7][3] = 73;
318    data[7][7] = 77;
319    data[8][8] = 88;
320
321    matrixsparse_initialize(matrix, data, MAX_ROWS, MAX_COLS);
322
323    eina_matrixsparse_size_get(matrix, &nrows, &ncols);
324    fail_if(nrows != MAX_ROWS || ncols != MAX_COLS);
325
326    r = eina_matrixsparse_size_set(matrix, nrows - 2, ncols - 2);
327    fail_if(r == EINA_FALSE);
328    data[1][9] = 0;
329    data[1][8] = 0;
330    data[2][8] = 0;
331    data[3][9] = 0;
332    data[4][8] = 0;
333    data[8][8] = 0;
334    matrixsparse_check(matrix, data, MAX_ROWS, MAX_COLS);
335
336    r = eina_matrixsparse_size_set(matrix, 5, 1);
337    fail_if(r == EINA_FALSE);
338    data[0][5] = 0;
339    data[1][3] = 0;
340    data[1][6] = 0;
341    data[1][7] = 0;
342    data[2][7] = 0;
343    data[2][6] = 0;
344    data[3][5] = 0;
345    data[3][6] = 0;
346    data[3][7] = 0;
347    data[4][2] = 0;
348    data[4][3] = 0;
349    data[4][7] = 0;
350    data[4][6] = 0;
351    data[5][3] = 0;
352    data[6][3] = 0;
353    data[6][4] = 0;
354    data[6][6] = 0;
355    data[7][3] = 0;
356    data[7][7] = 0;
357    matrixsparse_check(matrix, data, MAX_ROWS, MAX_COLS);
358
359    r = eina_matrixsparse_size_set(matrix, 1, 1);
360    fail_if(r == EINA_FALSE);
361    data[3][0] = 0;
362    data[1][0] = 0;
363    matrixsparse_check(matrix, data, MAX_ROWS, MAX_COLS);
364
365    r = eina_matrixsparse_size_set(matrix, 5, 4);
366    fail_if(r == EINA_FALSE);
367
368    r = eina_matrixsparse_data_idx_set(matrix, 4, 2, &data[4][2]);
369    fail_if(r == EINA_FALSE);
370    data[4][2] = 42;
371    matrixsparse_check(matrix, data, MAX_ROWS, MAX_COLS);
372
373    r = eina_matrixsparse_size_set(matrix, 5, 1);
374    fail_if(r == EINA_FALSE);
375    data[4][2] = 0;
376    matrixsparse_check(matrix, data, MAX_ROWS, MAX_COLS);
377
378    eina_matrixsparse_free(matrix);
379
380    eina_shutdown();
381 }
382 END_TEST
383
384 START_TEST(eina_test_iterators)
385 {
386    Eina_Matrixsparse *matrix = NULL;
387    Eina_Matrixsparse_Cell *cell = NULL;
388    Eina_Iterator *it = NULL;
389    Eina_Bool r;
390    long *test1, value;
391    unsigned long i, j;
392    unsigned long row, col;
393
394    long data[MAX_ROWS][MAX_COLS];
395
396    value = 0;
397    for (i = 0; i < MAX_ROWS; i++)
398      {
399         for (j = 0; j < MAX_COLS; j++)
400           {
401              data[i][j] = value++;
402              printf("%4ld ", data[i][j]);
403           }
404              printf("\n");
405      }
406
407              eina_init();
408
409    matrix = eina_matrixsparse_new(MAX_ROWS, MAX_COLS,
410                                   eina_matrixsparse_free_cell_cb, data);
411    fail_if(matrix == NULL);
412
413    r = eina_matrixsparse_data_idx_set(matrix, 3, 5, &data[3][5]);
414    fail_if(r == EINA_FALSE);
415    r = eina_matrixsparse_data_idx_set(matrix, 3, 6, &data[3][6]);
416    fail_if(r == EINA_FALSE);
417    r = eina_matrixsparse_data_idx_set(matrix, 3, 7, &data[3][7]);
418    fail_if(r == EINA_FALSE);
419    r = eina_matrixsparse_data_idx_set(matrix, 3, 9, &data[3][9]);
420    fail_if(r == EINA_FALSE);
421    r = eina_matrixsparse_data_idx_set(matrix, 3, 0, &data[3][0]);
422    fail_if(r == EINA_FALSE);
423    r = eina_matrixsparse_data_idx_set(matrix, 4, 6, &data[4][6]);
424    fail_if(r == EINA_FALSE);
425    r = eina_matrixsparse_data_idx_set(matrix, 4, 8, &data[4][8]);
426    fail_if(r == EINA_FALSE);
427    r = eina_matrixsparse_data_idx_set(matrix, 4, 2, &data[4][2]);
428    fail_if(r == EINA_FALSE);
429    r = eina_matrixsparse_data_idx_set(matrix, 4, 3, &data[4][3]);
430    fail_if(r == EINA_FALSE);
431    r = eina_matrixsparse_data_idx_set(matrix, 4, 7, &data[4][7]);
432    fail_if(r == EINA_FALSE);
433    r = eina_matrixsparse_data_idx_set(matrix, 6, 4, &data[6][4]);
434    fail_if(r == EINA_FALSE);
435    r = eina_matrixsparse_data_idx_set(matrix, 5, 3, &data[5][3]);
436    fail_if(r == EINA_FALSE);
437    r = eina_matrixsparse_data_idx_set(matrix, 6, 3, &data[6][3]);
438    fail_if(r == EINA_FALSE);
439    r = eina_matrixsparse_data_idx_set(matrix, 7, 3, &data[7][3]);
440    fail_if(r == EINA_FALSE);
441    r = eina_matrixsparse_data_idx_set(matrix, 0, 3, &data[0][3]);
442    fail_if(r == EINA_FALSE);
443    r = eina_matrixsparse_data_idx_set(matrix, 1, 3, &data[1][3]);
444    fail_if(r == EINA_FALSE);
445    r = eina_matrixsparse_data_idx_set(matrix, 1, 6, &data[1][6]);
446    fail_if(r == EINA_FALSE);
447    r = eina_matrixsparse_data_idx_set(matrix, 1, 9, &data[1][9]);
448    fail_if(r == EINA_FALSE);
449
450    it = eina_matrixsparse_iterator_new(matrix);
451    fail_if(it == NULL);
452    EINA_ITERATOR_FOREACH(it, cell)
453    {
454       fail_if(cell == NULL);
455       r = eina_matrixsparse_cell_position_get(cell, &row, &col);
456       fail_if(r == EINA_FALSE);
457
458       test1 = eina_matrixsparse_cell_data_get(cell);
459       fail_if(test1 == NULL || *test1 != data[row][col]);
460    }
461       eina_iterator_free(it);
462
463    it = eina_matrixsparse_iterator_complete_new(matrix);
464    fail_if(it == NULL);
465    EINA_ITERATOR_FOREACH(it, cell)
466    {
467          fail_if(cell == NULL);
468       r = eina_matrixsparse_cell_position_get(cell, &row, &col);
469          fail_if(r == EINA_FALSE);
470
471       test1 = eina_matrixsparse_cell_data_get(cell);
472       if (test1)
473          fail_if(*test1 != data[row][col]);
474    }
475          eina_iterator_free(it);
476
477    eina_matrixsparse_free(matrix);
478
479    eina_shutdown();
480 }
481 END_TEST
482
483 void
484 eina_test_matrixsparse(TCase *tc)
485 {
486    tcase_add_test(tc, eina_test_simple);
487    tcase_add_test(tc, eina_test_resize);
488    tcase_add_test(tc, eina_test_iterators);
489 }