1 #include <gtk/gtk.h>
2 
3 static void
simple(void)4 simple (void)
5 {
6   GtkWidget *box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
7   GtkWidget *l = gtk_label_new ("");
8 
9   gtk_box_append (GTK_BOX (box), l);
10 
11   g_assert_true (gtk_widget_get_parent (l) == box);
12   g_assert_null (gtk_widget_get_prev_sibling (l));
13   g_assert_null (gtk_widget_get_next_sibling (l));
14   g_assert_null (gtk_widget_get_first_child (l));
15   g_assert_null (gtk_widget_get_last_child (l));
16 
17   g_assert_true (gtk_widget_get_first_child (box) == l);
18   g_assert_true (gtk_widget_get_last_child (box) == l);
19 }
20 
21 static void
two(void)22 two (void)
23 {
24   GtkWidget *box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
25   GtkWidget *l1 = gtk_label_new ("");
26   GtkWidget *l2 = gtk_label_new ("");
27 
28   gtk_box_append (GTK_BOX (box), l1);
29   gtk_box_append (GTK_BOX (box), l2);
30 
31   g_assert_true (gtk_widget_get_parent (l1) == box);
32   g_assert_null (gtk_widget_get_prev_sibling (l1));
33   g_assert_true (gtk_widget_get_next_sibling (l1) == l2);
34 
35   g_assert_true (gtk_widget_get_parent (l2) == box);
36   g_assert_true (gtk_widget_get_prev_sibling (l2) == l1);
37   g_assert_null (gtk_widget_get_next_sibling (l2));
38 
39   g_assert_true (gtk_widget_get_first_child (box) == l1);
40   g_assert_true (gtk_widget_get_last_child (box) == l2);
41 }
42 
43 static void
prepend(void)44 prepend (void)
45 {
46   GtkWidget *p = gtk_label_new ("");
47   GtkWidget *l1 = gtk_label_new ("");
48   GtkWidget *l2 = gtk_label_new ("");
49 
50   gtk_widget_set_parent (l1, p);
51   gtk_widget_insert_after (l2, p, NULL);
52 
53   /* l2 should now be *before* l1 */
54 
55   g_assert_true (gtk_widget_get_parent (l1) == p);
56   g_assert_true (gtk_widget_get_prev_sibling (l1) == l2);
57   g_assert_null (gtk_widget_get_next_sibling (l1));
58 
59   g_assert_true (gtk_widget_get_parent (l2) == p);
60   g_assert_null (gtk_widget_get_prev_sibling (l2));
61   g_assert_true (gtk_widget_get_next_sibling (l2) == l1);
62 
63   g_assert_true (gtk_widget_get_first_child (p) == l2);
64   g_assert_true (gtk_widget_get_last_child (p) == l1);
65 }
66 
67 static void
append(void)68 append (void)
69 {
70   GtkWidget *p = gtk_label_new ("");
71   GtkWidget *l1 = gtk_label_new ("");
72   GtkWidget *l2 = gtk_label_new ("");
73 
74   gtk_widget_set_parent (l1, p);
75   gtk_widget_insert_before (l2, p, NULL);
76 
77   g_assert_true (gtk_widget_get_parent (l1) == p);
78   g_assert_null (gtk_widget_get_prev_sibling (l1));
79   g_assert_true (gtk_widget_get_next_sibling (l1) == l2);
80 
81   g_assert_true (gtk_widget_get_parent (l2) == p);
82   g_assert_true (gtk_widget_get_prev_sibling (l2) == l1);
83   g_assert_null (gtk_widget_get_next_sibling (l2));
84 
85   g_assert_true (gtk_widget_get_first_child (p) == l1);
86   g_assert_true (gtk_widget_get_last_child (p) == l2);
87 }
88 
89 static void
insert_after(void)90 insert_after (void)
91 {
92   GtkWidget *p = gtk_label_new ("");
93   GtkWidget *l1 = gtk_label_new ("");
94   GtkWidget *l2 = gtk_label_new ("");
95   GtkWidget *l3 = gtk_label_new ("");
96 
97   gtk_widget_set_parent (l1, p);
98   gtk_widget_set_parent (l3, p);
99 
100   g_assert_true (gtk_widget_get_parent (l1) == p);
101   g_assert_null (gtk_widget_get_prev_sibling (l1));
102   g_assert_true (gtk_widget_get_next_sibling (l1) == l3);
103 
104   g_assert_true (gtk_widget_get_parent (l3) == p);
105   g_assert_true (gtk_widget_get_prev_sibling (l3) == l1);
106   g_assert_null (gtk_widget_get_next_sibling (l3));
107 
108   g_assert_true (gtk_widget_get_first_child (p) == l1);
109   g_assert_true (gtk_widget_get_last_child (p) == l3);
110 
111   /* Now add l2 between l1 and l3 */
112   gtk_widget_insert_after (l2, p, l1);
113 
114   g_assert_true (gtk_widget_get_next_sibling (l1) == l2);
115 
116   g_assert_true (gtk_widget_get_parent (l2) == p);
117   g_assert_true (gtk_widget_get_prev_sibling (l2) == l1);
118   g_assert_true (gtk_widget_get_next_sibling (l2) == l3);
119 
120   g_assert_true (gtk_widget_get_prev_sibling (l3) == l2);
121 
122   g_assert_true (gtk_widget_get_first_child (p) == l1);
123   g_assert_true (gtk_widget_get_last_child (p) == l3);
124 }
125 
126 static void
insert_before(void)127 insert_before (void)
128 {
129   GtkWidget *p = gtk_label_new ("");
130   GtkWidget *l1 = gtk_label_new ("");
131   GtkWidget *l2 = gtk_label_new ("");
132   GtkWidget *l3 = gtk_label_new ("");
133 
134   gtk_widget_set_parent (l1, p);
135   gtk_widget_set_parent (l3, p);
136 
137   g_assert_true (gtk_widget_get_parent (l1) == p);
138   g_assert_null (gtk_widget_get_prev_sibling (l1));
139   g_assert_true (gtk_widget_get_next_sibling (l1) == l3);
140 
141   g_assert_true (gtk_widget_get_parent (l3) == p);
142   g_assert_true (gtk_widget_get_prev_sibling (l3) == l1);
143   g_assert_null (gtk_widget_get_next_sibling (l3));
144 
145   g_assert_true (gtk_widget_get_first_child (p) == l1);
146   g_assert_true (gtk_widget_get_last_child (p) == l3);
147 
148   /* Now add l2 between l1 and l3 */
149   gtk_widget_insert_before (l2, p, l3);
150 
151   g_assert_true (gtk_widget_get_next_sibling (l1) == l2);
152 
153   g_assert_true (gtk_widget_get_parent (l2) == p);
154   g_assert_true (gtk_widget_get_prev_sibling (l2) == l1);
155   g_assert_true (gtk_widget_get_next_sibling (l2) == l3);
156 
157   g_assert_true (gtk_widget_get_prev_sibling (l3) == l2);
158 
159   g_assert_true (gtk_widget_get_first_child (p) == l1);
160   g_assert_true (gtk_widget_get_last_child (p) == l3);
161 }
162 
163 static void
insert_after_self(void)164 insert_after_self (void)
165 {
166   GtkWidget *p = gtk_label_new ("");
167   GtkWidget *l = gtk_label_new ("");
168 
169   gtk_widget_insert_after (l, p, NULL);
170 
171   g_assert_true (gtk_widget_get_parent (l) == p);
172   g_assert_null (gtk_widget_get_prev_sibling (l));
173   g_assert_null (gtk_widget_get_next_sibling (l));
174   g_assert_null (gtk_widget_get_first_child (l));
175   g_assert_null (gtk_widget_get_last_child (l));
176 
177   g_assert_true (gtk_widget_get_first_child (p) == l);
178   g_assert_true (gtk_widget_get_last_child (p) == l);
179 
180   /* Insert l after l */
181   gtk_widget_insert_after (l, p, l);
182 
183   g_assert_true (gtk_widget_get_parent (l) == p);
184   g_assert_null (gtk_widget_get_prev_sibling (l));
185   g_assert_null (gtk_widget_get_next_sibling (l));
186   g_assert_null (gtk_widget_get_first_child (l));
187   g_assert_null (gtk_widget_get_last_child (l));
188 
189   g_assert_true (gtk_widget_get_first_child (p) == l);
190   g_assert_true (gtk_widget_get_last_child (p) == l);
191 }
192 
193 static void
insert_before_self(void)194 insert_before_self (void)
195 {
196   GtkWidget *p = gtk_label_new ("");
197   GtkWidget *l = gtk_label_new ("");
198 
199   gtk_widget_insert_before (l, p, NULL);
200 
201   g_assert_true (gtk_widget_get_parent (l) == p);
202   g_assert_null (gtk_widget_get_prev_sibling (l));
203   g_assert_null (gtk_widget_get_next_sibling (l));
204   g_assert_null (gtk_widget_get_first_child (l));
205   g_assert_null (gtk_widget_get_last_child (l));
206 
207   g_assert_true (gtk_widget_get_first_child (p) == l);
208   g_assert_true (gtk_widget_get_last_child (p) == l);
209 
210   /* Insert l before l */
211   gtk_widget_insert_before (l, p, l);
212 
213   g_assert_true (gtk_widget_get_parent (l) == p);
214   g_assert_null (gtk_widget_get_prev_sibling (l));
215   g_assert_null (gtk_widget_get_next_sibling (l));
216   g_assert_null (gtk_widget_get_first_child (l));
217   g_assert_null (gtk_widget_get_last_child (l));
218 
219   g_assert_true (gtk_widget_get_first_child (p) == l);
220   g_assert_true (gtk_widget_get_last_child (p) == l);
221 }
222 
223 static void
reorder_after(void)224 reorder_after (void)
225 {
226   GtkWidget *p = gtk_label_new ("");
227   GtkWidget *l1 = gtk_label_new ("");
228   GtkWidget *l2 = gtk_label_new ("");
229   GtkWidget *l3 = gtk_label_new ("");
230 
231   gtk_widget_set_parent (l1, p);
232   gtk_widget_set_parent (l3, p);
233 
234   g_assert_true (gtk_widget_get_parent (l1) == p);
235   g_assert_null (gtk_widget_get_prev_sibling (l1));
236   g_assert_true (gtk_widget_get_next_sibling (l1) == l3);
237 
238   g_assert_true (gtk_widget_get_parent (l3) == p);
239   g_assert_true (gtk_widget_get_prev_sibling (l3) == l1);
240   g_assert_null (gtk_widget_get_next_sibling (l3));
241 
242   g_assert_true (gtk_widget_get_first_child (p) == l1);
243   g_assert_true (gtk_widget_get_last_child (p) == l3);
244 
245   /* Now add l2 between l1 and l3 */
246   gtk_widget_insert_before (l2, p, l3);
247 
248   g_assert_true (gtk_widget_get_next_sibling (l1) == l2);
249 
250   g_assert_true (gtk_widget_get_parent (l2) == p);
251   g_assert_true (gtk_widget_get_prev_sibling (l2) == l1);
252   g_assert_true (gtk_widget_get_next_sibling (l2) == l3);
253 
254   g_assert_true (gtk_widget_get_prev_sibling (l3) == l2);
255 
256   g_assert_true (gtk_widget_get_first_child (p) == l1);
257   g_assert_true (gtk_widget_get_last_child (p) == l3);
258 
259   /* The order is now l1, l2, l3. Now reorder l3 after l1 so
260    * the correct order is l1, l3, l2 */
261 
262   gtk_widget_insert_after (l3, p, l1);
263 
264   g_assert_null (gtk_widget_get_prev_sibling (l1));
265   g_assert_true (gtk_widget_get_next_sibling (l1) == l3);
266 
267   g_assert_true (gtk_widget_get_prev_sibling (l3) == l1);
268   g_assert_true (gtk_widget_get_next_sibling (l3) == l2);
269 
270   g_assert_true (gtk_widget_get_prev_sibling (l2) == l3);
271   g_assert_null (gtk_widget_get_next_sibling (l2));
272 
273   g_assert_true (gtk_widget_get_first_child (p) == l1);
274   g_assert_true (gtk_widget_get_last_child (p) == l2);
275 }
276 
277 static void
reorder_before(void)278 reorder_before (void)
279 {
280   GtkWidget *p = gtk_label_new ("");
281   GtkWidget *l1 = gtk_label_new ("");
282   GtkWidget *l2 = gtk_label_new ("");
283   GtkWidget *l3 = gtk_label_new ("");
284 
285   gtk_widget_set_parent (l1, p);
286   gtk_widget_set_parent (l3, p);
287 
288   g_assert_true (gtk_widget_get_parent (l1) == p);
289   g_assert_null (gtk_widget_get_prev_sibling (l1));
290   g_assert_true (gtk_widget_get_next_sibling (l1) == l3);
291 
292   g_assert_true (gtk_widget_get_parent (l3) == p);
293   g_assert_true (gtk_widget_get_prev_sibling (l3) == l1);
294   g_assert_null (gtk_widget_get_next_sibling (l3));
295 
296   g_assert_true (gtk_widget_get_first_child (p) == l1);
297   g_assert_true (gtk_widget_get_last_child (p) == l3);
298 
299   /* Now add l2 between l1 and l3 */
300   gtk_widget_insert_before (l2, p, l3);
301 
302   g_assert_true (gtk_widget_get_next_sibling (l1) == l2);
303 
304   g_assert_true (gtk_widget_get_parent (l2) == p);
305   g_assert_true (gtk_widget_get_prev_sibling (l2) == l1);
306   g_assert_true (gtk_widget_get_next_sibling (l2) == l3);
307 
308   g_assert_true (gtk_widget_get_prev_sibling (l3) == l2);
309 
310   g_assert_true (gtk_widget_get_first_child (p) == l1);
311   g_assert_true (gtk_widget_get_last_child (p) == l3);
312 
313   /* The order is now l1, l2, l3. Now reorder l3 before l2 so
314    * the correct order is l1, l3, l2 */
315 
316   gtk_widget_insert_before (l3, p, l2);
317 
318   g_assert_null (gtk_widget_get_prev_sibling (l1));
319   g_assert_true (gtk_widget_get_next_sibling (l1) == l3);
320 
321   g_assert_true (gtk_widget_get_prev_sibling (l3) == l1);
322   g_assert_true (gtk_widget_get_next_sibling (l3) == l2);
323 
324   g_assert_true (gtk_widget_get_prev_sibling (l2) == l3);
325   g_assert_null (gtk_widget_get_next_sibling (l2));
326 
327   g_assert_true (gtk_widget_get_first_child (p) == l1);
328   g_assert_true (gtk_widget_get_last_child (p) == l2);
329 }
330 
331 static void
reorder_start(void)332 reorder_start (void)
333 {
334   GtkWidget *p = gtk_label_new ("");
335   GtkWidget *l1 = gtk_label_new ("");
336   GtkWidget *l2 = gtk_label_new ("");
337   GtkWidget *l3 = gtk_label_new ("");
338 
339   gtk_widget_set_parent (l1, p);
340   gtk_widget_set_parent (l3, p);
341 
342   g_assert_true (gtk_widget_get_parent (l1) == p);
343   g_assert_null (gtk_widget_get_prev_sibling (l1));
344   g_assert_true (gtk_widget_get_next_sibling (l1) == l3);
345 
346   g_assert_true (gtk_widget_get_parent (l3) == p);
347   g_assert_true (gtk_widget_get_prev_sibling (l3) == l1);
348   g_assert_null (gtk_widget_get_next_sibling (l3));
349 
350   g_assert_true (gtk_widget_get_first_child (p) == l1);
351   g_assert_true (gtk_widget_get_last_child (p) == l3);
352 
353   /* Now add l2 between l1 and l3 */
354   gtk_widget_insert_before (l2, p, l3);
355 
356   g_assert_true (gtk_widget_get_next_sibling (l1) == l2);
357 
358   g_assert_true (gtk_widget_get_parent (l2) == p);
359   g_assert_true (gtk_widget_get_prev_sibling (l2) == l1);
360   g_assert_true (gtk_widget_get_next_sibling (l2) == l3);
361 
362   g_assert_true (gtk_widget_get_prev_sibling (l3) == l2);
363 
364   g_assert_true (gtk_widget_get_first_child (p) == l1);
365   g_assert_true (gtk_widget_get_last_child (p) == l3);
366 
367   /* The order is now l1, l2, l3. Now reorder l3 to the start so
368    * the correct order is l3, l1, l2 */
369 
370   gtk_widget_insert_after (l3, p, NULL);
371 
372   g_assert_true (gtk_widget_get_prev_sibling (l1) == l3);
373   g_assert_true (gtk_widget_get_next_sibling (l1) == l2);
374 
375   g_assert_null (gtk_widget_get_prev_sibling (l3));
376   g_assert_true (gtk_widget_get_next_sibling (l3) == l1);
377 
378   g_assert_true (gtk_widget_get_prev_sibling (l2) == l1);
379   g_assert_null (gtk_widget_get_next_sibling (l2));
380 
381   g_assert_true (gtk_widget_get_first_child (p) == l3);
382   g_assert_true (gtk_widget_get_last_child (p) == l2);
383 }
384 
385 static void
reorder_end(void)386 reorder_end (void)
387 {
388   GtkWidget *p = gtk_label_new ("");
389   GtkWidget *l1 = gtk_label_new ("");
390   GtkWidget *l2 = gtk_label_new ("");
391   GtkWidget *l3 = gtk_label_new ("");
392 
393   gtk_widget_set_parent (l1, p);
394   gtk_widget_set_parent (l3, p);
395 
396   g_assert_true (gtk_widget_get_parent (l1) == p);
397   g_assert_null (gtk_widget_get_prev_sibling (l1));
398   g_assert_true (gtk_widget_get_next_sibling (l1) == l3);
399 
400   g_assert_true (gtk_widget_get_parent (l3) == p);
401   g_assert_true (gtk_widget_get_prev_sibling (l3) == l1);
402   g_assert_null (gtk_widget_get_next_sibling (l3));
403 
404   g_assert_true (gtk_widget_get_first_child (p) == l1);
405   g_assert_true (gtk_widget_get_last_child (p) == l3);
406 
407   /* Now add l2 between l1 and l3 */
408   gtk_widget_insert_before (l2, p, l3);
409 
410   g_assert_true (gtk_widget_get_next_sibling (l1) == l2);
411 
412   g_assert_true (gtk_widget_get_parent (l2) == p);
413   g_assert_true (gtk_widget_get_prev_sibling (l2) == l1);
414   g_assert_true (gtk_widget_get_next_sibling (l2) == l3);
415 
416   g_assert_true (gtk_widget_get_prev_sibling (l3) == l2);
417 
418   g_assert_true (gtk_widget_get_first_child (p) == l1);
419   g_assert_true (gtk_widget_get_last_child (p) == l3);
420 
421   /* The order is now l1, l2, l3. Now reorder l1 to the end so
422    * the correct order is l2, l3, l1 */
423 
424   gtk_widget_insert_before (l1, p, NULL);
425 
426   g_assert_true (gtk_widget_get_prev_sibling (l1) == l3);
427   g_assert_null (gtk_widget_get_next_sibling (l1));
428 
429   g_assert_true (gtk_widget_get_prev_sibling (l3) == l2);
430   g_assert_true (gtk_widget_get_next_sibling (l3) == l1);
431 
432   g_assert_null (gtk_widget_get_prev_sibling (l2));
433   g_assert_true (gtk_widget_get_next_sibling (l2) == l3);
434 
435   g_assert_true (gtk_widget_get_first_child (p) == l2);
436   g_assert_true (gtk_widget_get_last_child (p) == l1);
437 }
438 
439 static void
same_after(void)440 same_after (void)
441 {
442   GtkWidget *p = gtk_label_new ("");
443   GtkWidget *l1 = gtk_label_new ("");
444   GtkWidget *l2 = gtk_label_new ("");
445 
446   gtk_widget_set_parent (l1, p);
447   gtk_widget_set_parent (l2, p);
448 
449   g_assert_true (gtk_widget_get_parent (l1) == p);
450   g_assert_null (gtk_widget_get_prev_sibling (l1));
451   g_assert_true (gtk_widget_get_next_sibling (l1) == l2);
452 
453   g_assert_true (gtk_widget_get_parent (l2) == p);
454   g_assert_true (gtk_widget_get_prev_sibling (l2) == l1);
455   g_assert_null (gtk_widget_get_next_sibling (l2));
456 
457   g_assert_true (gtk_widget_get_first_child (p) == l1);
458   g_assert_true (gtk_widget_get_last_child (p) == l2);
459 
460   /* l2 is already after l1, so this shouldn't change anything! */
461   gtk_widget_insert_after (l2, p, l1);
462 
463   g_assert_true (gtk_widget_get_prev_sibling (l2) == l1);
464   g_assert_null (gtk_widget_get_next_sibling (l2));
465 
466   g_assert_null (gtk_widget_get_prev_sibling (l1));
467   g_assert_true (gtk_widget_get_next_sibling (l1) == l2);
468 
469   g_assert_true (gtk_widget_get_first_child (p) == l1);
470   g_assert_true (gtk_widget_get_last_child (p) == l2);
471 }
472 
473 static void
same_before(void)474 same_before (void)
475 {
476   GtkWidget *p = gtk_label_new ("");
477   GtkWidget *l1 = gtk_label_new ("");
478   GtkWidget *l2 = gtk_label_new ("");
479 
480   gtk_widget_set_parent (l1, p);
481   gtk_widget_set_parent (l2, p);
482 
483   g_assert_true (gtk_widget_get_parent (l1) == p);
484   g_assert_null (gtk_widget_get_prev_sibling (l1));
485   g_assert_true (gtk_widget_get_next_sibling (l1) == l2);
486 
487   g_assert_true (gtk_widget_get_parent (l2) == p);
488   g_assert_true (gtk_widget_get_prev_sibling (l2) == l1);
489   g_assert_null (gtk_widget_get_next_sibling (l2));
490 
491   g_assert_true (gtk_widget_get_first_child (p) == l1);
492   g_assert_true (gtk_widget_get_last_child (p) == l2);
493 
494   /* l1 is already before l2, so this shouldn't change anything! */
495   gtk_widget_insert_before (l1, p, l2);
496 
497   g_assert_true (gtk_widget_get_prev_sibling (l2) == l1);
498   g_assert_null (gtk_widget_get_next_sibling (l2));
499 
500   g_assert_null (gtk_widget_get_prev_sibling (l1));
501   g_assert_true (gtk_widget_get_next_sibling (l1) == l2);
502 
503   g_assert_true (gtk_widget_get_first_child (p) == l1);
504   g_assert_true (gtk_widget_get_last_child (p) == l2);
505 }
506 
507 static void
no_loop(void)508 no_loop (void)
509 {
510   GtkWidget *p = gtk_label_new ("");
511   GtkWidget *l1 = gtk_label_new ("");
512   GtkWidget *l2 = gtk_label_new ("");
513   GtkWidget *l3 = gtk_label_new ("");
514 
515   gtk_widget_set_parent (l1, p);
516   gtk_widget_set_parent (l2, p);
517   gtk_widget_set_parent (l3, p);
518 
519   /* l1 -> l2 -> l3 */
520 
521   gtk_widget_insert_after (l1, p, l3);
522   /* Now: l2 -> l3 -> l1 */
523   g_assert_null (gtk_widget_get_prev_sibling (l2));
524   g_assert_true (gtk_widget_get_next_sibling (l2) == l3);
525   g_assert_true (gtk_widget_get_next_sibling (l3) == l1);
526   g_assert_null (gtk_widget_get_next_sibling (l1));
527   g_assert_true (gtk_widget_get_prev_sibling (l1) == l3);
528 
529   gtk_widget_insert_after (l2, p, l1);
530   /* Now: l3 -> l1 -> l2 */
531   g_assert_null (gtk_widget_get_prev_sibling (l3));
532   g_assert_true (gtk_widget_get_next_sibling (l3) == l1);
533   g_assert_true (gtk_widget_get_next_sibling (l1) == l2);
534   g_assert_true (gtk_widget_get_prev_sibling (l1) == l3);
535   g_assert_true (gtk_widget_get_prev_sibling (l2) == l1);
536   g_assert_null (gtk_widget_get_next_sibling (l2));
537 
538   gtk_widget_insert_after (l1, p, NULL);
539   /* Now: l1 -> l3 -> l2 */
540   g_assert_null (gtk_widget_get_prev_sibling (l1));
541   g_assert_true (gtk_widget_get_next_sibling (l1) == l3);
542   g_assert_true (gtk_widget_get_next_sibling (l3) == l2);
543   g_assert_true (gtk_widget_get_prev_sibling (l3) == l1);
544   g_assert_true (gtk_widget_get_prev_sibling (l2) == l3);
545   g_assert_null (gtk_widget_get_next_sibling (l2));
546 }
547 
548 static void
reorder_refcount(void)549 reorder_refcount (void)
550 {
551   GtkWidget *p = gtk_label_new ("");
552   GtkWidget *l1 = gtk_label_new ("");
553   GtkWidget *l2 = gtk_label_new ("");
554 
555   g_assert_true (g_object_is_floating (l1));
556   g_assert_cmpint (G_OBJECT (l1)->ref_count, ==, 1);
557 
558   gtk_widget_set_parent (l1, p);
559 
560   g_assert_true (!g_object_is_floating (l1));
561   g_assert_cmpint (G_OBJECT (l1)->ref_count, ==, 1);
562 
563   g_assert_true (g_object_is_floating (l2));
564   g_assert_cmpint (G_OBJECT (l2)->ref_count, ==, 1);
565 
566   gtk_widget_set_parent (l2, p);
567 
568   g_assert_true (!g_object_is_floating (l2));
569   g_assert_cmpint (G_OBJECT (l2)->ref_count, ==, 1);
570 
571   g_assert_true (gtk_widget_get_next_sibling (l1) == l2);
572 
573   gtk_widget_insert_before (l2, p, l1);
574 
575   g_assert_true (gtk_widget_get_prev_sibling (l1) == l2);
576 
577   g_assert_cmpint (G_OBJECT (l1)->ref_count, ==, 1);
578   g_assert_cmpint (G_OBJECT (l2)->ref_count, ==, 1);
579 
580   gtk_widget_unparent (l1);
581   gtk_widget_unparent (l2);
582   g_object_unref (g_object_ref_sink (p));
583 }
584 
585 int
main(int argc,char ** argv)586 main (int argc, char **argv)
587 {
588   gtk_init ();
589   (g_test_init) (&argc, &argv, NULL);
590 
591   g_test_add_func ("/widgetorder/simple", simple);
592   g_test_add_func ("/widgetorder/two", two);
593   g_test_add_func ("/widgetorder/prepend", prepend);
594   g_test_add_func ("/widgetorder/append", append);
595   g_test_add_func ("/widgetorder/insert-after", insert_after);
596   g_test_add_func ("/widgetorder/insert-before", insert_before);
597   g_test_add_func ("/widgetorder/insert-after-self", insert_after_self);
598   g_test_add_func ("/widgetorder/insert-before-self", insert_before_self);
599   g_test_add_func ("/widgetorder/reorder-after", reorder_after);
600   g_test_add_func ("/widgetorder/reorder-before", reorder_before);
601   g_test_add_func ("/widgetorder/reorder-start", reorder_start);
602   g_test_add_func ("/widgetorder/reorder-end", reorder_end);
603   g_test_add_func ("/widgetorder/same-after", same_after);
604   g_test_add_func ("/widgetorder/same-before", same_before);
605   g_test_add_func ("/widgetorder/no-loop", no_loop);
606   g_test_add_func ("/widgetorder/reorder-refcount", reorder_refcount);
607 
608   return g_test_run ();
609 }
610