/* GStreamer
 * Copyright (C) 2013 Collabora Ltd.
 *   Author: Sebastian Dröge <sebastian.droege@collabora.co.uk>
 *
 * gstcapsfeatures.c: Unit test for GstCapsFeatures
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#include <gst/check/gstcheck.h>
#include <gst/gstcapsfeatures.h>

GST_START_TEST (test_basic_operations)
{
  GstCapsFeatures *a, *b;

  a = gst_caps_features_new ("m:abc", "m:def", "m:ghi", NULL);
  fail_unless (a != NULL);
  b = gst_caps_features_copy (a);
  fail_unless (b != NULL);
  fail_unless (gst_caps_features_is_equal (a, b));
  fail_if (gst_caps_features_is_equal (a,
          GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY));
  fail_unless_equals_int (gst_caps_features_get_size (a), 3);
  fail_unless_equals_string (gst_caps_features_get_nth (a, 1), "m:def");
  gst_caps_features_add (b, "m:jkl");
  fail_if (gst_caps_features_is_equal (a, b));
  fail_unless_equals_int (gst_caps_features_get_size (b), 4);
  fail_unless_equals_string (gst_caps_features_get_nth (b, 3), "m:jkl");
  gst_caps_features_add (b, "m:jkl");
  fail_unless_equals_int (gst_caps_features_get_size (b), 4);

  gst_caps_features_remove (b, "m:jkl");
  fail_unless (gst_caps_features_is_equal (a, b));
  gst_caps_features_remove (b, "m:abc");
  gst_caps_features_add (b, "m:abc");
  fail_unless (gst_caps_features_is_equal (a, b));
  gst_caps_features_remove (b, "m:abc");
  gst_caps_features_remove (b, "m:def");
  gst_caps_features_remove (b, "m:ghi");
  fail_unless (gst_caps_features_is_equal (b,
          GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY));
  gst_caps_features_add (b, GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY);

  gst_caps_features_free (a);
  gst_caps_features_free (b);
}

GST_END_TEST;

GST_START_TEST (test_from_to_string)
{
  GstCapsFeatures *a, *b;
  gchar *str;

  a = gst_caps_features_new ("m:abc", "m:def", "m:ghi", NULL);
  fail_unless (a != NULL);
  str = gst_caps_features_to_string (a);
  fail_unless (str != NULL);
  fail_unless_equals_string (str, "m:abc, m:def, m:ghi");
  b = gst_caps_features_from_string (str);
  fail_unless (b != NULL);
  fail_unless (gst_caps_features_is_equal (a, b));
  gst_caps_features_free (a);
  gst_caps_features_free (b);
  g_free (str);

  a = gst_caps_features_new_any ();
  fail_unless (a != NULL);
  fail_unless (gst_caps_features_is_any (a));
  str = gst_caps_features_to_string (a);
  fail_unless (str != NULL);
  fail_unless_equals_string (str, "ANY");
  b = gst_caps_features_from_string (str);
  fail_unless (b != NULL);
  fail_unless (gst_caps_features_is_equal (a, b));
  fail_unless (gst_caps_features_is_any (b));
  gst_caps_features_free (a);
  gst_caps_features_free (b);
  g_free (str);
}

GST_END_TEST;

static Suite *
gst_capsfeatures_suite (void)
{
  Suite *s = suite_create ("GstCapsFeatures");
  TCase *tc_chain = tcase_create ("operations");

  suite_add_tcase (s, tc_chain);
  tcase_add_test (tc_chain, test_basic_operations);
  tcase_add_test (tc_chain, test_from_to_string);

  return s;
}

GST_CHECK_MAIN (gst_capsfeatures);
