sl@0: /* GObject - GLib Type, Object, Parameter and Signal Library sl@0: * Copyright (C) 2001, 2003 Red Hat, Inc. sl@0: * sl@0: * This library is free software; you can redistribute it and/or sl@0: * modify it under the terms of the GNU Lesser General Public sl@0: * License as published by the Free Software Foundation; either sl@0: * version 2 of the License, or (at your option) any later version. sl@0: * sl@0: * This library is distributed in the hope that it will be useful, sl@0: * but WITHOUT ANY WARRANTY; without even the implied warranty of sl@0: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU sl@0: * Lesser General Public License for more details. sl@0: * sl@0: * You should have received a copy of the GNU Lesser General sl@0: * Public License along with this library; if not, write to the sl@0: * Free Software Foundation, Inc., 59 Temple Place, Suite 330, sl@0: * Boston, MA 02111-1307, USA. sl@0: */ sl@0: sl@0: #undef G_DISABLE_ASSERT sl@0: #undef G_LOG_DOMAIN sl@0: sl@0: #undef G_DISABLE_ASSERT sl@0: #undef G_DISABLE_CHECKS sl@0: #undef G_DISABLE_CAST_CHECKS sl@0: sl@0: #include sl@0: sl@0: #include sl@0: sl@0: #include "testcommon.h" sl@0: sl@0: #ifdef SYMBIAN sl@0: #include "mrt2_glib2_test.h" sl@0: #endif /*SYMBIAN*/ sl@0: sl@0: sl@0: /* Tests for all cclosure_marshal APIs */ sl@0: sl@0: /* sl@0: * TestObject, a parent class for TestObject sl@0: */ sl@0: #define TEST_TYPE_OBJECT (test_object_get_type ()) sl@0: typedef struct _TestObject TestObject; sl@0: typedef struct _TestObjectClass TestObjectClass; sl@0: sl@0: typedef struct sl@0: { sl@0: int a; sl@0: char c; sl@0: sl@0: }TestInputClass; sl@0: sl@0: struct _TestObject sl@0: { sl@0: GObject parent_instance; sl@0: }; sl@0: sl@0: struct _TestObjectClass sl@0: { sl@0: GObjectClass parent_class; sl@0: sl@0: void (*test_signal1) (TestObject *tobject, sl@0: gint param); sl@0: sl@0: //flags as parameter == ulong sl@0: gboolean (*test_signal2) (TestObject *tobject, sl@0: gulong param); sl@0: sl@0: void (*test_signal3) (TestObject *tobject, sl@0: gpointer param); sl@0: sl@0: void (*test_signal4) (TestObject *tobject, sl@0: gchar param); sl@0: sl@0: void (*test_signal5) (TestObject *tobject, sl@0: gdouble param); sl@0: sl@0: //enum == long sl@0: void (*test_signal6) (TestObject *tobject, sl@0: glong param); sl@0: sl@0: void (*test_signal7) (TestObject *tobject, sl@0: gulong param); sl@0: sl@0: void (*test_signal8) (TestObject *tobject, sl@0: gfloat param); sl@0: sl@0: void (*test_signal9) (TestObject *tobject, sl@0: glong param); sl@0: sl@0: //object sl@0: void (*test_signal10) (TestObject *tobject, sl@0: GObject *param); sl@0: sl@0: //pointer sl@0: void (*test_signal11) (TestObject *tobject, sl@0: gpointer param); sl@0: sl@0: void (*test_signal12) (TestObject *tobject, sl@0: gchar* param); sl@0: sl@0: void (*test_signal13) (TestObject *tobject, sl@0: guchar param); sl@0: sl@0: void (*test_signal14) (TestObject *tobject, sl@0: guint param); sl@0: sl@0: void (*test_signal15) (TestObject *tobject, sl@0: gulong param); sl@0: sl@0: void (*test_signal16) (TestObject *tobject, sl@0: guint param1, sl@0: gpointer param2); sl@0: sl@0: void (*test_signal17) (TestObject *tobject, sl@0: GParamSpec *param); sl@0: }; sl@0: sl@0: static GType test_object_get_type (void); sl@0: sl@0: /* Test input for Enums */ sl@0: enum sl@0: { sl@0: TEST_ENUM1, sl@0: TEST_ENUM2 sl@0: }; sl@0: sl@0: //VOID__BOOLEAN sl@0: void sl@0: test_object_real_signal1 (TestObject *tobject, sl@0: gint param) sl@0: { sl@0: g_assert(((gint)param == 10)); sl@0: } sl@0: sl@0: //BOOLEAN__FLAGS sl@0: gboolean sl@0: test_object_signal2_callback_before (TestObject *tobject, sl@0: gulong param) sl@0: { sl@0: switch (param) sl@0: { sl@0: case 1: return TRUE; sl@0: case 2: return FALSE; sl@0: case 3: return FALSE; sl@0: case 4: return FALSE; sl@0: } sl@0: sl@0: g_assert_not_reached (); sl@0: return FALSE; sl@0: } sl@0: sl@0: gboolean sl@0: test_object_real_signal2 (TestObject *tobject, sl@0: gulong param) sl@0: { sl@0: switch (param) sl@0: { sl@0: case 1: g_assert_not_reached (); return FALSE; sl@0: case 2: return TRUE; sl@0: case 3: return FALSE; sl@0: case 4: return FALSE; sl@0: } sl@0: sl@0: g_assert_not_reached (); sl@0: return FALSE; sl@0: } sl@0: sl@0: gboolean sl@0: test_object_signal2_callback_after (TestObject *tobject, sl@0: gulong param) sl@0: { sl@0: switch (param) sl@0: { sl@0: case 1: g_assert_not_reached (); return FALSE; sl@0: case 2: g_assert_not_reached (); return FALSE; sl@0: case 3: return TRUE; sl@0: case 4: return FALSE; sl@0: } sl@0: sl@0: g_assert_not_reached (); sl@0: return FALSE; sl@0: } sl@0: sl@0: //VOID__BOXED sl@0: void sl@0: test_object_real_signal3 (TestObject *tobject, sl@0: gpointer param) sl@0: { sl@0: g_assert((strcmp(param, "test-string") == 0)); sl@0: } sl@0: sl@0: //VOID__CHAR sl@0: void sl@0: test_object_real_signal4 (TestObject *tobject, sl@0: gchar param) sl@0: { sl@0: g_assert(((gchar)param == 'A')); sl@0: } sl@0: sl@0: //VOID__DOUBLE sl@0: void sl@0: test_object_real_signal5 (TestObject *tobject, sl@0: gdouble param) sl@0: { sl@0: g_assert(((gdouble)param == 2500000)); sl@0: } sl@0: sl@0: //VOID__ENUM sl@0: void sl@0: test_object_real_signal6 (TestObject *tobject, sl@0: glong param) sl@0: { sl@0: g_assert(((glong)param == TEST_ENUM2)); sl@0: } sl@0: sl@0: //VOID__FLAGS sl@0: void sl@0: test_object_real_signal7 (TestObject *tobject, sl@0: gulong param) sl@0: { sl@0: g_assert(((gulong)param == 1980l)); sl@0: } sl@0: sl@0: //VOID__FLOAT sl@0: void sl@0: test_object_real_signal8 (TestObject *tobject, sl@0: gfloat param) sl@0: { sl@0: g_assert(((gfloat)param == 11.23f)); sl@0: } sl@0: sl@0: //VOID__LONG sl@0: void sl@0: test_object_real_signal9 (TestObject *tobject, sl@0: glong param) sl@0: { sl@0: g_assert(((glong)param == -748l)); sl@0: } sl@0: sl@0: //VOID__OBJECT sl@0: void sl@0: test_object_real_signal10 (TestObject *tobject, sl@0: GObject *param) sl@0: { sl@0: g_assert(G_IS_OBJECT(param) == TRUE); sl@0: } sl@0: sl@0: //VOID__STRING sl@0: void sl@0: test_object_real_signal12 (TestObject *tobject, sl@0: gchar* param) sl@0: { sl@0: g_assert((strcmp(param, "string_input") == 0)); sl@0: } sl@0: sl@0: //VOID__UCHAR sl@0: void sl@0: test_object_real_signal13 (TestObject *tobject, sl@0: guchar param) sl@0: { sl@0: g_assert(param == '>'); sl@0: } sl@0: sl@0: sl@0: //VOID__UINT sl@0: void sl@0: test_object_real_signal14 (TestObject *tobject, sl@0: guint param) sl@0: { sl@0: g_assert(param == 10000); sl@0: } sl@0: sl@0: //VOID__UINT_POINTER sl@0: void sl@0: test_object_real_signal16 (TestObject *tobject, sl@0: guint param1, sl@0: gpointer param2) sl@0: { sl@0: g_assert((param1 == 10000) && (strcmp(param2, "test-string") == 0)); sl@0: } sl@0: sl@0: //VOID__PARAM sl@0: void sl@0: test_object_real_signal17 (TestObject *tobject, sl@0: GParamSpec *param) sl@0: { sl@0: g_assert(G_IS_PARAM_SPEC(param) == TRUE); sl@0: g_assert(!strcmp(param->_nick , "Hello")); sl@0: g_assert (!strcmp(param->name , "String1")); sl@0: } sl@0: sl@0: //Class init function sl@0: static void sl@0: test_object_class_init (TestObjectClass *class) sl@0: { sl@0: class->test_signal1 = test_object_real_signal1; sl@0: class->test_signal2 = test_object_real_signal2; sl@0: class->test_signal3 = test_object_real_signal3; sl@0: class->test_signal4 = test_object_real_signal4; sl@0: class->test_signal5 = test_object_real_signal5; sl@0: class->test_signal6 = test_object_real_signal6; sl@0: class->test_signal7 = test_object_real_signal7; sl@0: class->test_signal8 = test_object_real_signal8; sl@0: class->test_signal9 = test_object_real_signal9; sl@0: class->test_signal10 = test_object_real_signal10; sl@0: class->test_signal11= test_object_real_signal3; //since both are doing the same sl@0: class->test_signal12= test_object_real_signal12; sl@0: class->test_signal13= test_object_real_signal13; sl@0: class->test_signal14= test_object_real_signal14; sl@0: class->test_signal15= test_object_real_signal7; //both are doing the same comparison sl@0: class->test_signal16= test_object_real_signal16; sl@0: class->test_signal17= test_object_real_signal17; sl@0: sl@0: g_signal_new ("test-signal1", sl@0: G_OBJECT_CLASS_TYPE (class), sl@0: G_SIGNAL_RUN_LAST, sl@0: G_STRUCT_OFFSET (TestObjectClass, test_signal1), sl@0: NULL, NULL, sl@0: g_cclosure_marshal_VOID__BOOLEAN , sl@0: G_TYPE_NONE, 1, G_TYPE_INT); sl@0: sl@0: g_signal_new ("test-signal2", sl@0: G_OBJECT_CLASS_TYPE (class), sl@0: G_SIGNAL_RUN_LAST, sl@0: G_STRUCT_OFFSET (TestObjectClass, test_signal2), sl@0: g_signal_accumulator_true_handled, NULL, sl@0: g_cclosure_marshal_BOOLEAN__FLAGS, sl@0: G_TYPE_BOOLEAN, 1, G_TYPE_ULONG); sl@0: sl@0: g_signal_new ("test-signal3", sl@0: G_OBJECT_CLASS_TYPE (class), sl@0: G_SIGNAL_RUN_LAST, sl@0: G_STRUCT_OFFSET (TestObjectClass, test_signal3), sl@0: NULL, NULL, sl@0: g_cclosure_marshal_VOID__BOXED, sl@0: G_TYPE_NONE, 1, G_TYPE_POINTER); sl@0: sl@0: g_signal_new ("test-signal4", sl@0: G_OBJECT_CLASS_TYPE (class), sl@0: G_SIGNAL_RUN_LAST, sl@0: G_STRUCT_OFFSET (TestObjectClass, test_signal4), sl@0: NULL, NULL, sl@0: g_cclosure_marshal_VOID__CHAR, sl@0: G_TYPE_NONE, 1, G_TYPE_CHAR); sl@0: sl@0: g_signal_new ("test-signal5", sl@0: G_OBJECT_CLASS_TYPE (class), sl@0: G_SIGNAL_RUN_LAST, sl@0: G_STRUCT_OFFSET (TestObjectClass, test_signal5), sl@0: NULL, NULL, sl@0: g_cclosure_marshal_VOID__DOUBLE, sl@0: G_TYPE_NONE, 1, G_TYPE_DOUBLE); sl@0: sl@0: g_signal_new ("test-signal6", sl@0: G_OBJECT_CLASS_TYPE (class), sl@0: G_SIGNAL_RUN_LAST, sl@0: G_STRUCT_OFFSET (TestObjectClass, test_signal6), sl@0: NULL, NULL, sl@0: g_cclosure_marshal_VOID__ENUM, sl@0: G_TYPE_NONE, 1, G_TYPE_LONG); sl@0: sl@0: g_signal_new ("test-signal7", sl@0: G_OBJECT_CLASS_TYPE (class), sl@0: G_SIGNAL_RUN_LAST, sl@0: G_STRUCT_OFFSET (TestObjectClass, test_signal7), sl@0: NULL, NULL, sl@0: g_cclosure_marshal_VOID__FLAGS, sl@0: G_TYPE_NONE, 1, G_TYPE_ULONG); sl@0: sl@0: g_signal_new ("test-signal8", sl@0: G_OBJECT_CLASS_TYPE (class), sl@0: G_SIGNAL_RUN_LAST, sl@0: G_STRUCT_OFFSET (TestObjectClass, test_signal8), sl@0: NULL, NULL, sl@0: g_cclosure_marshal_VOID__FLOAT, sl@0: G_TYPE_NONE, 1, G_TYPE_FLOAT); sl@0: sl@0: g_signal_new ("test-signal9", sl@0: G_OBJECT_CLASS_TYPE (class), sl@0: G_SIGNAL_RUN_LAST, sl@0: G_STRUCT_OFFSET (TestObjectClass, test_signal9), sl@0: NULL, NULL, sl@0: g_cclosure_marshal_VOID__LONG, sl@0: G_TYPE_NONE, 1, G_TYPE_LONG); sl@0: sl@0: g_signal_new ("test-signal10", sl@0: G_OBJECT_CLASS_TYPE (class), sl@0: G_SIGNAL_RUN_LAST, sl@0: G_STRUCT_OFFSET (TestObjectClass, test_signal10), sl@0: NULL, NULL, sl@0: g_cclosure_marshal_VOID__OBJECT, sl@0: G_TYPE_NONE, 1, TEST_TYPE_OBJECT); sl@0: sl@0: g_signal_new ("test-signal11", sl@0: G_OBJECT_CLASS_TYPE (class), sl@0: G_SIGNAL_RUN_LAST, sl@0: G_STRUCT_OFFSET (TestObjectClass, test_signal11), sl@0: NULL, NULL, sl@0: g_cclosure_marshal_VOID__POINTER, sl@0: G_TYPE_NONE, 1, G_TYPE_POINTER); sl@0: sl@0: g_signal_new ("test-signal12", sl@0: G_OBJECT_CLASS_TYPE (class), sl@0: G_SIGNAL_RUN_LAST, sl@0: G_STRUCT_OFFSET (TestObjectClass, test_signal12), sl@0: NULL, NULL, sl@0: g_cclosure_marshal_VOID__STRING, sl@0: G_TYPE_NONE, 1, G_TYPE_STRING); sl@0: sl@0: g_signal_new ("test-signal13", sl@0: G_OBJECT_CLASS_TYPE (class), sl@0: G_SIGNAL_RUN_LAST, sl@0: G_STRUCT_OFFSET (TestObjectClass, test_signal13), sl@0: NULL, NULL, sl@0: g_cclosure_marshal_VOID__UCHAR, sl@0: G_TYPE_NONE, 1, G_TYPE_UCHAR); sl@0: sl@0: g_signal_new ("test-signal14", sl@0: G_OBJECT_CLASS_TYPE (class), sl@0: G_SIGNAL_RUN_LAST, sl@0: G_STRUCT_OFFSET (TestObjectClass, test_signal14), sl@0: NULL, NULL, sl@0: g_cclosure_marshal_VOID__UINT, sl@0: G_TYPE_NONE, 1, G_TYPE_UINT); sl@0: sl@0: g_signal_new ("test-signal15", sl@0: G_OBJECT_CLASS_TYPE (class), sl@0: G_SIGNAL_RUN_LAST, sl@0: G_STRUCT_OFFSET (TestObjectClass, test_signal15), sl@0: NULL, NULL, sl@0: g_cclosure_marshal_VOID__ULONG, sl@0: G_TYPE_NONE, 1, G_TYPE_ULONG); sl@0: sl@0: g_signal_new ("test-signal16", sl@0: G_OBJECT_CLASS_TYPE (class), sl@0: G_SIGNAL_RUN_LAST, sl@0: G_STRUCT_OFFSET (TestObjectClass, test_signal16), sl@0: NULL, NULL, sl@0: g_cclosure_marshal_VOID__UINT_POINTER, sl@0: G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_POINTER); sl@0: sl@0: g_signal_new ("test-signal17", sl@0: G_OBJECT_CLASS_TYPE (class), sl@0: G_SIGNAL_RUN_LAST, sl@0: G_STRUCT_OFFSET (TestObjectClass, test_signal17), sl@0: NULL, NULL, sl@0: g_cclosure_marshal_VOID__PARAM, sl@0: G_TYPE_NONE, 1, G_TYPE_PARAM); sl@0: } sl@0: sl@0: static DEFINE_TYPE(TestObject, test_object, sl@0: test_object_class_init, NULL, NULL, sl@0: G_TYPE_OBJECT) sl@0: sl@0: int sl@0: main (int argc, sl@0: char *argv[]) sl@0: { sl@0: TestObject *object; sl@0: gboolean bool_result; sl@0: gpointer i_string = "test-string"; sl@0: gchar i_char = 'A'; sl@0: gdouble i_double = 2500000; //typically 8 bytes sl@0: gfloat i_float = 11.23f; sl@0: gulong i_ulong = 1980l; sl@0: glong i_long = -748l; sl@0: gchar* i_char_string = "string_input"; sl@0: guchar i_uchar ='>'; sl@0: TestObject *i_input_obj; sl@0: GParamFlags i_flags; sl@0: GParamSpec* i_paramSpec; sl@0: sl@0: #ifdef SYMBIAN sl@0: g_log_set_handler (NULL, G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG, &mrtLogHandler, NULL); sl@0: #endif /*SYMBIAN*/ sl@0: sl@0: sl@0: /*g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) | sl@0: G_LOG_LEVEL_WARNING | sl@0: G_LOG_LEVEL_CRITICAL);*/ sl@0: g_type_init (); sl@0: sl@0: object = g_object_new (TEST_TYPE_OBJECT, NULL); sl@0: sl@0: //VOID__BOOLEAN sl@0: g_signal_emit_by_name (object, "test-signal1", 10, 0); sl@0: sl@0: sl@0: //BOOLEAN__FLAGS sl@0: g_signal_connect (object, "test-signal2", sl@0: G_CALLBACK (test_object_signal2_callback_before), NULL); sl@0: g_signal_connect_after (object, "test-signal2", sl@0: G_CALLBACK (test_object_signal2_callback_after), NULL); sl@0: sl@0: bool_result = FALSE; sl@0: g_signal_emit_by_name (object, "test-signal2", 1, &bool_result); sl@0: g_assert (bool_result == TRUE); sl@0: bool_result = FALSE; sl@0: g_signal_emit_by_name (object, "test-signal2", 2, &bool_result); sl@0: g_assert (bool_result == TRUE); sl@0: bool_result = FALSE; sl@0: g_signal_emit_by_name (object, "test-signal2", 3, &bool_result); sl@0: g_assert (bool_result == TRUE); sl@0: bool_result = TRUE; sl@0: g_signal_emit_by_name (object, "test-signal2", 4, &bool_result); sl@0: g_assert (bool_result == FALSE); sl@0: sl@0: sl@0: //VOID__BOXED sl@0: g_signal_emit_by_name (object, "test-signal3", i_string, NULL); sl@0: sl@0: //VOID__CHAR sl@0: g_signal_emit_by_name (object, "test-signal4", i_char, NULL); sl@0: sl@0: //VOID__DOUBLE sl@0: g_signal_emit_by_name (object, "test-signal5", i_double, NULL); sl@0: sl@0: //VOID__ENUM sl@0: g_signal_emit_by_name (object, "test-signal6", TEST_ENUM2, NULL); sl@0: sl@0: //VOID__FLAGS sl@0: g_signal_emit_by_name (object, "test-signal7", i_ulong, NULL); sl@0: sl@0: //VOID__FLOAT sl@0: g_signal_emit_by_name (object, "test-signal8", i_float, NULL); sl@0: sl@0: //VOID__FLOAT sl@0: g_signal_emit_by_name (object, "test-signal9", i_long, NULL); sl@0: sl@0: //VOID__OBJECT sl@0: i_input_obj = g_object_new (TEST_TYPE_OBJECT, NULL); sl@0: g_signal_emit_by_name (object, "test-signal10", i_input_obj, NULL); sl@0: sl@0: //VOID__POINTER sl@0: g_signal_emit_by_name (object, "test-signal11", i_string, NULL); sl@0: sl@0: //VOID__STRING sl@0: g_signal_emit_by_name (object, "test-signal12", i_char_string, NULL); sl@0: sl@0: //VOID__UCHAR sl@0: g_signal_emit_by_name (object, "test-signal13", i_uchar, NULL); sl@0: sl@0: //VOID__UINT sl@0: g_signal_emit_by_name (object, "test-signal14", 10000, NULL); sl@0: sl@0: //VOID__ULONG sl@0: g_signal_emit_by_name (object, "test-signal15", i_ulong, NULL); sl@0: sl@0: //VOID_UNIT__POINTER sl@0: g_signal_emit_by_name (object, "test-signal16", 10000, i_string,NULL); sl@0: sl@0: //VOID__PARAM sl@0: i_paramSpec = g_param_spec_uchar("String1","Hello","World", 0,100,10, i_flags); sl@0: g_signal_emit_by_name (object, "test-signal17", i_paramSpec, NULL); sl@0: sl@0: #if SYMBIAN sl@0: testResultXml("closure-marshal"); sl@0: #endif sl@0: sl@0: return 0; sl@0: }