Line data Source code
1 : /**
2 : * @file
3 : *
4 : * @brief
5 : *
6 : * @copyright BSD License (see doc/LICENSE.md or https://www.libelektra.org)
7 : */
8 :
9 : #include <opmphm.c>
10 : #include <tests_internal.h>
11 :
12 : ssize_t ksCopyInternal (KeySet * ks, size_t to, size_t from);
13 :
14 2 : void test_keyNotFound (void)
15 : {
16 2 : KeySet * ks = ksNew (10, keyNew ("/a", KEY_END), keyNew ("/b", KEY_END), keyNew ("/c", KEY_END), keyNew ("/d", KEY_END),
17 : keyNew ("/e", KEY_END), keyNew ("/f", KEY_END), keyNew ("/g", KEY_END), keyNew ("/h", KEY_END),
18 : keyNew ("/i", KEY_END), keyNew ("/j", KEY_END), KS_END);
19 :
20 2 : Key * found = ksLookupByName (ks, "/nothere", KDB_O_OPMPHM);
21 2 : succeed_if (!found, "key found");
22 :
23 2 : exit_if_fail (ks->opmphm, "build opmphm");
24 4 : succeed_if (opmphmIsBuild (ks->opmphm), "build opmphm");
25 :
26 2 : ksDel (ks);
27 2 : }
28 :
29 2 : void test_Copy (void)
30 : {
31 : // ksDup
32 : {
33 2 : KeySet * ks = ksNew (10, keyNew ("/a", KEY_END), keyNew ("/b", KEY_END), keyNew ("/c", KEY_END), keyNew ("/d", KEY_END),
34 : keyNew ("/e", KEY_END), keyNew ("/f", KEY_END), keyNew ("/g", KEY_END), keyNew ("/h", KEY_END),
35 : keyNew ("/i", KEY_END), keyNew ("/j", KEY_END), KS_END);
36 :
37 : // trigger build
38 2 : Key * found = ksLookupByName (ks, "/a", KDB_O_OPMPHM);
39 2 : succeed_if (found, "key found");
40 :
41 2 : exit_if_fail (ks->opmphm, "build opmphm");
42 4 : succeed_if (opmphmIsBuild (ks->opmphm), "build opmphm");
43 :
44 2 : KeySet * copy = ksDup (ks);
45 2 : succeed_if (copy, "copy");
46 :
47 : // opmphm should be build
48 2 : exit_if_fail (copy->opmphm, "build opmphm");
49 4 : succeed_if (opmphmIsBuild (copy->opmphm), "build opmphm");
50 :
51 : // test opmphm
52 : Key * iter;
53 2 : ksRewind (copy);
54 24 : while ((iter = ksNext (copy)))
55 : {
56 20 : Key * f = ksLookup (copy, iter, KDB_O_OPMPHM);
57 20 : succeed_if (f, "key found");
58 : }
59 :
60 : // cleanup
61 2 : ksDel (ks);
62 2 : ksDel (copy);
63 : }
64 : // ksDeepDup
65 : {
66 2 : KeySet * ks = ksNew (10, keyNew ("/a", KEY_END), keyNew ("/b", KEY_END), keyNew ("/c", KEY_END), keyNew ("/d", KEY_END),
67 : keyNew ("/e", KEY_END), keyNew ("/f", KEY_END), keyNew ("/g", KEY_END), keyNew ("/h", KEY_END),
68 : keyNew ("/i", KEY_END), keyNew ("/j", KEY_END), KS_END);
69 :
70 : // trigger build
71 2 : Key * found = ksLookupByName (ks, "/a", KDB_O_OPMPHM);
72 2 : succeed_if (found, "key found");
73 :
74 2 : exit_if_fail (ks->opmphm, "build opmphm");
75 4 : succeed_if (opmphmIsBuild (ks->opmphm), "build opmphm");
76 :
77 2 : KeySet * copy = ksDeepDup (ks);
78 2 : succeed_if (copy, "copy");
79 :
80 : // opmphm should be build
81 2 : exit_if_fail (copy->opmphm, "build opmphm");
82 4 : succeed_if (opmphmIsBuild (copy->opmphm), "build opmphm");
83 :
84 : // test opmphm
85 : Key * iter;
86 2 : ksRewind (copy);
87 24 : while ((iter = ksNext (copy)))
88 : {
89 20 : Key * f = ksLookup (copy, iter, KDB_O_OPMPHM);
90 20 : succeed_if (f, "key found");
91 : }
92 :
93 : // cleanup
94 2 : ksDel (ks);
95 2 : ksDel (copy);
96 : }
97 : // ksCopy
98 : {
99 2 : KeySet * ks = ksNew (10, keyNew ("/a", KEY_END), keyNew ("/b", KEY_END), keyNew ("/c", KEY_END), keyNew ("/d", KEY_END),
100 : keyNew ("/e", KEY_END), keyNew ("/f", KEY_END), keyNew ("/g", KEY_END), keyNew ("/h", KEY_END),
101 : keyNew ("/i", KEY_END), keyNew ("/j", KEY_END), KS_END);
102 :
103 : // trigger build
104 2 : Key * found = ksLookupByName (ks, "/a", KDB_O_OPMPHM);
105 2 : succeed_if (found, "key found");
106 :
107 2 : exit_if_fail (ks->opmphm, "build opmphm");
108 4 : succeed_if (opmphmIsBuild (ks->opmphm), "build opmphm");
109 :
110 2 : KeySet * copy = ksNew (0, KS_END);
111 2 : succeed_if (ksCopy (copy, ks) == 1, "copy");
112 :
113 : // opmphm should be build
114 2 : exit_if_fail (copy->opmphm, "build opmphm");
115 4 : succeed_if (opmphmIsBuild (copy->opmphm), "build opmphm");
116 :
117 : // test opmphm
118 : Key * iter;
119 2 : ksRewind (copy);
120 24 : while ((iter = ksNext (copy)))
121 : {
122 20 : Key * f = ksLookup (copy, iter, KDB_O_OPMPHM);
123 20 : succeed_if (f, "key found");
124 : }
125 :
126 : // cleanup
127 2 : ksDel (ks);
128 2 : ksDel (copy);
129 : }
130 : // test not build copy
131 : {
132 2 : KeySet * ks = ksNew (10, keyNew ("/a", KEY_END), keyNew ("/b", KEY_END), keyNew ("/c", KEY_END), keyNew ("/d", KEY_END),
133 : keyNew ("/e", KEY_END), keyNew ("/f", KEY_END), keyNew ("/g", KEY_END), keyNew ("/h", KEY_END),
134 : keyNew ("/i", KEY_END), keyNew ("/j", KEY_END), KS_END);
135 :
136 2 : KeySet * copy = ksDup (ks);
137 2 : succeed_if (copy, "copy");
138 :
139 : // opmphm should not be build
140 2 : succeed_if (!copy->opmphm, "not build opmphm");
141 :
142 : // cleanup
143 2 : ksDel (ks);
144 2 : ksDel (copy);
145 : }
146 2 : }
147 :
148 2 : void test_Invalidate (void)
149 : {
150 : // ksClose
151 : {
152 2 : KeySet * ks = ksNew (10, keyNew ("/a", KEY_END), keyNew ("/b", KEY_END), keyNew ("/c", KEY_END), keyNew ("/d", KEY_END),
153 : keyNew ("/e", KEY_END), keyNew ("/f", KEY_END), keyNew ("/g", KEY_END), keyNew ("/h", KEY_END),
154 : keyNew ("/i", KEY_END), keyNew ("/j", KEY_END), KS_END);
155 :
156 : // trigger build
157 2 : Key * found = ksLookupByName (ks, "/a", KDB_O_OPMPHM);
158 2 : succeed_if (found, "key found");
159 :
160 2 : exit_if_fail (ks->opmphm, "build opmphm");
161 4 : succeed_if (opmphmIsBuild (ks->opmphm), "build opmphm");
162 :
163 2 : succeed_if (ksClose (ks) == 0, "invalidate");
164 :
165 2 : exit_if_fail (ks->opmphm, "build opmphm");
166 4 : succeed_if (!opmphmIsBuild (ks->opmphm), "empty opmphm");
167 :
168 : // cleanup
169 2 : ksDel (ks);
170 : }
171 : // ksClear
172 : {
173 2 : KeySet * ks = ksNew (10, keyNew ("/a", KEY_END), keyNew ("/b", KEY_END), keyNew ("/c", KEY_END), keyNew ("/d", KEY_END),
174 : keyNew ("/e", KEY_END), keyNew ("/f", KEY_END), keyNew ("/g", KEY_END), keyNew ("/h", KEY_END),
175 : keyNew ("/i", KEY_END), keyNew ("/j", KEY_END), KS_END);
176 :
177 : // trigger build
178 2 : Key * found = ksLookupByName (ks, "/a", KDB_O_OPMPHM);
179 2 : succeed_if (found, "key found");
180 :
181 2 : exit_if_fail (ks->opmphm, "build opmphm");
182 4 : succeed_if (opmphmIsBuild (ks->opmphm), "build opmphm");
183 :
184 2 : succeed_if (ksClear (ks) == 0, "invalidate");
185 :
186 2 : exit_if_fail (ks->opmphm, "build opmphm");
187 4 : succeed_if (!opmphmIsBuild (ks->opmphm), "empty opmphm");
188 :
189 : // cleanup
190 2 : ksDel (ks);
191 : }
192 : // ksAppendKey
193 : {
194 2 : KeySet * ks = ksNew (10, keyNew ("/a", KEY_END), keyNew ("/b", KEY_END), keyNew ("/c", KEY_END), keyNew ("/d", KEY_END),
195 : keyNew ("/e", KEY_END), keyNew ("/f", KEY_END), keyNew ("/g", KEY_END), keyNew ("/h", KEY_END),
196 : keyNew ("/i", KEY_END), keyNew ("/j", KEY_END), KS_END);
197 :
198 : // trigger build
199 2 : Key * found = ksLookupByName (ks, "/a", KDB_O_OPMPHM);
200 2 : succeed_if (found, "key found");
201 :
202 2 : exit_if_fail (ks->opmphm, "build opmphm");
203 4 : succeed_if (opmphmIsBuild (ks->opmphm), "build opmphm");
204 :
205 : // insert existing one
206 2 : succeed_if (ksAppendKey (ks, keyNew ("/a", KEY_END)) > 0, "not invalidate");
207 :
208 2 : exit_if_fail (ks->opmphm, "build opmphm");
209 4 : succeed_if (opmphmIsBuild (ks->opmphm), "build opmphm");
210 :
211 : // insert new one
212 2 : succeed_if (ksAppendKey (ks, keyNew ("/k", KEY_END)) > 0, "invalidate");
213 :
214 2 : exit_if_fail (ks->opmphm, "build opmphm");
215 4 : succeed_if (!opmphmIsBuild (ks->opmphm), "empty opmphm");
216 :
217 : // cleanup
218 2 : ksDel (ks);
219 : }
220 : // ksAppend
221 : {
222 2 : KeySet * ks = ksNew (10, keyNew ("/a", KEY_END), keyNew ("/b", KEY_END), keyNew ("/c", KEY_END), keyNew ("/d", KEY_END),
223 : keyNew ("/e", KEY_END), keyNew ("/f", KEY_END), keyNew ("/g", KEY_END), keyNew ("/h", KEY_END),
224 : keyNew ("/i", KEY_END), keyNew ("/j", KEY_END), KS_END);
225 :
226 : // subset of ks
227 2 : KeySet * appendSub = ksNew (10, keyNew ("/a", KEY_END), keyNew ("/b", KEY_END), keyNew ("/c", KEY_END),
228 : keyNew ("/d", KEY_END), keyNew ("/e", KEY_END), keyNew ("/f", KEY_END), KS_END);
229 :
230 : // super set of ks
231 2 : KeySet * appendSuper =
232 2 : ksNew (10, keyNew ("/a", KEY_END), keyNew ("/b", KEY_END), keyNew ("/c", KEY_END), keyNew ("/d", KEY_END),
233 : keyNew ("/e", KEY_END), keyNew ("/f", KEY_END), keyNew ("/k", KEY_END), KS_END);
234 :
235 : // trigger build
236 2 : Key * found = ksLookupByName (ks, "/a", KDB_O_OPMPHM);
237 2 : succeed_if (found, "key found");
238 :
239 2 : exit_if_fail (ks->opmphm, "build opmphm");
240 4 : succeed_if (opmphmIsBuild (ks->opmphm), "build opmphm");
241 :
242 2 : succeed_if (ksAppend (ks, appendSub) > 0, "non invalidate");
243 :
244 2 : exit_if_fail (ks->opmphm, "build opmphm");
245 4 : succeed_if (opmphmIsBuild (ks->opmphm), "build opmphm");
246 :
247 2 : succeed_if (ksAppend (ks, appendSuper) > 0, "invalidate");
248 :
249 2 : exit_if_fail (ks->opmphm, "build opmphm");
250 4 : succeed_if (!opmphmIsBuild (ks->opmphm), "empty opmphm");
251 :
252 : // cleanup
253 2 : ksDel (ks);
254 2 : ksDel (appendSub);
255 2 : ksDel (appendSuper);
256 : }
257 : // ksCopyInternal
258 : {
259 2 : KeySet * ks = ksNew (20, keyNew ("/a", KEY_END), keyNew ("/b", KEY_END), keyNew ("/c", KEY_END), keyNew ("/d", KEY_END),
260 : keyNew ("/e", KEY_END), keyNew ("/f", KEY_END), keyNew ("/g", KEY_END), keyNew ("/h", KEY_END),
261 : keyNew ("/i", KEY_END), keyNew ("/j", KEY_END), KS_END);
262 :
263 : // trigger build
264 2 : Key * found = ksLookupByName (ks, "/a", KDB_O_OPMPHM);
265 2 : succeed_if (found, "key found");
266 :
267 2 : exit_if_fail (ks->opmphm, "build opmphm");
268 4 : succeed_if (opmphmIsBuild (ks->opmphm), "build opmphm");
269 :
270 2 : succeed_if (ksCopyInternal (ks, 2, 2) > 0, "invalidate");
271 :
272 2 : exit_if_fail (ks->opmphm, "build opmphm");
273 4 : succeed_if (!opmphmIsBuild (ks->opmphm), "empty opmphm");
274 :
275 : // cleanup
276 2 : ksDel (ks);
277 : }
278 : // ksCut
279 : {
280 2 : KeySet * ks = ksNew (10, keyNew ("/a", KEY_END), keyNew ("/b", KEY_END), keyNew ("/c", KEY_END), keyNew ("/d", KEY_END),
281 : keyNew ("/e", KEY_END), keyNew ("/f", KEY_END), keyNew ("/g", KEY_END), keyNew ("/h", KEY_END),
282 : keyNew ("/i", KEY_END), keyNew ("/j", KEY_END), KS_END);
283 :
284 : // trigger build
285 2 : Key * found = ksLookupByName (ks, "/a", KDB_O_OPMPHM);
286 2 : succeed_if (found, "key found");
287 :
288 2 : exit_if_fail (ks->opmphm, "build opmphm");
289 4 : succeed_if (opmphmIsBuild (ks->opmphm), "build opmphm");
290 :
291 2 : Key * cutPoint = keyNew ("/b", KEY_END);
292 2 : KeySet * cut = ksCut (ks, cutPoint);
293 2 : succeed_if (cut, "invalidate");
294 :
295 2 : exit_if_fail (ks->opmphm, "build opmphm");
296 4 : succeed_if (!opmphmIsBuild (ks->opmphm), "empty opmphm");
297 :
298 : // cleanup
299 2 : ksDel (ks);
300 2 : ksDel (cut);
301 2 : keyDel (cutPoint);
302 : }
303 : // ksPop
304 : {
305 2 : KeySet * ks = ksNew (10, keyNew ("/a", KEY_END), keyNew ("/b", KEY_END), keyNew ("/c", KEY_END), keyNew ("/d", KEY_END),
306 : keyNew ("/e", KEY_END), keyNew ("/f", KEY_END), keyNew ("/g", KEY_END), keyNew ("/h", KEY_END),
307 : keyNew ("/i", KEY_END), keyNew ("/j", KEY_END), KS_END);
308 :
309 : // trigger build
310 2 : Key * found = ksLookupByName (ks, "/a", KDB_O_OPMPHM);
311 2 : succeed_if (found, "key found");
312 :
313 2 : exit_if_fail (ks->opmphm, "build opmphm");
314 4 : succeed_if (opmphmIsBuild (ks->opmphm), "build opmphm");
315 :
316 2 : Key * popKey = ksPop (ks);
317 2 : succeed_if (popKey, "invalidate");
318 :
319 2 : exit_if_fail (ks->opmphm, "build opmphm");
320 4 : succeed_if (!opmphmIsBuild (ks->opmphm), "empty opmphm");
321 :
322 : // cleanup
323 2 : ksDel (ks);
324 2 : keyDel (popKey);
325 : }
326 : // elektraKsPopAtCursor
327 : {
328 2 : KeySet * ks = ksNew (10, keyNew ("/a", KEY_END), keyNew ("/b", KEY_END), keyNew ("/c", KEY_END), keyNew ("/d", KEY_END),
329 : keyNew ("/e", KEY_END), keyNew ("/f", KEY_END), keyNew ("/g", KEY_END), keyNew ("/h", KEY_END),
330 : keyNew ("/i", KEY_END), keyNew ("/j", KEY_END), KS_END);
331 :
332 : // trigger build
333 2 : Key * found = ksLookupByName (ks, "/a", KDB_O_OPMPHM);
334 2 : succeed_if (found, "key found");
335 :
336 2 : exit_if_fail (ks->opmphm, "build opmphm");
337 4 : succeed_if (opmphmIsBuild (ks->opmphm), "build opmphm");
338 :
339 2 : Key * popKey = elektraKsPopAtCursor (ks, 1);
340 2 : succeed_if (popKey, "invalidate");
341 :
342 2 : exit_if_fail (ks->opmphm, "build opmphm");
343 4 : succeed_if (!opmphmIsBuild (ks->opmphm), "empty opmphm");
344 :
345 : // cleanup
346 2 : ksDel (ks);
347 2 : keyDel (popKey);
348 : }
349 2 : }
350 :
351 2 : int main (int argc, char ** argv)
352 : {
353 2 : printf ("KS OPMPHM TESTS\n");
354 2 : printf ("==================\n\n");
355 :
356 2 : init (argc, argv);
357 :
358 2 : test_keyNotFound ();
359 2 : test_Copy ();
360 2 : test_Invalidate ();
361 :
362 2 : print_result ("test_ks_opmphm");
363 :
364 2 : return nbError;
365 : }
|