gstreamer_core/tsrc/check/gst/gstvalue/src/gstvalue.c
changeset 0 0e761a78d257
equal deleted inserted replaced
-1:000000000000 0:0e761a78d257
       
     1  /*
       
     2  *  Copyright © 2008 Nokia Corporation.
       
     3  *  This material, including documentation and any related 
       
     4  *  computer programs, is protected by copyright controlled by 
       
     5  *  Nokia Corporation. All rights are reserved. Copying, 
       
     6  *  including reproducing, storing, adapting or translating, any 
       
     7  *  or all of this material requires the prior written consent of 
       
     8  *  Nokia Corporation. This material also contains confidential 
       
     9  *  information which may not be disclosed to others without the 
       
    10  *  prior written consent of Nokia Corporation.
       
    11  * ============================================================================
       
    12  */
       
    13 
       
    14 /* GStreamer
       
    15  * Copyright (C) <2004> David Schleef <david at schleef dot org>
       
    16  * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
       
    17  *
       
    18  * gstvalue.c: Unit tests for GstValue
       
    19  *
       
    20  * This library is free software; you can redistribute it and/or
       
    21  * modify it under the terms of the GNU Library General Public
       
    22  * License as published by the Free Software Foundation; either
       
    23  * version 2 of the License, or (at your option) any later version.
       
    24  *
       
    25  * This library is distributed in the hope that it will be useful,
       
    26  * but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    27  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
       
    28  * Library General Public License for more details.
       
    29  *
       
    30  * You should have received a copy of the GNU Library General Public
       
    31  * License along with this library; if not, write to the
       
    32  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
       
    33  * Boston, MA 02111-1307, USA.
       
    34  */
       
    35 
       
    36 
       
    37 
       
    38 #include <gst/gst_global.h>
       
    39 #include <gst/check/gstcheck.h>
       
    40 
       
    41 #define LOG_FILE "c:\\logs\\gstvalue_logs.txt" 
       
    42 #include "std_log_result.h" 
       
    43 #define LOG_FILENAME_LINE __FILE__, __LINE__
       
    44 
       
    45 //char* xmlfile = "gstvalue";
       
    46 
       
    47 void create_xml(int result)
       
    48 {
       
    49     if(result)
       
    50         assert_failed = 1;
       
    51     
       
    52     testResultXml(xmlfile);
       
    53     close_log_file();
       
    54 }
       
    55 
       
    56 
       
    57 void test_deserialize_buffer()
       
    58 {
       
    59   GValue value = { 0 };
       
    60   GstBuffer *buf;
       
    61   
       
    62     xmlfile = "test_deserialize_buffer";
       
    63   std_log(LOG_FILENAME_LINE, "Test Started test_deserialize_buffer");
       
    64 
       
    65 
       
    66   g_value_init (&value, GST_TYPE_BUFFER);
       
    67   fail_unless (gst_value_deserialize (&value, "1234567890abcdef"));
       
    68   
       
    69   /* does not increase the refcount */
       
    70   buf = GST_BUFFER (gst_value_get_mini_object (&value));
       
    71   ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1);
       
    72 
       
    73   /* does not increase the refcount */
       
    74   buf = gst_value_get_buffer (&value);
       
    75   ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1);
       
    76 
       
    77   /* cleanup */
       
    78   g_value_unset (&value);
       
    79     
       
    80     std_log(LOG_FILENAME_LINE, "Test Successful");
       
    81   create_xml(0);
       
    82 }
       
    83 
       
    84 
       
    85 
       
    86 /* create and serialize a buffer */
       
    87 void test_serialize_buffer()
       
    88 {
       
    89   GValue value = { 0 };
       
    90   GstBuffer *buf;
       
    91   gchar *serialized;
       
    92   static const char *buf_data = "1234567890abcdef";
       
    93   gint len;
       
    94   
       
    95     xmlfile = "test_serialize_buffer";
       
    96   std_log(LOG_FILENAME_LINE, "Test Started test_serialize_buffer");
       
    97 
       
    98 
       
    99   len = strlen (buf_data);
       
   100   buf = gst_buffer_new_and_alloc (len);
       
   101   memcpy (GST_BUFFER_DATA (buf), buf_data, len);
       
   102   ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1);
       
   103 
       
   104   /* and assign buffer to mini object */
       
   105   g_value_init (&value, GST_TYPE_BUFFER);
       
   106   gst_value_take_buffer (&value, buf);
       
   107   ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1);
       
   108 
       
   109   /* now serialize it */
       
   110   serialized = gst_value_serialize (&value);
       
   111   GST_DEBUG ("serialized buffer to %s", serialized);
       
   112   fail_unless (serialized != NULL);
       
   113   
       
   114 
       
   115   /* refcount should not change */
       
   116   ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1);
       
   117 
       
   118   /* cleanup */
       
   119   g_free (serialized);
       
   120   g_value_unset (&value);
       
   121 
       
   122   /* take NULL buffer */
       
   123   g_value_init (&value, GST_TYPE_BUFFER);
       
   124   GST_DEBUG ("setting NULL buffer");
       
   125   gst_value_take_buffer (&value, NULL);
       
   126 
       
   127   /* now serialize it */
       
   128   GST_DEBUG ("serializing NULL buffer");
       
   129   serialized = gst_value_serialize (&value);
       
   130   /* should return NULL */
       
   131   fail_unless (serialized == NULL);
       
   132   
       
   133 
       
   134   g_free (serialized);
       
   135   g_value_unset (&value);
       
   136   
       
   137     std_log(LOG_FILENAME_LINE, "Test Successful");
       
   138   create_xml(0);
       
   139 }
       
   140 
       
   141 
       
   142 
       
   143 void test_deserialize_gint()
       
   144 {
       
   145   GValue value = { 0 };
       
   146   const char *strings[] = {
       
   147     "123456",
       
   148     "-123456",
       
   149     "0xFFFF",
       
   150     "0x0000FFFF",
       
   151     /* a positive long long, serializing to highest possible positive sint */
       
   152     "0x7FFFFFFF",
       
   153     /* a positive long long, serializing to lowest possible negative sint */
       
   154     "0x80000000",
       
   155     /* a negative long long, serializing to lowest possible negative sint */
       
   156     "0xFFFFFFFF80000000",
       
   157     "0xFF000000",
       
   158     /* a positive long long serializing to -1 */
       
   159     "0xFFFFFFFF",
       
   160     "0xFFFFFFFF",
       
   161     /* a negative long long serializing to -1 */
       
   162     "0xFFFFFFFFFFFFFFFF",
       
   163     "0xFFFFFFFFFFFFFFFF",
       
   164     "0xEFFFFFFF",
       
   165   };
       
   166   /* some casts need to be explicit because of unsigned -> signed */
       
   167   gint results[] = {
       
   168     123456,
       
   169     -123456,
       
   170     0xFFFF,
       
   171     0xFFFF,
       
   172     0x7FFFFFFF,
       
   173     (gint) 0x80000000,
       
   174     (gint) 0x80000000,
       
   175     (gint) 0xFF000000,
       
   176     -1,
       
   177     (gint) 0xFFFFFFFF,
       
   178     -1,
       
   179     (gint) 0xFFFFFFFFFFFFFFFFLL,
       
   180     (gint) 0xEFFFFFFF,
       
   181   };
       
   182   int i;
       
   183   
       
   184     xmlfile = "test_deserialize_gint";
       
   185   std_log(LOG_FILENAME_LINE, "Test Started test_deserialize_gint");
       
   186 
       
   187 
       
   188   g_value_init (&value, G_TYPE_INT);
       
   189 
       
   190   for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
       
   191     fail_unless (gst_value_deserialize (&value, strings[i]),
       
   192         "could not deserialize %s (%d)", strings[i], i);
       
   193         
       
   194     fail_unless (g_value_get_int (&value) == results[i],
       
   195         "resulting value is %d, not %d, for string %s (%d)",
       
   196         g_value_get_int (&value), results[i], strings[i], i);
       
   197         
       
   198   }
       
   199   
       
   200     std_log(LOG_FILENAME_LINE, "Test Successful");
       
   201   create_xml(0);
       
   202 }
       
   203 
       
   204 
       
   205 void test_deserialize_gint_failures()
       
   206 {
       
   207   GValue value = { 0 };
       
   208   const char *strings[] = {
       
   209     "-",                        /* not a complete number */
       
   210     "- TEST",                   /* not a complete number */
       
   211     "0x0000000100000000",       /* lowest long long that cannot fit in 32 bits */
       
   212     "0xF000000000000000",
       
   213     "0xFFFFFFF000000000",
       
   214     "0xFFFFFFFF00000000",
       
   215     "0x10000000000000000",      /* first number too long to fit into a long long */
       
   216     /* invent a new processor first before trying to make this one pass */
       
   217     "0x10000000000000000000000000000000000000000000",
       
   218   };
       
   219   int i;
       
   220   
       
   221     xmlfile = "test_deserialize_gint_failures";
       
   222   std_log(LOG_FILENAME_LINE, "Test Started test_deserialize_gint_failures");
       
   223 
       
   224 
       
   225   g_value_init (&value, G_TYPE_INT);
       
   226 
       
   227   for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
       
   228     fail_if (gst_value_deserialize (&value, strings[i]),
       
   229         "deserialized %s (%d), while it should have failed", strings[i], i);
       
   230         
       
   231   }
       
   232   
       
   233     std_log(LOG_FILENAME_LINE, "Test Successful");
       
   234   create_xml(0);
       
   235 }
       
   236 
       
   237 void test_deserialize_guint()
       
   238 {
       
   239   GValue value = { 0 };
       
   240   const char *strings[] = {
       
   241     "123456",
       
   242     "-123456",
       
   243     "0xFFFF",
       
   244     "0x0000FFFF",
       
   245     /* a positive long long, serializing to highest possible positive sint */
       
   246     "0x7FFFFFFF",
       
   247     /* a positive long long, serializing to lowest possible negative sint */
       
   248     "0x80000000",
       
   249     "2147483648",
       
   250     /* a negative long long, serializing to lowest possible negative sint */
       
   251     "0xFFFFFFFF80000000",
       
   252     /* a value typically used for rgb masks */
       
   253     "0xFF000000",
       
   254     /* a positive long long serializing to highest possible positive uint */
       
   255     "0xFFFFFFFF",
       
   256     "0xFFFFFFFF",
       
   257     /* a negative long long serializing to highest possible positive uint */
       
   258     "0xFFFFFFFFFFFFFFFF",
       
   259     "0xEFFFFFFF",
       
   260   };
       
   261   guint results[] = {
       
   262     123456,
       
   263     (guint) - 123456,
       
   264     0xFFFF,
       
   265     0xFFFF,
       
   266     0x7FFFFFFF,
       
   267     0x80000000,
       
   268     (guint) 2147483648LL,
       
   269     0x80000000,
       
   270     0xFF000000,
       
   271     0xFFFFFFFF,
       
   272     G_MAXUINT,
       
   273     (guint) 0xFFFFFFFFFFFFFFFFLL,
       
   274     0xEFFFFFFF,
       
   275   };
       
   276   int i;
       
   277   
       
   278     xmlfile = "test_deserialize_guint";
       
   279   std_log(LOG_FILENAME_LINE, "Test Started test_deserialize_guint");
       
   280 
       
   281 
       
   282   g_value_init (&value, G_TYPE_UINT);
       
   283 
       
   284   for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
       
   285     fail_unless (gst_value_deserialize (&value, strings[i]),
       
   286         "could not deserialize %s (%d)", strings[i], i);
       
   287         
       
   288     fail_unless (g_value_get_uint (&value) == results[i],
       
   289         "resulting value is %d, not %d, for string %s (%d)",
       
   290         g_value_get_uint (&value), results[i], strings[i], i);
       
   291         
       
   292   }
       
   293     std_log(LOG_FILENAME_LINE, "Test Successful");
       
   294   create_xml(0);
       
   295 }
       
   296 
       
   297 void test_deserialize_guint_failures()
       
   298 {
       
   299   GValue value = { 0 };
       
   300   const char *strings[] = {
       
   301     "-",                        /* not a complete number */
       
   302     "- TEST",                   /* not a complete number */
       
   303 #if 0
       
   304 /* FIXME: these values should not be deserializable, since they overflow
       
   305  * the target format */
       
   306     "0x0000000100000000",       /* lowest long long that cannot fit in 32 bits */
       
   307     "0xF000000000000000",
       
   308     "0xFFFFFFF000000000",
       
   309     "0xFFFFFFFF00000000",
       
   310     "0x10000000000000000",      /* first number too long to fit into a long long */
       
   311     /* invent a new processor first before trying to make this one pass */
       
   312     "0x10000000000000000000000000000000000000000000",
       
   313 #endif
       
   314   };
       
   315   int i;
       
   316   
       
   317     xmlfile = "test_deserialize_guint_failures";
       
   318   std_log(LOG_FILENAME_LINE, "Test Started test_deserialize_guint_failures");
       
   319 
       
   320 
       
   321   g_value_init (&value, G_TYPE_UINT);
       
   322 
       
   323   for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
       
   324     fail_if (gst_value_deserialize (&value, strings[i]),
       
   325         "deserialized %s (%d), while it should have failed", strings[i], i);
       
   326         
       
   327   }
       
   328     std_log(LOG_FILENAME_LINE, "Test Successful");
       
   329   create_xml(0);
       
   330 }
       
   331 
       
   332 
       
   333 void test_deserialize_gint64()
       
   334 {
       
   335   GValue value = { 0 };
       
   336   const char *strings[] = {
       
   337     "12345678901",
       
   338     "-12345678901",
       
   339   };
       
   340   gint64 results[] = {
       
   341     12345678901LL,
       
   342     -12345678901LL,
       
   343   };
       
   344   int i;
       
   345   
       
   346     xmlfile = "test_deserialize_gint64";
       
   347   std_log(LOG_FILENAME_LINE, "Test Started test_deserialize_gint64");
       
   348 
       
   349 
       
   350   g_value_init (&value, G_TYPE_INT64);
       
   351 
       
   352   for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
       
   353     fail_unless (gst_value_deserialize (&value, strings[i]),
       
   354         "could not deserialize %s (%d)", strings[i], i);
       
   355         
       
   356     fail_unless (g_value_get_int64 (&value) == results[i],
       
   357         "resulting value is %" G_GINT64_FORMAT ", not %" G_GINT64_FORMAT
       
   358         ", for string %s (%d)", g_value_get_int64 (&value),
       
   359         results[i], strings[i], i);
       
   360         
       
   361   }
       
   362   
       
   363     std_log(LOG_FILENAME_LINE, "Test Successful");
       
   364   create_xml(0);
       
   365 }
       
   366 
       
   367 
       
   368 
       
   369 
       
   370 
       
   371 void test_deserialize_gstfraction()
       
   372 {
       
   373   GValue value = { 0 };
       
   374   const char *strings[] = {
       
   375     "4/5",
       
   376     "-8/9"
       
   377   };
       
   378   gint64 result_numers[] = {
       
   379     4,
       
   380     -8
       
   381   };
       
   382   gint64 result_denoms[] = {
       
   383     5,
       
   384     9
       
   385   };
       
   386 
       
   387   int i;
       
   388   
       
   389     xmlfile = "test_deserialize_gstfraction";
       
   390   std_log(LOG_FILENAME_LINE, "Test Started test_deserialize_gstfraction");
       
   391 
       
   392 
       
   393   g_value_init (&value, GST_TYPE_FRACTION);
       
   394   for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
       
   395     fail_unless (gst_value_deserialize (&value, strings[i]),
       
   396         "could not deserialize %s (%d)", strings[i], i);
       
   397         
       
   398     fail_unless (gst_value_get_fraction_numerator (&value) == result_numers[i],
       
   399         "resulting numerator value is %d, not %d"
       
   400         ", for string %s (%d)", gst_value_get_fraction_numerator (&value),
       
   401         result_numers[i], strings[i], i);
       
   402         
       
   403     fail_unless (gst_value_get_fraction_denominator (&value) ==
       
   404         result_denoms[i], "resulting denominator value is %d, not %d"
       
   405         ", for string %s (%d)", gst_value_get_fraction_denominator (&value),
       
   406         result_denoms[i], strings[i], i);
       
   407         
       
   408   }
       
   409   
       
   410     std_log(LOG_FILENAME_LINE, "Test Successful");
       
   411   create_xml(0);
       
   412 }
       
   413 
       
   414 
       
   415 
       
   416 void test_serialize_flags()
       
   417 {
       
   418   GValue value = { 0 };
       
   419   gchar *string;
       
   420   GstSeekFlags flags[] = {
       
   421     0,
       
   422     GST_SEEK_FLAG_NONE,
       
   423     GST_SEEK_FLAG_FLUSH,
       
   424     GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
       
   425   };
       
   426   const char *results[] = {
       
   427     "GST_SEEK_FLAG_NONE",
       
   428     "GST_SEEK_FLAG_NONE",
       
   429     "GST_SEEK_FLAG_FLUSH",
       
   430     "GST_SEEK_FLAG_FLUSH+GST_SEEK_FLAG_ACCURATE",
       
   431   };
       
   432   int i;
       
   433   
       
   434     xmlfile = "test_serialize_flags";
       
   435   std_log(LOG_FILENAME_LINE, "Test Started test_serialize_flags");
       
   436 
       
   437 
       
   438   g_value_init (&value, GST_TYPE_SEEK_FLAGS);
       
   439 
       
   440   for (i = 0; i < G_N_ELEMENTS (flags); ++i) {
       
   441     g_value_set_flags (&value, flags[i]);
       
   442     string = gst_value_serialize (&value);
       
   443     fail_if (string == NULL, "could not serialize flags %d", i);
       
   444     
       
   445     fail_unless (strcmp (string, results[i]) == 0,
       
   446         "resulting value is %s, not %s, for flags #%d", string, results[i], i);
       
   447         
       
   448     g_free (string);
       
   449   }
       
   450     std_log(LOG_FILENAME_LINE, "Test Successful");
       
   451   create_xml(0);
       
   452 }
       
   453 
       
   454 
       
   455 
       
   456 
       
   457 void test_deserialize_flags()
       
   458 {
       
   459   GValue value = { 0 };
       
   460   const char *strings[] = {
       
   461     "",
       
   462     "0",
       
   463     "GST_SEEK_FLAG_NONE",
       
   464     "GST_SEEK_FLAG_FLUSH",
       
   465     "GST_SEEK_FLAG_FLUSH+GST_SEEK_FLAG_ACCURATE",
       
   466   };
       
   467   GstSeekFlags results[] = {
       
   468     GST_SEEK_FLAG_NONE,
       
   469     GST_SEEK_FLAG_NONE,
       
   470     GST_SEEK_FLAG_NONE,
       
   471     GST_SEEK_FLAG_FLUSH,
       
   472     GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
       
   473   };
       
   474   int i;
       
   475   
       
   476     xmlfile = "test_deserialize_flags";
       
   477   std_log(LOG_FILENAME_LINE, "Test Started test_deserialize_flags");
       
   478 
       
   479 
       
   480   g_value_init (&value, GST_TYPE_SEEK_FLAGS);
       
   481 
       
   482   for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
       
   483     fail_unless (gst_value_deserialize (&value, strings[i]),
       
   484         "could not deserialize %s (%d)", strings[i], i);
       
   485         
       
   486     fail_unless (g_value_get_flags (&value) == results[i],
       
   487         "resulting value is %d, not %d, for string %s (%d)",
       
   488         g_value_get_flags (&value), results[i], strings[i], i);
       
   489         
       
   490   }
       
   491     std_log(LOG_FILENAME_LINE, "Test Successful");
       
   492   create_xml(0);
       
   493 }
       
   494 
       
   495 
       
   496 void test_serialize_deserialize_format_enum()
       
   497 {
       
   498   GstStructure *s, *s2;
       
   499   GstFormat foobar_fmt;
       
   500   gchar *str, *str2, *end = NULL;
       
   501   
       
   502     xmlfile = "test_serialize_deserialize_format_enum";
       
   503   std_log(LOG_FILENAME_LINE, "Test Started test_serialize_deserialize_format_enum");
       
   504 
       
   505 
       
   506   /* make sure custom formats are serialised properly as well */
       
   507   foobar_fmt = gst_format_register ("foobar", "GST_FORMAT_FOOBAR");
       
   508   fail_unless (foobar_fmt != GST_FORMAT_UNDEFINED);
       
   509   
       
   510 
       
   511   s = gst_structure_new ("foo/bar", "format1", GST_TYPE_FORMAT,
       
   512       GST_FORMAT_BYTES, "format2", GST_TYPE_FORMAT, GST_FORMAT_TIME,
       
   513       "format3", GST_TYPE_FORMAT, GST_FORMAT_DEFAULT, "format4",
       
   514       GST_TYPE_FORMAT, foobar_fmt, NULL);
       
   515 
       
   516   str = gst_structure_to_string (s);
       
   517   GST_LOG ("Got structure string '%s'", GST_STR_NULL (str));
       
   518   fail_unless (str != NULL);
       
   519   
       
   520   fail_unless (strstr (str, "TIME") != NULL);
       
   521   
       
   522   fail_unless (strstr (str, "BYTE") != NULL);
       
   523   
       
   524   fail_unless (strstr (str, "DEFAULT") != NULL);
       
   525   
       
   526   fail_unless (strstr (str, "FOOBAR") != NULL);
       
   527   
       
   528 
       
   529   s2 = gst_structure_from_string (str, &end);
       
   530   fail_unless (s2 != NULL);
       
   531   
       
   532 
       
   533   str2 = gst_structure_to_string (s2);
       
   534   fail_unless (str2 != NULL);
       
   535   
       
   536 
       
   537   fail_unless (g_str_equal (str, str2));
       
   538   
       
   539 
       
   540   g_free (str);
       
   541   g_free (str2);
       
   542   gst_structure_free (s);
       
   543   gst_structure_free (s2);
       
   544   
       
   545     std_log(LOG_FILENAME_LINE, "Test Successful");
       
   546   create_xml(0);
       
   547 }
       
   548 
       
   549 
       
   550 void test_string()
       
   551 {
       
   552   gchar *try[] = {
       
   553     "Dude",
       
   554     "Hi, I'm a string",
       
   555     "tüüüt!"
       
   556   };
       
   557   gchar *tmp;
       
   558   GValue v = { 0, };
       
   559   guint i;
       
   560   
       
   561     xmlfile = "test_string";
       
   562   std_log(LOG_FILENAME_LINE, "Test Started test_string");
       
   563 
       
   564 
       
   565   g_value_init (&v, G_TYPE_STRING);
       
   566   for (i = 0; i < G_N_ELEMENTS (try); i++) {
       
   567     g_value_set_string (&v, try[i]);
       
   568     tmp = gst_value_serialize (&v);
       
   569     fail_if (tmp == NULL, "couldn't serialize: %s\n", try[i]);
       
   570     
       
   571     fail_unless (gst_value_deserialize (&v, tmp),
       
   572         "couldn't deserialize: %s\n", tmp);
       
   573         
       
   574     g_free (tmp);
       
   575 
       
   576     fail_unless (g_str_equal (g_value_get_string (&v), try[i]),
       
   577         "\nserialized  : %s\ndeserialized: %s", try[i],
       
   578         g_value_get_string (&v));
       
   579         
       
   580   }
       
   581   /* NULL strings should not be serializable */
       
   582   g_value_set_string (&v, NULL);
       
   583   fail_unless (gst_value_serialize (&v) == NULL);
       
   584   
       
   585   g_value_unset (&v);
       
   586   
       
   587     std_log(LOG_FILENAME_LINE, "Test Successful");
       
   588   create_xml(0);
       
   589 }
       
   590 
       
   591 
       
   592 
       
   593 void test_deserialize_string()
       
   594 {
       
   595   struct
       
   596   {
       
   597     gchar *from;
       
   598     gchar *to;
       
   599   } tests[] = {
       
   600     {
       
   601     "", ""},                    /* empty strings */
       
   602     {
       
   603     "\"\"", ""},                /* FAILURES */
       
   604     {
       
   605     "\"", NULL},                /* missing second quote */
       
   606     {
       
   607     "\"Hello\\ World", NULL},   /* missing second quote */
       
   608     {
       
   609     "\"\\", NULL},              /* quote at end, missing second quote */
       
   610     {
       
   611     "\"\\0", NULL},             /* missing second quote */
       
   612     {
       
   613     "\"\\0\"", NULL},           /* unfinished escaped character */
       
   614     {
       
   615     "\" \"", NULL},             /* spaces must be escaped */
       
   616 #if 0
       
   617         /* FIXME 0.9: this test should fail, but it doesn't */
       
   618     {
       
   619     "tüüt", NULL}             /* string with special chars must be escaped */
       
   620 #endif
       
   621   };
       
   622   guint i;
       
   623   GValue v = { 0, };
       
   624   gboolean ret = TRUE;
       
   625   
       
   626     xmlfile = "test_deserialize_string";
       
   627   std_log(LOG_FILENAME_LINE, "Test Started test_deserialize_string");
       
   628 
       
   629 
       
   630   g_value_init (&v, G_TYPE_STRING);
       
   631   for (i = 0; i < G_N_ELEMENTS (tests); i++) {
       
   632     if (gst_value_deserialize (&v, tests[i].from)) {
       
   633       fail_if (tests[i].to == NULL,
       
   634           "I got %s instead of a failure", g_value_get_string (&v));
       
   635           
       
   636       fail_unless (g_str_equal (g_value_get_string (&v), tests[i].to),
       
   637           "\nwanted: %s\ngot    : %s", tests[i].to, g_value_get_string (&v));
       
   638           
       
   639     } else {
       
   640       fail_if (tests[i].to != NULL, "failed, but wanted: %s", tests[i].to);
       
   641       
       
   642       ret = FALSE;
       
   643     }
       
   644   }
       
   645   g_value_unset (&v);
       
   646   
       
   647     std_log(LOG_FILENAME_LINE, "Test Successful");
       
   648   create_xml(0);
       
   649 }
       
   650 
       
   651 
       
   652 void test_value_intersect()
       
   653 {
       
   654   GValue dest = { 0 };
       
   655   GValue src1 = { 0 };
       
   656   GValue src2 = { 0 };
       
   657   GValue item = { 0 };
       
   658   gboolean ret;
       
   659   
       
   660     xmlfile = "test_value_intersect";
       
   661   std_log(LOG_FILENAME_LINE, "Test Started test_value_intersect");
       
   662 
       
   663 
       
   664   g_value_init (&src1, G_TYPE_INT);
       
   665   g_value_set_int (&src1, 10);
       
   666   g_value_init (&src2, G_TYPE_INT);
       
   667   g_value_set_int (&src2, 20);
       
   668   ret = gst_value_intersect (&dest, &src1, &src2);
       
   669   fail_unless (ret == FALSE);
       
   670   
       
   671   g_value_unset (&src1);
       
   672   g_value_unset (&src2);
       
   673 
       
   674   g_value_init (&src1, GST_TYPE_FOURCC);
       
   675   gst_value_set_fourcc (&src1, GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'));
       
   676   g_value_init (&src2, GST_TYPE_LIST);
       
   677   g_value_init (&item, GST_TYPE_FOURCC);
       
   678   gst_value_set_fourcc (&item, GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'));
       
   679   gst_value_list_append_value (&src2, &item);
       
   680   gst_value_set_fourcc (&item, GST_MAKE_FOURCC ('I', '4', '2', '0'));
       
   681   gst_value_list_append_value (&src2, &item);
       
   682   gst_value_set_fourcc (&item, GST_MAKE_FOURCC ('A', 'B', 'C', 'D'));
       
   683   gst_value_list_append_value (&src2, &item);
       
   684 
       
   685   fail_unless (gst_value_intersect (&dest, &src1, &src2));
       
   686   
       
   687   fail_unless (GST_VALUE_HOLDS_FOURCC (&dest));
       
   688   
       
   689   fail_unless (gst_value_get_fourcc (&dest) ==
       
   690       GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'));
       
   691       
       
   692 
       
   693   g_value_unset (&src1);
       
   694   g_value_unset (&src2);
       
   695   
       
   696     std_log(LOG_FILENAME_LINE, "Test Successful");
       
   697   create_xml(0);
       
   698 }
       
   699 
       
   700 
       
   701 void test_date()
       
   702 {
       
   703   GstStructure *s;
       
   704   GDate *date, *date2;
       
   705   gchar *str;
       
   706   
       
   707     xmlfile = "test_date";
       
   708   std_log(LOG_FILENAME_LINE, "Test Started test_date");
       
   709 
       
   710 
       
   711   date = g_date_new_dmy (22, 9, 2005);
       
   712 
       
   713   s = gst_structure_new ("media/x-type", "SOME_DATE_TAG", GST_TYPE_DATE,
       
   714       date, NULL);
       
   715 
       
   716   fail_unless (gst_structure_has_field_typed (s, "SOME_DATE_TAG",
       
   717           GST_TYPE_DATE));
       
   718           
       
   719   fail_unless (gst_structure_get_date (s, "SOME_DATE_TAG", &date2));
       
   720   
       
   721   fail_unless (date2 != NULL);
       
   722   
       
   723   fail_unless (g_date_valid (date2));
       
   724   
       
   725   fail_unless (g_date_compare (date, date2) == 0);
       
   726   
       
   727 
       
   728   g_date_free (date);
       
   729   g_date_free (date2);
       
   730   date = NULL;
       
   731   date2 = NULL;
       
   732 
       
   733   str = gst_structure_to_string (s);
       
   734   gst_structure_free (s);
       
   735   s = NULL;
       
   736 
       
   737   fail_unless (g_str_equal (str,
       
   738           "media/x-type, SOME_DATE_TAG=(GstDate)2005-09-22;"));
       
   739           
       
   740 
       
   741   s = gst_structure_from_string (str, NULL);
       
   742   g_free (str);
       
   743   str = NULL;
       
   744 
       
   745   fail_unless (s != NULL);
       
   746   
       
   747   fail_unless (gst_structure_has_name (s, "media/x-type"));
       
   748   
       
   749   fail_unless (gst_structure_has_field_typed (s, "SOME_DATE_TAG",
       
   750           GST_TYPE_DATE));
       
   751           
       
   752   fail_unless (gst_structure_get_date (s, "SOME_DATE_TAG", &date));
       
   753   
       
   754   fail_unless (date != NULL);
       
   755   
       
   756   fail_unless (g_date_valid (date));
       
   757   
       
   758   fail_unless (g_date_get_day (date) == 22);
       
   759   
       
   760   fail_unless (g_date_get_month (date) == 9);
       
   761   
       
   762   fail_unless (g_date_get_year (date) == 2005);
       
   763   
       
   764   g_date_free (date);
       
   765   date = NULL;
       
   766 
       
   767   str = gst_structure_to_string (s);
       
   768   gst_structure_free (s);
       
   769   s = NULL;
       
   770 
       
   771   fail_unless (g_str_equal (str,
       
   772           "media/x-type, SOME_DATE_TAG=(GstDate)2005-09-22;"));
       
   773           
       
   774   g_free (str);
       
   775   str = NULL;
       
   776   
       
   777     std_log(LOG_FILENAME_LINE, "Test Successful");
       
   778   create_xml(0);
       
   779 }
       
   780 
       
   781 
       
   782 void test_fraction_range()
       
   783 {
       
   784   GValue range = { 0, };
       
   785   GValue start = { 0, }, end = {
       
   786   0,};
       
   787   GValue src = { 0, }, dest = {
       
   788   0,};
       
   789   GValue range2 = { 0, };
       
   790   
       
   791     xmlfile = "test_fraction_range";
       
   792   std_log(LOG_FILENAME_LINE, "Test Started test_fraction_range");
       
   793 
       
   794 
       
   795   g_value_init (&range, GST_TYPE_FRACTION_RANGE);
       
   796   g_value_init (&range2, GST_TYPE_FRACTION_RANGE);
       
   797   g_value_init (&start, GST_TYPE_FRACTION);
       
   798   g_value_init (&end, GST_TYPE_FRACTION);
       
   799   g_value_init (&src, GST_TYPE_FRACTION);
       
   800 
       
   801   gst_value_set_fraction (&src, 1, 2);
       
   802 
       
   803   /* Check that a intersection of fraction & range = fraction */
       
   804   gst_value_set_fraction (&start, 1, 4);
       
   805   gst_value_set_fraction (&end, 2, 3);
       
   806   gst_value_set_fraction_range (&range, &start, &end);
       
   807 
       
   808   fail_unless (gst_value_intersect (&dest, &src, &range) == TRUE);
       
   809   
       
   810   fail_unless (G_VALUE_TYPE (&dest) == GST_TYPE_FRACTION);
       
   811   
       
   812   fail_unless (gst_value_compare (&dest, &src) == GST_VALUE_EQUAL);
       
   813   
       
   814 
       
   815   /* Check that a intersection selects the overlapping range */
       
   816   gst_value_set_fraction (&start, 1, 3);
       
   817   gst_value_set_fraction (&end, 2, 3);
       
   818   gst_value_set_fraction_range (&range2, &start, &end);
       
   819   g_value_unset (&dest);
       
   820   fail_unless (gst_value_intersect (&dest, &range, &range2) == TRUE);
       
   821   
       
   822   fail_unless (G_VALUE_TYPE (&dest) == GST_TYPE_FRACTION_RANGE);
       
   823   
       
   824 
       
   825   gst_value_set_fraction_range (&range2, &start, &end);
       
   826   fail_unless (gst_value_compare (&dest, &range2) == GST_VALUE_EQUAL);
       
   827   
       
   828 
       
   829   /* Check that non intersection ranges don't intersect */
       
   830   gst_value_set_fraction (&start, 4, 2);
       
   831   gst_value_set_fraction (&end, 5, 2);
       
   832   gst_value_set_fraction_range (&range2, &start, &end);
       
   833   g_value_unset (&dest);
       
   834   fail_unless (gst_value_intersect (&dest, &range, &range2) == FALSE);
       
   835   
       
   836 
       
   837   g_value_unset (&start);
       
   838   g_value_unset (&end);
       
   839   g_value_unset (&range);
       
   840   g_value_unset (&range2);
       
   841   g_value_unset (&src);
       
   842   
       
   843     std_log(LOG_FILENAME_LINE, "Test Successful");
       
   844   create_xml(0);
       
   845 }
       
   846 
       
   847 /* Test arithmetic subtraction of fractions */
       
   848 void test_value_subtract_fraction()
       
   849 {
       
   850   GValue result = { 0 };
       
   851   GValue src1 = { 0 };
       
   852   GValue src2 = { 0 };
       
   853   
       
   854     xmlfile = "test_value_subtract_fraction";
       
   855   std_log(LOG_FILENAME_LINE, "Test Started test_value_subtract_fraction");
       
   856 
       
   857 
       
   858   /* Subtract 1/4 from 1/2 */
       
   859   g_value_init (&src1, GST_TYPE_FRACTION);
       
   860   g_value_init (&src2, GST_TYPE_FRACTION);
       
   861   g_value_init (&result, GST_TYPE_FRACTION);
       
   862   gst_value_set_fraction (&src1, 1, 2);
       
   863   gst_value_set_fraction (&src2, 1, 4);
       
   864   fail_unless (gst_value_fraction_subtract (&result, &src1, &src2) == TRUE);
       
   865   
       
   866   fail_unless (gst_value_get_fraction_numerator (&result) == 1);
       
   867   
       
   868   fail_unless (gst_value_get_fraction_denominator (&result) == 4);
       
   869   
       
   870 
       
   871   g_value_unset (&src1);
       
   872   g_value_unset (&src2);
       
   873   g_value_unset (&result);
       
   874 
       
   875   /* Subtract 1/12 from 7/8 */
       
   876   g_value_init (&src1, GST_TYPE_FRACTION);
       
   877   g_value_init (&src2, GST_TYPE_FRACTION);
       
   878   g_value_init (&result, GST_TYPE_FRACTION);
       
   879   gst_value_set_fraction (&src1, 7, 8);
       
   880   gst_value_set_fraction (&src2, 1, 12);
       
   881   fail_unless (gst_value_fraction_subtract (&result, &src1, &src2) == TRUE);
       
   882   
       
   883   fail_unless (gst_value_get_fraction_numerator (&result) == 19);
       
   884   
       
   885   fail_unless (gst_value_get_fraction_denominator (&result) == 24);
       
   886   
       
   887 
       
   888   g_value_unset (&src1);
       
   889   g_value_unset (&src2);
       
   890   g_value_unset (&result);
       
   891 
       
   892   /* Subtract 12/13 from 4/3 */
       
   893   g_value_init (&src1, GST_TYPE_FRACTION);
       
   894   g_value_init (&src2, GST_TYPE_FRACTION);
       
   895   g_value_init (&result, GST_TYPE_FRACTION);
       
   896   gst_value_set_fraction (&src1, 4, 3);
       
   897   gst_value_set_fraction (&src2, 12, 13);
       
   898   fail_unless (gst_value_fraction_subtract (&result, &src1, &src2) == TRUE);
       
   899   
       
   900   fail_unless (gst_value_get_fraction_numerator (&result) == 16);
       
   901   
       
   902   fail_unless (gst_value_get_fraction_denominator (&result) == 39);
       
   903   
       
   904 
       
   905   g_value_unset (&src1);
       
   906   g_value_unset (&src2);
       
   907   g_value_unset (&result);
       
   908   
       
   909     std_log(LOG_FILENAME_LINE, "Test Successful");
       
   910   create_xml(0);
       
   911 
       
   912   /* Subtract 1/12 from 7/8 */
       
   913 }
       
   914 
       
   915 
       
   916 void test_value_compare()
       
   917 {
       
   918   GValue value1 = { 0 };
       
   919   GValue value2 = { 0 };
       
   920   GValue tmp = { 0 };
       
   921   
       
   922     xmlfile = "test_value_compare";
       
   923   std_log(LOG_FILENAME_LINE, "Test Started test_range");
       
   924 
       
   925 
       
   926   g_value_init (&value1, G_TYPE_INT);
       
   927   g_value_set_int (&value1, 10);
       
   928   g_value_init (&value2, G_TYPE_INT);
       
   929   g_value_set_int (&value2, 20);
       
   930   fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
       
   931   fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
       
   932   fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
       
   933   g_value_unset (&value1);
       
   934   g_value_unset (&value2);
       
   935 
       
   936   g_value_init (&value1, G_TYPE_DOUBLE);
       
   937   g_value_set_double (&value1, 10);
       
   938   g_value_init (&value2, G_TYPE_DOUBLE);
       
   939   g_value_set_double (&value2, 20);
       
   940   fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
       
   941   fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
       
   942   fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
       
   943   g_value_unset (&value1);
       
   944   g_value_unset (&value2);
       
   945 
       
   946   g_value_init (&value1, G_TYPE_STRING);
       
   947   g_value_set_string (&value1, "a");
       
   948   g_value_init (&value2, G_TYPE_STRING);
       
   949   g_value_set_string (&value2, "b");
       
   950   fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
       
   951   fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
       
   952   fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
       
   953   g_value_unset (&value1);
       
   954   g_value_unset (&value2);
       
   955 
       
   956   g_value_init (&value1, GST_TYPE_FOURCC);
       
   957   gst_value_set_fourcc (&value1, GST_MAKE_FOURCC ('a', 'b', 'c', 'd'));
       
   958   g_value_init (&value2, GST_TYPE_FOURCC);
       
   959   gst_value_set_fourcc (&value2, GST_MAKE_FOURCC ('1', '2', '3', '4'));
       
   960   fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_UNORDERED);
       
   961   fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
       
   962   g_value_unset (&value1);
       
   963   g_value_unset (&value2);
       
   964 
       
   965   /* comparing 2/3 with 3/4 */
       
   966   g_value_init (&value1, GST_TYPE_FRACTION);
       
   967   gst_value_set_fraction (&value1, 2, 3);
       
   968   g_value_init (&value2, GST_TYPE_FRACTION);
       
   969   gst_value_set_fraction (&value2, 3, 4);
       
   970   fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
       
   971   fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
       
   972   fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
       
   973   g_value_unset (&value1);
       
   974   g_value_unset (&value2);
       
   975 
       
   976   /* comparing -4/5 with 2/-3 */
       
   977   g_value_init (&value1, GST_TYPE_FRACTION);
       
   978   gst_value_set_fraction (&value1, -4, 5);
       
   979   g_value_init (&value2, GST_TYPE_FRACTION);
       
   980   gst_value_set_fraction (&value2, 2, -3);
       
   981   fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
       
   982   fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
       
   983   fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
       
   984   g_value_unset (&value1);
       
   985   g_value_unset (&value2);
       
   986 
       
   987   /* comparing 10/100 with 200/2000 */
       
   988   g_value_init (&value1, GST_TYPE_FRACTION);
       
   989   gst_value_set_fraction (&value1, 10, 100);
       
   990   g_value_init (&value2, GST_TYPE_FRACTION);
       
   991   gst_value_set_fraction (&value2, 200, 2000);
       
   992   fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL);
       
   993   g_value_unset (&value1);
       
   994   g_value_unset (&value2);
       
   995 
       
   996   /* comparing -4/5 with 2/-3 */
       
   997   g_value_init (&value1, GST_TYPE_FRACTION);
       
   998   gst_value_set_fraction (&value1, -4, 5);
       
   999   g_value_init (&value2, GST_TYPE_FRACTION);
       
  1000   gst_value_set_fraction (&value2, 2, -3);
       
  1001   fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
       
  1002   fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
       
  1003   fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
       
  1004   g_value_unset (&value1);
       
  1005   g_value_unset (&value2);
       
  1006 
       
  1007   /* Check that lists are equal regardless of order */
       
  1008   g_value_init (&value1, GST_TYPE_LIST);
       
  1009   g_value_init (&tmp, G_TYPE_INT);
       
  1010   g_value_set_int (&tmp, 1);
       
  1011   gst_value_list_append_value (&value1, &tmp);
       
  1012   g_value_set_int (&tmp, 2);
       
  1013   gst_value_list_append_value (&value1, &tmp);
       
  1014   g_value_set_int (&tmp, 3);
       
  1015   gst_value_list_append_value (&value1, &tmp);
       
  1016   g_value_set_int (&tmp, 4);
       
  1017   gst_value_list_append_value (&value1, &tmp);
       
  1018 
       
  1019   g_value_init (&value2, GST_TYPE_LIST);
       
  1020   g_value_set_int (&tmp, 4);
       
  1021   gst_value_list_append_value (&value2, &tmp);
       
  1022   g_value_set_int (&tmp, 3);
       
  1023   gst_value_list_append_value (&value2, &tmp);
       
  1024   g_value_set_int (&tmp, 2);
       
  1025   gst_value_list_append_value (&value2, &tmp);
       
  1026   g_value_set_int (&tmp, 1);
       
  1027   gst_value_list_append_value (&value2, &tmp);
       
  1028 
       
  1029   fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL,
       
  1030       "value lists with different order were not equal when they should be");
       
  1031   fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL,
       
  1032       "value lists with same order were not equal when they should be");
       
  1033   fail_unless (gst_value_compare (&value2, &value2) == GST_VALUE_EQUAL,
       
  1034       "value lists with same order were not equal when they should be");
       
  1035 
       
  1036   /* Carry over the lists to this next check: */
       
  1037   /* Lists with different sizes are unequal */
       
  1038   g_value_set_int (&tmp, 1);
       
  1039   gst_value_list_append_value (&value2, &tmp);
       
  1040 
       
  1041   fail_if (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL,
       
  1042       "Value lists with different size were equal when they shouldn't be");
       
  1043 
       
  1044   /* Carry over the lists to this next check: */
       
  1045   /* Lists with same size but list1 contains one more element not in list2 */
       
  1046   g_value_set_int (&tmp, 5);
       
  1047   gst_value_list_append_value (&value1, &tmp);
       
  1048 
       
  1049   fail_if (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL,
       
  1050       "Value lists with different elements were equal when they shouldn't be");
       
  1051   fail_if (gst_value_compare (&value2, &value1) == GST_VALUE_EQUAL,
       
  1052       "Value lists with different elements were equal when they shouldn't be");
       
  1053 
       
  1054   g_value_unset (&value1);
       
  1055   g_value_unset (&value2);
       
  1056   g_value_unset (&tmp);
       
  1057 
       
  1058   /* Arrays are only equal when in the same order */
       
  1059   g_value_init (&value1, GST_TYPE_ARRAY);
       
  1060   g_value_init (&tmp, G_TYPE_INT);
       
  1061   g_value_set_int (&tmp, 1);
       
  1062   gst_value_array_append_value (&value1, &tmp);
       
  1063   g_value_set_int (&tmp, 2);
       
  1064   gst_value_array_append_value (&value1, &tmp);
       
  1065   g_value_set_int (&tmp, 3);
       
  1066   gst_value_array_append_value (&value1, &tmp);
       
  1067   g_value_set_int (&tmp, 4);
       
  1068   gst_value_array_append_value (&value1, &tmp);
       
  1069 
       
  1070   g_value_init (&value2, GST_TYPE_ARRAY);
       
  1071   g_value_set_int (&tmp, 4);
       
  1072   gst_value_array_append_value (&value2, &tmp);
       
  1073   g_value_set_int (&tmp, 3);
       
  1074   gst_value_array_append_value (&value2, &tmp);
       
  1075   g_value_set_int (&tmp, 2);
       
  1076   gst_value_array_append_value (&value2, &tmp);
       
  1077   g_value_set_int (&tmp, 1);
       
  1078   gst_value_array_append_value (&value2, &tmp);
       
  1079 
       
  1080   fail_if (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL,
       
  1081       "Value arrays with different order were equal when they shouldn't be");
       
  1082   fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL,
       
  1083       "Identical value arrays were not equal when they should be");
       
  1084   fail_unless (gst_value_compare (&value2, &value2) == GST_VALUE_EQUAL,
       
  1085       "Identical value arrays were not equal when they should be");
       
  1086 
       
  1087   /* Carry over the arrays to this next check: */
       
  1088   /* Arrays with different sizes are unequal */
       
  1089   g_value_unset (&value2);
       
  1090   g_value_init (&value2, GST_TYPE_ARRAY);
       
  1091   g_value_copy (&value1, &value2);
       
  1092 
       
  1093   g_value_set_int (&tmp, 1);
       
  1094   gst_value_array_append_value (&value2, &tmp);
       
  1095 
       
  1096   fail_if (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL,
       
  1097       "Value arrays with different size were equal when they shouldn't be");
       
  1098   /* order should not matter */
       
  1099   fail_if (gst_value_compare (&value2, &value1) == GST_VALUE_EQUAL,
       
  1100       "Value arrays with different size were equal when they shouldn't be");
       
  1101 
       
  1102   g_value_unset (&value1);
       
  1103   g_value_unset (&value2);
       
  1104   g_value_unset (&tmp);
       
  1105   
       
  1106     std_log(LOG_FILENAME_LINE, "Test Successful");
       
  1107   create_xml(0);
       
  1108 }
       
  1109 
       
  1110 
       
  1111 void test_value_subtract_int()
       
  1112 {
       
  1113   GValue dest = { 0 };
       
  1114   GValue src1 = { 0 };
       
  1115   GValue src2 = { 0 };
       
  1116   const GValue *tmp;
       
  1117   gboolean ret;
       
  1118   
       
  1119     xmlfile = "test_value_subtract_int";
       
  1120   std_log(LOG_FILENAME_LINE, "Test Started test_range");
       
  1121 
       
  1122 
       
  1123   /*  int <-> int
       
  1124    */
       
  1125   g_value_init (&src1, G_TYPE_INT);
       
  1126   g_value_set_int (&src1, 10);
       
  1127   g_value_init (&src2, G_TYPE_INT);
       
  1128   g_value_set_int (&src2, 20);
       
  1129   /* subtract as in sets, result is 10 */
       
  1130   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1131   fail_unless (ret == TRUE);
       
  1132   fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
       
  1133   g_value_unset (&dest);
       
  1134 
       
  1135   /* same values, yields empty set */
       
  1136   ret = gst_value_subtract (&dest, &src1, &src1);
       
  1137   fail_unless (ret == FALSE);
       
  1138   g_value_unset (&src1);
       
  1139   g_value_unset (&src2);
       
  1140 
       
  1141   /*  int <-> int_range
       
  1142    */
       
  1143 
       
  1144   /* would yield an empty set */
       
  1145   g_value_init (&src1, G_TYPE_INT);
       
  1146   g_value_set_int (&src1, 10);
       
  1147   g_value_init (&src2, GST_TYPE_INT_RANGE);
       
  1148   gst_value_set_int_range (&src2, 0, 20);
       
  1149   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1150   fail_unless (ret == FALSE);
       
  1151 
       
  1152   /* and the other way around, should create a list of two ranges. */
       
  1153   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1154   fail_unless (ret == TRUE);
       
  1155   fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
       
  1156   tmp = gst_value_list_get_value (&dest, 0);
       
  1157   fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
       
  1158   fail_unless (gst_value_get_int_range_min (tmp) == 0);
       
  1159   fail_unless (gst_value_get_int_range_max (tmp) == 9);
       
  1160   tmp = gst_value_list_get_value (&dest, 1);
       
  1161   fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
       
  1162   fail_unless (gst_value_get_int_range_min (tmp) == 11);
       
  1163   fail_unless (gst_value_get_int_range_max (tmp) == 20);
       
  1164   g_value_unset (&dest);
       
  1165   g_value_unset (&src1);
       
  1166   g_value_unset (&src2);
       
  1167 
       
  1168   /* border case 1, empty set */
       
  1169   g_value_init (&src1, G_TYPE_INT);
       
  1170   g_value_set_int (&src1, 10);
       
  1171   g_value_init (&src2, GST_TYPE_INT_RANGE);
       
  1172   gst_value_set_int_range (&src2, 10, 20);
       
  1173   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1174   fail_unless (ret == FALSE);
       
  1175 
       
  1176   /* and the other way around, should create a new range. */
       
  1177   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1178   fail_unless (ret == TRUE);
       
  1179   fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
       
  1180   fail_unless (gst_value_get_int_range_min (&dest) == 11);
       
  1181   fail_unless (gst_value_get_int_range_max (&dest) == 20);
       
  1182   g_value_unset (&dest);
       
  1183   g_value_unset (&src1);
       
  1184   g_value_unset (&src2);
       
  1185 
       
  1186   /* border case 2, empty set */
       
  1187   g_value_init (&src1, G_TYPE_INT);
       
  1188   g_value_set_int (&src1, 20);
       
  1189   g_value_init (&src2, GST_TYPE_INT_RANGE);
       
  1190   gst_value_set_int_range (&src2, 10, 20);
       
  1191   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1192   fail_unless (ret == FALSE);
       
  1193 
       
  1194   /* and the other way around, should create a new range. */
       
  1195   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1196   fail_unless (ret == TRUE);
       
  1197   fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
       
  1198   fail_unless (gst_value_get_int_range_min (&dest) == 10);
       
  1199   fail_unless (gst_value_get_int_range_max (&dest) == 19);
       
  1200   g_value_unset (&dest);
       
  1201   g_value_unset (&src1);
       
  1202   g_value_unset (&src2);
       
  1203 
       
  1204   /* case 3, valid set */
       
  1205   g_value_init (&src1, G_TYPE_INT);
       
  1206   g_value_set_int (&src1, 0);
       
  1207   g_value_init (&src2, GST_TYPE_INT_RANGE);
       
  1208   gst_value_set_int_range (&src2, 10, 20);
       
  1209   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1210   fail_unless (ret == TRUE);
       
  1211   fail_unless (G_VALUE_HOLDS_INT (&dest) == TRUE);
       
  1212   fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
       
  1213   g_value_unset (&dest);
       
  1214 
       
  1215   /* and the other way around, should keep the range. */
       
  1216   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1217   fail_unless (ret == TRUE);
       
  1218   fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
       
  1219   fail_unless (gst_value_get_int_range_min (&dest) == 10);
       
  1220   fail_unless (gst_value_get_int_range_max (&dest) == 20);
       
  1221   g_value_unset (&dest);
       
  1222   g_value_unset (&src1);
       
  1223   g_value_unset (&src2);
       
  1224 
       
  1225   /*  int_range <-> int_range
       
  1226    */
       
  1227 
       
  1228   /* same range, empty set */
       
  1229   g_value_init (&src1, GST_TYPE_INT_RANGE);
       
  1230   gst_value_set_int_range (&src1, 10, 20);
       
  1231   g_value_init (&src2, GST_TYPE_INT_RANGE);
       
  1232   gst_value_set_int_range (&src2, 10, 20);
       
  1233   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1234   fail_unless (ret == FALSE);
       
  1235   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1236   fail_unless (ret == FALSE);
       
  1237   g_value_unset (&src1);
       
  1238   g_value_unset (&src2);
       
  1239 
       
  1240   /* non overlapping ranges */
       
  1241   g_value_init (&src1, GST_TYPE_INT_RANGE);
       
  1242   gst_value_set_int_range (&src1, 10, 20);
       
  1243   g_value_init (&src2, GST_TYPE_INT_RANGE);
       
  1244   gst_value_set_int_range (&src2, 30, 40);
       
  1245   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1246   fail_unless (ret == TRUE);
       
  1247   fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
       
  1248   fail_unless (gst_value_get_int_range_min (&dest) == 10);
       
  1249   fail_unless (gst_value_get_int_range_max (&dest) == 20);
       
  1250   g_value_unset (&dest);
       
  1251   /* the other way */
       
  1252   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1253   fail_unless (ret == TRUE);
       
  1254   fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
       
  1255   fail_unless (gst_value_get_int_range_min (&dest) == 30);
       
  1256   fail_unless (gst_value_get_int_range_max (&dest) == 40);
       
  1257   g_value_unset (&dest);
       
  1258   g_value_unset (&src1);
       
  1259   g_value_unset (&src2);
       
  1260 
       
  1261   /* completely overlapping ranges */
       
  1262   g_value_init (&src1, GST_TYPE_INT_RANGE);
       
  1263   gst_value_set_int_range (&src1, 10, 20);
       
  1264   g_value_init (&src2, GST_TYPE_INT_RANGE);
       
  1265   gst_value_set_int_range (&src2, 10, 30);
       
  1266   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1267   fail_unless (ret == FALSE);
       
  1268   /* the other way */
       
  1269   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1270   fail_unless (ret == TRUE);
       
  1271   fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
       
  1272   fail_unless (gst_value_get_int_range_min (&dest) == 21);
       
  1273   fail_unless (gst_value_get_int_range_max (&dest) == 30);
       
  1274   g_value_unset (&dest);
       
  1275   g_value_unset (&src1);
       
  1276   g_value_unset (&src2);
       
  1277 
       
  1278   /* partially overlapping ranges */
       
  1279   g_value_init (&src1, GST_TYPE_INT_RANGE);
       
  1280   gst_value_set_int_range (&src1, 10, 20);
       
  1281   g_value_init (&src2, GST_TYPE_INT_RANGE);
       
  1282   gst_value_set_int_range (&src2, 15, 30);
       
  1283   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1284   fail_unless (ret == TRUE);
       
  1285   fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
       
  1286   fail_unless (gst_value_get_int_range_min (&dest) == 10);
       
  1287   fail_unless (gst_value_get_int_range_max (&dest) == 14);
       
  1288   g_value_unset (&dest);
       
  1289   /* the other way */
       
  1290   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1291   fail_unless (ret == TRUE);
       
  1292   fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
       
  1293   fail_unless (gst_value_get_int_range_min (&dest) == 21);
       
  1294   fail_unless (gst_value_get_int_range_max (&dest) == 30);
       
  1295   g_value_unset (&dest);
       
  1296   g_value_unset (&src1);
       
  1297   g_value_unset (&src2);
       
  1298 
       
  1299   /* create a hole { int_range, int_range } */
       
  1300   g_value_init (&src1, GST_TYPE_INT_RANGE);
       
  1301   gst_value_set_int_range (&src1, 10, 30);
       
  1302   g_value_init (&src2, GST_TYPE_INT_RANGE);
       
  1303   gst_value_set_int_range (&src2, 15, 20);
       
  1304   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1305   fail_unless (ret == TRUE);
       
  1306   fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
       
  1307   tmp = gst_value_list_get_value (&dest, 0);
       
  1308   fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
       
  1309   fail_unless (gst_value_get_int_range_min (tmp) == 10);
       
  1310   fail_unless (gst_value_get_int_range_max (tmp) == 14);
       
  1311   tmp = gst_value_list_get_value (&dest, 1);
       
  1312   fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
       
  1313   fail_unless (gst_value_get_int_range_min (tmp) == 21);
       
  1314   fail_unless (gst_value_get_int_range_max (tmp) == 30);
       
  1315   g_value_unset (&dest);
       
  1316   /* the other way */
       
  1317   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1318   fail_unless (ret == FALSE);
       
  1319   g_value_unset (&src1);
       
  1320   g_value_unset (&src2);
       
  1321 
       
  1322   /* create a hole, { int, int } */
       
  1323   g_value_init (&src1, GST_TYPE_INT_RANGE);
       
  1324   gst_value_set_int_range (&src1, 10, 30);
       
  1325   g_value_init (&src2, GST_TYPE_INT_RANGE);
       
  1326   gst_value_set_int_range (&src2, 11, 29);
       
  1327   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1328   fail_unless (ret == TRUE);
       
  1329   fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
       
  1330   tmp = gst_value_list_get_value (&dest, 0);
       
  1331   fail_unless (G_VALUE_HOLDS_INT (tmp) == TRUE);
       
  1332   fail_unless (g_value_get_int (tmp) == 10);
       
  1333   tmp = gst_value_list_get_value (&dest, 1);
       
  1334   fail_unless (G_VALUE_HOLDS_INT (tmp) == TRUE);
       
  1335   fail_unless (g_value_get_int (tmp) == 30);
       
  1336   g_value_unset (&dest);
       
  1337   /* the other way */
       
  1338   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1339   fail_unless (ret == FALSE);
       
  1340   g_value_unset (&src1);
       
  1341   g_value_unset (&src2);
       
  1342 
       
  1343   /* create a hole, { int, int_range } */
       
  1344   g_value_init (&src1, GST_TYPE_INT_RANGE);
       
  1345   gst_value_set_int_range (&src1, 10, 30);
       
  1346   g_value_init (&src2, GST_TYPE_INT_RANGE);
       
  1347   gst_value_set_int_range (&src2, 11, 28);
       
  1348   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1349   fail_unless (ret == TRUE);
       
  1350   fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
       
  1351   tmp = gst_value_list_get_value (&dest, 0);
       
  1352   fail_unless (G_VALUE_HOLDS_INT (tmp) == TRUE);
       
  1353   fail_unless (g_value_get_int (tmp) == 10);
       
  1354   tmp = gst_value_list_get_value (&dest, 1);
       
  1355   fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
       
  1356   fail_unless (gst_value_get_int_range_min (tmp) == 29);
       
  1357   fail_unless (gst_value_get_int_range_max (tmp) == 30);
       
  1358   g_value_unset (&dest);
       
  1359   /* the other way */
       
  1360   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1361   fail_unless (ret == FALSE);
       
  1362   g_value_unset (&src1);
       
  1363   g_value_unset (&src2);
       
  1364 
       
  1365   /* create a hole, { int_range, int } */
       
  1366   g_value_init (&src1, GST_TYPE_INT_RANGE);
       
  1367   gst_value_set_int_range (&src1, 10, 30);
       
  1368   g_value_init (&src2, GST_TYPE_INT_RANGE);
       
  1369   gst_value_set_int_range (&src2, 12, 29);
       
  1370   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1371   fail_unless (ret == TRUE);
       
  1372   fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
       
  1373   tmp = gst_value_list_get_value (&dest, 0);
       
  1374   fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
       
  1375   fail_unless (gst_value_get_int_range_min (tmp) == 10);
       
  1376   fail_unless (gst_value_get_int_range_max (tmp) == 11);
       
  1377   tmp = gst_value_list_get_value (&dest, 1);
       
  1378   fail_unless (G_VALUE_HOLDS_INT (tmp) == TRUE);
       
  1379   fail_unless (g_value_get_int (tmp) == 30);
       
  1380   g_value_unset (&dest);
       
  1381   /* the other way */
       
  1382   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1383   fail_unless (ret == FALSE);
       
  1384   g_value_unset (&src1);
       
  1385   g_value_unset (&src2);
       
  1386   
       
  1387     std_log(LOG_FILENAME_LINE, "Test Successful");
       
  1388   create_xml(0);
       
  1389 }
       
  1390 
       
  1391 
       
  1392 
       
  1393 void test_value_subtract_double()
       
  1394 {
       
  1395   GValue dest = { 0 };
       
  1396   GValue src1 = { 0 };
       
  1397   GValue src2 = { 0 };
       
  1398   const GValue *tmp;
       
  1399   gboolean ret;
       
  1400   
       
  1401     xmlfile = "test_value_subtract_double";
       
  1402   std_log(LOG_FILENAME_LINE, "Test Started test_range");
       
  1403 
       
  1404 
       
  1405   /*  double <-> double
       
  1406    */
       
  1407   g_value_init (&src1, G_TYPE_DOUBLE);
       
  1408   g_value_set_double (&src1, 10.0);
       
  1409   g_value_init (&src2, G_TYPE_DOUBLE);
       
  1410   g_value_set_double (&src2, 20.0);
       
  1411   /* subtract as in sets, result is 10 */
       
  1412   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1413   fail_unless (ret == TRUE);
       
  1414   fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
       
  1415   g_value_unset (&dest);
       
  1416 
       
  1417   /* same values, yields empty set */
       
  1418   ret = gst_value_subtract (&dest, &src1, &src1);
       
  1419   fail_unless (ret == FALSE);
       
  1420   g_value_unset (&src1);
       
  1421   g_value_unset (&src2);
       
  1422 
       
  1423   /*  double <-> double_range
       
  1424    */
       
  1425 
       
  1426   /* would yield an empty set */
       
  1427   g_value_init (&src1, G_TYPE_DOUBLE);
       
  1428   g_value_set_double (&src1, 10.0);
       
  1429   g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
       
  1430   gst_value_set_double_range (&src2, 0.0, 20.0);
       
  1431   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1432   fail_unless (ret == FALSE);
       
  1433 
       
  1434   /* and the other way around, we cannot create open ranges
       
  1435    * so the result is the range again */
       
  1436   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1437   fail_unless (ret == TRUE);
       
  1438   fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
       
  1439   fail_unless (gst_value_get_double_range_min (&dest) == 0.0);
       
  1440   fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
       
  1441   g_value_unset (&dest);
       
  1442   g_value_unset (&src1);
       
  1443   g_value_unset (&src2);
       
  1444 
       
  1445   /* border case 1, empty set */
       
  1446   g_value_init (&src1, G_TYPE_DOUBLE);
       
  1447   g_value_set_double (&src1, 10.0);
       
  1448   g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
       
  1449   gst_value_set_double_range (&src2, 10.0, 20.0);
       
  1450   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1451   fail_unless (ret == FALSE);
       
  1452 
       
  1453   /* and the other way around, should keep same range as
       
  1454    * we don't have open ranges. */
       
  1455   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1456   fail_unless (ret == TRUE);
       
  1457   fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
       
  1458   fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
       
  1459   fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
       
  1460   g_value_unset (&dest);
       
  1461   g_value_unset (&src1);
       
  1462   g_value_unset (&src2);
       
  1463 
       
  1464   /* border case 2, empty set */
       
  1465   g_value_init (&src1, G_TYPE_DOUBLE);
       
  1466   g_value_set_double (&src1, 20.0);
       
  1467   g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
       
  1468   gst_value_set_double_range (&src2, 10.0, 20.0);
       
  1469   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1470   fail_unless (ret == FALSE);
       
  1471 
       
  1472   /* and the other way around, should keep same range as
       
  1473    * we don't have open ranges. */
       
  1474   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1475   fail_unless (ret == TRUE);
       
  1476   fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
       
  1477   fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
       
  1478   fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
       
  1479   g_value_unset (&dest);
       
  1480   g_value_unset (&src1);
       
  1481   g_value_unset (&src2);
       
  1482 
       
  1483   /* case 3, valid set */
       
  1484   g_value_init (&src1, G_TYPE_DOUBLE);
       
  1485   g_value_set_double (&src1, 0.0);
       
  1486   g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
       
  1487   gst_value_set_double_range (&src2, 10.0, 20.0);
       
  1488   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1489   fail_unless (ret == TRUE);
       
  1490   fail_unless (G_VALUE_HOLDS_DOUBLE (&dest) == TRUE);
       
  1491   fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
       
  1492   g_value_unset (&dest);
       
  1493 
       
  1494   /* and the other way around, should keep the range. */
       
  1495   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1496   fail_unless (ret == TRUE);
       
  1497   fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
       
  1498   fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
       
  1499   fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
       
  1500   g_value_unset (&dest);
       
  1501   g_value_unset (&src1);
       
  1502   g_value_unset (&src2);
       
  1503 
       
  1504   /*  double_range <-> double_range
       
  1505    */
       
  1506 
       
  1507   /* same range, empty set */
       
  1508   g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
       
  1509   gst_value_set_double_range (&src1, 10.0, 20.0);
       
  1510   g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
       
  1511   gst_value_set_double_range (&src2, 10.0, 20.0);
       
  1512   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1513   fail_unless (ret == FALSE);
       
  1514   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1515   fail_unless (ret == FALSE);
       
  1516   g_value_unset (&src1);
       
  1517   g_value_unset (&src2);
       
  1518 
       
  1519   /* non overlapping ranges */
       
  1520   g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
       
  1521   gst_value_set_double_range (&src1, 10.0, 20.0);
       
  1522   g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
       
  1523   gst_value_set_double_range (&src2, 30.0, 40.0);
       
  1524   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1525   fail_unless (ret == TRUE);
       
  1526   fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
       
  1527   fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
       
  1528   fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
       
  1529   g_value_unset (&dest);
       
  1530   /* the other way */
       
  1531   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1532   fail_unless (ret == TRUE);
       
  1533   fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
       
  1534   fail_unless (gst_value_get_double_range_min (&dest) == 30.0);
       
  1535   fail_unless (gst_value_get_double_range_max (&dest) == 40.0);
       
  1536   g_value_unset (&dest);
       
  1537   g_value_unset (&src1);
       
  1538   g_value_unset (&src2);
       
  1539 
       
  1540   /* completely overlapping ranges */
       
  1541   g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
       
  1542   gst_value_set_double_range (&src1, 10.0, 20.0);
       
  1543   g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
       
  1544   gst_value_set_double_range (&src2, 10.0, 30.0);
       
  1545   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1546   fail_unless (ret == FALSE);
       
  1547   /* the other way */
       
  1548   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1549   fail_unless (ret == TRUE);
       
  1550   fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
       
  1551   fail_unless (gst_value_get_double_range_min (&dest) == 20.0);
       
  1552   fail_unless (gst_value_get_double_range_max (&dest) == 30.0);
       
  1553   g_value_unset (&dest);
       
  1554   g_value_unset (&src1);
       
  1555   g_value_unset (&src2);
       
  1556 
       
  1557   /* partially overlapping ranges */
       
  1558   g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
       
  1559   gst_value_set_double_range (&src1, 10.0, 20.0);
       
  1560   g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
       
  1561   gst_value_set_double_range (&src2, 15.0, 30.0);
       
  1562   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1563   fail_unless (ret == TRUE);
       
  1564   fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
       
  1565   fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
       
  1566   fail_unless (gst_value_get_double_range_max (&dest) == 15.0);
       
  1567   g_value_unset (&dest);
       
  1568   /* the other way */
       
  1569   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1570   fail_unless (ret == TRUE);
       
  1571   fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
       
  1572   fail_unless (gst_value_get_double_range_min (&dest) == 20.0);
       
  1573   fail_unless (gst_value_get_double_range_max (&dest) == 30.0);
       
  1574   g_value_unset (&dest);
       
  1575   g_value_unset (&src1);
       
  1576   g_value_unset (&src2);
       
  1577 
       
  1578   /* create a hole { double_range, double_range } */
       
  1579   g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
       
  1580   gst_value_set_double_range (&src1, 10.0, 30.0);
       
  1581   g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
       
  1582   gst_value_set_double_range (&src2, 15.0, 20.0);
       
  1583   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1584   fail_unless (ret == TRUE);
       
  1585   fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
       
  1586   tmp = gst_value_list_get_value (&dest, 0);
       
  1587   fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (tmp) == TRUE);
       
  1588   fail_unless (gst_value_get_double_range_min (tmp) == 10.0);
       
  1589   fail_unless (gst_value_get_double_range_max (tmp) == 15.0);
       
  1590   tmp = gst_value_list_get_value (&dest, 1);
       
  1591   fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (tmp) == TRUE);
       
  1592   fail_unless (gst_value_get_double_range_min (tmp) == 20.0);
       
  1593   fail_unless (gst_value_get_double_range_max (tmp) == 30.0);
       
  1594   g_value_unset (&dest);
       
  1595   /* the other way */
       
  1596   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1597   fail_unless (ret == FALSE);
       
  1598   g_value_unset (&src1);
       
  1599   g_value_unset (&src2);
       
  1600   
       
  1601     std_log(LOG_FILENAME_LINE, "Test Successful");
       
  1602   create_xml(0);
       
  1603 }
       
  1604 
       
  1605 
       
  1606 /* Test set subtraction operations on fraction ranges */
       
  1607 void test_value_subtract_fraction_range()
       
  1608 {
       
  1609   GValue dest = { 0 };
       
  1610   GValue src1 = { 0 };
       
  1611   GValue src2 = { 0 };
       
  1612   GValue cmp = { 0 };
       
  1613   const GValue *tmp;
       
  1614   gboolean ret;
       
  1615   
       
  1616     xmlfile = "test_value_subtract_fraction_range";
       
  1617   std_log(LOG_FILENAME_LINE, "Test Started test_range");
       
  1618 
       
  1619 
       
  1620   /* Value for tests */
       
  1621   g_value_init (&cmp, GST_TYPE_FRACTION);
       
  1622 
       
  1623   /*  fraction <-> fraction
       
  1624    */
       
  1625   g_value_init (&src1, GST_TYPE_FRACTION);
       
  1626   gst_value_set_fraction (&src1, 10, 1);
       
  1627   g_value_init (&src2, GST_TYPE_FRACTION);
       
  1628   gst_value_set_fraction (&src2, 20, 1);
       
  1629   gst_value_set_fraction (&src1, 10, 1);
       
  1630 
       
  1631   /* subtract as in sets, result is 10 */
       
  1632   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1633   fail_unless (ret == TRUE);
       
  1634   fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
       
  1635   g_value_unset (&dest);
       
  1636 
       
  1637   /* same values, yields empty set */
       
  1638   ret = gst_value_subtract (&dest, &src1, &src1);
       
  1639   fail_unless (ret == FALSE);
       
  1640   g_value_unset (&src1);
       
  1641   g_value_unset (&src2);
       
  1642 
       
  1643   /*  fraction <-> fraction_range
       
  1644    */
       
  1645 
       
  1646   /* would yield an empty set */
       
  1647   g_value_init (&src1, GST_TYPE_FRACTION);
       
  1648   gst_value_set_fraction (&src1, 10, 1);
       
  1649   g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
       
  1650   gst_value_set_fraction_range_full (&src2, 0, 1, 20, 1);
       
  1651   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1652   fail_unless (ret == FALSE);
       
  1653 
       
  1654   /* and the other way around, we cannot create open ranges
       
  1655    * so the result is the range again */
       
  1656   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1657   fail_unless (ret == TRUE);
       
  1658   fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
       
  1659   gst_value_set_fraction (&cmp, 0, 1);
       
  1660   fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
       
  1661           &cmp) == GST_VALUE_EQUAL);
       
  1662   gst_value_set_fraction (&cmp, 20, 1);
       
  1663   fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
       
  1664           &cmp) == GST_VALUE_EQUAL);
       
  1665   g_value_unset (&dest);
       
  1666   g_value_unset (&src1);
       
  1667   g_value_unset (&src2);
       
  1668 
       
  1669   /* border case 1, empty set */
       
  1670   g_value_init (&src1, GST_TYPE_FRACTION);
       
  1671   gst_value_set_fraction (&src1, 10, 1);
       
  1672   g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
       
  1673   gst_value_set_fraction_range_full (&src2, 10, 1, 20, 1);
       
  1674   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1675   fail_unless (ret == FALSE);
       
  1676 
       
  1677   /* and the other way around, should keep same range as
       
  1678    * we don't have open ranges. */
       
  1679   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1680   fail_unless (ret == TRUE);
       
  1681   fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
       
  1682   gst_value_set_fraction (&cmp, 10, 1);
       
  1683   fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
       
  1684           &cmp) == GST_VALUE_EQUAL);
       
  1685   gst_value_set_fraction (&cmp, 20, 1);
       
  1686   fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
       
  1687           &cmp) == GST_VALUE_EQUAL);
       
  1688   g_value_unset (&dest);
       
  1689   g_value_unset (&src1);
       
  1690   g_value_unset (&src2);
       
  1691 
       
  1692   /* case 2, valid set */
       
  1693   g_value_init (&src1, GST_TYPE_FRACTION);
       
  1694   gst_value_set_fraction (&src1, 0, 1);
       
  1695   g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
       
  1696   gst_value_set_fraction_range_full (&src2, 10, 1, 20, 1);
       
  1697   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1698   fail_unless (ret == TRUE);
       
  1699   fail_unless (GST_VALUE_HOLDS_FRACTION (&dest) == TRUE);
       
  1700   fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
       
  1701   g_value_unset (&dest);
       
  1702 
       
  1703   /* and the other way around, should keep the range. */
       
  1704   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1705   fail_unless (ret == TRUE);
       
  1706   fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
       
  1707   fail_unless (gst_value_compare (&dest, &src2) == GST_VALUE_EQUAL);
       
  1708   g_value_unset (&dest);
       
  1709   g_value_unset (&src1);
       
  1710   g_value_unset (&src2);
       
  1711 
       
  1712   /*  fraction_range <-> fraction_range
       
  1713    */
       
  1714 
       
  1715   /* same range, empty set */
       
  1716   g_value_init (&src1, GST_TYPE_FRACTION_RANGE);
       
  1717   gst_value_set_fraction_range_full (&src1, 10, 2, 20, 2);
       
  1718   g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
       
  1719   gst_value_set_fraction_range_full (&src2, 10, 2, 20, 2);
       
  1720   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1721   fail_unless (ret == FALSE);
       
  1722   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1723   fail_unless (ret == FALSE);
       
  1724   g_value_unset (&src1);
       
  1725   g_value_unset (&src2);
       
  1726 
       
  1727   /* non overlapping ranges */
       
  1728   g_value_init (&src1, GST_TYPE_FRACTION_RANGE);
       
  1729   gst_value_set_fraction_range_full (&src1, 10, 2, 10, 1);
       
  1730   g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
       
  1731   gst_value_set_fraction_range_full (&src2, 30, 2, 40, 2);
       
  1732   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1733   fail_unless (ret == TRUE);
       
  1734   fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
       
  1735   gst_value_set_fraction (&cmp, 5, 1);
       
  1736   fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
       
  1737           &cmp) == GST_VALUE_EQUAL);
       
  1738   gst_value_set_fraction (&cmp, 10, 1);
       
  1739   fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
       
  1740           &cmp) == GST_VALUE_EQUAL);
       
  1741 
       
  1742   g_value_unset (&dest);
       
  1743   /* the other way */
       
  1744   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1745   fail_unless (ret == TRUE);
       
  1746   fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
       
  1747   gst_value_set_fraction (&cmp, 15, 1);
       
  1748   fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
       
  1749           &cmp) == GST_VALUE_EQUAL);
       
  1750   gst_value_set_fraction (&cmp, 20, 1);
       
  1751   fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
       
  1752           &cmp) == GST_VALUE_EQUAL);
       
  1753   g_value_unset (&dest);
       
  1754   g_value_unset (&src1);
       
  1755   g_value_unset (&src2);
       
  1756 
       
  1757   /* completely overlapping ranges */
       
  1758   g_value_init (&src1, GST_TYPE_FRACTION_RANGE);
       
  1759   gst_value_set_fraction_range_full (&src1, 10, 1, 20, 1);
       
  1760   g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
       
  1761   gst_value_set_fraction_range_full (&src2, 10, 1, 30, 1);
       
  1762   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1763   fail_unless (ret == FALSE);
       
  1764   /* the other way */
       
  1765   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1766   fail_unless (ret == TRUE);
       
  1767   fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
       
  1768   gst_value_set_fraction (&cmp, 20, 1);
       
  1769   fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
       
  1770           &cmp) == GST_VALUE_EQUAL);
       
  1771   gst_value_set_fraction (&cmp, 30, 1);
       
  1772   fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
       
  1773           &cmp) == GST_VALUE_EQUAL);
       
  1774   g_value_unset (&dest);
       
  1775   g_value_unset (&src1);
       
  1776   g_value_unset (&src2);
       
  1777 
       
  1778   /* partially overlapping ranges */
       
  1779   g_value_init (&src1, GST_TYPE_FRACTION_RANGE);
       
  1780   gst_value_set_fraction_range_full (&src1, 10, 1, 20, 1);
       
  1781   g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
       
  1782   gst_value_set_fraction_range_full (&src2, 15, 1, 30, 1);
       
  1783   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1784   fail_unless (ret == TRUE);
       
  1785   fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
       
  1786   gst_value_set_fraction (&cmp, 10, 1);
       
  1787   fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
       
  1788           &cmp) == GST_VALUE_EQUAL);
       
  1789   gst_value_set_fraction (&cmp, 15, 1);
       
  1790   fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
       
  1791           &cmp) == GST_VALUE_EQUAL);
       
  1792   g_value_unset (&dest);
       
  1793 
       
  1794   /* the other way */
       
  1795   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1796   fail_unless (ret == TRUE);
       
  1797   fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
       
  1798   gst_value_set_fraction (&cmp, 20, 1);
       
  1799   fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
       
  1800           &cmp) == GST_VALUE_EQUAL);
       
  1801   gst_value_set_fraction (&cmp, 30, 1);
       
  1802   fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
       
  1803           &cmp) == GST_VALUE_EQUAL);
       
  1804   g_value_unset (&dest);
       
  1805   g_value_unset (&src1);
       
  1806   g_value_unset (&src2);
       
  1807 
       
  1808   /* create a hole { double_range, double_range } */
       
  1809   g_value_init (&src1, GST_TYPE_FRACTION_RANGE);
       
  1810   gst_value_set_fraction_range_full (&src1, 10, 1, 30, 1);
       
  1811   g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
       
  1812   gst_value_set_fraction_range_full (&src2, 15, 1, 20, 1);
       
  1813   ret = gst_value_subtract (&dest, &src1, &src2);
       
  1814   fail_unless (ret == TRUE);
       
  1815   fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
       
  1816   /* 1st list entry */
       
  1817   tmp = gst_value_list_get_value (&dest, 0);
       
  1818   fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (tmp) == TRUE);
       
  1819   gst_value_set_fraction (&cmp, 10, 1);
       
  1820   fail_unless (gst_value_compare (gst_value_get_fraction_range_min (tmp),
       
  1821           &cmp) == GST_VALUE_EQUAL);
       
  1822   gst_value_set_fraction (&cmp, 15, 1);
       
  1823   fail_unless (gst_value_compare (gst_value_get_fraction_range_max (tmp),
       
  1824           &cmp) == GST_VALUE_EQUAL);
       
  1825   /* 2nd list entry */
       
  1826   tmp = gst_value_list_get_value (&dest, 1);
       
  1827   fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (tmp) == TRUE);
       
  1828   gst_value_set_fraction (&cmp, 20, 1);
       
  1829   fail_unless (gst_value_compare (gst_value_get_fraction_range_min (tmp),
       
  1830           &cmp) == GST_VALUE_EQUAL);
       
  1831   gst_value_set_fraction (&cmp, 30, 1);
       
  1832   fail_unless (gst_value_compare (gst_value_get_fraction_range_max (tmp),
       
  1833           &cmp) == GST_VALUE_EQUAL);
       
  1834   g_value_unset (&dest);
       
  1835   /* the other way */
       
  1836   ret = gst_value_subtract (&dest, &src2, &src1);
       
  1837   fail_unless (ret == FALSE);
       
  1838   g_value_unset (&src1);
       
  1839   g_value_unset (&src2);
       
  1840 
       
  1841   g_value_unset (&cmp);
       
  1842   
       
  1843     std_log(LOG_FILENAME_LINE, "Test Successful");
       
  1844   create_xml(0);
       
  1845 }
       
  1846 
       
  1847 
       
  1848 /*void main(int argc,char** argv)
       
  1849 {
       
  1850 
       
  1851    gst_init(&argc,&argv);
       
  1852    	
       
  1853    test_deserialize_buffer();
       
  1854    test_serialize_buffer();
       
  1855    test_deserialize_gint();
       
  1856    test_deserialize_gint_failures();
       
  1857    test_deserialize_guint();
       
  1858    test_deserialize_guint_failures();
       
  1859    test_deserialize_gint64();
       
  1860    test_deserialize_gstfraction();
       
  1861    test_serialize_flags();
       
  1862    test_deserialize_flags();
       
  1863    test_serialize_deserialize_format_enum();
       
  1864    test_string();
       
  1865    test_deserialize_string();
       
  1866    test_value_intersect();
       
  1867    test_date();
       
  1868    test_fraction_range();
       
  1869    test_value_subtract_fraction();   
       
  1870    test_value_compare();
       
  1871    test_value_subtract_int();
       
  1872    test_value_subtract_double();
       
  1873    test_value_subtract_fraction_range();  
       
  1874    
       
  1875   
       
  1876 }*/
       
  1877 
       
  1878 
       
  1879 void (*fn[21]) (void) = {       
       
  1880         test_deserialize_buffer,
       
  1881    			test_serialize_buffer,
       
  1882    			test_deserialize_gint,
       
  1883    			test_deserialize_gint_failures,
       
  1884    			test_deserialize_guint,
       
  1885    			test_deserialize_guint_failures,
       
  1886    			test_deserialize_gint64,
       
  1887    			test_deserialize_gstfraction,
       
  1888    			test_serialize_flags,
       
  1889    			test_deserialize_flags,
       
  1890    			test_serialize_deserialize_format_enum,
       
  1891    			test_string,
       
  1892    			test_deserialize_string,
       
  1893    			test_value_intersect,
       
  1894    			test_date,
       
  1895    			test_fraction_range,
       
  1896    			test_value_subtract_fraction,  
       
  1897    			test_value_compare,
       
  1898    			test_value_subtract_int,
       
  1899    			test_value_subtract_double,
       
  1900    			test_value_subtract_fraction_range
       
  1901 };
       
  1902 
       
  1903 char *args[] = {
       
  1904         "test_deserialize_buffer",
       
  1905         "test_serialize_buffer",
       
  1906         "test_deserialize_gint",
       
  1907         "test_deserialize_gint_failures",
       
  1908         "test_deserialize_guint",
       
  1909         "test_deserialize_guint_failures",
       
  1910         "test_deserialize_gint64",
       
  1911         "test_deserialize_gstfraction",
       
  1912         "test_serialize_flags",
       
  1913         "test_deserialize_flags",
       
  1914         "test_serialize_deserialize_format_enum",
       
  1915         "test_string",
       
  1916         "test_deserialize_string",
       
  1917         "test_value_intersect",
       
  1918         "test_date",
       
  1919         "test_fraction_range",
       
  1920         "test_value_subtract_fraction",
       
  1921         "test_value_compare",
       
  1922         "test_value_subtract_int",
       
  1923         "test_value_subtract_double",
       
  1924         "test_value_subtract_fraction_range"
       
  1925 };
       
  1926 
       
  1927 
       
  1928 GST_CHECK_MAIN (gst_value);