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_deserialize_buffer)
32 g_value_init (&value, GST_TYPE_BUFFER);
33 fail_unless (gst_value_deserialize (&value, "1234567890abcdef"));
34 buf = GST_BUFFER (gst_value_get_mini_object (&value));
36 ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1);
39 gst_buffer_unref (buf);
44 GST_START_TEST (test_deserialize_gint64)
47 const char *strings[] = {
57 g_value_init (&value, G_TYPE_INT64);
59 for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
60 fail_unless (gst_value_deserialize (&value, strings[i]),
61 "could not deserialize %s (%d)", strings[i], i);
62 fail_unless (g_value_get_int64 (&value) == results[i],
63 "resulting value is %" G_GINT64_FORMAT ", not %" G_GINT64_FORMAT
64 ", for string %s (%d)", value, results[i], strings[i], i);
70 GST_START_TEST (test_deserialize_gint)
73 const char *strings[] = {
78 /* a positive long long, serializing to highest possible positive sint */
80 /* a positive long long, serializing to lowest possible negative sint */
82 /* a negative long long, serializing to lowest possible negative sint */
85 /* a positive long long serializing to -1 */
88 /* a negative long long serializing to -1 */
105 /* cast needs to be explicit because of unsigned -> signed */
106 (gint) 0xFFFFFFFFFFFFFFFFLL,
111 g_value_init (&value, G_TYPE_INT);
113 for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
114 fail_unless (gst_value_deserialize (&value, strings[i]),
115 "could not deserialize %s (%d)", strings[i], i);
116 fail_unless (g_value_get_int (&value) == results[i],
117 "resulting value is %d, not %d, for string %s (%d)",
118 g_value_get_int (&value), results[i], strings[i], i);
124 GST_START_TEST (test_deserialize_gint_failures)
126 GValue value = { 0 };
127 const char *strings[] = {
128 "-", /* not a complete number */
129 "- TEST", /* not a complete number */
130 "0x0000000100000000", /* lowest long long that cannot fit in 32 bits */
131 "0xF000000000000000",
132 "0xFFFFFFF000000000",
133 "0xFFFFFFFF00000000",
134 "0x10000000000000000", /* first number too long to fit into a long long */
135 /* invent a new processor first before trying to make this one pass */
136 "0x10000000000000000000000000000000000000000000",
140 g_value_init (&value, G_TYPE_INT);
142 for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
143 fail_if (gst_value_deserialize (&value, strings[i]),
144 "deserialized %s (%d), while it should have failed", strings[i], i);
150 GST_START_TEST (test_deserialize_guint)
152 GValue value = { 0 };
153 const char *strings[] = {
158 /* a positive long long, serializing to highest possible positive sint */
160 /* a positive long long, serializing to lowest possible negative sint */
163 /* a negative long long, serializing to lowest possible negative sint */
164 "0xFFFFFFFF80000000",
165 /* a value typically used for rgb masks */
167 /* a positive long long serializing to highest possible positive uint */
170 /* a negative long long serializing to highest possible positive uint */
171 "0xFFFFFFFFFFFFFFFF",
181 (guint) 2147483648LL,
186 (guint) 0xFFFFFFFFFFFFFFFFLL,
191 g_value_init (&value, G_TYPE_UINT);
193 for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
194 fail_unless (gst_value_deserialize (&value, strings[i]),
195 "could not deserialize %s (%d)", strings[i], i);
196 fail_unless (g_value_get_uint (&value) == results[i],
197 "resulting value is %d, not %d, for string %s (%d)",
198 g_value_get_uint (&value), results[i], strings[i], i);
204 GST_START_TEST (test_deserialize_guint_failures)
206 GValue value = { 0 };
207 const char *strings[] = {
208 "-", /* not a complete number */
209 "- TEST", /* not a complete number */
211 /* FIXME: these values should not be deserializable, since they overflow
212 * the target format */
213 "0x0000000100000000", /* lowest long long that cannot fit in 32 bits */
214 "0xF000000000000000",
215 "0xFFFFFFF000000000",
216 "0xFFFFFFFF00000000",
217 "0x10000000000000000", /* first number too long to fit into a long long */
218 /* invent a new processor first before trying to make this one pass */
219 "0x10000000000000000000000000000000000000000000",
224 g_value_init (&value, G_TYPE_UINT);
226 for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
227 fail_if (gst_value_deserialize (&value, strings[i]),
228 "deserialized %s (%d), while it should have failed", strings[i], i);
235 GST_START_TEST (test_string)
246 g_value_init (&v, G_TYPE_STRING);
247 for (i = 0; i < G_N_ELEMENTS (try); i++) {
248 g_value_set_string (&v, try[i]);
249 tmp = gst_value_serialize (&v);
250 fail_if (tmp == NULL, "couldn't serialize: %s\n", try[i]);
251 fail_unless (gst_value_deserialize (&v, tmp),
252 "couldn't deserialize: %s\n", tmp);
255 fail_unless (g_str_equal (g_value_get_string (&v), try[i]),
256 "\nserialized : %s\ndeserialized: %s", try[i],
257 g_value_get_string (&v));
259 /* NULL strings should not be serializable */
260 g_value_set_string (&v, NULL);
261 fail_unless (gst_value_serialize (&v) == NULL);
267 GST_START_TEST (test_deserialize_string)
275 "", ""}, /* empty strings */
277 "\"\"", ""}, /* FAILURES */
279 "\"", NULL}, /* missing second quote */
281 "\"Hello\\ World", NULL}, /* missing second quote */
283 "\"\\", NULL}, /* quote at end, missing second quote */
285 "\"\\0", NULL}, /* missing second quote */
287 "\"\\0\"", NULL}, /* unfinished escaped character */
289 "\" \"", NULL}, /* spaces must be escaped */
291 /* FIXME 0.9: this test should fail, but it doesn't */
293 "tüüt", NULL} /* string with special chars must be escaped */
300 g_value_init (&v, G_TYPE_STRING);
301 for (i = 0; i < G_N_ELEMENTS (tests); i++) {
302 if (gst_value_deserialize (&v, tests[i].from)) {
303 fail_if (tests[i].to == NULL,
304 "I got %s instead of a failure", g_value_get_string (&v));
305 fail_unless (g_str_equal (g_value_get_string (&v), tests[i].to),
306 "\nwanted: %s\ngot : %s", tests[i].to, g_value_get_string (&v));
308 fail_if (tests[i].to != NULL, "failed, but wanted: %s", tests[i].to);
317 GST_START_TEST (test_value_compare)
319 GValue value1 = { 0 };
320 GValue value2 = { 0 };
322 g_value_init (&value1, G_TYPE_INT);
323 g_value_set_int (&value1, 10);
324 g_value_init (&value2, G_TYPE_INT);
325 g_value_set_int (&value2, 20);
326 fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
327 fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
328 fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
329 g_value_unset (&value1);
330 g_value_unset (&value2);
332 g_value_init (&value1, G_TYPE_DOUBLE);
333 g_value_set_double (&value1, 10);
334 g_value_init (&value2, G_TYPE_DOUBLE);
335 g_value_set_double (&value2, 20);
336 fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
337 fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
338 fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
339 g_value_unset (&value1);
340 g_value_unset (&value2);
342 g_value_init (&value1, G_TYPE_STRING);
343 g_value_set_string (&value1, "a");
344 g_value_init (&value2, G_TYPE_STRING);
345 g_value_set_string (&value2, "b");
346 fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
347 fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
348 fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
349 g_value_unset (&value1);
350 g_value_unset (&value2);
352 g_value_init (&value1, GST_TYPE_FOURCC);
353 gst_value_set_fourcc (&value1, GST_MAKE_FOURCC ('a', 'b', 'c', 'd'));
354 g_value_init (&value2, GST_TYPE_FOURCC);
355 gst_value_set_fourcc (&value2, GST_MAKE_FOURCC ('1', '2', '3', '4'));
356 fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_UNORDERED);
357 fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
358 g_value_unset (&value1);
359 g_value_unset (&value2);
361 /* comparing 2/3 with 3/4 */
362 g_value_init (&value1, GST_TYPE_FRACTION);
363 gst_value_set_fraction (&value1, 2, 3);
364 g_value_init (&value2, GST_TYPE_FRACTION);
365 gst_value_set_fraction (&value2, 3, 4);
366 fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
367 fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
368 fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
369 g_value_unset (&value1);
370 g_value_unset (&value2);
372 /* comparing -4/5 with 2/-3 */
373 g_value_init (&value1, GST_TYPE_FRACTION);
374 gst_value_set_fraction (&value1, -4, 5);
375 g_value_init (&value2, GST_TYPE_FRACTION);
376 gst_value_set_fraction (&value2, 2, -3);
377 fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
378 fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
379 fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
380 g_value_unset (&value1);
381 g_value_unset (&value2);
383 /* comparing 10/100 with 200/2000 */
384 g_value_init (&value1, GST_TYPE_FRACTION);
385 gst_value_set_fraction (&value1, 10, 100);
386 g_value_init (&value2, GST_TYPE_FRACTION);
387 gst_value_set_fraction (&value2, 200, 2000);
388 fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL);
389 g_value_unset (&value1);
390 g_value_unset (&value2);
392 /* comparing -4/5 with 2/-3 */
393 g_value_init (&value1, GST_TYPE_FRACTION);
394 gst_value_set_fraction (&value1, -4, 5);
395 g_value_init (&value2, GST_TYPE_FRACTION);
396 gst_value_set_fraction (&value2, 2, -3);
397 fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
398 fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
399 fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
400 g_value_unset (&value1);
401 g_value_unset (&value2);
406 GST_START_TEST (test_value_intersect)
414 g_value_init (&src1, G_TYPE_INT);
415 g_value_set_int (&src1, 10);
416 g_value_init (&src2, G_TYPE_INT);
417 g_value_set_int (&src2, 20);
418 ret = gst_value_intersect (&dest, &src1, &src2);
419 fail_unless (ret == FALSE);
420 g_value_unset (&src1);
421 g_value_unset (&src2);
423 g_value_init (&src1, GST_TYPE_FOURCC);
424 gst_value_set_fourcc (&src1, GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'));
425 g_value_init (&src2, GST_TYPE_LIST);
426 g_value_init (&item, GST_TYPE_FOURCC);
427 gst_value_set_fourcc (&item, GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'));
428 gst_value_list_append_value (&src2, &item);
429 gst_value_set_fourcc (&item, GST_MAKE_FOURCC ('I', '4', '2', '0'));
430 gst_value_list_append_value (&src2, &item);
431 gst_value_set_fourcc (&item, GST_MAKE_FOURCC ('A', 'B', 'C', 'D'));
432 gst_value_list_append_value (&src2, &item);
434 fail_unless (gst_value_intersect (&dest, &src1, &src2));
435 fail_unless (GST_VALUE_HOLDS_FOURCC (&dest));
436 fail_unless (gst_value_get_fourcc (&dest) ==
437 GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'));
443 GST_START_TEST (test_value_subtract_int)
453 g_value_init (&src1, G_TYPE_INT);
454 g_value_set_int (&src1, 10);
455 g_value_init (&src2, G_TYPE_INT);
456 g_value_set_int (&src2, 20);
457 /* subtract as in sets, result is 10 */
458 ret = gst_value_subtract (&dest, &src1, &src2);
459 fail_unless (ret == TRUE);
460 fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
461 g_value_unset (&dest);
463 /* same values, yields empty set */
464 ret = gst_value_subtract (&dest, &src1, &src1);
465 fail_unless (ret == FALSE);
466 g_value_unset (&src1);
467 g_value_unset (&src2);
472 /* would yield an empty set */
473 g_value_init (&src1, G_TYPE_INT);
474 g_value_set_int (&src1, 10);
475 g_value_init (&src2, GST_TYPE_INT_RANGE);
476 gst_value_set_int_range (&src2, 0, 20);
477 ret = gst_value_subtract (&dest, &src1, &src2);
478 fail_unless (ret == FALSE);
480 /* and the other way around, should create a list of two ranges. */
481 ret = gst_value_subtract (&dest, &src2, &src1);
482 fail_unless (ret == TRUE);
483 fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
484 tmp = gst_value_list_get_value (&dest, 0);
485 fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
486 fail_unless (gst_value_get_int_range_min (tmp) == 0);
487 fail_unless (gst_value_get_int_range_max (tmp) == 9);
488 tmp = gst_value_list_get_value (&dest, 1);
489 fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
490 fail_unless (gst_value_get_int_range_min (tmp) == 11);
491 fail_unless (gst_value_get_int_range_max (tmp) == 20);
492 g_value_unset (&dest);
493 g_value_unset (&src1);
494 g_value_unset (&src2);
496 /* border case 1, empty set */
497 g_value_init (&src1, G_TYPE_INT);
498 g_value_set_int (&src1, 10);
499 g_value_init (&src2, GST_TYPE_INT_RANGE);
500 gst_value_set_int_range (&src2, 10, 20);
501 ret = gst_value_subtract (&dest, &src1, &src2);
502 fail_unless (ret == FALSE);
504 /* and the other way around, should create a new range. */
505 ret = gst_value_subtract (&dest, &src2, &src1);
506 fail_unless (ret == TRUE);
507 fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
508 fail_unless (gst_value_get_int_range_min (&dest) == 11);
509 fail_unless (gst_value_get_int_range_max (&dest) == 20);
510 g_value_unset (&dest);
511 g_value_unset (&src1);
512 g_value_unset (&src2);
514 /* border case 2, empty set */
515 g_value_init (&src1, G_TYPE_INT);
516 g_value_set_int (&src1, 20);
517 g_value_init (&src2, GST_TYPE_INT_RANGE);
518 gst_value_set_int_range (&src2, 10, 20);
519 ret = gst_value_subtract (&dest, &src1, &src2);
520 fail_unless (ret == FALSE);
522 /* and the other way around, should create a new range. */
523 ret = gst_value_subtract (&dest, &src2, &src1);
524 fail_unless (ret == TRUE);
525 fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
526 fail_unless (gst_value_get_int_range_min (&dest) == 10);
527 fail_unless (gst_value_get_int_range_max (&dest) == 19);
528 g_value_unset (&dest);
529 g_value_unset (&src1);
530 g_value_unset (&src2);
532 /* case 3, valid set */
533 g_value_init (&src1, G_TYPE_INT);
534 g_value_set_int (&src1, 0);
535 g_value_init (&src2, GST_TYPE_INT_RANGE);
536 gst_value_set_int_range (&src2, 10, 20);
537 ret = gst_value_subtract (&dest, &src1, &src2);
538 fail_unless (ret == TRUE);
539 fail_unless (G_VALUE_HOLDS_INT (&dest) == TRUE);
540 fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
541 g_value_unset (&dest);
543 /* and the other way around, should keep the range. */
544 ret = gst_value_subtract (&dest, &src2, &src1);
545 fail_unless (ret == TRUE);
546 fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
547 fail_unless (gst_value_get_int_range_min (&dest) == 10);
548 fail_unless (gst_value_get_int_range_max (&dest) == 20);
549 g_value_unset (&dest);
550 g_value_unset (&src1);
551 g_value_unset (&src2);
553 /* int_range <-> int_range
556 /* same range, empty set */
557 g_value_init (&src1, GST_TYPE_INT_RANGE);
558 gst_value_set_int_range (&src1, 10, 20);
559 g_value_init (&src2, GST_TYPE_INT_RANGE);
560 gst_value_set_int_range (&src2, 10, 20);
561 ret = gst_value_subtract (&dest, &src1, &src2);
562 fail_unless (ret == FALSE);
563 ret = gst_value_subtract (&dest, &src2, &src1);
564 fail_unless (ret == FALSE);
565 g_value_unset (&src1);
566 g_value_unset (&src2);
568 /* non overlapping ranges */
569 g_value_init (&src1, GST_TYPE_INT_RANGE);
570 gst_value_set_int_range (&src1, 10, 20);
571 g_value_init (&src2, GST_TYPE_INT_RANGE);
572 gst_value_set_int_range (&src2, 30, 40);
573 ret = gst_value_subtract (&dest, &src1, &src2);
574 fail_unless (ret == TRUE);
575 fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
576 fail_unless (gst_value_get_int_range_min (&dest) == 10);
577 fail_unless (gst_value_get_int_range_max (&dest) == 20);
578 g_value_unset (&dest);
580 ret = gst_value_subtract (&dest, &src2, &src1);
581 fail_unless (ret == TRUE);
582 fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
583 fail_unless (gst_value_get_int_range_min (&dest) == 30);
584 fail_unless (gst_value_get_int_range_max (&dest) == 40);
585 g_value_unset (&dest);
586 g_value_unset (&src1);
587 g_value_unset (&src2);
589 /* completely overlapping ranges */
590 g_value_init (&src1, GST_TYPE_INT_RANGE);
591 gst_value_set_int_range (&src1, 10, 20);
592 g_value_init (&src2, GST_TYPE_INT_RANGE);
593 gst_value_set_int_range (&src2, 10, 30);
594 ret = gst_value_subtract (&dest, &src1, &src2);
595 fail_unless (ret == FALSE);
597 ret = gst_value_subtract (&dest, &src2, &src1);
598 fail_unless (ret == TRUE);
599 fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
600 fail_unless (gst_value_get_int_range_min (&dest) == 21);
601 fail_unless (gst_value_get_int_range_max (&dest) == 30);
602 g_value_unset (&dest);
603 g_value_unset (&src1);
604 g_value_unset (&src2);
606 /* partially overlapping ranges */
607 g_value_init (&src1, GST_TYPE_INT_RANGE);
608 gst_value_set_int_range (&src1, 10, 20);
609 g_value_init (&src2, GST_TYPE_INT_RANGE);
610 gst_value_set_int_range (&src2, 15, 30);
611 ret = gst_value_subtract (&dest, &src1, &src2);
612 fail_unless (ret == TRUE);
613 fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
614 fail_unless (gst_value_get_int_range_min (&dest) == 10);
615 fail_unless (gst_value_get_int_range_max (&dest) == 14);
616 g_value_unset (&dest);
618 ret = gst_value_subtract (&dest, &src2, &src1);
619 fail_unless (ret == TRUE);
620 fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
621 fail_unless (gst_value_get_int_range_min (&dest) == 21);
622 fail_unless (gst_value_get_int_range_max (&dest) == 30);
623 g_value_unset (&dest);
624 g_value_unset (&src1);
625 g_value_unset (&src2);
627 /* create a hole { int_range, int_range } */
628 g_value_init (&src1, GST_TYPE_INT_RANGE);
629 gst_value_set_int_range (&src1, 10, 30);
630 g_value_init (&src2, GST_TYPE_INT_RANGE);
631 gst_value_set_int_range (&src2, 15, 20);
632 ret = gst_value_subtract (&dest, &src1, &src2);
633 fail_unless (ret == TRUE);
634 fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
635 tmp = gst_value_list_get_value (&dest, 0);
636 fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
637 fail_unless (gst_value_get_int_range_min (tmp) == 10);
638 fail_unless (gst_value_get_int_range_max (tmp) == 14);
639 tmp = gst_value_list_get_value (&dest, 1);
640 fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
641 fail_unless (gst_value_get_int_range_min (tmp) == 21);
642 fail_unless (gst_value_get_int_range_max (tmp) == 30);
643 g_value_unset (&dest);
645 ret = gst_value_subtract (&dest, &src2, &src1);
646 fail_unless (ret == FALSE);
647 g_value_unset (&src1);
648 g_value_unset (&src2);
650 /* create a hole, { int, int } */
651 g_value_init (&src1, GST_TYPE_INT_RANGE);
652 gst_value_set_int_range (&src1, 10, 30);
653 g_value_init (&src2, GST_TYPE_INT_RANGE);
654 gst_value_set_int_range (&src2, 11, 29);
655 ret = gst_value_subtract (&dest, &src1, &src2);
656 fail_unless (ret == TRUE);
657 fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
658 tmp = gst_value_list_get_value (&dest, 0);
659 fail_unless (G_VALUE_HOLDS_INT (tmp) == TRUE);
660 fail_unless (g_value_get_int (tmp) == 10);
661 tmp = gst_value_list_get_value (&dest, 1);
662 fail_unless (G_VALUE_HOLDS_INT (tmp) == TRUE);
663 fail_unless (g_value_get_int (tmp) == 30);
664 g_value_unset (&dest);
666 ret = gst_value_subtract (&dest, &src2, &src1);
667 fail_unless (ret == FALSE);
668 g_value_unset (&src1);
669 g_value_unset (&src2);
671 /* create a hole, { int, int_range } */
672 g_value_init (&src1, GST_TYPE_INT_RANGE);
673 gst_value_set_int_range (&src1, 10, 30);
674 g_value_init (&src2, GST_TYPE_INT_RANGE);
675 gst_value_set_int_range (&src2, 11, 28);
676 ret = gst_value_subtract (&dest, &src1, &src2);
677 fail_unless (ret == TRUE);
678 fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
679 tmp = gst_value_list_get_value (&dest, 0);
680 fail_unless (G_VALUE_HOLDS_INT (tmp) == TRUE);
681 fail_unless (g_value_get_int (tmp) == 10);
682 tmp = gst_value_list_get_value (&dest, 1);
683 fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
684 fail_unless (gst_value_get_int_range_min (tmp) == 29);
685 fail_unless (gst_value_get_int_range_max (tmp) == 30);
686 g_value_unset (&dest);
688 ret = gst_value_subtract (&dest, &src2, &src1);
689 fail_unless (ret == FALSE);
690 g_value_unset (&src1);
691 g_value_unset (&src2);
693 /* create a hole, { int_range, int } */
694 g_value_init (&src1, GST_TYPE_INT_RANGE);
695 gst_value_set_int_range (&src1, 10, 30);
696 g_value_init (&src2, GST_TYPE_INT_RANGE);
697 gst_value_set_int_range (&src2, 12, 29);
698 ret = gst_value_subtract (&dest, &src1, &src2);
699 fail_unless (ret == TRUE);
700 fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
701 tmp = gst_value_list_get_value (&dest, 0);
702 fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
703 fail_unless (gst_value_get_int_range_min (tmp) == 10);
704 fail_unless (gst_value_get_int_range_max (tmp) == 11);
705 tmp = gst_value_list_get_value (&dest, 1);
706 fail_unless (G_VALUE_HOLDS_INT (tmp) == TRUE);
707 fail_unless (g_value_get_int (tmp) == 30);
708 g_value_unset (&dest);
710 ret = gst_value_subtract (&dest, &src2, &src1);
711 fail_unless (ret == FALSE);
712 g_value_unset (&src1);
713 g_value_unset (&src2);
718 GST_START_TEST (test_value_subtract_double)
728 g_value_init (&src1, G_TYPE_DOUBLE);
729 g_value_set_double (&src1, 10.0);
730 g_value_init (&src2, G_TYPE_DOUBLE);
731 g_value_set_double (&src2, 20.0);
732 /* subtract as in sets, result is 10 */
733 ret = gst_value_subtract (&dest, &src1, &src2);
734 fail_unless (ret == TRUE);
735 fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
736 g_value_unset (&dest);
738 /* same values, yields empty set */
739 ret = gst_value_subtract (&dest, &src1, &src1);
740 fail_unless (ret == FALSE);
741 g_value_unset (&src1);
742 g_value_unset (&src2);
744 /* double <-> double_range
747 /* would yield an empty set */
748 g_value_init (&src1, G_TYPE_DOUBLE);
749 g_value_set_double (&src1, 10.0);
750 g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
751 gst_value_set_double_range (&src2, 0.0, 20.0);
752 ret = gst_value_subtract (&dest, &src1, &src2);
753 fail_unless (ret == FALSE);
755 /* and the other way around, we cannot create open ranges
756 * so the result is the range again */
757 ret = gst_value_subtract (&dest, &src2, &src1);
758 fail_unless (ret == TRUE);
759 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
760 fail_unless (gst_value_get_double_range_min (&dest) == 0.0);
761 fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
762 g_value_unset (&dest);
763 g_value_unset (&src1);
764 g_value_unset (&src2);
766 /* border case 1, empty set */
767 g_value_init (&src1, G_TYPE_DOUBLE);
768 g_value_set_double (&src1, 10.0);
769 g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
770 gst_value_set_double_range (&src2, 10.0, 20.0);
771 ret = gst_value_subtract (&dest, &src1, &src2);
772 fail_unless (ret == FALSE);
774 /* and the other way around, should keep same range as
775 * we don't have open ranges. */
776 ret = gst_value_subtract (&dest, &src2, &src1);
777 fail_unless (ret == TRUE);
778 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
779 fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
780 fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
781 g_value_unset (&dest);
782 g_value_unset (&src1);
783 g_value_unset (&src2);
785 /* border case 2, empty set */
786 g_value_init (&src1, G_TYPE_DOUBLE);
787 g_value_set_double (&src1, 20.0);
788 g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
789 gst_value_set_double_range (&src2, 10.0, 20.0);
790 ret = gst_value_subtract (&dest, &src1, &src2);
791 fail_unless (ret == FALSE);
793 /* and the other way around, should keep same range as
794 * we don't have open ranges. */
795 ret = gst_value_subtract (&dest, &src2, &src1);
796 fail_unless (ret == TRUE);
797 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
798 fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
799 fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
800 g_value_unset (&dest);
801 g_value_unset (&src1);
802 g_value_unset (&src2);
804 /* case 3, valid set */
805 g_value_init (&src1, G_TYPE_DOUBLE);
806 g_value_set_double (&src1, 0.0);
807 g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
808 gst_value_set_double_range (&src2, 10.0, 20.0);
809 ret = gst_value_subtract (&dest, &src1, &src2);
810 fail_unless (ret == TRUE);
811 fail_unless (G_VALUE_HOLDS_DOUBLE (&dest) == TRUE);
812 fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
813 g_value_unset (&dest);
815 /* and the other way around, should keep the range. */
816 ret = gst_value_subtract (&dest, &src2, &src1);
817 fail_unless (ret == TRUE);
818 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
819 fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
820 fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
821 g_value_unset (&dest);
822 g_value_unset (&src1);
823 g_value_unset (&src2);
825 /* double_range <-> double_range
828 /* same range, empty set */
829 g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
830 gst_value_set_double_range (&src1, 10.0, 20.0);
831 g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
832 gst_value_set_double_range (&src2, 10.0, 20.0);
833 ret = gst_value_subtract (&dest, &src1, &src2);
834 fail_unless (ret == FALSE);
835 ret = gst_value_subtract (&dest, &src2, &src1);
836 fail_unless (ret == FALSE);
837 g_value_unset (&src1);
838 g_value_unset (&src2);
840 /* non overlapping ranges */
841 g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
842 gst_value_set_double_range (&src1, 10.0, 20.0);
843 g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
844 gst_value_set_double_range (&src2, 30.0, 40.0);
845 ret = gst_value_subtract (&dest, &src1, &src2);
846 fail_unless (ret == TRUE);
847 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
848 fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
849 fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
850 g_value_unset (&dest);
852 ret = gst_value_subtract (&dest, &src2, &src1);
853 fail_unless (ret == TRUE);
854 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
855 fail_unless (gst_value_get_double_range_min (&dest) == 30.0);
856 fail_unless (gst_value_get_double_range_max (&dest) == 40.0);
857 g_value_unset (&dest);
858 g_value_unset (&src1);
859 g_value_unset (&src2);
861 /* completely overlapping ranges */
862 g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
863 gst_value_set_double_range (&src1, 10.0, 20.0);
864 g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
865 gst_value_set_double_range (&src2, 10.0, 30.0);
866 ret = gst_value_subtract (&dest, &src1, &src2);
867 fail_unless (ret == FALSE);
869 ret = gst_value_subtract (&dest, &src2, &src1);
870 fail_unless (ret == TRUE);
871 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
872 fail_unless (gst_value_get_double_range_min (&dest) == 20.0);
873 fail_unless (gst_value_get_double_range_max (&dest) == 30.0);
874 g_value_unset (&dest);
875 g_value_unset (&src1);
876 g_value_unset (&src2);
878 /* partially overlapping ranges */
879 g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
880 gst_value_set_double_range (&src1, 10.0, 20.0);
881 g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
882 gst_value_set_double_range (&src2, 15.0, 30.0);
883 ret = gst_value_subtract (&dest, &src1, &src2);
884 fail_unless (ret == TRUE);
885 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
886 fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
887 fail_unless (gst_value_get_double_range_max (&dest) == 15.0);
888 g_value_unset (&dest);
890 ret = gst_value_subtract (&dest, &src2, &src1);
891 fail_unless (ret == TRUE);
892 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
893 fail_unless (gst_value_get_double_range_min (&dest) == 20.0);
894 fail_unless (gst_value_get_double_range_max (&dest) == 30.0);
895 g_value_unset (&dest);
896 g_value_unset (&src1);
897 g_value_unset (&src2);
899 /* create a hole { double_range, double_range } */
900 g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
901 gst_value_set_double_range (&src1, 10.0, 30.0);
902 g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
903 gst_value_set_double_range (&src2, 15.0, 20.0);
904 ret = gst_value_subtract (&dest, &src1, &src2);
905 fail_unless (ret == TRUE);
906 fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
907 tmp = gst_value_list_get_value (&dest, 0);
908 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (tmp) == TRUE);
909 fail_unless (gst_value_get_double_range_min (tmp) == 10.0);
910 fail_unless (gst_value_get_double_range_max (tmp) == 15.0);
911 tmp = gst_value_list_get_value (&dest, 1);
912 fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (tmp) == TRUE);
913 fail_unless (gst_value_get_double_range_min (tmp) == 20.0);
914 fail_unless (gst_value_get_double_range_max (tmp) == 30.0);
915 g_value_unset (&dest);
917 ret = gst_value_subtract (&dest, &src2, &src1);
918 fail_unless (ret == FALSE);
919 g_value_unset (&src1);
920 g_value_unset (&src2);
925 GST_START_TEST (test_date)
931 date = g_date_new_dmy (22, 9, 2005);
933 s = gst_structure_new ("media/x-type", "SOME_DATE_TAG", GST_TYPE_DATE,
936 fail_unless (gst_structure_has_field_typed (s, "SOME_DATE_TAG",
938 fail_unless (gst_structure_get_date (s, "SOME_DATE_TAG", &date2));
939 fail_unless (date2 != NULL);
940 fail_unless (g_date_valid (date2));
941 fail_unless (g_date_compare (date, date2) == 0);
948 str = gst_structure_to_string (s);
949 gst_structure_free (s);
952 fail_unless (g_str_equal (str,
953 "media/x-type, SOME_DATE_TAG=(GstDate)2005-09-22"));
955 s = gst_structure_from_string (str, NULL);
959 fail_unless (s != NULL);
960 fail_unless (gst_structure_has_name (s, "media/x-type"));
961 fail_unless (gst_structure_has_field_typed (s, "SOME_DATE_TAG",
963 fail_unless (gst_structure_get_date (s, "SOME_DATE_TAG", &date));
964 fail_unless (date != NULL);
965 fail_unless (g_date_valid (date));
966 fail_unless (g_date_get_day (date) == 22);
967 fail_unless (g_date_get_month (date) == 9);
968 fail_unless (g_date_get_year (date) == 2005);
972 str = gst_structure_to_string (s);
973 gst_structure_free (s);
976 fail_unless (g_str_equal (str,
977 "media/x-type, SOME_DATE_TAG=(GstDate)2005-09-22"));
985 gst_value_suite (void)
987 Suite *s = suite_create ("GstValue");
988 TCase *tc_chain = tcase_create ("general");
990 suite_add_tcase (s, tc_chain);
991 tcase_add_test (tc_chain, test_deserialize_buffer);
992 tcase_add_test (tc_chain, test_deserialize_gint);
993 tcase_add_test (tc_chain, test_deserialize_gint_failures);
994 tcase_add_test (tc_chain, test_deserialize_guint);
995 tcase_add_test (tc_chain, test_deserialize_guint_failures);
996 tcase_add_test (tc_chain, test_deserialize_gint64);
997 tcase_add_test (tc_chain, test_string);
998 tcase_add_test (tc_chain, test_deserialize_string);
999 tcase_add_test (tc_chain, test_value_compare);
1000 tcase_add_test (tc_chain, test_value_intersect);
1001 tcase_add_test (tc_chain, test_value_subtract_int);
1002 tcase_add_test (tc_chain, test_value_subtract_double);
1003 tcase_add_test (tc_chain, test_date);
1009 main (int argc, char **argv)
1013 Suite *s = gst_value_suite ();
1014 SRunner *sr = srunner_create (s);
1016 gst_check_init (&argc, &argv);
1018 srunner_run_all (sr, CK_NORMAL);
1019 nf = srunner_ntests_failed (sr);