1 /* Copyright (C) 2013-2020 Roland Lutz
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2 of the License, or
6 (at your option) any later version.
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software Foundation,
15 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
21 static void assert_selected_objects_0(
22 xorn_revision_t rev
, xorn_selection_t sel
)
24 xorn_object_t
*objects
;
27 assert(xorn_get_selected_objects(rev
, sel
, &objects
, &count
) == 0);
31 assert(xorn_selection_is_empty(rev
, sel
) == true);
34 static void assert_selected_objects_1(
35 xorn_revision_t rev
, xorn_selection_t sel
, xorn_object_t ob
)
37 xorn_object_t
*objects
;
40 assert(xorn_get_selected_objects(rev
, sel
, &objects
, &count
) == 0);
41 assert(objects
!= NULL
);
43 assert(objects
[0] == ob
);
46 assert(xorn_selection_is_empty(rev
, sel
) == false);
49 static void assert_selected_objects_2(
50 xorn_revision_t rev
, xorn_selection_t sel
,
51 xorn_object_t ob0
, xorn_object_t ob1
)
53 xorn_object_t
*objects
;
56 assert(xorn_get_selected_objects(rev
, sel
, &objects
, &count
) == 0);
57 assert(objects
!= NULL
);
59 assert((objects
[0] == ob0
&& objects
[1] == ob1
) ||
60 (objects
[0] == ob1
&& objects
[1] == ob0
));
63 assert(xorn_selection_is_empty(rev
, sel
) == false);
66 static void assert_selected_objects_3(
67 xorn_revision_t rev
, xorn_selection_t sel
,
68 xorn_object_t ob0
, xorn_object_t ob1
, xorn_object_t ob2
)
70 xorn_object_t
*objects
;
73 assert(xorn_get_selected_objects(rev
, sel
, &objects
, &count
) == 0);
74 assert(objects
!= NULL
);
77 (objects
[0] == ob0
&& objects
[1] == ob1
&& objects
[2] == ob2
) ||
78 (objects
[0] == ob0
&& objects
[1] == ob2
&& objects
[2] == ob1
) ||
79 (objects
[0] == ob1
&& objects
[1] == ob0
&& objects
[2] == ob2
) ||
80 (objects
[0] == ob1
&& objects
[1] == ob2
&& objects
[2] == ob0
) ||
81 (objects
[0] == ob2
&& objects
[1] == ob0
&& objects
[2] == ob1
) ||
82 (objects
[0] == ob2
&& objects
[1] == ob1
&& objects
[2] == ob0
));
85 assert(xorn_selection_is_empty(rev
, sel
) == false);
90 xorn_revision_t rev0
, rev1
, rev2
, rev3
;
91 xorn_object_t ob0
, ob1a
, ob1b
;
93 xorn_selection_t sel
, sel1
, sel2
;
95 setup(&rev0
, &rev1
, &rev2
, &rev3
, &ob0
, &ob1a
, &ob1b
);
99 sel
= xorn_select_none();
101 assert_selected_objects_0(rev0
, sel
);
102 assert_selected_objects_0(rev1
, sel
);
103 assert_selected_objects_0(rev2
, sel
);
104 assert_selected_objects_0(rev3
, sel
);
105 xorn_free_selection(sel
);
109 sel
= xorn_select_object(ob0
);
111 assert_selected_objects_0(rev0
, sel
);
112 assert_selected_objects_1(rev1
, sel
, ob0
);
113 assert_selected_objects_1(rev2
, sel
, ob0
);
114 assert_selected_objects_1(rev3
, sel
, ob0
);
115 xorn_free_selection(sel
);
117 sel
= xorn_select_object(ob1a
);
119 assert_selected_objects_0(rev0
, sel
);
120 assert_selected_objects_0(rev1
, sel
);
121 assert_selected_objects_1(rev2
, sel
, ob1a
);
122 assert_selected_objects_0(rev3
, sel
);
123 xorn_free_selection(sel
);
125 sel
= xorn_select_object(ob1b
);
127 assert_selected_objects_0(rev0
, sel
);
128 assert_selected_objects_0(rev1
, sel
);
129 assert_selected_objects_1(rev2
, sel
, ob1b
);
130 assert_selected_objects_1(rev3
, sel
, ob1b
);
131 xorn_free_selection(sel
);
135 sel
= xorn_select_all(rev0
);
137 assert_selected_objects_0(rev0
, sel
);
138 assert_selected_objects_0(rev1
, sel
);
139 assert_selected_objects_0(rev2
, sel
);
140 assert_selected_objects_0(rev3
, sel
);
141 xorn_free_selection(sel
);
143 sel
= xorn_select_all(rev1
);
145 assert_selected_objects_0(rev0
, sel
);
146 assert_selected_objects_1(rev1
, sel
, ob0
);
147 assert_selected_objects_1(rev2
, sel
, ob0
);
148 assert_selected_objects_1(rev3
, sel
, ob0
);
149 xorn_free_selection(sel
);
151 sel
= xorn_select_all(rev2
);
153 assert_selected_objects_0(rev0
, sel
);
154 assert_selected_objects_1(rev1
, sel
, ob0
);
155 assert_selected_objects_3(rev2
, sel
, ob0
, ob1a
, ob1b
);
156 assert_selected_objects_2(rev3
, sel
, ob0
, ob1b
);
157 xorn_free_selection(sel
);
159 sel
= xorn_select_all(rev3
);
161 assert_selected_objects_0(rev0
, sel
);
162 assert_selected_objects_1(rev1
, sel
, ob0
);
163 assert_selected_objects_2(rev2
, sel
, ob0
, ob1b
);
164 assert_selected_objects_2(rev3
, sel
, ob0
, ob1b
);
165 xorn_free_selection(sel
);
167 /* select all except */
169 sel1
= xorn_select_none();
170 assert(sel1
!= NULL
);
171 sel
= xorn_select_all_except(rev0
, sel1
);
173 assert_selected_objects_0(rev0
, sel
);
174 assert_selected_objects_0(rev1
, sel
);
175 assert_selected_objects_0(rev2
, sel
);
176 assert_selected_objects_0(rev3
, sel
);
177 xorn_free_selection(sel
);
179 sel
= xorn_select_all_except(rev1
, sel1
);
181 assert_selected_objects_0(rev0
, sel
);
182 assert_selected_objects_1(rev1
, sel
, ob0
);
183 assert_selected_objects_1(rev2
, sel
, ob0
);
184 assert_selected_objects_1(rev3
, sel
, ob0
);
185 xorn_free_selection(sel
);
187 sel
= xorn_select_all_except(rev2
, sel1
);
189 assert_selected_objects_0(rev0
, sel
);
190 assert_selected_objects_1(rev1
, sel
, ob0
);
191 assert_selected_objects_3(rev2
, sel
, ob0
, ob1a
, ob1b
);
192 assert_selected_objects_2(rev3
, sel
, ob0
, ob1b
);
193 xorn_free_selection(sel
);
195 sel
= xorn_select_all_except(rev3
, sel1
);
197 assert_selected_objects_0(rev0
, sel
);
198 assert_selected_objects_1(rev1
, sel
, ob0
);
199 assert_selected_objects_2(rev2
, sel
, ob0
, ob1b
);
200 assert_selected_objects_2(rev3
, sel
, ob0
, ob1b
);
201 xorn_free_selection(sel
);
202 xorn_free_selection(sel1
);
204 sel1
= xorn_select_object(ob0
);
205 assert(sel1
!= NULL
);
206 sel
= xorn_select_all_except(rev0
, sel1
);
208 assert_selected_objects_0(rev0
, sel
);
209 assert_selected_objects_0(rev1
, sel
);
210 assert_selected_objects_0(rev2
, sel
);
211 assert_selected_objects_0(rev3
, sel
);
212 xorn_free_selection(sel
);
214 sel
= xorn_select_all_except(rev1
, sel1
);
216 assert_selected_objects_0(rev0
, sel
);
217 assert_selected_objects_0(rev1
, sel
);
218 assert_selected_objects_0(rev2
, sel
);
219 assert_selected_objects_0(rev3
, sel
);
220 xorn_free_selection(sel
);
222 sel
= xorn_select_all_except(rev2
, sel1
);
224 assert_selected_objects_0(rev0
, sel
);
225 assert_selected_objects_0(rev1
, sel
);
226 assert_selected_objects_2(rev2
, sel
, ob1a
, ob1b
);
227 assert_selected_objects_1(rev3
, sel
, ob1b
);
228 xorn_free_selection(sel
);
230 sel
= xorn_select_all_except(rev3
, sel1
);
232 assert_selected_objects_0(rev0
, sel
);
233 assert_selected_objects_0(rev1
, sel
);
234 assert_selected_objects_1(rev2
, sel
, ob1b
);
235 assert_selected_objects_1(rev3
, sel
, ob1b
);
236 xorn_free_selection(sel
);
237 xorn_free_selection(sel1
);
239 sel1
= xorn_select_all(rev3
);
240 assert(sel1
!= NULL
);
241 sel
= xorn_select_all_except(rev0
, sel1
);
243 assert_selected_objects_0(rev0
, sel
);
244 assert_selected_objects_0(rev1
, sel
);
245 assert_selected_objects_0(rev2
, sel
);
246 assert_selected_objects_0(rev3
, sel
);
247 xorn_free_selection(sel
);
249 sel
= xorn_select_all_except(rev1
, sel1
);
251 assert_selected_objects_0(rev0
, sel
);
252 assert_selected_objects_0(rev1
, sel
);
253 assert_selected_objects_0(rev2
, sel
);
254 assert_selected_objects_0(rev3
, sel
);
255 xorn_free_selection(sel
);
257 sel
= xorn_select_all_except(rev2
, sel1
);
259 assert_selected_objects_0(rev0
, sel
);
260 assert_selected_objects_0(rev1
, sel
);
261 assert_selected_objects_1(rev2
, sel
, ob1a
);
262 assert_selected_objects_0(rev3
, sel
);
263 xorn_free_selection(sel
);
265 sel
= xorn_select_all_except(rev3
, sel1
);
267 assert_selected_objects_0(rev0
, sel
);
268 assert_selected_objects_0(rev1
, sel
);
269 assert_selected_objects_0(rev2
, sel
);
270 assert_selected_objects_0(rev3
, sel
);
271 xorn_free_selection(sel
);
272 xorn_free_selection(sel1
);
274 /* select including */
276 sel1
= xorn_select_all(rev3
);
277 assert(sel1
!= NULL
);
278 sel
= xorn_select_including(sel1
, ob0
);
280 assert_selected_objects_0(rev0
, sel
);
281 assert_selected_objects_1(rev1
, sel
, ob0
);
282 assert_selected_objects_2(rev2
, sel
, ob0
, ob1b
);
283 assert_selected_objects_2(rev3
, sel
, ob0
, ob1b
);
284 xorn_free_selection(sel
);
286 sel
= xorn_select_including(sel1
, ob1a
);
288 assert_selected_objects_0(rev0
, sel
);
289 assert_selected_objects_1(rev1
, sel
, ob0
);
290 assert_selected_objects_3(rev2
, sel
, ob0
, ob1a
, ob1b
);
291 assert_selected_objects_2(rev3
, sel
, ob0
, ob1b
);
292 xorn_free_selection(sel
);
294 sel
= xorn_select_including(sel1
, ob1b
);
296 assert_selected_objects_0(rev0
, sel
);
297 assert_selected_objects_1(rev1
, sel
, ob0
);
298 assert_selected_objects_2(rev2
, sel
, ob0
, ob1b
);
299 assert_selected_objects_2(rev3
, sel
, ob0
, ob1b
);
300 xorn_free_selection(sel
);
301 xorn_free_selection(sel1
);
303 /* select excluding */
305 sel1
= xorn_select_all(rev3
);
306 assert(sel1
!= NULL
);
307 sel
= xorn_select_excluding(sel1
, ob0
);
309 assert_selected_objects_0(rev0
, sel
);
310 assert_selected_objects_0(rev1
, sel
);
311 assert_selected_objects_1(rev2
, sel
, ob1b
);
312 assert_selected_objects_1(rev3
, sel
, ob1b
);
313 xorn_free_selection(sel
);
315 sel
= xorn_select_excluding(sel1
, ob1a
);
317 assert_selected_objects_0(rev0
, sel
);
318 assert_selected_objects_1(rev1
, sel
, ob0
);
319 assert_selected_objects_2(rev2
, sel
, ob0
, ob1b
);
320 assert_selected_objects_2(rev3
, sel
, ob0
, ob1b
);
321 xorn_free_selection(sel
);
323 sel
= xorn_select_excluding(sel1
, ob1b
);
325 assert_selected_objects_0(rev0
, sel
);
326 assert_selected_objects_1(rev1
, sel
, ob0
);
327 assert_selected_objects_1(rev2
, sel
, ob0
);
328 assert_selected_objects_1(rev3
, sel
, ob0
);
329 xorn_free_selection(sel
);
330 xorn_free_selection(sel1
);
334 sel1
= xorn_select_all(rev1
);
335 assert(sel1
!= NULL
);
336 sel2
= xorn_select_none();
337 assert(sel2
!= NULL
);
338 sel
= xorn_select_union(sel1
, sel2
);
340 assert_selected_objects_1(rev2
, sel
, ob0
);
341 xorn_free_selection(sel
);
342 xorn_free_selection(sel2
);
344 sel2
= xorn_select_object(ob1a
);
345 assert(sel2
!= NULL
);
346 sel
= xorn_select_union(sel1
, sel2
);
348 assert_selected_objects_2(rev2
, sel
, ob0
, ob1a
);
349 xorn_free_selection(sel
);
350 xorn_free_selection(sel2
);
352 sel2
= xorn_select_all(rev2
);
353 assert(sel2
!= NULL
);
354 sel
= xorn_select_union(sel1
, sel2
);
356 assert_selected_objects_3(rev2
, sel
, ob0
, ob1a
, ob1b
);
357 xorn_free_selection(sel
);
358 xorn_free_selection(sel2
);
360 sel2
= xorn_select_all(rev3
);
361 assert(sel2
!= NULL
);
362 sel
= xorn_select_union(sel1
, sel2
);
364 assert_selected_objects_2(rev2
, sel
, ob0
, ob1b
);
365 xorn_free_selection(sel
);
366 xorn_free_selection(sel2
);
367 sel2
= xorn_select_all_except(rev2
, sel1
);
368 assert(sel2
!= NULL
);
369 xorn_free_selection(sel1
);
371 sel2
= xorn_select_none();
372 assert(sel2
!= NULL
);
373 sel
= xorn_select_union(sel1
, sel2
);
375 assert_selected_objects_2(rev2
, sel
, ob1a
, ob1b
);
376 xorn_free_selection(sel
);
377 xorn_free_selection(sel2
);
379 sel2
= xorn_select_object(ob1a
);
380 assert(sel2
!= NULL
);
381 sel
= xorn_select_union(sel1
, sel2
);
383 assert_selected_objects_2(rev2
, sel
, ob1a
, ob1b
);
384 xorn_free_selection(sel
);
385 xorn_free_selection(sel2
);
387 sel2
= xorn_select_all(rev2
);
388 assert(sel2
!= NULL
);
389 sel
= xorn_select_union(sel1
, sel2
);
391 assert_selected_objects_3(rev2
, sel
, ob0
, ob1a
, ob1b
);
392 xorn_free_selection(sel
);
393 xorn_free_selection(sel2
);
395 sel2
= xorn_select_all(rev3
);
396 assert(sel2
!= NULL
);
397 sel
= xorn_select_union(sel1
, sel2
);
399 assert_selected_objects_3(rev2
, sel
, ob0
, ob1a
, ob1b
);
400 xorn_free_selection(sel
);
401 xorn_free_selection(sel2
);
402 xorn_free_selection(sel1
);
404 /* select intersection */
406 sel1
= xorn_select_all(rev1
);
407 assert(sel1
!= NULL
);
408 sel2
= xorn_select_none();
409 assert(sel2
!= NULL
);
410 sel
= xorn_select_intersection(sel1
, sel2
);
412 assert_selected_objects_0(rev2
, sel
);
413 xorn_free_selection(sel
);
414 xorn_free_selection(sel2
);
416 sel2
= xorn_select_object(ob1a
);
417 assert(sel2
!= NULL
);
418 sel
= xorn_select_intersection(sel1
, sel2
);
420 assert_selected_objects_0(rev2
, sel
);
421 xorn_free_selection(sel
);
422 xorn_free_selection(sel2
);
424 sel2
= xorn_select_all(rev2
);
425 assert(sel2
!= NULL
);
426 sel
= xorn_select_intersection(sel1
, sel2
);
428 assert_selected_objects_1(rev2
, sel
, ob0
);
429 xorn_free_selection(sel
);
430 xorn_free_selection(sel2
);
432 sel2
= xorn_select_all(rev3
);
433 assert(sel2
!= NULL
);
434 sel
= xorn_select_intersection(sel1
, sel2
);
436 assert_selected_objects_1(rev2
, sel
, ob0
);
437 xorn_free_selection(sel
);
438 xorn_free_selection(sel2
);
439 sel2
= xorn_select_all_except(rev2
, sel1
);
440 assert(sel2
!= NULL
);
441 xorn_free_selection(sel1
);
443 sel2
= xorn_select_none();
444 assert(sel2
!= NULL
);
445 sel
= xorn_select_intersection(sel1
, sel2
);
447 assert_selected_objects_0(rev2
, sel
);
448 xorn_free_selection(sel
);
449 xorn_free_selection(sel2
);
451 sel2
= xorn_select_object(ob1a
);
452 assert(sel2
!= NULL
);
453 sel
= xorn_select_intersection(sel1
, sel2
);
455 assert_selected_objects_1(rev2
, sel
, ob1a
);
456 xorn_free_selection(sel
);
457 xorn_free_selection(sel2
);
459 sel2
= xorn_select_all(rev2
);
460 assert(sel2
!= NULL
);
461 sel
= xorn_select_intersection(sel1
, sel2
);
463 assert_selected_objects_2(rev2
, sel
, ob1a
, ob1b
);
464 xorn_free_selection(sel
);
465 xorn_free_selection(sel2
);
467 sel2
= xorn_select_all(rev3
);
468 assert(sel2
!= NULL
);
469 sel
= xorn_select_intersection(sel1
, sel2
);
471 assert_selected_objects_1(rev2
, sel
, ob1b
);
472 xorn_free_selection(sel
);
473 xorn_free_selection(sel2
);
474 xorn_free_selection(sel1
);
476 /* select difference */
478 sel1
= xorn_select_all(rev1
);
479 assert(sel1
!= NULL
);
480 sel2
= xorn_select_none();
481 assert(sel2
!= NULL
);
482 sel
= xorn_select_difference(sel1
, sel2
);
484 assert_selected_objects_1(rev2
, sel
, ob0
);
485 xorn_free_selection(sel
);
486 xorn_free_selection(sel2
);
488 sel2
= xorn_select_object(ob1a
);
489 assert(sel2
!= NULL
);
490 sel
= xorn_select_difference(sel1
, sel2
);
492 assert_selected_objects_1(rev2
, sel
, ob0
);
493 xorn_free_selection(sel
);
494 xorn_free_selection(sel2
);
496 sel2
= xorn_select_all(rev2
);
497 assert(sel2
!= NULL
);
498 sel
= xorn_select_difference(sel1
, sel2
);
500 assert_selected_objects_0(rev2
, sel
);
501 xorn_free_selection(sel
);
502 xorn_free_selection(sel2
);
504 sel2
= xorn_select_all(rev3
);
505 assert(sel2
!= NULL
);
506 sel
= xorn_select_difference(sel1
, sel2
);
508 assert_selected_objects_0(rev2
, sel
);
509 xorn_free_selection(sel
);
510 xorn_free_selection(sel2
);
511 sel2
= xorn_select_all_except(rev2
, sel1
);
512 assert(sel2
!= NULL
);
513 xorn_free_selection(sel1
);
515 sel2
= xorn_select_none();
516 assert(sel2
!= NULL
);
517 sel
= xorn_select_difference(sel1
, sel2
);
519 assert_selected_objects_2(rev2
, sel
, ob1a
, ob1b
);
520 xorn_free_selection(sel
);
521 xorn_free_selection(sel2
);
523 sel2
= xorn_select_object(ob1a
);
524 assert(sel2
!= NULL
);
525 sel
= xorn_select_difference(sel1
, sel2
);
527 assert_selected_objects_1(rev2
, sel
, ob1b
);
528 xorn_free_selection(sel
);
529 xorn_free_selection(sel2
);
531 sel2
= xorn_select_all(rev2
);
532 assert(sel2
!= NULL
);
533 sel
= xorn_select_difference(sel1
, sel2
);
535 assert_selected_objects_0(rev2
, sel
);
536 xorn_free_selection(sel
);
537 xorn_free_selection(sel2
);
539 sel2
= xorn_select_all(rev3
);
540 assert(sel2
!= NULL
);
541 sel
= xorn_select_difference(sel1
, sel2
);
543 assert_selected_objects_1(rev2
, sel
, ob1a
);
544 xorn_free_selection(sel
);
545 xorn_free_selection(sel2
);
546 xorn_free_selection(sel1
);
548 xorn_free_revision(rev3
);
549 xorn_free_revision(rev2
);
550 xorn_free_revision(rev1
);
551 xorn_free_revision(rev0
);