Home | History | Annotate | Download | only in gobject
      1 /* GObject - GLib Type, Object, Parameter and Signal Library
      2  * Copyright (C) 2001, 2003 Red Hat, Inc.
      3  *
      4  * This library is free software; you can redistribute it and/or
      5  * modify it under the terms of the GNU Lesser General Public
      6  * License as published by the Free Software Foundation; either
      7  * version 2 of the License, or (at your option) any later version.
      8  *
      9  * This library is distributed in the hope that it will be useful,
     10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12  * Lesser General Public License for more details.
     13  *
     14  * You should have received a copy of the GNU Lesser General
     15  * Public License along with this library; if not, write to the
     16  * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
     17  * Boston, MA 02111-1307, USA.
     18  */
     19 
     20 #undef	G_LOG_DOMAIN
     21 #define	G_LOG_DOMAIN "TestAccumulator"
     22 
     23 #undef G_DISABLE_ASSERT
     24 #undef G_DISABLE_CHECKS
     25 #undef G_DISABLE_CAST_CHECKS
     26 
     27 #include <string.h>
     28 
     29 #include	<glib-object.h>
     30 
     31 #include "testmarshal.h"
     32 #include "testcommon.h"
     33 
     34 /* What this test tests is the behavior of signal accumulators
     35  * Two accumulators are tested:
     36  *
     37  * 1: A custom accumulator that appends the returned strings
     38  * 2: The standard g_signal_accumulator_true_handled that stops
     39  *    emission on TRUE returns.
     40  */
     41 
     42 /*
     43  * TestObject, a parent class for TestObject
     44  */
     45 #define TEST_TYPE_OBJECT          (test_object_get_type ())
     46 typedef struct _TestObject        TestObject;
     47 typedef struct _TestObjectClass   TestObjectClass;
     48 
     49 struct _TestObject
     50 {
     51   GObject parent_instance;
     52 };
     53 struct _TestObjectClass
     54 {
     55   GObjectClass parent_class;
     56 
     57   gchar*   (*test_signal1) (TestObject *tobject,
     58 			    gint        param);
     59   gboolean (*test_signal2) (TestObject *tobject,
     60 			    gint        param);
     61 };
     62 
     63 static GType test_object_get_type (void);
     64 
     65 static gboolean
     66 test_signal1_accumulator (GSignalInvocationHint *ihint,
     67 			  GValue                *return_accu,
     68 			  const GValue          *handler_return,
     69 			  gpointer               data)
     70 {
     71   const gchar *accu_string = g_value_get_string (return_accu);
     72   const gchar *new_string = g_value_get_string (handler_return);
     73   gchar *result_string;
     74 
     75   if (accu_string)
     76     result_string = g_strconcat (accu_string, new_string, NULL);
     77   else if (new_string)
     78     result_string = g_strdup (new_string);
     79   else
     80     result_string = NULL;
     81 
     82   g_value_set_string_take_ownership (return_accu, result_string);
     83 
     84   return TRUE;
     85 }
     86 
     87 gchar*
     88 test_object_signal1_callback_before (TestObject *tobject,
     89 				     gint        param,
     90 				     gpointer    data)
     91 {
     92   return g_strdup ("<before>");
     93 }
     94 
     95 gchar*
     96 test_object_real_signal1 (TestObject *tobject,
     97 			  gint        param)
     98 {
     99   return g_strdup ("<default>");
    100 }
    101 
    102 gchar*
    103 test_object_signal1_callback_after (TestObject *tobject,
    104 				    gint        param,
    105 				    gpointer    data)
    106 {
    107   return g_strdup ("<after>");
    108 }
    109 
    110 gboolean
    111 test_object_signal2_callback_before (TestObject *tobject,
    112 				     gint        param)
    113 {
    114   switch (param)
    115     {
    116     case 1: return TRUE;
    117     case 2: return FALSE;
    118     case 3: return FALSE;
    119     case 4: return FALSE;
    120     }
    121 
    122   g_assert_not_reached ();
    123   return FALSE;
    124 }
    125 
    126 gboolean
    127 test_object_real_signal2 (TestObject *tobject,
    128 			  gint        param)
    129 {
    130   switch (param)
    131     {
    132     case 1: g_assert_not_reached (); return FALSE;
    133     case 2: return TRUE;
    134     case 3: return FALSE;
    135     case 4: return FALSE;
    136     }
    137 
    138   g_assert_not_reached ();
    139   return FALSE;
    140 }
    141 
    142 gboolean
    143 test_object_signal2_callback_after (TestObject *tobject,
    144 				     gint        param)
    145 {
    146   switch (param)
    147     {
    148     case 1: g_assert_not_reached (); return FALSE;
    149     case 2: g_assert_not_reached (); return FALSE;
    150     case 3: return TRUE;
    151     case 4: return FALSE;
    152     }
    153 
    154   g_assert_not_reached ();
    155   return FALSE;
    156 }
    157 
    158 static void
    159 test_object_class_init (TestObjectClass *class)
    160 {
    161   class->test_signal1 = test_object_real_signal1;
    162   class->test_signal2 = test_object_real_signal2;
    163 
    164   g_signal_new ("test-signal1",
    165 		G_OBJECT_CLASS_TYPE (class),
    166 		G_SIGNAL_RUN_LAST,
    167 		G_STRUCT_OFFSET (TestObjectClass, test_signal1),
    168 		test_signal1_accumulator, NULL,
    169 		test_marshal_STRING__INT,
    170 		G_TYPE_STRING, 1, G_TYPE_INT);
    171   g_signal_new ("test-signal2",
    172 		G_OBJECT_CLASS_TYPE (class),
    173 		G_SIGNAL_RUN_LAST,
    174 		G_STRUCT_OFFSET (TestObjectClass, test_signal2),
    175 		g_signal_accumulator_true_handled, NULL,
    176 		test_marshal_BOOLEAN__INT,
    177 		G_TYPE_BOOLEAN, 1, G_TYPE_INT);
    178 }
    179 
    180 static DEFINE_TYPE(TestObject, test_object,
    181 		   test_object_class_init, NULL, NULL,
    182 		   G_TYPE_OBJECT)
    183 
    184 int
    185 main (int   argc,
    186       char *argv[])
    187 {
    188   TestObject *object;
    189   gchar *string_result;
    190   gboolean bool_result;
    191 
    192   g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) |
    193 			  G_LOG_LEVEL_WARNING |
    194 			  G_LOG_LEVEL_CRITICAL);
    195   g_type_init ();
    196 
    197   object = g_object_new (TEST_TYPE_OBJECT, NULL);
    198 
    199   g_signal_connect (object, "test-signal1",
    200 		    G_CALLBACK (test_object_signal1_callback_before), NULL);
    201   g_signal_connect_after (object, "test-signal1",
    202 			  G_CALLBACK (test_object_signal1_callback_after), NULL);
    203 
    204   g_signal_emit_by_name (object, "test-signal1", 0, &string_result);
    205   g_assert (strcmp (string_result, "<before><default><after>") == 0);
    206   g_free (string_result);
    207 
    208   g_signal_connect (object, "test-signal2",
    209 		    G_CALLBACK (test_object_signal2_callback_before), NULL);
    210   g_signal_connect_after (object, "test-signal2",
    211 			  G_CALLBACK (test_object_signal2_callback_after), NULL);
    212 
    213   bool_result = FALSE;
    214   g_signal_emit_by_name (object, "test-signal2", 1, &bool_result);
    215   g_assert (bool_result == TRUE);
    216   bool_result = FALSE;
    217   g_signal_emit_by_name (object, "test-signal2", 2, &bool_result);
    218   g_assert (bool_result == TRUE);
    219   bool_result = FALSE;
    220   g_signal_emit_by_name (object, "test-signal2", 3, &bool_result);
    221   g_assert (bool_result == TRUE);
    222   bool_result = TRUE;
    223   g_signal_emit_by_name (object, "test-signal2", 4, &bool_result);
    224   g_assert (bool_result == FALSE);
    225 
    226   return 0;
    227 }
    228