/* GStreamer
 *
 * unit tests for the navigation interface library
 *
 * Copyright (C) 2009 Jan Schmidt <thaytan@noraisin.net>
 *
 * 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.
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <gst/check/gstcheck.h>

#include <gst/video/navigation.h>

#include <string.h>

#define TEST_ELEMENT_TYPE (test_element_get_type())

typedef struct TestElement TestElement;
typedef struct TestElementClass TestElementClass;

struct TestElement
{
  GstElement parent;

  GstNavigationEventType sent_type;
  const gchar *sent_key;
  gdouble sent_x, sent_y;
  gint sent_button;
  GstNavigationCommand sent_command;
};

struct TestElementClass
{
  GstElementClass parent_class;
};

GType test_element_get_type (void);

static void init_interface (GType type);
static void nav_send_event (GstNavigation * navigation,
    GstStructure * structure);

G_DEFINE_TYPE_WITH_CODE (TestElement, test_element, GST_TYPE_ELEMENT,
    init_interface (g_define_type_id));

static void
test_element_navigation_interface_init (GstNavigationInterface * iface)
{
  iface->send_event = nav_send_event;
}

static void
init_interface (GType type)
{
  static const GInterfaceInfo navigation_iface_info = {
    (GInterfaceInitFunc) test_element_navigation_interface_init,
    NULL,
    NULL,
  };

  g_type_add_interface_static (type, GST_TYPE_NAVIGATION,
      &navigation_iface_info);
}

static void
test_element_class_init (TestElementClass * klass)
{
}

static void
test_element_init (TestElement * this)
{
}

static void
nav_send_event (GstNavigation * navigation, GstStructure * structure)
{
  GstEvent *event = gst_event_new_navigation (structure);
  GstNavigationEventType etype = gst_navigation_event_get_type (event);
  TestElement *self = (TestElement *) (navigation);

  fail_if (etype == GST_NAVIGATION_EVENT_INVALID,
      "Received navigation event could not be parsed");
  fail_unless (etype == self->sent_type,
      "Received navigation event did not match sent");

  switch (etype) {
    case GST_NAVIGATION_EVENT_KEY_PRESS:
    case GST_NAVIGATION_EVENT_KEY_RELEASE:{
      const gchar *key;
      fail_unless (gst_navigation_event_parse_key_event (event, &key));
      fail_unless (strcmp (key, self->sent_key) == 0);
      break;
    }
    case GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS:
    case GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE:{
      gint button;
      gdouble x, y;
      fail_unless (gst_navigation_event_parse_mouse_button_event (event,
              &button, &x, &y));
      fail_unless (button == self->sent_button);
      fail_unless (x == self->sent_x);
      fail_unless (y == self->sent_y);
      break;
    }
    case GST_NAVIGATION_EVENT_MOUSE_MOVE:{
      gdouble x, y;
      fail_unless (gst_navigation_event_parse_mouse_move_event (event, &x, &y));
      fail_unless (x == self->sent_x);
      fail_unless (y == self->sent_y);
      break;
    }
    case GST_NAVIGATION_EVENT_COMMAND:{
      GstNavigationCommand cmd;
      fail_unless (gst_navigation_event_parse_command (event, &cmd));
      fail_unless (cmd == self->sent_command);
    }
    default:
      break;
  }

  gst_event_unref (event);
}

GST_START_TEST (test_events)
{
  /* Create an empty GstElement that has a GstNavigation interface and then
   * send some navigation events and validate them */
  TestElement *test_element =
      (TestElement *) g_object_new (TEST_ELEMENT_TYPE, NULL);
  GstNavigationCommand cmds[] = {
    GST_NAVIGATION_COMMAND_MENU1, GST_NAVIGATION_COMMAND_MENU2,
    GST_NAVIGATION_COMMAND_MENU3, GST_NAVIGATION_COMMAND_MENU4,
    GST_NAVIGATION_COMMAND_MENU5, GST_NAVIGATION_COMMAND_MENU6,
    GST_NAVIGATION_COMMAND_MENU7, GST_NAVIGATION_COMMAND_LEFT,
    GST_NAVIGATION_COMMAND_RIGHT, GST_NAVIGATION_COMMAND_UP,
    GST_NAVIGATION_COMMAND_DOWN, GST_NAVIGATION_COMMAND_ACTIVATE,
    GST_NAVIGATION_COMMAND_PREV_ANGLE, GST_NAVIGATION_COMMAND_NEXT_ANGLE
  };
  gint i;

  test_element->sent_type = GST_NAVIGATION_EVENT_KEY_PRESS;
  test_element->sent_key = "1";
  gst_navigation_send_key_event (GST_NAVIGATION (test_element), "key-press",
      "1");

  test_element->sent_type = GST_NAVIGATION_EVENT_KEY_RELEASE;
  test_element->sent_key = "2";
  gst_navigation_send_key_event (GST_NAVIGATION (test_element), "key-release",
      "2");

  test_element->sent_type = GST_NAVIGATION_EVENT_MOUSE_MOVE;
  test_element->sent_x = 50;
  test_element->sent_y = 100;
  gst_navigation_send_mouse_event (GST_NAVIGATION (test_element), "mouse-move",
      0, 50, 100);

  test_element->sent_type = GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS;
  test_element->sent_x = 10;
  test_element->sent_y = 20;
  test_element->sent_button = 1;
  gst_navigation_send_mouse_event (GST_NAVIGATION (test_element),
      "mouse-button-press", 1, 10, 20);

  for (i = 0; i < G_N_ELEMENTS (cmds); i++) {
    test_element->sent_type = GST_NAVIGATION_EVENT_COMMAND;
    test_element->sent_command = cmds[i];
    gst_navigation_send_command (GST_NAVIGATION (test_element), cmds[i]);
  }

  gst_object_unref (test_element);
}

GST_END_TEST;

GST_START_TEST (test_messages)
{
  GstMessage *m;
  /* GST_NAVIGATION_MESSAGE_MOUSE_OVER */
  {
    gboolean active;
    m = gst_navigation_message_new_mouse_over (NULL, TRUE);
    fail_if (m == NULL);
    fail_unless (gst_navigation_message_get_type (m) ==
        GST_NAVIGATION_MESSAGE_MOUSE_OVER);
    fail_unless (GST_MESSAGE_SRC (m) == NULL);
    fail_unless (gst_navigation_message_parse_mouse_over (m, &active));
    fail_unless (active == TRUE);
    gst_message_unref (m);

    m = gst_navigation_message_new_mouse_over (NULL, FALSE);
    fail_if (m == NULL);
    fail_unless (GST_MESSAGE_SRC (m) == NULL);
    fail_unless (gst_navigation_message_get_type (m) ==
        GST_NAVIGATION_MESSAGE_MOUSE_OVER);
    fail_unless (gst_navigation_message_parse_mouse_over (m, &active));
    fail_unless (active == FALSE);
    gst_message_unref (m);
  }

  /* GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED */
  {
    m = gst_navigation_message_new_commands_changed (NULL);
    fail_if (m == NULL);
    fail_unless (GST_MESSAGE_SRC (m) == NULL);
    fail_unless (gst_navigation_message_get_type (m) ==
        GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED);
    gst_message_unref (m);
  }

  /* GST_NAVIGATION_MESSAGE_ANGLES_CHANGED */
  {
    guint angle, angles;
    m = gst_navigation_message_new_angles_changed (NULL, 1, 5);
    fail_if (m == NULL);
    fail_unless (GST_MESSAGE_SRC (m) == NULL);
    fail_unless (gst_navigation_message_get_type (m) ==
        GST_NAVIGATION_MESSAGE_ANGLES_CHANGED);
    fail_unless (gst_navigation_message_parse_angles_changed (m, &angle,
            &angles));
    fail_unless (angle == 1);
    fail_unless (angles == 5);
    gst_message_unref (m);
  }
}

GST_END_TEST;

GST_START_TEST (test_queries)
{
  GstQuery *q;

  /* GST_NAVIGATION_QUERY_COMMANDS */
  {
    guint n;
    GstNavigationCommand cmd;

    q = gst_navigation_query_new_commands ();
    fail_unless (q != NULL);
    fail_unless (gst_navigation_query_get_type (q) ==
        GST_NAVIGATION_QUERY_COMMANDS);
    gst_navigation_query_set_commands (q, 3, GST_NAVIGATION_COMMAND_LEFT,
        GST_NAVIGATION_COMMAND_MENU1, GST_NAVIGATION_COMMAND_MENU5);
    fail_unless (gst_navigation_query_parse_commands_length (q, &n));
    fail_unless (n == 3);
    fail_unless (gst_navigation_query_parse_commands_nth (q, 1, &cmd));
    fail_unless (cmd == GST_NAVIGATION_COMMAND_MENU1);

    fail_unless (gst_navigation_query_parse_commands_length (q, NULL));
    fail_unless (gst_navigation_query_parse_commands_nth (q, 2, NULL));

    gst_query_unref (q);
  }

  /* GST_NAVIGATION_QUERY_ANGLES */
  {
    guint angle, angles;
    q = gst_navigation_query_new_angles ();
    fail_unless (q != NULL);
    fail_unless (gst_navigation_query_get_type (q) ==
        GST_NAVIGATION_QUERY_ANGLES);
    gst_navigation_query_set_angles (q, 4, 8);
    fail_unless (gst_navigation_query_parse_angles (q, &angle, &angles));
    fail_unless (angle == 4);
    fail_unless (angles == 8);

    fail_unless (gst_navigation_query_parse_angles (q, NULL, &angles));
    fail_unless (gst_navigation_query_parse_angles (q, &angle, NULL));
    fail_unless (gst_navigation_query_parse_angles (q, NULL, NULL));

    gst_query_unref (q);
  }

}

GST_END_TEST;

static Suite *
navigation_suite (void)
{
  Suite *s = suite_create ("navigation interface");
  TCase *tc_chain = tcase_create ("notifications");

  suite_add_tcase (s, tc_chain);
  tcase_add_test (tc_chain, test_events);
  tcase_add_test (tc_chain, test_messages);
  tcase_add_test (tc_chain, test_queries);

  return s;
}

GST_CHECK_MAIN (navigation);
