Eobj: Use xref.
[profile/ivi/eobj.git] / tests / eobj_test_general.c
1 #ifdef HAVE_CONFIG_H
2 # include "config.h"
3 #endif
4
5 #include <stdio.h>
6
7 #include "eobj_suite.h"
8 #include "Eobj.h"
9
10 #include "class_simple.h"
11
12 START_TEST(eobj_simple)
13 {
14    eobj_init();
15    Eobj *obj = eobj_add(EOBJ_BASE_CLASS, NULL);
16    fail_if(obj);
17
18    eobj_shutdown();
19 }
20 END_TEST
21
22 START_TEST(eobj_xrefs)
23 {
24    eobj_init();
25    Eobj *obj = eobj_add(SIMPLE_CLASS, NULL);
26    Eobj *obj2 = eobj_add(SIMPLE_CLASS, NULL);
27    Eobj *obj3 = eobj_add(SIMPLE_CLASS, NULL);
28
29    eobj_xref(obj, obj2);
30    fail_if(eobj_ref_get(obj) != 2);
31    eobj_xref(obj, obj3);
32    fail_if(eobj_ref_get(obj) != 3);
33
34    eobj_xunref(obj, obj2);
35    fail_if(eobj_ref_get(obj) != 2);
36    eobj_xunref(obj, obj3);
37    fail_if(eobj_ref_get(obj) != 1);
38
39 #ifndef NDEBUG
40    eobj_xunref(obj, obj3);
41    fail_if(eobj_ref_get(obj) != 1);
42
43    eobj_xref(obj, obj2);
44    fail_if(eobj_ref_get(obj) != 2);
45
46    eobj_xunref(obj, obj3);
47    fail_if(eobj_ref_get(obj) != 2);
48
49    eobj_xunref(obj, obj2);
50    fail_if(eobj_ref_get(obj) != 1);
51 #endif
52
53    eobj_unref(obj);
54    eobj_unref(obj2);
55    eobj_unref(obj3);
56
57    eobj_shutdown();
58 }
59 END_TEST
60
61 START_TEST(eobj_weak_reference)
62 {
63    eobj_init();
64
65    Eobj *obj = eobj_add(SIMPLE_CLASS, NULL);
66    Eobj_Weak_Ref *wref = eobj_weak_ref_new(obj);
67    fail_if(!eobj_weak_ref_get(wref));
68
69    eobj_unref(obj);
70    fail_if(eobj_weak_ref_get(wref));
71
72    eobj_weak_ref_free(wref);
73
74    obj = eobj_add(SIMPLE_CLASS, NULL);
75    wref = eobj_weak_ref_new(obj);
76
77    eobj_ref(obj);
78    fail_if(!eobj_weak_ref_get(wref));
79
80    eobj_del(obj);
81    fail_if(eobj_weak_ref_get(wref));
82
83    eobj_unref(obj);
84    fail_if(eobj_weak_ref_get(wref));
85
86    eobj_weak_ref_free(wref);
87
88
89    eobj_shutdown();
90 }
91 END_TEST
92
93 START_TEST(eobj_op_errors)
94 {
95    eobj_init();
96    Eobj *obj = eobj_add(SIMPLE_CLASS, NULL);
97
98    /* Out of bounds op for a legal class. */
99    fail_if(eobj_do(obj, 0x00010111));
100
101    /* Ilegal class. */
102    fail_if(eobj_do(obj, 0x0F010111));
103
104    fail_if(eobj_ref_get(obj) != 1);
105
106    eobj_ref(obj);
107    fail_if(eobj_ref_get(obj) != 2);
108
109    eobj_ref(obj);
110    fail_if(eobj_ref_get(obj) != 3);
111
112    eobj_unref(obj);
113    fail_if(eobj_ref_get(obj) != 2);
114
115    eobj_unref(obj);
116    fail_if(eobj_ref_get(obj) != 1);
117
118    eobj_unref(obj);
119    eobj_shutdown();
120 }
121 END_TEST
122
123 static void
124 _fake_free_func(void *data)
125 {
126    if (!data)
127       return;
128
129    int *a = data;
130    ++*a;
131 }
132
133 START_TEST(eobj_generic_data)
134 {
135    eobj_init();
136    Eobj *obj = eobj_add(SIMPLE_CLASS, NULL);
137    void *data;
138
139    eobj_do(obj, EOBJ_BASE_DATA_SET("test1", (void *) 1, NULL));
140    eobj_do(obj, EOBJ_BASE_DATA_GET("test1", &data));
141    fail_if(1 != (int) data);
142    eobj_do(obj, EOBJ_BASE_DATA_DEL("test1"));
143    eobj_do(obj, EOBJ_BASE_DATA_GET("test1", &data));
144    fail_if(data);
145
146    eobj_do(obj, EOBJ_BASE_DATA_SET("test1", (void *) 1, NULL));
147    eobj_do(obj, EOBJ_BASE_DATA_SET("test2", (void *) 2, NULL));
148    eobj_do(obj, EOBJ_BASE_DATA_GET("test1", &data));
149    fail_if(1 != (int) data);
150    eobj_do(obj, EOBJ_BASE_DATA_GET("test2", &data));
151    fail_if(2 != (int) data);
152
153    eobj_do(obj, EOBJ_BASE_DATA_GET("test2", &data));
154    fail_if(2 != (int) data);
155    eobj_do(obj, EOBJ_BASE_DATA_DEL("test2"));
156    eobj_do(obj, EOBJ_BASE_DATA_GET("test2", &data));
157    fail_if(data);
158
159    eobj_do(obj, EOBJ_BASE_DATA_GET("test1", &data));
160    fail_if(1 != (int) data);
161    eobj_do(obj, EOBJ_BASE_DATA_DEL("test1"));
162    eobj_do(obj, EOBJ_BASE_DATA_GET("test1", &data));
163    fail_if(data);
164
165    int a = 0;
166    eobj_do(obj, EOBJ_BASE_DATA_SET("test3", &a, _fake_free_func));
167    eobj_do(obj, EOBJ_BASE_DATA_GET("test3", &data));
168    fail_if(&a != data);
169    eobj_do(obj, EOBJ_BASE_DATA_GET("test3", NULL));
170    eobj_do(obj, EOBJ_BASE_DATA_DEL("test3"));
171    fail_if(a != 1);
172
173    a = 0;
174    eobj_do(obj, EOBJ_BASE_DATA_SET("test3", &a, _fake_free_func));
175    eobj_do(obj, EOBJ_BASE_DATA_SET("test3", NULL, _fake_free_func));
176    fail_if(a != 1);
177    a = 0;
178    data = (void *) 123;
179    eobj_do(obj, EOBJ_BASE_DATA_SET(NULL, &a, _fake_free_func));
180    eobj_do(obj, EOBJ_BASE_DATA_GET(NULL, &data));
181    fail_if(data);
182    eobj_do(obj, EOBJ_BASE_DATA_DEL(NULL));
183
184    a = 0;
185    eobj_do(obj, EOBJ_BASE_DATA_SET("test3", &a, _fake_free_func));
186    eobj_do(obj, EOBJ_BASE_DATA_SET("test3", NULL, NULL));
187    fail_if(a != 1);
188    eobj_do(obj, EOBJ_BASE_DATA_SET("test3", &a, _fake_free_func));
189
190    eobj_unref(obj);
191    fail_if(a != 2);
192
193    eobj_shutdown();
194 }
195 END_TEST
196
197 void eobj_test_general(TCase *tc)
198 {
199    tcase_add_test(tc, eobj_generic_data);
200    tcase_add_test(tc, eobj_op_errors);
201    tcase_add_test(tc, eobj_simple);
202    tcase_add_test(tc, eobj_weak_reference);
203    tcase_add_test(tc, eobj_xrefs);
204 }