aa246463fff6f6c4d42ebe317a08bbd71963fc05
[platform/upstream/gst-editing-services.git] / tests / check / ges / group.c
1 /* GStreamer Editing Services
2  *
3  * Copyright (C) <2013> Thibault Saunier <thibault.saunier@collabora.com>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #include "test-utils.h"
22 #include <ges/ges.h>
23 #include <gst/check/gstcheck.h>
24
25 GST_START_TEST (test_move_group)
26 {
27   GESAsset *asset;
28   GESGroup *group;
29   GESTimeline *timeline;
30   GESLayer *layer, *layer1;
31   GESClip *clip, *clip1, *clip2;
32
33   GList *clips = NULL;
34
35   ges_init ();
36
37   timeline = ges_timeline_new_audio_video ();
38
39   layer = ges_timeline_append_layer (timeline);
40   layer1 = ges_timeline_append_layer (timeline);
41   asset = ges_asset_request (GES_TYPE_TEST_CLIP, NULL, NULL);
42
43   /**
44    * Our timeline:
45    * -------------
46    *
47    *          0------------Group1---------------110
48    *          |--------                          |
49    * layer:   |  clip  |                         |
50    *          |-------10                         |
51    *          |----------------------------------|
52    *          |        0---------    0-----------|
53    * layer1:  |        | clip1   |    |  clip2   |
54    *          |       10--------20   50----------|
55    *          |----------------------------------|
56    */
57   clip = ges_layer_add_asset (layer, asset, 0, 0, 10, GES_TRACK_TYPE_UNKNOWN);
58   clip1 =
59       ges_layer_add_asset (layer1, asset, 10, 0, 10, GES_TRACK_TYPE_UNKNOWN);
60   clip2 =
61       ges_layer_add_asset (layer1, asset, 50, 0, 60, GES_TRACK_TYPE_UNKNOWN);
62   clips = g_list_prepend (clips, clip);
63   clips = g_list_prepend (clips, clip1);
64   clips = g_list_prepend (clips, clip2);
65   group = GES_GROUP (ges_container_group (clips));
66   g_list_free (clips);
67   ASSERT_OBJECT_REFCOUNT (group, "2 ref for the timeline", 2);
68
69   fail_unless (GES_IS_GROUP (group));
70   ASSERT_OBJECT_REFCOUNT (group, "2 ref for the timeline", 2);
71   fail_unless (g_list_length (GES_CONTAINER_CHILDREN (group)) == 3);
72   assert_equals_int (GES_CONTAINER_HEIGHT (group), 2);
73
74   /* Nothing should move */
75   ges_timeline_element_set_start (GES_TIMELINE_ELEMENT (clip1), 5);
76
77   CHECK_OBJECT_PROPS (clip, 0, 0, 10);
78   CHECK_OBJECT_PROPS (clip1, 10, 0, 10);
79   CHECK_OBJECT_PROPS (clip2, 50, 0, 60);
80   CHECK_OBJECT_PROPS (group, 0, 0, 110);
81
82   /*
83    *        0  10------------Group1---------------120
84    *            |--------                          |
85    * layer:     |  clip  |                         |
86    *            |-------20                         |
87    *            |----------------------------------|
88    *            |        0---------    0-----------|
89    * layer1:    |        | clip1   |    |  clip2   |
90    *            |       20--------30   60----------|
91    *            |----------------------------------|
92    */
93   ges_timeline_element_set_start (GES_TIMELINE_ELEMENT (clip), 10);
94   CHECK_OBJECT_PROPS (clip, 10, 0, 10);
95   CHECK_OBJECT_PROPS (clip1, 20, 0, 10);
96   CHECK_OBJECT_PROPS (clip2, 60, 0, 60);
97   CHECK_OBJECT_PROPS (group, 10, 0, 110);
98
99   /*
100    *        0  10------------Group1---------------120
101    *            |------                            |
102    * layer:     |clip  |                           |
103    *            |-----15                           |
104    *            |----------------------------------|
105    *            |        0---------    0-----------|
106    * layer1:    |        | clip1   |    |  clip2   |
107    *            |       20--------30   60----------|
108    *            |----------------------------------|
109    */
110   ges_timeline_element_set_duration (GES_TIMELINE_ELEMENT (clip), 5);
111   CHECK_OBJECT_PROPS (clip, 10, 0, 5);
112   CHECK_OBJECT_PROPS (clip1, 20, 0, 10);
113   CHECK_OBJECT_PROPS (clip2, 60, 0, 60);
114   CHECK_OBJECT_PROPS (group, 10, 0, 110);
115   ASSERT_OBJECT_REFCOUNT (group, "2 ref for the timeline", 2);
116
117   /*
118    *        0  10------------Group1---------------110
119    *            |------                            |
120    * layer:     |clip  |                           |
121    *            |-----15                           |
122    *            |----------------------------------|
123    *            |        0---------    0-----------|
124    * layer1:    |        | clip1   |    |  clip2   |
125    *            |       20--------30   60----------|
126    *            |----------------------------------|
127    */
128   ges_timeline_element_set_duration (GES_TIMELINE_ELEMENT (clip2), 50);
129   CHECK_OBJECT_PROPS (clip, 10, 0, 5);
130   CHECK_OBJECT_PROPS (clip1, 20, 0, 10);
131   CHECK_OBJECT_PROPS (clip2, 60, 0, 50);
132   CHECK_OBJECT_PROPS (group, 10, 0, 100);
133
134   /*
135    *        0  10------------Group1---------------110
136    *            |------                            |
137    * layer:     |clip  |                           |
138    *            |-----15                           |
139    *            |----------------------------------|
140    *            |        5---------    0-----------|
141    * layer1:    |        | clip1   |    |  clip2   |
142    *            |       20--------30   60----------|
143    *            |----------------------------------|
144    */
145   ges_timeline_element_set_inpoint (GES_TIMELINE_ELEMENT (clip1), 5);
146   CHECK_OBJECT_PROPS (clip, 10, 0, 5);
147   CHECK_OBJECT_PROPS (clip1, 20, 5, 10);
148   CHECK_OBJECT_PROPS (clip2, 60, 0, 50);
149   CHECK_OBJECT_PROPS (group, 10, 0, 100);
150
151   /*
152    *        0  10------------Group1---------------110
153    *            |------                            |
154    * layer:     |clip  |                           |
155    *            |-----15                           |
156    *            |----------------------------------|
157    *            |        5---------    0-----------|
158    * layer1:    |        | clip1   |    |  clip2   |
159    *            |       20--------30   60----------|
160    *            |----------------------------------|
161    */
162   ges_timeline_element_set_inpoint (GES_TIMELINE_ELEMENT (clip1), 5);
163   CHECK_OBJECT_PROPS (clip, 10, 0, 5);
164   CHECK_OBJECT_PROPS (clip1, 20, 5, 10);
165   CHECK_OBJECT_PROPS (clip2, 60, 0, 50);
166   CHECK_OBJECT_PROPS (group, 10, 0, 100);
167   ASSERT_OBJECT_REFCOUNT (group, "2 ref for the timeline", 2);
168   fail_if (ges_timeline_element_trim (GES_TIMELINE_ELEMENT (group), 20));
169   CHECK_OBJECT_PROPS (clip, 10, 0, 5);
170   CHECK_OBJECT_PROPS (clip1, 20, 5, 10);
171   CHECK_OBJECT_PROPS (clip2, 60, 0, 50);
172   CHECK_OBJECT_PROPS (group, 10, 0, 100);
173   ASSERT_OBJECT_REFCOUNT (group, "2 ref for the timeline", 2);
174
175   fail_if (ges_timeline_element_trim (GES_TIMELINE_ELEMENT (group), 25));
176   CHECK_OBJECT_PROPS (clip, 10, 0, 5);
177   CHECK_OBJECT_PROPS (clip1, 20, 5, 10);
178   CHECK_OBJECT_PROPS (clip2, 60, 0, 50);
179   CHECK_OBJECT_PROPS (group, 10, 0, 100);
180   ASSERT_OBJECT_REFCOUNT (group, "2 ref for the timeline", 2);
181
182   /* Same thing in the end... */
183   ges_timeline_element_trim (GES_TIMELINE_ELEMENT (group), 10);
184   CHECK_OBJECT_PROPS (clip, 10, 0, 5);
185   CHECK_OBJECT_PROPS (clip1, 20, 5, 10);
186   CHECK_OBJECT_PROPS (clip2, 60, 0, 50);
187   CHECK_OBJECT_PROPS (group, 10, 0, 100);
188   ASSERT_OBJECT_REFCOUNT (group, "2 ref for the timeline", 2);
189
190   /*
191    *        0  12------------Group1---------------110
192    *            2------                            |
193    * layer:     |clip  |                           |
194    *            |-----15                           |
195    *            |----------------------------------|
196    *            |        7---------     2----------|
197    * layer1:    |        | clip1   |    |  clip2   |
198    *            |       22--------30   62----------|
199    *            |----------------------------------|
200    */
201   ges_timeline_element_trim (GES_TIMELINE_ELEMENT (group), 12);
202   CHECK_OBJECT_PROPS (clip, 12, 2, 3);
203   CHECK_OBJECT_PROPS (clip1, 22, 7, 8);
204   CHECK_OBJECT_PROPS (clip2, 62, 2, 48);
205   CHECK_OBJECT_PROPS (group, 12, 0, 98);
206   ASSERT_OBJECT_REFCOUNT (group, "2 ref for the timeline", 2);
207
208   /* Setting the duration would lead to overlaps */
209   ges_timeline_element_set_duration (GES_TIMELINE_ELEMENT (group), 10);
210   CHECK_OBJECT_PROPS (clip, 12, 2, 3);
211   CHECK_OBJECT_PROPS (clip1, 22, 7, 8);
212   CHECK_OBJECT_PROPS (clip2, 62, 2, 48);
213   CHECK_OBJECT_PROPS (group, 12, 0, 98);
214   ges_timeline_element_set_duration (GES_TIMELINE_ELEMENT (group), 100);
215   CHECK_OBJECT_PROPS (clip, 12, 2, 3);
216   CHECK_OBJECT_PROPS (clip1, 22, 7, 8);
217   CHECK_OBJECT_PROPS (clip2, 62, 2, 50);
218   CHECK_OBJECT_PROPS (group, 12, 0, 100);
219
220   ges_timeline_element_set_start (GES_TIMELINE_ELEMENT (group), 20);
221   CHECK_OBJECT_PROPS (clip, 20, 2, 3);
222   CHECK_OBJECT_PROPS (clip1, 30, 7, 8);
223   CHECK_OBJECT_PROPS (clip2, 70, 2, 50);
224   CHECK_OBJECT_PROPS (group, 20, 0, 100);
225
226   fail_if (ges_timeline_element_trim (GES_TIMELINE_ELEMENT (group), 10));
227   CHECK_OBJECT_PROPS (clip, 20, 2, 3);
228   CHECK_OBJECT_PROPS (clip1, 30, 7, 8);
229   CHECK_OBJECT_PROPS (clip2, 70, 2, 50);
230   CHECK_OBJECT_PROPS (group, 20, 0, 100);
231
232   ASSERT_OBJECT_REFCOUNT (group, "2 ref for the timeline", 2);
233   check_destroyed (G_OBJECT (timeline), G_OBJECT (group), NULL);
234   gst_object_unref (asset);
235
236   ges_deinit ();
237 }
238
239 GST_END_TEST;
240
241
242
243 static void
244 _changed_layer_cb (GESTimelineElement * clip,
245     GParamSpec * arg G_GNUC_UNUSED, guint * nb_calls)
246 {
247   *nb_calls = *nb_calls + 1;
248 }
249
250 GST_START_TEST (test_group_in_group)
251 {
252   GESAsset *asset;
253   GESTimeline *timeline;
254   GESGroup *group, *group1;
255   GESLayer *layer, *layer1, *layer2, *layer3;
256   GESClip *c, *c1, *c2, *c3, *c4, *c5;
257
258   guint nb_layer_notifies = 0;
259   GList *clips = NULL;
260
261   ges_init ();
262
263   timeline = ges_timeline_new_audio_video ();
264
265   /* Our timeline
266    *
267    *    --0------------10-Group-----20---------------30-------Group1----------70
268    *      | +-----------+                             |+-----------50         |
269    * L    | |    C      |                             ||     C3    |          |
270    *      | +-----------+                             |+-----------+          |
271    *    --|-------------------------------------------|-----40----------------|
272    *      |            +------------+ +-------------+ |      +--------60      |
273    * L1   |            |     C1     | |     C2      | |      |     C4 |       |
274    *      |            +------------+ +-------------+ |      +--------+       |
275    *    --|-------------------------------------------|-----------------------|
276    *      |                                           |             +--------+|
277    * L2   |                                           |             |  c5    ||
278    *      |                                           |             +--------+|
279    *    --+-------------------------------------------+-----------------------+
280    *
281    * L3
282    *
283    *    -----------------------------------------------------------------------
284    */
285
286   layer = ges_timeline_append_layer (timeline);
287   layer1 = ges_timeline_append_layer (timeline);
288   layer2 = ges_timeline_append_layer (timeline);
289   layer3 = ges_timeline_append_layer (timeline);
290   assert_equals_int (ges_layer_get_priority (layer3), 3);
291   asset = ges_asset_request (GES_TYPE_TEST_CLIP, NULL, NULL);
292
293   c = ges_layer_add_asset (layer, asset, 0, 0, 10, GES_TRACK_TYPE_UNKNOWN);
294   c1 = ges_layer_add_asset (layer1, asset, 10, 0, 10, GES_TRACK_TYPE_UNKNOWN);
295   c2 = ges_layer_add_asset (layer1, asset, 20, 0, 10, GES_TRACK_TYPE_UNKNOWN);
296   clips = g_list_prepend (clips, c);
297   clips = g_list_prepend (clips, c1);
298   clips = g_list_prepend (clips, c2);
299   group = GES_GROUP (ges_container_group (clips));
300   fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group) == timeline);
301   g_list_free (clips);
302
303   fail_unless (GES_IS_GROUP (group));
304   CHECK_OBJECT_PROPS (c, 0, 0, 10);
305   CHECK_OBJECT_PROPS (c1, 10, 0, 10);
306   CHECK_OBJECT_PROPS (c2, 20, 0, 10);
307   CHECK_OBJECT_PROPS (group, 0, 0, 30);
308
309   c3 = ges_layer_add_asset (layer, asset, 30, 0, 20, GES_TRACK_TYPE_UNKNOWN);
310   c4 = ges_layer_add_asset (layer1, asset, 40, 0, 20, GES_TRACK_TYPE_UNKNOWN);
311   c5 = ges_layer_add_asset (layer2, asset, 50, 0, 20, GES_TRACK_TYPE_UNKNOWN);
312   clips = g_list_prepend (NULL, c3);
313   clips = g_list_prepend (clips, c4);
314   clips = g_list_prepend (clips, c5);
315   group1 = GES_GROUP (ges_container_group (clips));
316   fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group1) == timeline);
317   g_list_free (clips);
318
319   fail_unless (GES_IS_GROUP (group1));
320   CHECK_OBJECT_PROPS (c3, 30, 0, 20);
321   CHECK_OBJECT_PROPS (c4, 40, 0, 20);
322   CHECK_OBJECT_PROPS (c5, 50, 0, 20);
323   CHECK_OBJECT_PROPS (group1, 30, 0, 40);
324   check_layer (c, 0);
325   check_layer (c1, 1);
326   check_layer (c2, 1);
327   check_layer (c3, 0);
328   check_layer (c4, 1);
329   check_layer (c5, 2);
330
331   fail_unless (ges_container_add (GES_CONTAINER (group),
332           GES_TIMELINE_ELEMENT (group1)));
333   CHECK_OBJECT_PROPS (c, 0, 0, 10);
334   CHECK_OBJECT_PROPS (c1, 10, 0, 10);
335   CHECK_OBJECT_PROPS (c2, 20, 0, 10);
336   CHECK_OBJECT_PROPS (c3, 30, 0, 20);
337   CHECK_OBJECT_PROPS (c4, 40, 0, 20);
338   CHECK_OBJECT_PROPS (c5, 50, 0, 20);
339   CHECK_OBJECT_PROPS (group, 0, 0, 70);
340   CHECK_OBJECT_PROPS (group1, 30, 0, 40);
341   check_layer (c, 0);
342   check_layer (c1, 1);
343   check_layer (c2, 1);
344   check_layer (c3, 0);
345   check_layer (c4, 1);
346   check_layer (c5, 2);
347
348   fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group) == timeline);
349   fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group1) == timeline);
350
351   ges_timeline_element_set_start (GES_TIMELINE_ELEMENT (c4), 50);
352   CHECK_OBJECT_PROPS (c, 10, 0, 10);
353   CHECK_OBJECT_PROPS (c1, 20, 0, 10);
354   CHECK_OBJECT_PROPS (c2, 30, 0, 10);
355   CHECK_OBJECT_PROPS (c3, 40, 0, 20);
356   CHECK_OBJECT_PROPS (c4, 50, 0, 20);
357   CHECK_OBJECT_PROPS (c5, 60, 0, 20);
358   CHECK_OBJECT_PROPS (group, 10, 0, 70);
359   CHECK_OBJECT_PROPS (group1, 40, 0, 40);
360   fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group) == timeline);
361   fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group1) == timeline);
362   check_layer (c, 0);
363   check_layer (c1, 1);
364   check_layer (c2, 1);
365   check_layer (c3, 0);
366   check_layer (c4, 1);
367   check_layer (c5, 2);
368
369   /* Our timeline
370    *
371    * L
372    *    -----------------------------------------------------------------------
373    *      0------------10-Group-----20---------------30-------Group1----------70
374    *      | +-----------+                             |+-----------50         |
375    * L1   | |    C      |                             ||     C3    |          |
376    *      | +-----------+                             |+-----------+          |
377    *      |                                           |                       |
378    *    --|-------------------------------------------|-----40----------------|
379    *      |            +------------+ +-------------+ |      +--------60      |
380    * L2   |            |     C1     | |     C2      | |      |     C4 |       |
381    *      |            +------------+ +-------------+ |      +--------+       |
382    *    --|-------------------------------------------|-----------------------|
383    *      |                                           |             +--------+|
384    * L3   |                                           |             |  c5    ||
385    *      |                                           |             +--------+|
386    *    --+-------------------------------------------+-----------------------+
387    */
388   fail_unless (ges_clip_move_to_layer (c, layer1));
389   check_layer (c, 1);
390   check_layer (c1, 2);
391   check_layer (c2, 2);
392   check_layer (c3, 1);
393   check_layer (c4, 2);
394   check_layer (c5, 3);
395   assert_equals_int (_PRIORITY (group), 1);
396   assert_equals_int (_PRIORITY (group1), 1);
397
398   /* We can not move so far! */
399   g_signal_connect_after (c4, "notify::layer",
400       (GCallback) _changed_layer_cb, &nb_layer_notifies);
401   fail_if (ges_clip_move_to_layer (c4, layer));
402   assert_equals_int (nb_layer_notifies, 0);
403   check_layer (c, 1);
404   check_layer (c1, 2);
405   check_layer (c2, 2);
406   check_layer (c3, 1);
407   check_layer (c4, 2);
408   check_layer (c5, 3);
409   assert_equals_int (_PRIORITY (group), 1);
410   assert_equals_int (_PRIORITY (group1), 1);
411
412   clips = ges_container_ungroup (GES_CONTAINER (group), FALSE);
413   assert_equals_int (g_list_length (clips), 4);
414   g_list_free_full (clips, gst_object_unref);
415
416   gst_object_unref (timeline);
417   gst_object_unref (asset);
418
419   ges_deinit ();
420 }
421
422 GST_END_TEST;
423
424 GST_START_TEST (test_group_in_group_layer_moving)
425 {
426   GESAsset *asset;
427   GESTimeline *timeline;
428   GESGroup *group;
429   GESLayer *layer, *layer1, *layer2, *layer3;
430   GESClip *c, *c1;
431
432   GList *clips = NULL;
433
434   ges_init ();
435
436   timeline = ges_timeline_new_audio_video ();
437
438   /* Our timeline
439    *
440    *    --0------------10-Group-----20
441    *      | +-----------+           |
442    * L    | |    C      |           |
443    *      | +-----------+           |
444    *    --|--------------------------
445    *      |            +------------+
446    * L1   |            |     C1     |
447    *      |            +------------+
448    *    -----------------------------
449    */
450
451   layer = ges_timeline_append_layer (timeline);
452   layer1 = ges_timeline_append_layer (timeline);
453   layer2 = ges_timeline_append_layer (timeline);
454   layer3 = ges_timeline_append_layer (timeline);
455   fail_unless (layer2 && layer3);
456   assert_equals_int (ges_layer_get_priority (layer3), 3);
457   asset = ges_asset_request (GES_TYPE_TEST_CLIP, NULL, NULL);
458
459   c = ges_layer_add_asset (layer, asset, 0, 0, 10, GES_TRACK_TYPE_UNKNOWN);
460   c1 = ges_layer_add_asset (layer1, asset, 10, 0, 10, GES_TRACK_TYPE_UNKNOWN);
461   clips = g_list_prepend (clips, c);
462   clips = g_list_prepend (clips, c1);
463   group = GES_GROUP (ges_container_group (clips));
464   fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group) == timeline);
465   g_list_free (clips);
466
467   fail_unless (GES_IS_GROUP (group));
468   CHECK_OBJECT_PROPS (c, 0, 0, 10);
469   CHECK_OBJECT_PROPS (c1, 10, 0, 10);
470   CHECK_OBJECT_PROPS (group, 0, 0, 20);
471
472   /* Our timeline
473    *
474    *    --0--------10-----------20-Group----30
475    *      |         +-----------+           |
476    * L    |         |    C      |           |
477    *      |         +-----------+           |
478    *    --|-----------------------------------
479    *      |                    +------------+
480    * L1   |                    |     C1     |
481    *      |                    +------------+
482    *    -------------------------------------
483    */
484   fail_unless (ges_container_edit (GES_CONTAINER (c), NULL,
485           -1, GES_EDIT_MODE_NORMAL, GES_EDGE_NONE, 10));
486
487   CHECK_OBJECT_PROPS (c, 10, 0, 10);
488   CHECK_OBJECT_PROPS (c1, 20, 0, 10);
489   CHECK_OBJECT_PROPS (group, 10, 0, 20);
490   assert_equals_int (GES_TIMELINE_ELEMENT_LAYER_PRIORITY (c), 0);
491   assert_equals_int (GES_TIMELINE_ELEMENT_LAYER_PRIORITY (c1), 1);
492
493   ges_layer_set_priority (layer2, 0);
494   ges_layer_set_priority (layer, 1);
495   ges_layer_set_priority (layer1, 2);
496
497   assert_equals_int (GES_TIMELINE_ELEMENT_LAYER_PRIORITY (c), 1);
498   assert_equals_int (GES_TIMELINE_ELEMENT_LAYER_PRIORITY (c1), 2);
499
500   /* Our timeline
501    *
502    *    --0--------10-----------20-Group----30
503    *      |         +-----------+           |
504    * L2   |         |    C      |           |
505    *      |         +-----------+           |
506    *    --|-----------------------------------
507    *      |                    +------------+
508    * L    |                    |     C1     |
509    *      |                    +------------+
510    *    -------------------------------------
511    *
512    * L1
513    *    -------------------------------------
514    */
515   fail_unless (ges_container_edit (GES_CONTAINER (c), NULL,
516           0, GES_EDIT_MODE_NORMAL, GES_EDGE_NONE, 10));
517   CHECK_OBJECT_PROPS (c, 10, 0, 10);
518   CHECK_OBJECT_PROPS (c1, 20, 0, 10);
519   CHECK_OBJECT_PROPS (group, 10, 0, 20);
520   assert_equals_int (GES_TIMELINE_ELEMENT_LAYER_PRIORITY (c), 0);
521   assert_equals_int (GES_TIMELINE_ELEMENT_LAYER_PRIORITY (c1), 1);
522
523   /* Our timeline
524    *
525    *    --0--------10-----------20-Group----30
526    * L2   |                                 |
527    *   --------------------------------------
528    *      |         +-----------+           |
529    * L    |         |    C      |           |
530    *      |         +-----------+           |
531    *    --|-----------------------------------
532    *      |                    +------------+
533    * L1   |                    |     C1     |
534    *      |                    +------------+
535    *    -------------------------------------
536    */
537   fail_unless (ges_container_edit (GES_CONTAINER (c), NULL,
538           1, GES_EDIT_MODE_NORMAL, GES_EDGE_NONE, 10));
539   CHECK_OBJECT_PROPS (c, 10, 0, 10);
540   CHECK_OBJECT_PROPS (c1, 20, 0, 10);
541   CHECK_OBJECT_PROPS (group, 10, 0, 20);
542   assert_equals_int (GES_TIMELINE_ELEMENT_LAYER_PRIORITY (c), 1);
543   assert_equals_int (GES_TIMELINE_ELEMENT_LAYER_PRIORITY (c1), 2);
544
545   gst_object_unref (timeline);
546   gst_object_unref (asset);
547
548   ges_deinit ();
549 }
550
551 GST_END_TEST;
552
553
554 GST_START_TEST (test_group_in_self)
555 {
556   GESLayer *layer;
557   GESClip *c, *c1;
558   GESAsset *asset;
559   GESTimeline *timeline;
560   GESGroup *group;
561
562   GList *clips = NULL;
563
564   ges_init ();
565
566   timeline = ges_timeline_new_audio_video ();
567
568   layer = ges_timeline_append_layer (timeline);
569   asset = ges_asset_request (GES_TYPE_TEST_CLIP, NULL, NULL);
570
571   c = ges_layer_add_asset (layer, asset, 0, 0, 10, GES_TRACK_TYPE_UNKNOWN);
572   c1 = ges_layer_add_asset (layer, asset, 10, 0, 10, GES_TRACK_TYPE_UNKNOWN);
573   clips = g_list_prepend (clips, c);
574   clips = g_list_prepend (clips, c1);
575
576
577   group = GES_GROUP (ges_container_group (clips));
578   fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group) == timeline);
579   g_list_free (clips);
580
581   fail_if (ges_container_add (GES_CONTAINER (group),
582           GES_TIMELINE_ELEMENT (group)));
583   clips = ges_container_get_children (GES_CONTAINER (group), TRUE);
584   assert_equals_int (g_list_length (clips), 6);
585
586   gst_object_unref (timeline);
587   gst_object_unref (asset);
588
589   ges_deinit ();
590 }
591
592 GST_END_TEST;
593
594 static void
595 project_loaded_cb (GESProject * project, GESTimeline * timeline,
596     GMainLoop * mainloop)
597 {
598   GST_ERROR ("LOADED!");
599   g_main_loop_quit (mainloop);
600 }
601
602 GST_START_TEST (test_group_serialization)
603 {
604   gchar *tmpuri;
605   GESLayer *layer;
606   GESClip *c, *c1, *c2, *c3;
607   GESAsset *asset;
608   GESTimeline *timeline;
609   GESGroup *group;
610   GESProject *project;
611   GMainLoop *mainloop;
612
613   GError *err = NULL;
614   GList *tmp, *clips = NULL;
615
616   ges_init ();
617
618   timeline = ges_timeline_new_audio_video ();
619
620   layer = ges_timeline_append_layer (timeline);
621   asset = ges_asset_request (GES_TYPE_TEST_CLIP, NULL, NULL);
622
623   c = ges_layer_add_asset (layer, asset, 0, 0, 10, GES_TRACK_TYPE_UNKNOWN);
624
625   c1 = ges_layer_add_asset (layer, asset, 10, 0, 10, GES_TRACK_TYPE_UNKNOWN);
626
627   clips = g_list_prepend (clips, c);
628   clips = g_list_prepend (clips, c1);
629
630   c2 = ges_layer_add_asset (layer, asset, 20, 0, 10, GES_TRACK_TYPE_UNKNOWN);
631
632   c3 = ges_layer_add_asset (layer, asset, 30, 0, 10, GES_TRACK_TYPE_UNKNOWN);
633
634   group = GES_GROUP (ges_container_group (clips));
635   fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group) == timeline);
636   g_list_free (clips);
637
638
639   clips = g_list_append (NULL, group);
640   clips = g_list_append (clips, c2);
641   group = GES_GROUP (ges_container_group (clips));
642   fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group) == timeline);
643   g_list_free (clips);
644
645   clips = g_list_append (NULL, group);
646   clips = g_list_append (clips, c3);
647   group = GES_GROUP (ges_container_group (clips));
648   fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group) == timeline);
649   g_list_free (clips);
650
651   project =
652       GES_PROJECT (ges_extractable_get_asset (GES_EXTRACTABLE (timeline)));
653
654   tmpuri = ges_test_get_tmp_uri ("test-auto-transition-save.xges");
655   fail_unless (ges_project_save (project, timeline, tmpuri, NULL, TRUE, NULL));
656   gst_object_unref (timeline);
657   gst_object_unref (asset);
658
659   project = ges_project_new (tmpuri);
660   mainloop = g_main_loop_new (NULL, FALSE);
661   g_signal_connect (project, "loaded", (GCallback) project_loaded_cb, mainloop);
662   timeline = GES_TIMELINE (ges_asset_extract (GES_ASSET (project), &err));
663   g_main_loop_run (mainloop);
664
665   fail_unless (err == NULL, "%s", err ? err->message : "Nothing");
666   fail_unless (timeline != NULL);
667
668   layer = timeline->layers->data;
669   for (tmp = ges_layer_get_clips (layer); tmp; tmp = tmp->next) {
670     fail_unless (GES_IS_GROUP (GES_TIMELINE_ELEMENT_PARENT (tmp->data)),
671         "%s parent is %p, NOT a group", GES_TIMELINE_ELEMENT_NAME (tmp->data),
672         GES_TIMELINE_ELEMENT_PARENT (tmp->data));
673   }
674
675
676   g_free (tmpuri);
677   gst_object_unref (timeline);
678
679   ges_deinit ();
680 }
681
682 GST_END_TEST;
683
684 static Suite *
685 ges_suite (void)
686 {
687   Suite *s = suite_create ("ges-group");
688   TCase *tc_chain = tcase_create ("group");
689
690   suite_add_tcase (s, tc_chain);
691
692   tcase_add_test (tc_chain, test_move_group);
693   tcase_add_test (tc_chain, test_group_in_group);
694   tcase_add_test (tc_chain, test_group_in_self);
695   tcase_add_test (tc_chain, test_group_serialization);
696   tcase_add_test (tc_chain, test_group_in_group_layer_moving);
697
698   return s;
699 }
700
701 GST_CHECK_MAIN (ges);