summaryrefslogtreecommitdiff
path: root/tests/invoke/genericmarshaller.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/invoke/genericmarshaller.c')
-rw-r--r--tests/invoke/genericmarshaller.c204
1 files changed, 204 insertions, 0 deletions
diff --git a/tests/invoke/genericmarshaller.c b/tests/invoke/genericmarshaller.c
new file mode 100644
index 00000000..9ee0c204
--- /dev/null
+++ b/tests/invoke/genericmarshaller.c
@@ -0,0 +1,204 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * testmarshallergeneric.c: Generic CClosure marshaller
+ * Copyright (C) 2007 Johan Dahlin
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+#include <glib-object.h>
+#include "girepository.h"
+
+typedef struct {
+ GObject parent;
+} TestObject;
+
+typedef struct {
+ GObjectClass parent_class;
+ void (* test1) (TestObject *object);
+ void (* test2) (TestObject *object, char *str);
+ int (* test3) (TestObject *object, int i);
+ void (* test4) (TestObject *object,
+ gboolean b, long l, float f, double d,
+ guint uint, gulong ulong);
+} TestObjectClass;
+
+#define TEST_TYPE_OBJECT (test_object_get_type())
+#define TEST_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_OBJECT, TestObject))
+#define TEST_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TEST_TYPE_OBJECT, TestObjectClass))
+#define TEST_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_OBJECT))
+#define TEST_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TEST_TYPE_OBJECT))
+#define TEST_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), TEST_TYPE_OBJECT, TestObjectClass))
+
+GType test_object_get_type (void);
+
+enum {
+ TEST1,
+ TEST2,
+ TEST3,
+ TEST4,
+ LAST_SIGNAL
+};
+
+static guint object_signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE (TestObject, test_object, G_TYPE_OBJECT);
+
+static void test_object_init (TestObject *self)
+{
+}
+
+static void test_object_class_init (TestObjectClass *klass)
+{
+ GObjectClass *gobject_class = (GObjectClass*) klass;
+
+ object_signals[TEST1] =
+ g_signal_new ("test1",
+ G_TYPE_FROM_CLASS (gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (TestObjectClass, test1),
+ NULL, NULL,
+ gi_cclosure_marshal_generic,
+ G_TYPE_NONE, 0);
+ object_signals[TEST2] =
+ g_signal_new ("test2",
+ G_TYPE_FROM_CLASS (gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (TestObjectClass, test2),
+ NULL, NULL,
+ gi_cclosure_marshal_generic,
+ G_TYPE_NONE, 1,
+ G_TYPE_STRING);
+ object_signals[TEST3] =
+ g_signal_new ("test3",
+ G_TYPE_FROM_CLASS (gobject_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (TestObjectClass, test3),
+ NULL, NULL,
+ gi_cclosure_marshal_generic,
+ G_TYPE_INT, 1,
+ G_TYPE_DOUBLE);
+ object_signals[TEST4] =
+ g_signal_new ("test4",
+ G_TYPE_FROM_CLASS (gobject_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (TestObjectClass, test3),
+ NULL, NULL,
+ gi_cclosure_marshal_generic,
+ G_TYPE_NONE, 6,
+ G_TYPE_BOOLEAN,
+ G_TYPE_LONG,
+ G_TYPE_FLOAT,
+ G_TYPE_DOUBLE,
+ G_TYPE_UINT,
+ G_TYPE_ULONG);
+}
+
+static void
+test1_callback (TestObject *object, char *data)
+{
+ g_return_if_fail (TEST_IS_OBJECT (object));
+ g_return_if_fail (!strcmp (data, "user-data"));
+}
+
+static void
+test1_callback_swapped (char *data, TestObject *object)
+{
+ g_return_if_fail (TEST_IS_OBJECT (object));
+ g_return_if_fail (!strcmp (data, "user-data"));
+}
+
+static void
+test2_callback (TestObject *object, char *string)
+{
+ g_return_if_fail (TEST_IS_OBJECT (object));
+ g_return_if_fail (!strcmp (string, "string"));
+}
+
+static int
+test3_callback (TestObject *object, double f)
+{
+ g_return_val_if_fail (TEST_IS_OBJECT (object), -1);
+ g_return_val_if_fail (f == 42.0, -1);
+
+ return 20;
+}
+
+static void
+test4_callback (TestObject *object,
+ gboolean b, long l, float f, double d, guint uint, gulong ulong,
+ gpointer user_data)
+{
+ g_return_if_fail (b == TRUE);
+ g_return_if_fail (l == 10L);
+ g_return_if_fail (f <= 3.14001 && f >= 3.13999);
+ g_return_if_fail (d == 1.78);
+ g_return_if_fail (uint == 20);
+ g_return_if_fail (ulong == 30L);
+}
+
+void
+test_cclosure_marshal (void)
+{
+ TestObject *object;
+ gchar *data = "user-data";
+ int i;
+
+ g_printerr ("running genericmarshaller tests\n");
+
+ g_type_init ();
+
+ object = g_object_new (TEST_TYPE_OBJECT, NULL);
+ g_signal_connect (G_OBJECT (object),
+ "test1",
+ G_CALLBACK (test1_callback),
+ data);
+ g_signal_connect_swapped (G_OBJECT (object),
+ "test1",
+ G_CALLBACK (test1_callback_swapped),
+ data);
+ g_signal_connect (G_OBJECT (object),
+ "test2",
+ G_CALLBACK (test2_callback),
+ NULL);
+ g_signal_connect (G_OBJECT (object),
+ "test3",
+ G_CALLBACK (test3_callback),
+ NULL);
+ g_signal_connect (G_OBJECT (object),
+ "test4",
+ G_CALLBACK (test4_callback),
+ NULL);
+
+ g_signal_emit (G_OBJECT (object), object_signals[TEST1], 0);
+ g_signal_emit (G_OBJECT (object), object_signals[TEST2], 0, "string");
+ g_signal_emit (G_OBJECT (object), object_signals[TEST3], 0, 42.0, &i);
+ g_signal_emit (G_OBJECT (object), object_signals[TEST4], 0,
+ TRUE, 10L, 3.14, 1.78, 20, 30L);
+ g_assert (i == 20);
+
+ g_object_unref (object);
+
+ g_printerr ("genericmarshaller succeeded\n");
+}
+
+int main(void)
+{
+ test_cclosure_marshal ();
+
+ return 0;
+}
+