2 * Copyright (C) <2004> David Schleef <david at schleef dot org>
3 * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
5 * gstvalue.c: Unit tests for GstValue
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
24 #include <gst/check/gstcheck.h>
27 GST_START_TEST (test_serialize_fourcc)
32 GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'),
33 GST_MAKE_FOURCC ('Y', '8', '0', '0'),
34 GST_MAKE_FOURCC ('Y', '8', ' ', ' '),
35 GST_MAKE_FOURCC ('Y', '1', '6', ' '),
36 GST_MAKE_FOURCC ('Y', 'U', 'Y', '_'),
37 GST_MAKE_FOURCC ('Y', 'U', 'Y', '#'),
39 gint fourccs_size = sizeof (fourccs) / sizeof (fourccs[0]);
40 const gchar *fourcc_strings[] = {
45 "0x5f595559", /* Ascii values of YUY_ */
46 "0x23595559", /* Ascii values of YUY# */
48 gint fourcc_strings_size =
49 sizeof (fourcc_strings) / sizeof (fourcc_strings[0]);
51 fail_unless (fourccs_size == fourcc_strings_size);
53 for (i = 0; i < fourccs_size; ++i) {
56 g_value_init (&value, GST_TYPE_FOURCC);
58 gst_value_set_fourcc (&value, fourccs[i]);
59 str = gst_value_serialize (&value);
61 fail_unless (strcmp (str, fourcc_strings[i]) == 0);
69 GST_START_TEST (test_deserialize_fourcc)
74 GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'),
75 GST_MAKE_FOURCC ('Y', '8', '0', '0'),
76 GST_MAKE_FOURCC ('Y', '8', ' ', ' '),
77 GST_MAKE_FOURCC ('Y', '8', ' ', ' '),
78 GST_MAKE_FOURCC ('Y', '8', ' ', ' '),
79 GST_MAKE_FOURCC ('Y', '1', '6', ' '),
80 GST_MAKE_FOURCC ('Y', 'U', 'Y', '_'),
81 GST_MAKE_FOURCC ('Y', 'U', 'Y', '#'),
83 gint fourccs_size = sizeof (fourccs) / sizeof (fourccs[0]);
84 const gchar *fourcc_strings[] = {
91 "0x5f595559", /* Ascii values of YUY_ */
92 "0x23595559", /* Ascii values of YUY# */
94 gint fourcc_strings_size =
95 sizeof (fourcc_strings) / sizeof (fourcc_strings[0]);
97 fail_unless (fourccs_size == fourcc_strings_size);
99 for (i = 0; i < fourccs_size; ++i) {
100 GValue value = { 0 };
102 g_value_init (&value, GST_TYPE_FOURCC);
104 fail_unless (gst_value_deserialize (&value, fourcc_strings[i]));
105 fail_unless_equals_int (gst_value_get_fourcc (&value), fourccs[i]);
107 g_value_unset (&value);
113 GST_START_TEST (test_deserialize_buffer)
115 GValue value = { 0 };
118 g_value_init (&value, GST_TYPE_BUFFER);
119 fail_unless (gst_value_deserialize (&value, "1234567890abcdef"));
120 /* does not increase the refcount */
121 buf = GST_BUFFER (gst_value_get_mini_object (&value));
122 ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1);
124 /* does not increase the refcount */
125 buf = gst_value_get_buffer (&value);
126 ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1);
129 g_value_unset (&value);
134 /* create and serialize a buffer */
135 GST_START_TEST (test_serialize_buffer)
137 GValue value = { 0 };
140 static const char *buf_data = "1234567890abcdef";
143 len = strlen (buf_data);
144 buf = gst_buffer_new_and_alloc (len);
145 memcpy (GST_BUFFER_DATA (buf), buf_data, len);
146 ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1);
148 /* and assign buffer to mini object */
149 g_value_init (&value, GST_TYPE_BUFFER);
150 gst_value_take_buffer (&value, buf);
151 ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1);
153 /* now serialize it */
154 serialized = gst_value_serialize (&value);
155 GST_DEBUG ("serialized buffer to %s", serialized);
156 fail_unless (serialized != NULL);
158 /* refcount should not change */
159 ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1);
163 g_value_unset (&value);
165 /* take NULL buffer */
166 g_value_init (&value, GST_TYPE_BUFFER);
167 GST_DEBUG ("setting NULL buffer");
168 gst_value_take_buffer (&value, NULL);
170 /* now serialize it */
171 GST_DEBUG ("serializing NULL buffer");
172 serialized = gst_value_serialize (&value);
173 /* should return NULL */
174 fail_unless (serialized == NULL);
177 g_value_unset (&value);
182 GST_START_TEST (test_deserialize_gint64)
184 GValue value = { 0 };
185 const char *strings[] = {
188 "1152921504606846976",
189 "-1152921504606846976",
194 1152921504606846976LL,
195 -1152921504606846976LL,
199 g_value_init (&value, G_TYPE_INT64);
201 for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
202 fail_unless (gst_value_deserialize (&value, strings[i]),
203 "could not deserialize %s (%d)", strings[i], i);
204 fail_unless (g_value_get_int64 (&value) == results[i],
205 "resulting value is %" G_GINT64_FORMAT ", not %" G_GINT64_FORMAT
206 ", for string %s (%d)", g_value_get_int64 (&value),
207 results[i], strings[i], i);
213 GST_START_TEST (test_deserialize_guint64)
215 GValue value = { 0 };
216 const char *strings[] = {
217 "0xffffffffffffffff",
218 "9223372036854775810",
219 "-9223372036854775810",
224 guint64 results[] = {
225 0xffffffffffffffffULL,
226 9223372036854775810ULL,
227 9223372036854775806ULL,
234 g_value_init (&value, G_TYPE_UINT64);
236 for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
237 fail_unless (gst_value_deserialize (&value, strings[i]),
238 "could not deserialize %s (%d)", strings[i], i);
239 fail_unless (g_value_get_uint64 (&value) == results[i],
240 "resulting value is %" G_GUINT64_FORMAT ", not %" G_GUINT64_FORMAT
241 ", for string %s (%d)", g_value_get_uint64 (&value),
242 results[i], strings[i], i);
248 GST_START_TEST (test_deserialize_gstfraction)
250 GValue value = { 0 };
251 const char *strings[] = {
255 gint64 result_numers[] = {
259 gint64 result_denoms[] = {
266 g_value_init (&value, GST_TYPE_FRACTION);
267 for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
268 fail_unless (gst_value_deserialize (&value, strings[i]),
269 "could not deserialize %s (%d)", strings[i], i);
270 fail_unless (gst_value_get_fraction_numerator (&value) == result_numers[i],
271 "resulting numerator value is %d, not %d"
272 ", for string %s (%d)", gst_value_get_fraction_numerator (&value),
273 result_numers[i], strings[i], i);
274 fail_unless (gst_value_get_fraction_denominator (&value) ==
275 result_denoms[i], "resulting denominator value is %d, not %d"
276 ", for string %s (%d)", gst_value_get_fraction_denominator (&value),
277 result_denoms[i], strings[i], i);
283 GST_START_TEST (test_deserialize_gint)
285 GValue value = { 0 };
286 const char *strings[] = {
291 /* a positive long long, serializing to highest possible positive sint */
293 /* a positive long long, serializing to lowest possible negative sint */
295 /* a negative long long, serializing to lowest possible negative sint */
296 "0xFFFFFFFF80000000",
298 /* a positive long long serializing to -1 */
301 /* a negative long long serializing to -1 */
302 "0xFFFFFFFFFFFFFFFF",
303 "0xFFFFFFFFFFFFFFFF",
306 /* some casts need to be explicit because of unsigned -> signed */
319 (gint) 0xFFFFFFFFFFFFFFFFLL,
324 g_value_init (&value, G_TYPE_INT);
326 for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
327 fail_unless (gst_value_deserialize (&value, strings[i]),
328 "could not deserialize %s (%d)", strings[i], i);
329 fail_unless (g_value_get_int (&value) == results[i],
330 "resulting value is %d, not %d, for string %s (%d)",
331 g_value_get_int (&value), results[i], strings[i], i);
337 GST_START_TEST (test_deserialize_gint_failures)
339 GValue value = { 0 };
340 const char *strings[] = {
341 "-", /* not a complete number */
342 "- TEST", /* not a complete number */
343 "0x0000000100000000", /* lowest long long that cannot fit in 32 bits */
344 "0xF000000000000000",
345 "0xFFFFFFF000000000",
346 "0xFFFFFFFF00000000",
347 "0x10000000000000000", /* first number too long to fit into a long long */
348 /* invent a new processor first before trying to make this one pass */
349 "0x10000000000000000000000000000000000000000000",
353 g_value_init (&value, G_TYPE_INT);
355 for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
356 fail_if (gst_value_deserialize (&value, strings[i]),
357 "deserialized %s (%d), while it should have failed", strings[i], i);
363 GST_START_TEST (test_deserialize_guint)
365 GValue value = { 0 };
366 const char *strings[] = {
371 /* a positive long long, serializing to highest possible positive sint */
373 /* a positive long long, serializing to lowest possible negative sint */
376 /* a negative long long, serializing to lowest possible negative sint */
377 "0xFFFFFFFF80000000",
378 /* a value typically used for rgb masks */
380 /* a positive long long serializing to highest possible positive uint */
383 /* a negative long long serializing to highest possible positive uint */
384 "0xFFFFFFFFFFFFFFFF",
394 (guint) 2147483648LL,
399 (guint) 0xFFFFFFFFFFFFFFFFLL,
404 g_value_init (&value, G_TYPE_UINT);
406 for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
407 fail_unless (gst_value_deserialize (&value, strings[i]),
408 "could not deserialize %s (%d)", strings[i], i);
409 fail_unless (g_value_get_uint (&value) == results[i],
410 "resulting value is %d, not %d, for string %s (%d)",
411 g_value_get_uint (&value), results[i], strings[i], i);
417 GST_START_TEST (test_deserialize_guint_failures)
419 GValue value = { 0 };
420 const char *strings[] = {
421 "-", /* not a complete number */
422 "- TEST", /* not a complete number */
424 /* FIXME: these values should not be deserializable, since they overflow
425 * the target format */
426 "0x0000000100000000", /* lowest long long that cannot fit in 32 bits */
427 "0xF000000000000000",
428 "0xFFFFFFF000000000",
429 "0xFFFFFFFF00000000",
430 "0x10000000000000000", /* first number too long to fit into a long long */
431 /* invent a new processor first before trying to make this one pass */
432 "0x10000000000000000000000000000000000000000000",
437 g_value_init (&value, G_TYPE_UINT);
439 for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
440 fail_if (gst_value_deserialize (&value, strings[i]),
441 "deserialized %s (%d), while it should have failed", strings[i], i);
447 GST_START_TEST (test_serialize_flags)
449 GValue value = { 0 };
451 GstSeekFlags flags[] = {
455 GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
457 const char *results[] = {
458 "GST_SEEK_FLAG_NONE",
459 "GST_SEEK_FLAG_NONE",
460 "GST_SEEK_FLAG_FLUSH",
461 "GST_SEEK_FLAG_FLUSH+GST_SEEK_FLAG_ACCURATE",
465 g_value_init (&value, GST_TYPE_SEEK_FLAGS);
467 for (i = 0; i < G_N_ELEMENTS (flags); ++i) {
468 g_value_set_flags (&value, flags[i]);
469 string = gst_value_serialize (&value);
470 fail_if (string == NULL, "could not serialize flags %d", i);
471 fail_unless (strcmp (string, results[i]) == 0,
472 "resulting value is %s, not %s, for flags #%d", string, results[i], i);
480 GST_START_TEST (test_deserialize_flags)
482 GValue value = { 0 };
483 const char *strings[] = {
486 "GST_SEEK_FLAG_NONE",
487 "GST_SEEK_FLAG_FLUSH",
488 "GST_SEEK_FLAG_FLUSH+GST_SEEK_FLAG_ACCURATE",
490 GstSeekFlags results[] = {
495 GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
499 g_value_init (&value, GST_TYPE_SEEK_FLAGS);
501 for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
502 fail_unless (gst_value_deserialize (&value, strings[i]),
503 "could not deserialize %s (%d)", strings[i], i);
504 fail_unless (g_value_get_flags (&value) == results[i],
505 "resulting value is %d, not %d, for string %s (%d)",
506 g_value_get_flags (&value), results[i], strings[i], i);
512 GST_START_TEST (test_string)
514 const gchar *try[] = {
518 "\"\"" /* Empty string */
524 g_value_init (&v, G_TYPE_STRING);
525 for (i = 0; i < G_N_ELEMENTS (try); i++) {
526 g_value_set_string (&v, try[i]);
527 tmp = gst_value_serialize (&v);
528 fail_if (tmp == NULL, "couldn't serialize: %s\n", try[i]);
529 fail_unless (gst_value_deserialize (&v, tmp),
530 "couldn't deserialize: %s\n", tmp);
533 fail_unless (g_str_equal (g_value_get_string (&v), try[i]),
534 "\nserialized : %s\ndeserialized: %s", try[i],
535 g_value_get_string (&v));
537 /* NULL strings should not be serializable */
538 g_value_set_string (&v, NULL);
539 fail_unless (gst_value_serialize (&v) == NULL);
545 GST_START_TEST (test_deserialize_string)
553 "", ""}, /* empty strings */
555 "\"\"", ""}, /* quoted empty string -> empty string */
556 /* Expected FAILURES: */
558 "\"", NULL}, /* missing second quote */
560 "\"Hello\\ World", NULL}, /* missing second quote */
562 "\"\\", NULL}, /* quote at end, missing second quote */
564 "\"\\0", NULL}, /* missing second quote */
566 "\"\\0\"", NULL}, /* unfinished escaped character */
568 "\" \"", NULL}, /* spaces must be escaped */
570 /* FIXME 0.9: this test should fail, but it doesn't */
572 "tüüt", NULL} /* string with special chars must be escaped */
579 g_value_init (&v, G_TYPE_STRING);
580 for (i = 0; i < G_N_ELEMENTS (tests); i++) {
581 if (gst_value_deserialize (&v, tests[i].from)) {
582 fail_if (tests[i].to == NULL,
583 "I got %s instead of a failure", g_value_get_string (&v));
584 fail_unless (g_str_equal (g_value_get_string (&v), tests[i].to),
585 "\nwanted: %s\ngot : %s", tests[i].to, g_value_get_string (&v));
587 fail_if (tests[i].to != NULL, "failed, but wanted: %s", tests[i].to);
596 GST_START_TEST (test_value_compare)
598 GValue value1 = { 0 };
599 GValue value2 = { 0 };
602 g_value_init (&value1, G_TYPE_INT);
603 g_value_set_int (&value1, 10);
604 g_value_init (&value2, G_TYPE_INT);
605 g_value_set_int (&value2, 20);
606 fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
607 fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
608 fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
609 g_value_unset (&value1);
610 g_value_unset (&value2);
612 g_value_init (&value1, G_TYPE_DOUBLE);
613 g_value_set_double (&value1, 10);
614 g_value_init (&value2, G_TYPE_DOUBLE);
615 g_value_set_double (&value2, 20);
616 fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
617 fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
618 fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
619 g_value_unset (&value1);
620 g_value_unset (&value2);
622 g_value_init (&value1, G_TYPE_STRING);
623 g_value_set_string (&value1, "a");
624 g_value_init (&value2, G_TYPE_STRING);
625 g_value_set_string (&value2, "b");
626 fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
627 fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
628 fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
629 /* Test some NULL string comparisons */
630 g_value_set_string (&value2, NULL);
631 fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_UNORDERED);
632 fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_UNORDERED);
633 fail_unless (gst_value_compare (&value2, &value2) == GST_VALUE_EQUAL);
635 g_value_unset (&value1);
636 g_value_unset (&value2);
638 g_value_init (&value1, GST_TYPE_FOURCC);
639 gst_value_set_fourcc (&value1, GST_MAKE_FOURCC ('a', 'b', 'c', 'd'));
640 g_value_init (&value2, GST_TYPE_FOURCC);
641 gst_value_set_fourcc (&value2, GST_MAKE_FOURCC ('1', '2', '3', '4'));
642 fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_UNORDERED);
643 fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
644 g_value_unset (&value1);
645 g_value_unset (&value2);
647 /* comparing 2/3 with 3/4 */
648 g_value_init (&value1, GST_TYPE_FRACTION);
649 gst_value_set_fraction (&value1, 2, 3);
650 g_value_init (&value2, GST_TYPE_FRACTION);
651 gst_value_set_fraction (&value2, 3, 4);
652 fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
653 fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
654 fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
655 g_value_unset (&value1);
656 g_value_unset (&value2);
658 /* comparing -4/5 with 2/-3 */
659 g_value_init (&value1, GST_TYPE_FRACTION);
660 gst_value_set_fraction (&value1, -4, 5);
661 g_value_init (&value2, GST_TYPE_FRACTION);
662 gst_value_set_fraction (&value2, 2, -3);
663 fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
664 fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
665 fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
666 g_value_unset (&value1);
667 g_value_unset (&value2);
669 /* comparing 10/100 with 200/2000 */
670 g_value_init (&value1, GST_TYPE_FRACTION);
671 gst_value_set_fraction (&value1, 10, 100);
672 g_value_init (&value2, GST_TYPE_FRACTION);
673 gst_value_set_fraction (&value2, 200, 2000);
674 fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL);
675 g_value_unset (&value1);
676 g_value_unset (&value2);
678 /* comparing -4/5 with 2/-3 */
679 g_value_init (&value1, GST_TYPE_FRACTION);
680 gst_value_set_fraction (&value1, -4, 5);
681 g_value_init (&value2, GST_TYPE_FRACTION);
682 gst_value_set_fraction (&value2, 2, -3);
683 fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
684 fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
685 fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
686 g_value_unset (&value1);
687 g_value_unset (&value2);
689 /* Check that lists are equal regardless of order */
690 g_value_init (&value1, GST_TYPE_LIST);
691 g_value_init (&tmp, G_TYPE_INT);
692 g_value_set_int (&tmp, 1);
693 gst_value_list_append_value (&value1, &tmp);
694 g_value_set_int (&tmp, 2);
695 gst_value_list_append_value (&value1, &tmp);
696 g_value_set_int (&tmp, 3);
697 gst_value_list_append_value (&value1, &tmp);
698 g_value_set_int (&tmp, 4);
699 gst_value_list_append_value (&value1, &tmp);
701 g_value_init (&value2, GST_TYPE_LIST);
702 g_value_set_int (&tmp, 4);
703 gst_value_list_append_value (&value2, &tmp);
704 g_value_set_int (&tmp, 3);
705 gst_value_list_append_value (&value2, &tmp);
706 g_value_set_int (&tmp, 2);
707 gst_value_list_append_value (&value2, &tmp);
708 g_value_set_int (&tmp, 1);
709 gst_value_list_append_value (&value2, &tmp);
711 fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL,
712 "value lists with different order were not equal when they should be");
713 fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL,
714 "value lists with same order were not equal when they should be");
715 fail_unless (gst_value_compare (&value2, &value2) == GST_VALUE_EQUAL,
716 "value lists with same order were not equal when they should be");
718 /* Carry over the lists to this next check: */
719 /* Lists with different sizes are unequal */
720 g_value_set_int (&tmp, 1);
721 gst_value_list_append_value (&value2, &tmp);
723 fail_if (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL,
724 "Value lists with different size were equal when they shouldn't be");
726 /* Carry over the lists to this next check: */
727 /* Lists with same size but list1 contains one more element not in list2 */
728 g_value_set_int (&tmp, 5);
729 gst_value_list_append_value (&value1, &tmp);
731 fail_if (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL,
732 "Value lists with different elements were equal when they shouldn't be");
733 fail_if (gst_value_compare (&value2, &value1) == GST_VALUE_EQUAL,
734 "Value lists with different elements were equal when they shouldn't be");
736 g_value_unset (&value1);
737 g_value_unset (&value2);
738 g_value_unset (&tmp);
740 /* Arrays are only equal when in the same order */
741 g_value_init (&value1, GST_TYPE_ARRAY);
742 g_value_init (&tmp, G_TYPE_INT);
743 g_value_set_int (&tmp, 1);
744 gst_value_array_append_value (&value1, &tmp);
745 g_value_set_int (&tmp, 2);
746 gst_value_array_append_value (&value1, &tmp);
747 g_value_set_int (&tmp, 3);
748 gst_value_array_append_value (&value1, &tmp);
749 g_value_set_int (&tmp, 4);
750 gst_value_array_append_value (&value1, &tmp);
752 g_value_init (&value2, GST_TYPE_ARRAY);
753 g_value_set_int (&tmp, 4);
754 gst_value_array_append_value (&value2, &tmp);
755 g_value_set_int (&tmp, 3);
756 gst_value_array_append_value (&value2, &tmp);
757 g_value_set_int (&tmp, 2);
758 gst_value_array_append_value (&value2, &tmp);
759 g_value_set_int (&tmp, 1);
760 gst_value_array_append_value (&value2, &tmp);
762 fail_if (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL,
763 "Value arrays with different order were equal when they shouldn't be");
764 fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL,
765 "Identical value arrays were not equal when they should be");
766 fail_unless (gst_value_compare (&value2, &value2) == GST_VALUE_EQUAL,
767 "Identical value arrays were not equal when they should be");
769 /* Carry over the arrays to this next check: */
770 /* Arrays with different sizes are unequal */
771 g_value_unset (&value2);
772 g_value_init (&value2, GST_TYPE_ARRAY);
773 g_value_copy (&value1, &value2);
775 g_value_set_int (&tmp, 1);
776 gst_value_array_append_value (&value2, &tmp);
778 fail_if (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL,
779 "Value arrays with different size were equal when they shouldn't be");
780 /* order should not matter */
781 fail_if (gst_value_compare (&value2, &value1) == GST_VALUE_EQUAL,
782 "Value arrays with different size were equal when they shouldn't be");
784 g_value_unset (&value1);
785 g_value_unset (&value2);
786 g_value_unset (&tmp);
791 GST_START_TEST (test_value_intersect)
799 g_value_init (&src1, G_TYPE_INT);
800 g_value_set_int (&src1, 10);
801 g_value_init (&src2, G_TYPE_INT);
802 g_value_set_int (&src2, 20);
803 ret = gst_value_intersect (&dest, &src1, &src2);
804 fail_unless (ret == FALSE);
805 g_value_unset (&src1);
806 g_value_unset (&src2);
808 g_value_init (&src1, GST_TYPE_FOURCC);
809 gst_value_set_fourcc (&src1, GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'));
810 g_value_init (&src2, GST_TYPE_LIST);
811 g_value_init (&item, GST_TYPE_FOURCC);
812 gst_value_set_fourcc (&item, GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'));
813 gst_value_list_append_value (&src2, &item);
814 gst_value_set_fourcc (&item, GST_MAKE_FOURCC ('I', '4', '2', '0'));
815 gst_value_list_append_value (&src2, &item);
816 gst_value_set_fourcc (&item, GST_MAKE_FOURCC ('A', 'B', 'C', 'D'));
817 gst_value_list_append_value (&src2, &item);
819 fail_unless (gst_value_intersect (&dest, &src1, &src2));
820 fail_unless (GST_VALUE_HOLDS_FOURCC (&dest));
821 fail_unless (gst_value_get_fourcc (&dest) ==
822 GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'));
824 g_value_unset (&src1);
825 g_value_unset (&src2);
831 GST_START_TEST (test_value_subtract_int)
841 g_value_init (&src1, G_TYPE_INT);
842 g_value_set_int (&src1, 10);
843 g_value_init (&src2, G_TYPE_INT);
844 g_value_set_int (&src2, 20);
845 /* subtract as in sets, result is 10 */
846 ret = gst_value_subtract (&dest, &src1, &src2);
847 fail_unless (ret == TRUE);
848 fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
849 g_value_unset (&dest);
851 /* same values, yields empty set */
852 ret = gst_value_subtract (&dest, &src1, &src1);
853 fail_unless (ret == FALSE);
854 g_value_unset (&src1);
855 g_value_unset (&src2);
860 /* would yield an empty set */
861 g_value_init (&src1, G_TYPE_INT);
862 g_value_set_int (&src1, 10);
863 g_value_init (&src2, GST_TYPE_INT_RANGE);
864 gst_value_set_int_range (&src2, 0, 20);
865 ret = gst_value_subtract (&dest, &src1, &src2);
866 fail_unless (ret == FALSE);
868 /* and the other way around, should create a list of two ranges. */
869 ret = gst_value_subtract (&dest, &src2, &src1);
870 fail_unless (ret == TRUE);
871 fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
872 tmp = gst_value_list_get_value (&dest, 0);
873 fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
874 fail_unless (gst_value_get_int_range_min (tmp) == 0);
875 fail_unless (gst_value_get_int_range_max (tmp) == 9);
876 tmp = gst_value_list_get_value (&dest, 1);
877 fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
878 fail_unless (gst_value_get_int_range_min (tmp) == 11);
879 fail_unless (gst_value_get_int_range_max (tmp) == 20);
880 g_value_unset (&dest);
881 g_value_unset (&src1);
882 g_value_unset (&src2);
884 /* border case 1, empty set */
885 g_value_init (&src1, G_TYPE_INT);
886 g_value_set_int (&src1, 10);
887 g_value_init (&src2, GST_TYPE_INT_RANGE);
888 gst_value_set_int_range (&src2, 10, 20);
889 ret = gst_value_subtract (&dest, &src1, &src2);
890 fail_unless (ret == FALSE);
892 /* and the other way around, should create a new range. */
893 ret = gst_value_subtract (&dest, &src2, &src1);
894 fail_unless (ret == TRUE);
895 fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
896 fail_unless (gst_value_get_int_range_min (&dest) == 11);
897 fail_unless (gst_value_get_int_range_max (&dest) == 20);
898 g_value_unset (&dest);
899 g_value_unset (&src1);
900 g_value_unset (&src2);
902 /* border case 2, empty set */
903 g_value_init (&src1, G_TYPE_INT);
904 g_value_set_int (&src1, 20);
905 g_value_init (&src2, GST_TYPE_INT_RANGE);
906 gst_value_set_int_range (&src2, 10, 20);
907 ret = gst_value_subtract (&dest, &src1, &src2);
908 fail_unless (ret == FALSE);
910 /* and the other way around, should create a new range. */
911 ret = gst_value_subtract (&dest, &src2, &src1);
912 fail_unless (ret == TRUE);
913 fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
914 fail_unless (gst_value_get_int_range_min (&dest) == 10);
915 fail_unless (gst_value_get_int_range_max (&dest) == 19);
916 g_value_unset (&dest);
917 g_value_unset (&src1);
918 g_value_unset (&src2);
920 /* case 3, valid set */
921 g_value_init (&src1, G_TYPE_INT);
922 g_value_set_int (&src1, 0);
923 g_value_init (&src2, GST_TYPE_INT_RANGE);
924 gst_value_set_int_range (&src2, 10, 20);
925 ret = gst_value_subtract (&dest, &src1, &src2);
926 fail_unless (ret == TRUE);
927 fail_unless (G_VALUE_HOLDS_INT (&dest) == TRUE);
928 fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
929 g_value_unset (&dest);
931 /* and the other way around, should keep the range. */
932 ret = gst_value_subtract (&dest, &src2, &src1);
933 fail_unless (ret == TRUE);
934 fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
935 fail_unless (gst_value_get_int_range_min (&dest) == 10);
936 fail_unless (gst_value_get_int_range_max (&dest) == 20);
937 g_value_unset (&dest);
938 g_value_unset (&src1);
939 g_value_unset (&src2);
941 /* int_range <-> int_range
944 /* same range, empty set */
945 g_value_init (&src1, GST_TYPE_INT_RANGE);
946 gst_value_set_int_range (&src1, 10, 20);
947 g_value_init (&src2, GST_TYPE_INT_RANGE);
948 gst_value_set_int_range (&src2, 10, 20);
949 ret = gst_value_subtract (&dest, &src1, &src2);
950 fail_unless (ret == FALSE);
951 ret = gst_value_subtract (&dest, &src2, &src1);
952 fail_unless (ret == FALSE);
953 g_value_unset (&src1);
954 g_value_unset (&src2);
956 /* non overlapping ranges */
957 g_value_init (&src1, GST_TYPE_INT_RANGE);
958 gst_value_set_int_range (&src1, 10, 20);
959 g_value_init (&src2, GST_TYPE_INT_RANGE);
960 gst_value_set_int_range (&src2, 30, 40);
961 ret = gst_value_subtract (&dest, &src1, &src2);
962 fail_unless (ret == TRUE);
963 fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
964 fail_unless (gst_value_get_int_range_min (&dest) == 10);
965 fail_unless (gst_value_get_int_range_max (&dest) == 20);
966 g_value_unset (&dest);
968 ret = gst_value_subtract (&dest, &src2, &src1);
969 fail_unless (ret == TRUE);
970 fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
971 fail_unless (gst_value_get_int_range_min (&dest) == 30);
972 fail_unless (gst_value_get_int_range_max (&dest) == 40);
973 g_value_unset (&dest);
974 g_value_unset (&src1);
975 g_value_unset (&src2);
977 /* completely overlapping ranges */
978 g_value_init (&src1, GST_TYPE_INT_RANGE);
979 gst_value_set_int_range (&src1, 10, 20);
980 g_value_init (&src2, GST_TYPE_INT_RANGE);
981 gst_value_set_int_range (&src2, 10, 30);
982 ret = gst_value_subtract (&dest, &src1, &src2);
983 fail_unless (ret == FALSE);
985 ret = gst_value_subtract (&dest, &src2, &src1);
986 fail_unless (ret == TRUE);
987 fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
988 fail_unless (gst_value_get_int_range_min (&dest) == 21);
989 fail_unless (gst_value_get_int_range_max (&dest) == 30);
990 g_value_unset (&dest);
991 g_value_unset (&src1);
992 g_value_unset (&src2);
994 /* partially overlapping ranges */
995 g_value_init (&src1, GST_TYPE_INT_RANGE);
996 gst_value_set_int_range (&src1, 10, 20);
997 g_value_init (&src2, GST_TYPE_INT_RANGE);
998 gst_value_set_int_range (&src2, 15, 30);
999 ret = gst_value_subtract (&dest, &src1, &src2);
1000 fail_unless (ret == TRUE);
1001 fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
1002 fail_unless (gst_value_get_int_range_min (&dest) == 10);
1003 fail_unless (gst_value_get_int_range_max (&dest) == 14);
1004 g_value_unset (&dest);
1006 ret = gst_value_subtract (&dest, &src2, &src1);
1007 fail_unless (ret == TRUE);
1008 fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
1009 fail_unless (gst_value_get_int_range_min (&dest) == 21);
1010 fail_unless (gst_value_get_int_range_max (&dest) == 30);
1011 g_value_unset (&dest);
1012 g_value_unset (&src1);
1013 g_value_unset (&src2);
1015 /* create a hole { int_range, int_range } */
1016 g_value_init (&src1, GST_TYPE_INT_RANGE);
1017 gst_value_set_int_range (&src1, 10, 30);
1018 g_value_init (&src2, GST_TYPE_INT_RANGE);
1019 gst_value_set_int_range (&src2, 15, 20);
1020 ret = gst_value_subtract (&dest, &src1, &src2);
1021 fail_unless (ret == TRUE);
1022 fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
1023 tmp = gst_value_list_get_value (&dest, 0);
1024 fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
1025 fail_unless (gst_value_get_int_range_min (tmp) == 10);
1026 fail_unless (gst_value_get_int_range_max (tmp) == 14);
1027 tmp = gst_value_list_get_value (&dest, 1);
1028 fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
1029 fail_unless (gst_value_get_int_range_min (tmp) == 21);
1030 fail_unless (gst_value_get_int_range_max (tmp) == 30);
1031 g_value_unset (&dest);
1033 ret = gst_value_subtract (&dest, &src2, &src1);
1034 fail_unless (ret == FALSE);
1035 g_value_unset (&src1);
1036 g_value_unset (&src2);
1038 /* create a hole, { int, int } */
1039 g_value_init (&src1, GST_TYPE_INT_RANGE);
1040 gst_value_set_int_range (&src1, 10, 30);
1041 g_value_init (&src2, GST_TYPE_INT_RANGE);
1042 gst_value_set_int_range (&src2, 11, 29);
1043 ret = gst_value_subtract (&dest, &src1, &src2);
1044 fail_unless (ret == TRUE);
1045 fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
1046 tmp = gst_value_list_get_value (&dest, 0);
1047 fail_unless (G_VALUE_HOLDS_INT (tmp) == TRUE);
1048 fail_unless (g_value_get_int (tmp) == 10);
1049 tmp = gst_value_list_get_value (&dest, 1);
1050 fail_unless (G_VALUE_HOLDS_INT (tmp) == TRUE);
1051 fail_unless (g_value_get_int (tmp) == 30);
1052 g_value_unset (&dest);
1054 ret = gst_value_subtract (&dest, &src2, &src1);
1055 fail_unless (ret == FALSE);
1056 g_value_unset (&src1);
1057 g_value_unset (&src2);
1059 /* create a hole, { int, int_range } */
1060 g_value_init (&src1, GST_TYPE_INT_RANGE);
1061 gst_value_set_int_range (&src1, 10, 30);
1062 g_value_init (&src2, GST_TYPE_INT_RANGE);
1063 gst_value_set_int_range (&src2, 11, 28);
1064 ret = gst_value_subtract (&dest, &src1, &src2);
1065 fail_unless (ret == TRUE);
1066 fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
1067 tmp = gst_value_list_get_value (&dest, 0);
1068 fail_unless (G_VALUE_HOLDS_INT (tmp) == TRUE);
1069 fail_unless (g_value_get_int (tmp) == 10);
1070 tmp = gst_value_list_get_value (&dest, 1);
1071 fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
1072 fail_unless (gst_value_get_int_range_min (tmp) == 29);
1073 fail_unless (gst_value_get_int_range_max (tmp) == 30);
1074 g_value_unset (&dest);
1076 ret = gst_value_subtract (&dest, &src2, &src1);
1077 fail_unless (ret == FALSE);
1078 g_value_unset (&src1);
1079 g_value_unset (&src2);
1081 /* create a hole, { int_range, int } */
1082 g_value_init (&src1, GST_TYPE_INT_RANGE);
1083 gst_value_set_int_range (&src1, 10, 30);
1084 g_value_init (&src2, GST_TYPE_INT_RANGE);
1085 gst_value_set_int_range (&src2, 12, 29);
1086 ret = gst_value_subtract (&dest, &src1, &src2);
1087 fail_unless (ret == TRUE);
1088 fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
1089 tmp = gst_value_list_get_value (&dest, 0);
1090 fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
1091 fail_unless (gst_value_get_int_range_min (tmp) == 10);
1092 fail_unless (gst_value_get_int_range_max (tmp) == 11);
1093 tmp = gst_value_list_get_value (&dest, 1);
1094 fail_unless (G_VALUE_HOLDS_INT (tmp) == TRUE);
1095 fail_unless (g_value_get_int (tmp) == 30);
1096 g_value_unset (&dest);
1098 ret = gst_value_subtract (&dest, &src2, &src1);
1099 fail_unless (ret == FALSE);
1100 g_value_unset (&src1);
1101 g_value_unset (&src2);
1106 GST_START_TEST (test_value_subtract_double)
1108 GValue dest = { 0 };
1109 GValue src1 = { 0 };
1110 GValue src2 = { 0 };
1114 /* double <-> double
1116 g_value_init (&src1, G_TYPE_DOUBLE);
1117 g_value_set_double (&src1, 10.0);
1118 g_value_init (&src2, G_TYPE_DOUBLE);
1119 g_value_set_double (&src2, 20.0);
1120 /* subtract as in sets, result is 10 */
1121 ret = gst_value_subtract (&dest, &src1, &src2);
1122 fail_unless (ret == TRUE);
1123 fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
1124 g_value_unset (&dest);
1126 /* same values, yields empty set */
1127 ret = gst_value_subtract (&dest, &src1, &src1);
1128 fail_unless (ret == FALSE);
1129 g_value_unset (&src1);
1130 g_value_unset (&src2);
1132 /* double <-> double_range
1135 /* would yield an empty set */
1136 g_value_init (&src1, G_TYPE_DOUBLE);
1137 g_value_set_double (&src1, 10.0);
1138 g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
1139 gst_value_set_double_range (&src2, 0.0, 20.0);
1140 ret = gst_value_subtract (&dest, &src1, &src2);
1141 fail_unless (ret == FALSE);
1143 /* and the other way around, we cannot create open ranges
1144 * so the result is the range again */
1145 ret = gst_value_subtract (&dest, &src2, &src1);
1146 fail_unless (ret == TRUE);
1147 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
1148 fail_unless (gst_value_get_double_range_min (&dest) == 0.0);
1149 fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
1150 g_value_unset (&dest);
1151 g_value_unset (&src1);
1152 g_value_unset (&src2);
1154 /* border case 1, empty set */
1155 g_value_init (&src1, G_TYPE_DOUBLE);
1156 g_value_set_double (&src1, 10.0);
1157 g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
1158 gst_value_set_double_range (&src2, 10.0, 20.0);
1159 ret = gst_value_subtract (&dest, &src1, &src2);
1160 fail_unless (ret == FALSE);
1162 /* and the other way around, should keep same range as
1163 * we don't have open ranges. */
1164 ret = gst_value_subtract (&dest, &src2, &src1);
1165 fail_unless (ret == TRUE);
1166 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
1167 fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
1168 fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
1169 g_value_unset (&dest);
1170 g_value_unset (&src1);
1171 g_value_unset (&src2);
1173 /* border case 2, empty set */
1174 g_value_init (&src1, G_TYPE_DOUBLE);
1175 g_value_set_double (&src1, 20.0);
1176 g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
1177 gst_value_set_double_range (&src2, 10.0, 20.0);
1178 ret = gst_value_subtract (&dest, &src1, &src2);
1179 fail_unless (ret == FALSE);
1181 /* and the other way around, should keep same range as
1182 * we don't have open ranges. */
1183 ret = gst_value_subtract (&dest, &src2, &src1);
1184 fail_unless (ret == TRUE);
1185 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
1186 fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
1187 fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
1188 g_value_unset (&dest);
1189 g_value_unset (&src1);
1190 g_value_unset (&src2);
1192 /* case 3, valid set */
1193 g_value_init (&src1, G_TYPE_DOUBLE);
1194 g_value_set_double (&src1, 0.0);
1195 g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
1196 gst_value_set_double_range (&src2, 10.0, 20.0);
1197 ret = gst_value_subtract (&dest, &src1, &src2);
1198 fail_unless (ret == TRUE);
1199 fail_unless (G_VALUE_HOLDS_DOUBLE (&dest) == TRUE);
1200 fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
1201 g_value_unset (&dest);
1203 /* and the other way around, should keep the range. */
1204 ret = gst_value_subtract (&dest, &src2, &src1);
1205 fail_unless (ret == TRUE);
1206 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
1207 fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
1208 fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
1209 g_value_unset (&dest);
1210 g_value_unset (&src1);
1211 g_value_unset (&src2);
1213 /* double_range <-> double_range
1216 /* same range, empty set */
1217 g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
1218 gst_value_set_double_range (&src1, 10.0, 20.0);
1219 g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
1220 gst_value_set_double_range (&src2, 10.0, 20.0);
1221 ret = gst_value_subtract (&dest, &src1, &src2);
1222 fail_unless (ret == FALSE);
1223 ret = gst_value_subtract (&dest, &src2, &src1);
1224 fail_unless (ret == FALSE);
1225 g_value_unset (&src1);
1226 g_value_unset (&src2);
1228 /* non overlapping ranges */
1229 g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
1230 gst_value_set_double_range (&src1, 10.0, 20.0);
1231 g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
1232 gst_value_set_double_range (&src2, 30.0, 40.0);
1233 ret = gst_value_subtract (&dest, &src1, &src2);
1234 fail_unless (ret == TRUE);
1235 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
1236 fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
1237 fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
1238 g_value_unset (&dest);
1240 ret = gst_value_subtract (&dest, &src2, &src1);
1241 fail_unless (ret == TRUE);
1242 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
1243 fail_unless (gst_value_get_double_range_min (&dest) == 30.0);
1244 fail_unless (gst_value_get_double_range_max (&dest) == 40.0);
1245 g_value_unset (&dest);
1246 g_value_unset (&src1);
1247 g_value_unset (&src2);
1249 /* completely overlapping ranges */
1250 g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
1251 gst_value_set_double_range (&src1, 10.0, 20.0);
1252 g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
1253 gst_value_set_double_range (&src2, 10.0, 30.0);
1254 ret = gst_value_subtract (&dest, &src1, &src2);
1255 fail_unless (ret == FALSE);
1257 ret = gst_value_subtract (&dest, &src2, &src1);
1258 fail_unless (ret == TRUE);
1259 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
1260 fail_unless (gst_value_get_double_range_min (&dest) == 20.0);
1261 fail_unless (gst_value_get_double_range_max (&dest) == 30.0);
1262 g_value_unset (&dest);
1263 g_value_unset (&src1);
1264 g_value_unset (&src2);
1266 /* partially overlapping ranges */
1267 g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
1268 gst_value_set_double_range (&src1, 10.0, 20.0);
1269 g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
1270 gst_value_set_double_range (&src2, 15.0, 30.0);
1271 ret = gst_value_subtract (&dest, &src1, &src2);
1272 fail_unless (ret == TRUE);
1273 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
1274 fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
1275 fail_unless (gst_value_get_double_range_max (&dest) == 15.0);
1276 g_value_unset (&dest);
1278 ret = gst_value_subtract (&dest, &src2, &src1);
1279 fail_unless (ret == TRUE);
1280 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
1281 fail_unless (gst_value_get_double_range_min (&dest) == 20.0);
1282 fail_unless (gst_value_get_double_range_max (&dest) == 30.0);
1283 g_value_unset (&dest);
1284 g_value_unset (&src1);
1285 g_value_unset (&src2);
1287 /* create a hole { double_range, double_range } */
1288 g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
1289 gst_value_set_double_range (&src1, 10.0, 30.0);
1290 g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
1291 gst_value_set_double_range (&src2, 15.0, 20.0);
1292 ret = gst_value_subtract (&dest, &src1, &src2);
1293 fail_unless (ret == TRUE);
1294 fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
1295 tmp = gst_value_list_get_value (&dest, 0);
1296 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (tmp) == TRUE);
1297 fail_unless (gst_value_get_double_range_min (tmp) == 10.0);
1298 fail_unless (gst_value_get_double_range_max (tmp) == 15.0);
1299 tmp = gst_value_list_get_value (&dest, 1);
1300 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (tmp) == TRUE);
1301 fail_unless (gst_value_get_double_range_min (tmp) == 20.0);
1302 fail_unless (gst_value_get_double_range_max (tmp) == 30.0);
1303 g_value_unset (&dest);
1305 ret = gst_value_subtract (&dest, &src2, &src1);
1306 fail_unless (ret == FALSE);
1307 g_value_unset (&src1);
1308 g_value_unset (&src2);
1313 /* Test arithmetic subtraction of fractions */
1314 GST_START_TEST (test_value_subtract_fraction)
1316 GValue result = { 0 };
1317 GValue src1 = { 0 };
1318 GValue src2 = { 0 };
1320 /* Subtract 1/4 from 1/2 */
1321 g_value_init (&src1, GST_TYPE_FRACTION);
1322 g_value_init (&src2, GST_TYPE_FRACTION);
1323 g_value_init (&result, GST_TYPE_FRACTION);
1324 gst_value_set_fraction (&src1, 1, 2);
1325 gst_value_set_fraction (&src2, 1, 4);
1326 fail_unless (gst_value_fraction_subtract (&result, &src1, &src2) == TRUE);
1327 fail_unless (gst_value_get_fraction_numerator (&result) == 1);
1328 fail_unless (gst_value_get_fraction_denominator (&result) == 4);
1330 g_value_unset (&src1);
1331 g_value_unset (&src2);
1332 g_value_unset (&result);
1334 /* Subtract 1/12 from 7/8 */
1335 g_value_init (&src1, GST_TYPE_FRACTION);
1336 g_value_init (&src2, GST_TYPE_FRACTION);
1337 g_value_init (&result, GST_TYPE_FRACTION);
1338 gst_value_set_fraction (&src1, 7, 8);
1339 gst_value_set_fraction (&src2, 1, 12);
1340 fail_unless (gst_value_fraction_subtract (&result, &src1, &src2) == TRUE);
1341 fail_unless (gst_value_get_fraction_numerator (&result) == 19);
1342 fail_unless (gst_value_get_fraction_denominator (&result) == 24);
1344 g_value_unset (&src1);
1345 g_value_unset (&src2);
1346 g_value_unset (&result);
1348 /* Subtract 12/13 from 4/3 */
1349 g_value_init (&src1, GST_TYPE_FRACTION);
1350 g_value_init (&src2, GST_TYPE_FRACTION);
1351 g_value_init (&result, GST_TYPE_FRACTION);
1352 gst_value_set_fraction (&src1, 4, 3);
1353 gst_value_set_fraction (&src2, 12, 13);
1354 fail_unless (gst_value_fraction_subtract (&result, &src1, &src2) == TRUE);
1355 fail_unless (gst_value_get_fraction_numerator (&result) == 16);
1356 fail_unless (gst_value_get_fraction_denominator (&result) == 39);
1358 g_value_unset (&src1);
1359 g_value_unset (&src2);
1360 g_value_unset (&result);
1362 /* Subtract 1/12 from 7/8 */
1367 /* Test set subtraction operations on fraction ranges */
1368 GST_START_TEST (test_value_subtract_fraction_range)
1370 GValue dest = { 0 };
1371 GValue src1 = { 0 };
1372 GValue src2 = { 0 };
1377 /* Value for tests */
1378 g_value_init (&cmp, GST_TYPE_FRACTION);
1380 /* fraction <-> fraction
1382 g_value_init (&src1, GST_TYPE_FRACTION);
1383 gst_value_set_fraction (&src1, 10, 1);
1384 g_value_init (&src2, GST_TYPE_FRACTION);
1385 gst_value_set_fraction (&src2, 20, 1);
1386 gst_value_set_fraction (&src1, 10, 1);
1388 /* subtract as in sets, result is 10 */
1389 ret = gst_value_subtract (&dest, &src1, &src2);
1390 fail_unless (ret == TRUE);
1391 fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
1392 g_value_unset (&dest);
1394 /* same values, yields empty set */
1395 ret = gst_value_subtract (&dest, &src1, &src1);
1396 fail_unless (ret == FALSE);
1397 g_value_unset (&src1);
1398 g_value_unset (&src2);
1400 /* fraction <-> fraction_range
1403 /* would yield an empty set */
1404 g_value_init (&src1, GST_TYPE_FRACTION);
1405 gst_value_set_fraction (&src1, 10, 1);
1406 g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
1407 gst_value_set_fraction_range_full (&src2, 0, 1, 20, 1);
1408 ret = gst_value_subtract (&dest, &src1, &src2);
1409 fail_unless (ret == FALSE);
1411 /* and the other way around, we cannot create open ranges
1412 * so the result is the range again */
1413 ret = gst_value_subtract (&dest, &src2, &src1);
1414 fail_unless (ret == TRUE);
1415 fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
1416 gst_value_set_fraction (&cmp, 0, 1);
1417 fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
1418 &cmp) == GST_VALUE_EQUAL);
1419 gst_value_set_fraction (&cmp, 20, 1);
1420 fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
1421 &cmp) == GST_VALUE_EQUAL);
1422 g_value_unset (&dest);
1423 g_value_unset (&src1);
1424 g_value_unset (&src2);
1426 /* border case 1, empty set */
1427 g_value_init (&src1, GST_TYPE_FRACTION);
1428 gst_value_set_fraction (&src1, 10, 1);
1429 g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
1430 gst_value_set_fraction_range_full (&src2, 10, 1, 20, 1);
1431 ret = gst_value_subtract (&dest, &src1, &src2);
1432 fail_unless (ret == FALSE);
1434 /* and the other way around, should keep same range as
1435 * we don't have open ranges. */
1436 ret = gst_value_subtract (&dest, &src2, &src1);
1437 fail_unless (ret == TRUE);
1438 fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
1439 gst_value_set_fraction (&cmp, 10, 1);
1440 fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
1441 &cmp) == GST_VALUE_EQUAL);
1442 gst_value_set_fraction (&cmp, 20, 1);
1443 fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
1444 &cmp) == GST_VALUE_EQUAL);
1445 g_value_unset (&dest);
1446 g_value_unset (&src1);
1447 g_value_unset (&src2);
1449 /* case 2, valid set */
1450 g_value_init (&src1, GST_TYPE_FRACTION);
1451 gst_value_set_fraction (&src1, 0, 1);
1452 g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
1453 gst_value_set_fraction_range_full (&src2, 10, 1, 20, 1);
1454 ret = gst_value_subtract (&dest, &src1, &src2);
1455 fail_unless (ret == TRUE);
1456 fail_unless (GST_VALUE_HOLDS_FRACTION (&dest) == TRUE);
1457 fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
1458 g_value_unset (&dest);
1460 /* and the other way around, should keep the range. */
1461 ret = gst_value_subtract (&dest, &src2, &src1);
1462 fail_unless (ret == TRUE);
1463 fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
1464 fail_unless (gst_value_compare (&dest, &src2) == GST_VALUE_EQUAL);
1465 g_value_unset (&dest);
1466 g_value_unset (&src1);
1467 g_value_unset (&src2);
1469 /* fraction_range <-> fraction_range
1472 /* same range, empty set */
1473 g_value_init (&src1, GST_TYPE_FRACTION_RANGE);
1474 gst_value_set_fraction_range_full (&src1, 10, 2, 20, 2);
1475 g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
1476 gst_value_set_fraction_range_full (&src2, 10, 2, 20, 2);
1477 ret = gst_value_subtract (&dest, &src1, &src2);
1478 fail_unless (ret == FALSE);
1479 ret = gst_value_subtract (&dest, &src2, &src1);
1480 fail_unless (ret == FALSE);
1481 g_value_unset (&src1);
1482 g_value_unset (&src2);
1484 /* non overlapping ranges */
1485 g_value_init (&src1, GST_TYPE_FRACTION_RANGE);
1486 gst_value_set_fraction_range_full (&src1, 10, 2, 10, 1);
1487 g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
1488 gst_value_set_fraction_range_full (&src2, 30, 2, 40, 2);
1489 ret = gst_value_subtract (&dest, &src1, &src2);
1490 fail_unless (ret == TRUE);
1491 fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
1492 gst_value_set_fraction (&cmp, 5, 1);
1493 fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
1494 &cmp) == GST_VALUE_EQUAL);
1495 gst_value_set_fraction (&cmp, 10, 1);
1496 fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
1497 &cmp) == GST_VALUE_EQUAL);
1499 g_value_unset (&dest);
1501 ret = gst_value_subtract (&dest, &src2, &src1);
1502 fail_unless (ret == TRUE);
1503 fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
1504 gst_value_set_fraction (&cmp, 15, 1);
1505 fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
1506 &cmp) == GST_VALUE_EQUAL);
1507 gst_value_set_fraction (&cmp, 20, 1);
1508 fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
1509 &cmp) == GST_VALUE_EQUAL);
1510 g_value_unset (&dest);
1511 g_value_unset (&src1);
1512 g_value_unset (&src2);
1514 /* completely overlapping ranges */
1515 g_value_init (&src1, GST_TYPE_FRACTION_RANGE);
1516 gst_value_set_fraction_range_full (&src1, 10, 1, 20, 1);
1517 g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
1518 gst_value_set_fraction_range_full (&src2, 10, 1, 30, 1);
1519 ret = gst_value_subtract (&dest, &src1, &src2);
1520 fail_unless (ret == FALSE);
1522 ret = gst_value_subtract (&dest, &src2, &src1);
1523 fail_unless (ret == TRUE);
1524 fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
1525 gst_value_set_fraction (&cmp, 20, 1);
1526 fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
1527 &cmp) == GST_VALUE_EQUAL);
1528 gst_value_set_fraction (&cmp, 30, 1);
1529 fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
1530 &cmp) == GST_VALUE_EQUAL);
1531 g_value_unset (&dest);
1532 g_value_unset (&src1);
1533 g_value_unset (&src2);
1535 /* partially overlapping ranges */
1536 g_value_init (&src1, GST_TYPE_FRACTION_RANGE);
1537 gst_value_set_fraction_range_full (&src1, 10, 1, 20, 1);
1538 g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
1539 gst_value_set_fraction_range_full (&src2, 15, 1, 30, 1);
1540 ret = gst_value_subtract (&dest, &src1, &src2);
1541 fail_unless (ret == TRUE);
1542 fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
1543 gst_value_set_fraction (&cmp, 10, 1);
1544 fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
1545 &cmp) == GST_VALUE_EQUAL);
1546 gst_value_set_fraction (&cmp, 15, 1);
1547 fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
1548 &cmp) == GST_VALUE_EQUAL);
1549 g_value_unset (&dest);
1552 ret = gst_value_subtract (&dest, &src2, &src1);
1553 fail_unless (ret == TRUE);
1554 fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
1555 gst_value_set_fraction (&cmp, 20, 1);
1556 fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
1557 &cmp) == GST_VALUE_EQUAL);
1558 gst_value_set_fraction (&cmp, 30, 1);
1559 fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
1560 &cmp) == GST_VALUE_EQUAL);
1561 g_value_unset (&dest);
1562 g_value_unset (&src1);
1563 g_value_unset (&src2);
1565 /* create a hole { double_range, double_range } */
1566 g_value_init (&src1, GST_TYPE_FRACTION_RANGE);
1567 gst_value_set_fraction_range_full (&src1, 10, 1, 30, 1);
1568 g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
1569 gst_value_set_fraction_range_full (&src2, 15, 1, 20, 1);
1570 ret = gst_value_subtract (&dest, &src1, &src2);
1571 fail_unless (ret == TRUE);
1572 fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
1573 /* 1st list entry */
1574 tmp = gst_value_list_get_value (&dest, 0);
1575 fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (tmp) == TRUE);
1576 gst_value_set_fraction (&cmp, 10, 1);
1577 fail_unless (gst_value_compare (gst_value_get_fraction_range_min (tmp),
1578 &cmp) == GST_VALUE_EQUAL);
1579 gst_value_set_fraction (&cmp, 15, 1);
1580 fail_unless (gst_value_compare (gst_value_get_fraction_range_max (tmp),
1581 &cmp) == GST_VALUE_EQUAL);
1582 /* 2nd list entry */
1583 tmp = gst_value_list_get_value (&dest, 1);
1584 fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (tmp) == TRUE);
1585 gst_value_set_fraction (&cmp, 20, 1);
1586 fail_unless (gst_value_compare (gst_value_get_fraction_range_min (tmp),
1587 &cmp) == GST_VALUE_EQUAL);
1588 gst_value_set_fraction (&cmp, 30, 1);
1589 fail_unless (gst_value_compare (gst_value_get_fraction_range_max (tmp),
1590 &cmp) == GST_VALUE_EQUAL);
1591 g_value_unset (&dest);
1593 ret = gst_value_subtract (&dest, &src2, &src1);
1594 fail_unless (ret == FALSE);
1595 g_value_unset (&src1);
1596 g_value_unset (&src2);
1598 g_value_unset (&cmp);
1603 /* Test set subtraction operations on fraction lists */
1604 GST_START_TEST (test_value_subtract_fraction_list)
1606 GValue list1 = { 0 };
1607 GValue list2 = { 0 };
1608 GValue val1 = { 0 };
1609 GValue val2 = { 0 };
1613 g_value_init (&list1, GST_TYPE_LIST);
1614 g_value_init (&val1, GST_TYPE_FRACTION);
1615 gst_value_set_fraction (&val1, 15, 2);
1616 gst_value_list_append_value (&list1, &val1);
1617 g_value_init (&tmp, GST_TYPE_FRACTION);
1618 gst_value_set_fraction (&tmp, 5, 1);
1619 gst_value_list_append_value (&list1, &tmp);
1620 g_value_unset (&tmp);
1622 g_value_init (&list2, GST_TYPE_LIST);
1623 g_value_init (&val2, GST_TYPE_FRACTION);
1624 gst_value_set_fraction (&val2, 15, 1);
1625 gst_value_list_append_value (&list2, &val2);
1626 g_value_init (&tmp, GST_TYPE_FRACTION);
1627 gst_value_set_fraction (&tmp, 5, 1);
1628 gst_value_list_append_value (&list2, &tmp);
1629 g_value_unset (&tmp);
1631 /* should subtract all common elements */
1632 ret = gst_value_subtract (&tmp, &list1, &list2);
1633 fail_unless (ret == TRUE);
1634 fail_unless (gst_value_compare (&tmp, &val1) == GST_VALUE_EQUAL);
1635 g_value_unset (&val1);
1636 g_value_unset (&tmp);
1638 ret = gst_value_subtract (&tmp, &list2, &list1);
1639 fail_unless (ret == TRUE);
1640 fail_unless (gst_value_compare (&tmp, &val2) == GST_VALUE_EQUAL);
1641 g_value_unset (&val2);
1642 g_value_unset (&tmp);
1644 g_value_unset (&list1);
1645 g_value_unset (&list2);
1651 GST_START_TEST (test_date)
1654 GDate *date, *date2;
1657 date = g_date_new_dmy (22, 9, 2005);
1659 s = gst_structure_new ("media/x-type", "SOME_DATE_TAG", GST_TYPE_DATE,
1662 fail_unless (gst_structure_has_field_typed (s, "SOME_DATE_TAG",
1664 fail_unless (gst_structure_get_date (s, "SOME_DATE_TAG", &date2));
1665 fail_unless (date2 != NULL);
1666 fail_unless (g_date_valid (date2));
1667 fail_unless (g_date_compare (date, date2) == 0);
1670 g_date_free (date2);
1674 str = gst_structure_to_string (s);
1675 gst_structure_free (s);
1678 fail_unless (g_str_equal (str,
1679 "media/x-type, SOME_DATE_TAG=(GstDate)2005-09-22;"));
1681 s = gst_structure_from_string (str, NULL);
1685 fail_unless (s != NULL);
1686 fail_unless (gst_structure_has_name (s, "media/x-type"));
1687 fail_unless (gst_structure_has_field_typed (s, "SOME_DATE_TAG",
1689 fail_unless (gst_structure_get_date (s, "SOME_DATE_TAG", &date));
1690 fail_unless (date != NULL);
1691 fail_unless (g_date_valid (date));
1692 fail_unless (g_date_get_day (date) == 22);
1693 fail_unless (g_date_get_month (date) == 9);
1694 fail_unless (g_date_get_year (date) == 2005);
1698 str = gst_structure_to_string (s);
1699 gst_structure_free (s);
1702 fail_unless (g_str_equal (str,
1703 "media/x-type, SOME_DATE_TAG=(GstDate)2005-09-22;"));
1710 GST_START_TEST (test_fraction_range)
1712 GValue range = { 0, };
1713 GValue start = { 0, }, end = {
1715 GValue src = { 0, }, dest = {
1717 GValue range2 = { 0, };
1719 g_value_init (&range, GST_TYPE_FRACTION_RANGE);
1720 g_value_init (&range2, GST_TYPE_FRACTION_RANGE);
1721 g_value_init (&start, GST_TYPE_FRACTION);
1722 g_value_init (&end, GST_TYPE_FRACTION);
1723 g_value_init (&src, GST_TYPE_FRACTION);
1725 gst_value_set_fraction (&src, 1, 2);
1727 /* Check that a intersection of fraction & range = fraction */
1728 gst_value_set_fraction (&start, 1, 4);
1729 gst_value_set_fraction (&end, 2, 3);
1730 gst_value_set_fraction_range (&range, &start, &end);
1732 fail_unless (gst_value_intersect (&dest, &src, &range) == TRUE);
1733 fail_unless (G_VALUE_TYPE (&dest) == GST_TYPE_FRACTION);
1734 fail_unless (gst_value_compare (&dest, &src) == GST_VALUE_EQUAL);
1736 /* Check that a intersection selects the overlapping range */
1737 gst_value_set_fraction (&start, 1, 3);
1738 gst_value_set_fraction (&end, 2, 3);
1739 gst_value_set_fraction_range (&range2, &start, &end);
1740 g_value_unset (&dest);
1741 fail_unless (gst_value_intersect (&dest, &range, &range2) == TRUE);
1742 fail_unless (G_VALUE_TYPE (&dest) == GST_TYPE_FRACTION_RANGE);
1744 gst_value_set_fraction_range (&range2, &start, &end);
1745 fail_unless (gst_value_compare (&dest, &range2) == GST_VALUE_EQUAL);
1747 /* Check that non intersection ranges don't intersect */
1748 gst_value_set_fraction (&start, 4, 2);
1749 gst_value_set_fraction (&end, 5, 2);
1750 gst_value_set_fraction_range (&range2, &start, &end);
1751 g_value_unset (&dest);
1752 fail_unless (gst_value_intersect (&dest, &range, &range2) == FALSE);
1754 g_value_unset (&start);
1755 g_value_unset (&end);
1756 g_value_unset (&range);
1757 g_value_unset (&range2);
1758 g_value_unset (&src);
1763 GST_START_TEST (test_serialize_deserialize_format_enum)
1765 GstStructure *s, *s2;
1766 GstFormat foobar_fmt;
1767 gchar *str, *str2, *end = NULL;
1769 /* make sure custom formats are serialised properly as well */
1770 foobar_fmt = gst_format_register ("foobar", "GST_FORMAT_FOOBAR");
1771 fail_unless (foobar_fmt != GST_FORMAT_UNDEFINED);
1773 s = gst_structure_new ("foo/bar", "format1", GST_TYPE_FORMAT,
1774 GST_FORMAT_BYTES, "format2", GST_TYPE_FORMAT, GST_FORMAT_TIME,
1775 "format3", GST_TYPE_FORMAT, GST_FORMAT_DEFAULT, "format4",
1776 GST_TYPE_FORMAT, foobar_fmt, NULL);
1778 str = gst_structure_to_string (s);
1779 GST_LOG ("Got structure string '%s'", GST_STR_NULL (str));
1780 fail_unless (str != NULL);
1781 fail_unless (strstr (str, "TIME") != NULL);
1782 fail_unless (strstr (str, "BYTE") != NULL);
1783 fail_unless (strstr (str, "DEFAULT") != NULL);
1784 fail_unless (strstr (str, "FOOBAR") != NULL);
1786 s2 = gst_structure_from_string (str, &end);
1787 fail_unless (s2 != NULL);
1789 str2 = gst_structure_to_string (s2);
1790 fail_unless (str2 != NULL);
1792 fail_unless (g_str_equal (str, str2));
1796 gst_structure_free (s);
1797 gst_structure_free (s2);
1802 GST_START_TEST (test_serialize_deserialize_caps)
1804 GValue value = { 0 }, value2 = {
1806 GstCaps *caps, *caps2;
1809 caps = gst_caps_new_simple ("test/caps",
1810 "foo", G_TYPE_INT, 10, "bar", G_TYPE_STRING, "test", NULL);
1811 fail_if (GST_CAPS_REFCOUNT_VALUE (caps) != 1);
1813 /* and assign caps to gvalue */
1814 g_value_init (&value, GST_TYPE_CAPS);
1815 g_value_take_boxed (&value, caps);
1816 fail_if (GST_CAPS_REFCOUNT_VALUE (caps) != 1);
1818 /* now serialize it */
1819 serialized = gst_value_serialize (&value);
1820 GST_DEBUG ("serialized caps to %s", serialized);
1821 fail_unless (serialized != NULL);
1823 /* refcount should not change */
1824 fail_if (GST_CAPS_REFCOUNT_VALUE (caps) != 1);
1826 /* now deserialize again */
1827 g_value_init (&value2, GST_TYPE_CAPS);
1828 gst_value_deserialize (&value2, serialized);
1830 caps2 = g_value_get_boxed (&value2);
1831 fail_if (GST_CAPS_REFCOUNT_VALUE (caps2) != 1);
1833 /* they should be equal */
1834 fail_unless (gst_caps_is_equal (caps, caps2));
1837 g_value_unset (&value);
1838 g_value_unset (&value2);
1839 g_free (serialized);
1845 gst_value_suite (void)
1847 Suite *s = suite_create ("GstValue");
1848 TCase *tc_chain = tcase_create ("general");
1850 suite_add_tcase (s, tc_chain);
1851 tcase_add_test (tc_chain, test_serialize_fourcc);
1852 tcase_add_test (tc_chain, test_deserialize_fourcc);
1853 tcase_add_test (tc_chain, test_deserialize_buffer);
1854 tcase_add_test (tc_chain, test_serialize_buffer);
1855 tcase_add_test (tc_chain, test_deserialize_gint);
1856 tcase_add_test (tc_chain, test_deserialize_gint_failures);
1857 tcase_add_test (tc_chain, test_deserialize_guint);
1858 tcase_add_test (tc_chain, test_deserialize_guint_failures);
1859 tcase_add_test (tc_chain, test_deserialize_gint64);
1860 tcase_add_test (tc_chain, test_deserialize_guint64);
1861 tcase_add_test (tc_chain, test_deserialize_gstfraction);
1862 tcase_add_test (tc_chain, test_serialize_flags);
1863 tcase_add_test (tc_chain, test_deserialize_flags);
1864 tcase_add_test (tc_chain, test_serialize_deserialize_format_enum);
1865 tcase_add_test (tc_chain, test_string);
1866 tcase_add_test (tc_chain, test_deserialize_string);
1867 tcase_add_test (tc_chain, test_value_compare);
1868 tcase_add_test (tc_chain, test_value_intersect);
1869 tcase_add_test (tc_chain, test_value_subtract_int);
1870 tcase_add_test (tc_chain, test_value_subtract_double);
1871 tcase_add_test (tc_chain, test_value_subtract_fraction);
1872 tcase_add_test (tc_chain, test_value_subtract_fraction_range);
1873 tcase_add_test (tc_chain, test_value_subtract_fraction_list);
1874 tcase_add_test (tc_chain, test_date);
1875 tcase_add_test (tc_chain, test_fraction_range);
1876 tcase_add_test (tc_chain, test_serialize_deserialize_caps);
1881 GST_CHECK_MAIN (gst_value);