u16id: Add maps for identifiers id of 16 bits
[src/app-framework-binder.git] / src / tests / u16id / test-u16id.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <stdarg.h>
4 #include <errno.h>
5 #include <string.h>
6 #include <stdint.h>
7
8 #include <check.h>
9
10 #include "u16id.h"
11
12 /*********************************************************************/
13
14 #define S  29
15
16 void cbi2p(void*closure, uint16_t id, void *ptr)
17 {
18         int *y = closure;
19         int ni = y[0];
20         ck_assert((ni >> id) & 1);
21         ck_assert((uintptr_t)ptr == (uintptr_t)(ni + id));
22         y[1]++;
23 }
24
25 void test_i2ptr(struct u16id2ptr **pi2p)
26 {
27         int i, ni, n, x, y[2];
28         uint16_t j;
29         void *p;
30
31         i = 0;
32         while (!(i >> S)) {
33                 ni = i * 3 + 1;
34                 n = 0;
35                 for (j = 0 ; j < S ; j++) {
36                         if ((i >> j) & 1) {
37                                 ck_assert_int_eq(1, u16id2ptr_has(*pi2p, j));
38                                 ck_assert_int_eq(0, u16id2ptr_get(*pi2p, j, &p));
39                                 ck_assert((uintptr_t)p == (uintptr_t)(i + j));
40                                 ck_assert_int_eq(-1, u16id2ptr_add(pi2p, j, p));
41                                 ck_assert_int_eq(0, u16id2ptr_put(*pi2p, j, p));
42                         } else {
43                                 ck_assert_int_eq(0, u16id2ptr_has(*pi2p, j));
44                                 ck_assert_int_eq(-1, u16id2ptr_get(*pi2p, j, &p));
45                                 ck_assert_int_eq(-1, u16id2ptr_put(*pi2p, j, p));
46                         }
47                         if ((ni >> j) & 1) {
48                                 p = (void*)(uintptr_t)(ni + j);
49                                 ck_assert_int_eq(0, u16id2ptr_set(pi2p, j, p));
50                                 n++;
51                         } else if ((i >> j) & 1) {
52                                 ck_assert_int_eq(0, u16id2ptr_drop(pi2p, j, &p));
53                                 ck_assert((uintptr_t)p == (uintptr_t)(i + j));
54                         } else {
55                                 ck_assert_int_eq(-1, u16id2ptr_drop(pi2p, j, NULL));
56                         }
57                 }
58                 ck_assert_int_eq(n, u16id2ptr_count(*pi2p));
59                 for (x = 0 ; x < n ; x++) {
60                         ck_assert_int_eq(0, u16id2ptr_at(*pi2p, x, &j, &p));
61                         ck_assert((ni >> j) & 1);
62                         ck_assert((uintptr_t)p == (uintptr_t)(ni + j));
63                 }
64                 y[0] = ni;
65                 y[1] = 0;
66                 u16id2ptr_forall(*pi2p, cbi2p, y);
67                 ck_assert_int_eq(n, y[1]);
68                 i = ni;
69         }
70 }
71
72 START_TEST (check_u16id2ptr)
73 {
74         struct u16id2ptr *i2p;
75
76         i2p = NULL;
77         test_i2ptr(&i2p);
78         ck_assert(i2p);
79         u16id2ptr_destroy(&i2p);
80         ck_assert(!i2p);
81         ck_assert_int_eq(0, u16id2ptr_create(&i2p));
82         test_i2ptr(&i2p);
83         ck_assert(i2p);
84         u16id2ptr_destroy(&i2p);
85         ck_assert(!i2p);
86 }
87 END_TEST
88
89 /*********************************************************************/
90
91 void test_i2bool(struct u16id2bool **pi2b)
92 {
93         int i, j, ni, v;
94         uint16_t x;
95
96         i = 0;
97         while (!(i >> S)) {
98                 ni = i * 3 + 1;
99                 for (j = 0 ; j < S ; j++) {
100                         x = (uint16_t)(j * 5);
101                         v = (i >> j) & 1;
102                         ck_assert_int_eq(v, u16id2bool_get(*pi2b, x));
103                         ck_assert_int_eq(v, u16id2bool_set(pi2b, x, (ni >> j) & 1));
104                 }
105                 i = ni;
106         }
107         for (j = 0 ; j < S ; j++) {
108                 x = (uint16_t)(j * 5);
109                 v = (i >> j) & 1;
110                 ck_assert_int_eq(v, u16id2bool_get(*pi2b, x));
111                 ck_assert_int_eq(v, u16id2bool_set(pi2b, x, 0));
112         }
113 }
114
115 START_TEST (check_u16id2bool)
116 {
117         struct u16id2bool *i2b;
118
119         i2b = NULL;
120         test_i2bool(&i2b);
121         ck_assert(i2b);
122         u16id2bool_destroy(&i2b);
123         ck_assert(!i2b);
124         ck_assert_int_eq(0, u16id2bool_create(&i2b));
125         test_i2bool(&i2b);
126         ck_assert(i2b);
127         u16id2bool_destroy(&i2b);
128         ck_assert(!i2b);
129 }
130 END_TEST
131
132 /*********************************************************************/
133
134 static Suite *suite;
135 static TCase *tcase;
136
137 void mksuite(const char *name) { suite = suite_create(name); }
138 void addtcase(const char *name) { tcase = tcase_create(name); suite_add_tcase(suite, tcase); tcase_set_timeout(tcase, 120); }
139 void addtest(TFun fun) { tcase_add_test(tcase, fun); }
140 int srun()
141 {
142         int nerr;
143         SRunner *srunner = srunner_create(suite);
144         srunner_run_all(srunner, CK_NORMAL);
145         nerr = srunner_ntests_failed(srunner);
146         srunner_free(srunner);
147         return nerr;
148 }
149
150 int main(int ac, char **av)
151 {
152         mksuite("u16id");
153                 addtcase("u16id");
154                         addtest(check_u16id2ptr);
155                         addtest(check_u16id2bool);
156         return !!srun();
157 }