LCOV - code coverage report
Current view: top level - gobject/tests - signals.c (source / functions) Coverage Total Hit
Test: unnamed Lines: 98.5 % 839 826
Test Date: 2024-11-26 05:23:01 Functions: 97.7 % 87 85
Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : #include <glib-object.h>
       2                 :             : #include "marshalers.h"
       3                 :             : 
       4                 :             : #define g_assert_cmpflags(type,n1, cmp, n2) G_STMT_START { \
       5                 :             :                                                type __n1 = (n1), __n2 = (n2); \
       6                 :             :                                                if (__n1 cmp __n2) ; else \
       7                 :             :                                                  g_assertion_message_cmpint (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
       8                 :             :                                                                              #n1 " " #cmp " " #n2, __n1, #cmp, __n2, 'i'); \
       9                 :             :                                             } G_STMT_END
      10                 :             : #define g_assert_cmpenum(type,n1, cmp, n2) G_STMT_START { \
      11                 :             :                                                type __n1 = (n1), __n2 = (n2); \
      12                 :             :                                                if (__n1 cmp __n2) ; else \
      13                 :             :                                                  g_assertion_message_cmpint (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
      14                 :             :                                                                              #n1 " " #cmp " " #n2, __n1, #cmp, __n2, 'i'); \
      15                 :             :                                             } G_STMT_END
      16                 :             : 
      17                 :             : typedef enum {
      18                 :             :   TEST_ENUM_NEGATIVE = -30,
      19                 :             :   TEST_ENUM_NONE = 0,
      20                 :             :   TEST_ENUM_FOO = 1,
      21                 :             :   TEST_ENUM_BAR = 2
      22                 :             : } TestEnum;
      23                 :             : 
      24                 :             : typedef enum {
      25                 :             :   TEST_UNSIGNED_ENUM_FOO = 1,
      26                 :             :   TEST_UNSIGNED_ENUM_BAR = 42
      27                 :             :   /* Don't test 0x80000000 for now- nothing appears to do this in
      28                 :             :    * practice, and it triggers GValue/GEnum bugs on ppc64.
      29                 :             :    */
      30                 :             : } TestUnsignedEnum;
      31                 :             : 
      32                 :             : static void
      33                 :           1 : custom_marshal_VOID__INVOCATIONHINT (GClosure     *closure,
      34                 :             :                                      GValue       *return_value G_GNUC_UNUSED,
      35                 :             :                                      guint         n_param_values,
      36                 :             :                                      const GValue *param_values,
      37                 :             :                                      gpointer      invocation_hint,
      38                 :             :                                      gpointer      marshal_data)
      39                 :             : {
      40                 :             :   typedef void (*GMarshalFunc_VOID__INVOCATIONHINT) (gpointer     data1,
      41                 :             :                                                      gpointer     invocation_hint,
      42                 :             :                                                      gpointer     data2);
      43                 :             :   GMarshalFunc_VOID__INVOCATIONHINT callback;
      44                 :           1 :   GCClosure *cc = (GCClosure*) closure;
      45                 :             :   gpointer data1, data2;
      46                 :             : 
      47                 :           1 :   g_return_if_fail (n_param_values == 2);
      48                 :             : 
      49                 :           1 :   if (G_CCLOSURE_SWAP_DATA (closure))
      50                 :             :     {
      51                 :           0 :       data1 = closure->data;
      52                 :           0 :       data2 = g_value_peek_pointer (param_values + 0);
      53                 :             :     }
      54                 :             :   else
      55                 :             :     {
      56                 :           1 :       data1 = g_value_peek_pointer (param_values + 0);
      57                 :           1 :       data2 = closure->data;
      58                 :             :     }
      59                 :           1 :   callback = (GMarshalFunc_VOID__INVOCATIONHINT) (marshal_data ? marshal_data : cc->callback);
      60                 :             : 
      61                 :           1 :   callback (data1,
      62                 :             :             invocation_hint,
      63                 :             :             data2);
      64                 :             : }
      65                 :             : 
      66                 :             : static GType
      67                 :           2 : test_enum_get_type (void)
      68                 :             : {
      69                 :             :   static GType static_g_define_type_id = 0;
      70                 :             : 
      71                 :           2 :   if (g_once_init_enter_pointer (&static_g_define_type_id))
      72                 :             :     {
      73                 :             :       static const GEnumValue values[] = {
      74                 :             :         { TEST_ENUM_NEGATIVE, "TEST_ENUM_NEGATIVE", "negative" },
      75                 :             :         { TEST_ENUM_NONE, "TEST_ENUM_NONE", "none" },
      76                 :             :         { TEST_ENUM_FOO, "TEST_ENUM_FOO", "foo" },
      77                 :             :         { TEST_ENUM_BAR, "TEST_ENUM_BAR", "bar" },
      78                 :             :         { 0, NULL, NULL }
      79                 :             :       };
      80                 :             :       GType g_define_type_id =
      81                 :           1 :         g_enum_register_static (g_intern_static_string ("TestEnum"), values);
      82                 :           1 :       g_once_init_leave_pointer (&static_g_define_type_id, g_define_type_id);
      83                 :             :     }
      84                 :             : 
      85                 :           2 :   return static_g_define_type_id;
      86                 :             : }
      87                 :             : 
      88                 :             : static GType
      89                 :           2 : test_unsigned_enum_get_type (void)
      90                 :             : {
      91                 :             :   static GType static_g_define_type_id = 0;
      92                 :             : 
      93                 :           2 :   if (g_once_init_enter_pointer (&static_g_define_type_id))
      94                 :             :     {
      95                 :             :       static const GEnumValue values[] = {
      96                 :             :         { TEST_UNSIGNED_ENUM_FOO, "TEST_UNSIGNED_ENUM_FOO", "foo" },
      97                 :             :         { TEST_UNSIGNED_ENUM_BAR, "TEST_UNSIGNED_ENUM_BAR", "bar" },
      98                 :             :         { 0, NULL, NULL }
      99                 :             :       };
     100                 :             :       GType g_define_type_id =
     101                 :           1 :         g_enum_register_static (g_intern_static_string ("TestUnsignedEnum"), values);
     102                 :           1 :       g_once_init_leave_pointer (&static_g_define_type_id, g_define_type_id);
     103                 :             :     }
     104                 :             : 
     105                 :           2 :   return static_g_define_type_id;
     106                 :             : }
     107                 :             : 
     108                 :             : typedef enum {
     109                 :             :   MY_ENUM_VALUE = 1,
     110                 :             : } MyEnum;
     111                 :             : 
     112                 :             : static const GEnumValue my_enum_values[] =
     113                 :             : {
     114                 :             :   { MY_ENUM_VALUE, "the first value", "one" },
     115                 :             :   { 0, NULL, NULL }
     116                 :             : };
     117                 :             : 
     118                 :             : typedef enum {
     119                 :             :   MY_FLAGS_FIRST_BIT = (1 << 0),
     120                 :             :   MY_FLAGS_THIRD_BIT = (1 << 2),
     121                 :             :   MY_FLAGS_LAST_BIT = (1 << 31)
     122                 :             : } MyFlags;
     123                 :             : 
     124                 :             : static const GFlagsValue my_flag_values[] =
     125                 :             : {
     126                 :             :   { MY_FLAGS_FIRST_BIT, "the first bit", "first-bit" },
     127                 :             :   { MY_FLAGS_THIRD_BIT, "the third bit", "third-bit" },
     128                 :             :   { MY_FLAGS_LAST_BIT, "the last bit", "last-bit" },
     129                 :             :   { 0, NULL, NULL }
     130                 :             : };
     131                 :             : 
     132                 :             : static GType enum_type;
     133                 :             : static GType flags_type;
     134                 :             : 
     135                 :             : static guint simple_id;
     136                 :             : static guint simple2_id;
     137                 :             : 
     138                 :             : typedef struct {
     139                 :             :   GTypeInterface g_iface;
     140                 :             : } FooInterface;
     141                 :             : 
     142                 :             : GType foo_get_type (void);
     143                 :             : 
     144                 :           3 : G_DEFINE_INTERFACE (Foo, foo, G_TYPE_OBJECT)
     145                 :             : 
     146                 :             : static void
     147                 :           1 : foo_default_init (FooInterface *iface)
     148                 :             : {
     149                 :           1 : }
     150                 :             : 
     151                 :             : typedef struct {
     152                 :             :   GObject parent;
     153                 :             : } Baa;
     154                 :             : 
     155                 :             : typedef struct {
     156                 :             :   GObjectClass parent_class;
     157                 :             : } BaaClass;
     158                 :             : 
     159                 :             : static void
     160                 :           1 : baa_init_foo (FooInterface *iface)
     161                 :             : {
     162                 :           1 : }
     163                 :             : 
     164                 :             : GType baa_get_type (void);
     165                 :             : 
     166                 :           3 : G_DEFINE_TYPE_WITH_CODE (Baa, baa, G_TYPE_OBJECT,
     167                 :             :                          G_IMPLEMENT_INTERFACE (foo_get_type (), baa_init_foo))
     168                 :             : 
     169                 :             : static void
     170                 :           1 : baa_init (Baa *baa)
     171                 :             : {
     172                 :           1 : }
     173                 :             : 
     174                 :             : static void
     175                 :           1 : baa_class_init (BaaClass *class)
     176                 :             : {
     177                 :           1 : }
     178                 :             : 
     179                 :             : typedef struct _Test Test;
     180                 :             : typedef struct _TestClass TestClass;
     181                 :             : 
     182                 :             : struct _Test
     183                 :             : {
     184                 :             :   GObject parent_instance;
     185                 :             : };
     186                 :             : 
     187                 :             : static void all_types_handler (Test *test, int i, gboolean b, char c, guchar uc, guint ui, glong l, gulong ul, MyEnum e, MyFlags f, float fl, double db, char *str, GParamSpec *param, GBytes *bytes, gpointer ptr, Test *obj, GVariant *var, gint64 i64, guint64 ui64);
     188                 :             : static gboolean accumulator_sum (GSignalInvocationHint *ihint, GValue *return_accu, const GValue *handler_return, gpointer data);
     189                 :             : static gboolean accumulator_concat_string (GSignalInvocationHint *ihint, GValue *return_accu, const GValue *handler_return, gpointer data);
     190                 :             : static gchar * accumulator_class (Test *test);
     191                 :             : 
     192                 :             : struct _TestClass
     193                 :             : {
     194                 :             :   GObjectClass parent_class;
     195                 :             : 
     196                 :             :   void (* variant_changed) (Test *, GVariant *);
     197                 :             :   void (* all_types) (Test *test, int i, gboolean b, char c, guchar uc, guint ui, glong l, gulong ul, MyEnum e, MyFlags f, float fl, double db, char *str, GParamSpec *param, GBytes *bytes, gpointer ptr, Test *obj, GVariant *var, gint64 i64, guint64 ui64);
     198                 :             :   void (* all_types_null) (Test *test, int i, gboolean b, char c, guchar uc, guint ui, glong l, gulong ul, MyEnum e, MyFlags f, float fl, double db, char *str, GParamSpec *param, GBytes *bytes, gpointer ptr, Test *obj, GVariant *var, gint64 i64, guint64 ui64);
     199                 :             :   gchar * (*accumulator_class) (Test *test);
     200                 :             : };
     201                 :             : 
     202                 :             : static GType test_get_type (void);
     203                 :          66 : G_DEFINE_TYPE (Test, test, G_TYPE_OBJECT)
     204                 :             : 
     205                 :             : static void
     206                 :          32 : test_init (Test *test)
     207                 :             : {
     208                 :          32 : }
     209                 :             : 
     210                 :             : static void
     211                 :           1 : test_class_init (TestClass *klass)
     212                 :             : {
     213                 :             :   guint s;
     214                 :             : 
     215                 :           1 :   enum_type = g_enum_register_static ("MyEnum", my_enum_values);
     216                 :           1 :   flags_type = g_flags_register_static ("MyFlag", my_flag_values);
     217                 :             : 
     218                 :           1 :   klass->all_types = all_types_handler;
     219                 :           1 :   klass->accumulator_class = accumulator_class;
     220                 :             : 
     221                 :           1 :   simple_id = g_signal_new ("simple",
     222                 :             :                 G_TYPE_FROM_CLASS (klass),
     223                 :             :                 G_SIGNAL_RUN_LAST,
     224                 :             :                 0,
     225                 :             :                 NULL, NULL,
     226                 :             :                 NULL,
     227                 :             :                 G_TYPE_NONE,
     228                 :             :                 0);
     229                 :           1 :   g_signal_new ("simple-detailed",
     230                 :             :                 G_TYPE_FROM_CLASS (klass),
     231                 :             :                 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
     232                 :             :                 0,
     233                 :             :                 NULL, NULL,
     234                 :             :                 NULL,
     235                 :             :                 G_TYPE_NONE,
     236                 :             :                 0);
     237                 :             :   /* Deliberately install this one in non-canonical form to check that’s handled correctly: */
     238                 :           1 :   simple2_id = g_signal_new ("simple_2",
     239                 :             :                 G_TYPE_FROM_CLASS (klass),
     240                 :             :                 G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE,
     241                 :             :                 0,
     242                 :             :                 NULL, NULL,
     243                 :             :                 NULL,
     244                 :             :                 G_TYPE_NONE,
     245                 :             :                 0);
     246                 :           1 :   g_signal_new ("simple-accumulator",
     247                 :             :                 G_TYPE_FROM_CLASS (klass),
     248                 :             :                 G_SIGNAL_RUN_LAST,
     249                 :             :                 0,
     250                 :             :                 accumulator_sum, NULL,
     251                 :             :                 NULL,
     252                 :             :                 G_TYPE_INT,
     253                 :             :                 0);
     254                 :           1 :   g_signal_new ("accumulator-class-first",
     255                 :             :                 G_TYPE_FROM_CLASS (klass),
     256                 :             :                 G_SIGNAL_RUN_FIRST,
     257                 :             :                 G_STRUCT_OFFSET (TestClass, accumulator_class),
     258                 :             :                 accumulator_concat_string, NULL,
     259                 :             :                 NULL,
     260                 :             :                 G_TYPE_STRING,
     261                 :             :                 0);
     262                 :           1 :   g_signal_new ("accumulator-class-last",
     263                 :             :                 G_TYPE_FROM_CLASS (klass),
     264                 :             :                 G_SIGNAL_RUN_LAST,
     265                 :             :                 G_STRUCT_OFFSET (TestClass, accumulator_class),
     266                 :             :                 accumulator_concat_string, NULL,
     267                 :             :                 NULL,
     268                 :             :                 G_TYPE_STRING,
     269                 :             :                 0);
     270                 :           1 :   g_signal_new ("accumulator-class-cleanup",
     271                 :             :                 G_TYPE_FROM_CLASS (klass),
     272                 :             :                 G_SIGNAL_RUN_CLEANUP,
     273                 :             :                 G_STRUCT_OFFSET (TestClass, accumulator_class),
     274                 :             :                 accumulator_concat_string, NULL,
     275                 :             :                 NULL,
     276                 :             :                 G_TYPE_STRING,
     277                 :             :                 0);
     278                 :           1 :   g_signal_new ("accumulator-class-first-last",
     279                 :             :                 G_TYPE_FROM_CLASS (klass),
     280                 :             :                 G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST,
     281                 :             :                 G_STRUCT_OFFSET (TestClass, accumulator_class),
     282                 :             :                 accumulator_concat_string, NULL,
     283                 :             :                 NULL,
     284                 :             :                 G_TYPE_STRING,
     285                 :             :                 0);
     286                 :           1 :   g_signal_new ("accumulator-class-first-last-cleanup",
     287                 :             :                 G_TYPE_FROM_CLASS (klass),
     288                 :             :                 G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST | G_SIGNAL_RUN_CLEANUP,
     289                 :             :                 G_STRUCT_OFFSET (TestClass, accumulator_class),
     290                 :             :                 accumulator_concat_string, NULL,
     291                 :             :                 NULL,
     292                 :             :                 G_TYPE_STRING,
     293                 :             :                 0);
     294                 :           1 :   g_signal_new ("accumulator-class-last-cleanup",
     295                 :             :                 G_TYPE_FROM_CLASS (klass),
     296                 :             :                 G_SIGNAL_RUN_LAST | G_SIGNAL_RUN_CLEANUP,
     297                 :             :                 G_STRUCT_OFFSET (TestClass, accumulator_class),
     298                 :             :                 accumulator_concat_string, NULL,
     299                 :             :                 NULL,
     300                 :             :                 G_TYPE_STRING,
     301                 :             :                 0);
     302                 :           1 :   g_signal_new ("generic-marshaller-1",
     303                 :             :                 G_TYPE_FROM_CLASS (klass),
     304                 :             :                 G_SIGNAL_RUN_LAST,
     305                 :             :                 0,
     306                 :             :                 NULL, NULL,
     307                 :             :                 NULL,
     308                 :             :                 G_TYPE_NONE,
     309                 :             :                 7,
     310                 :             :                 G_TYPE_CHAR, G_TYPE_UCHAR, G_TYPE_INT, G_TYPE_LONG, G_TYPE_POINTER, G_TYPE_DOUBLE, G_TYPE_FLOAT);
     311                 :           1 :   g_signal_new ("generic-marshaller-2",
     312                 :             :                 G_TYPE_FROM_CLASS (klass),
     313                 :             :                 G_SIGNAL_RUN_LAST,
     314                 :             :                 0,
     315                 :             :                 NULL, NULL,
     316                 :             :                 NULL,
     317                 :             :                 G_TYPE_NONE,
     318                 :             :                 5,
     319                 :             :                 G_TYPE_INT, test_enum_get_type(), G_TYPE_INT, test_unsigned_enum_get_type (), G_TYPE_INT);
     320                 :           1 :   g_signal_new ("generic-marshaller-enum-return-signed",
     321                 :             :                 G_TYPE_FROM_CLASS (klass),
     322                 :             :                 G_SIGNAL_RUN_LAST,
     323                 :             :                 0,
     324                 :             :                 NULL, NULL,
     325                 :             :                 NULL,
     326                 :             :                 test_enum_get_type(),
     327                 :             :                 0);
     328                 :           1 :   g_signal_new ("generic-marshaller-enum-return-unsigned",
     329                 :             :                 G_TYPE_FROM_CLASS (klass),
     330                 :             :                 G_SIGNAL_RUN_LAST,
     331                 :             :                 0,
     332                 :             :                 NULL, NULL,
     333                 :             :                 NULL,
     334                 :             :                 test_unsigned_enum_get_type(),
     335                 :             :                 0);
     336                 :           1 :   g_signal_new ("generic-marshaller-int-return",
     337                 :             :                 G_TYPE_FROM_CLASS (klass),
     338                 :             :                 G_SIGNAL_RUN_LAST,
     339                 :             :                 0,
     340                 :             :                 NULL, NULL,
     341                 :             :                 NULL,
     342                 :             :                 G_TYPE_INT,
     343                 :             :                 0);
     344                 :           1 :   s = g_signal_new ("va-marshaller-int-return",
     345                 :             :                 G_TYPE_FROM_CLASS (klass),
     346                 :             :                 G_SIGNAL_RUN_LAST,
     347                 :             :                 0,
     348                 :             :                 NULL, NULL,
     349                 :             :                 test_INT__VOID,
     350                 :             :                 G_TYPE_INT,
     351                 :             :                 0);
     352                 :           1 :   g_signal_set_va_marshaller (s, G_TYPE_FROM_CLASS (klass),
     353                 :             :                               test_INT__VOIDv);
     354                 :           1 :   g_signal_new ("generic-marshaller-uint-return",
     355                 :             :                 G_TYPE_FROM_CLASS (klass),
     356                 :             :                 G_SIGNAL_RUN_LAST,
     357                 :             :                 0,
     358                 :             :                 NULL, NULL,
     359                 :             :                 NULL,
     360                 :             :                 G_TYPE_UINT,
     361                 :             :                 0);
     362                 :           1 :   g_signal_new ("generic-marshaller-interface-return",
     363                 :             :                 G_TYPE_FROM_CLASS (klass),
     364                 :             :                 G_SIGNAL_RUN_LAST,
     365                 :             :                 0,
     366                 :             :                 NULL, NULL,
     367                 :             :                 NULL,
     368                 :             :                 foo_get_type (),
     369                 :             :                 0);
     370                 :           1 :   s = g_signal_new ("va-marshaller-uint-return",
     371                 :             :                 G_TYPE_FROM_CLASS (klass),
     372                 :             :                 G_SIGNAL_RUN_LAST,
     373                 :             :                 0,
     374                 :             :                 NULL, NULL,
     375                 :             :                 test_INT__VOID,
     376                 :             :                 G_TYPE_UINT,
     377                 :             :                 0);
     378                 :           1 :   g_signal_set_va_marshaller (s, G_TYPE_FROM_CLASS (klass),
     379                 :             :                               test_UINT__VOIDv);
     380                 :           1 :   g_signal_new ("custom-marshaller",
     381                 :             :                 G_TYPE_FROM_CLASS (klass),
     382                 :             :                 G_SIGNAL_RUN_LAST,
     383                 :             :                 0,
     384                 :             :                 NULL, NULL,
     385                 :             :                 custom_marshal_VOID__INVOCATIONHINT,
     386                 :             :                 G_TYPE_NONE,
     387                 :             :                 1,
     388                 :             :                 G_TYPE_POINTER);
     389                 :           1 :   g_signal_new ("variant-changed-no-slot",
     390                 :             :                 G_TYPE_FROM_CLASS (klass),
     391                 :             :                 G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT,
     392                 :             :                 0,
     393                 :             :                 NULL, NULL,
     394                 :             :                 g_cclosure_marshal_VOID__VARIANT,
     395                 :             :                 G_TYPE_NONE,
     396                 :             :                 1,
     397                 :             :                 G_TYPE_VARIANT);
     398                 :           1 :   g_signal_new ("variant-changed",
     399                 :             :                 G_TYPE_FROM_CLASS (klass),
     400                 :             :                 G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT,
     401                 :             :                 G_STRUCT_OFFSET (TestClass, variant_changed),
     402                 :             :                 NULL, NULL,
     403                 :             :                 g_cclosure_marshal_VOID__VARIANT,
     404                 :             :                 G_TYPE_NONE,
     405                 :             :                 1,
     406                 :             :                 G_TYPE_VARIANT);
     407                 :           1 :   g_signal_new ("all-types",
     408                 :             :                 G_TYPE_FROM_CLASS (klass),
     409                 :             :                 G_SIGNAL_RUN_LAST,
     410                 :             :                 G_STRUCT_OFFSET (TestClass, all_types),
     411                 :             :                 NULL, NULL,
     412                 :             :                 test_VOID__INT_BOOLEAN_CHAR_UCHAR_UINT_LONG_ULONG_ENUM_FLAGS_FLOAT_DOUBLE_STRING_PARAM_BOXED_POINTER_OBJECT_VARIANT_INT64_UINT64,
     413                 :             :                 G_TYPE_NONE,
     414                 :             :                 19,
     415                 :             :                 G_TYPE_INT,
     416                 :             :                 G_TYPE_BOOLEAN,
     417                 :             :                 G_TYPE_CHAR,
     418                 :             :                 G_TYPE_UCHAR,
     419                 :             :                 G_TYPE_UINT,
     420                 :             :                 G_TYPE_LONG,
     421                 :             :                 G_TYPE_ULONG,
     422                 :             :                 enum_type,
     423                 :             :                 flags_type,
     424                 :             :                 G_TYPE_FLOAT,
     425                 :             :                 G_TYPE_DOUBLE,
     426                 :             :                 G_TYPE_STRING,
     427                 :           1 :                 G_TYPE_PARAM_LONG,
     428                 :             :                 G_TYPE_BYTES,
     429                 :             :                 G_TYPE_POINTER,
     430                 :             :                 test_get_type (),
     431                 :             :                 G_TYPE_VARIANT,
     432                 :             :                 G_TYPE_INT64,
     433                 :             :                 G_TYPE_UINT64);
     434                 :           1 :   s = g_signal_new ("all-types-va",
     435                 :             :                 G_TYPE_FROM_CLASS (klass),
     436                 :             :                 G_SIGNAL_RUN_LAST,
     437                 :             :                 G_STRUCT_OFFSET (TestClass, all_types),
     438                 :             :                 NULL, NULL,
     439                 :             :                 test_VOID__INT_BOOLEAN_CHAR_UCHAR_UINT_LONG_ULONG_ENUM_FLAGS_FLOAT_DOUBLE_STRING_PARAM_BOXED_POINTER_OBJECT_VARIANT_INT64_UINT64,
     440                 :             :                 G_TYPE_NONE,
     441                 :             :                 19,
     442                 :             :                 G_TYPE_INT,
     443                 :             :                 G_TYPE_BOOLEAN,
     444                 :             :                 G_TYPE_CHAR,
     445                 :             :                 G_TYPE_UCHAR,
     446                 :             :                 G_TYPE_UINT,
     447                 :             :                 G_TYPE_LONG,
     448                 :             :                 G_TYPE_ULONG,
     449                 :             :                 enum_type,
     450                 :             :                 flags_type,
     451                 :             :                 G_TYPE_FLOAT,
     452                 :             :                 G_TYPE_DOUBLE,
     453                 :             :                 G_TYPE_STRING,
     454                 :           1 :                 G_TYPE_PARAM_LONG,
     455                 :             :                 G_TYPE_BYTES,
     456                 :             :                 G_TYPE_POINTER,
     457                 :             :                 test_get_type (),
     458                 :             :                 G_TYPE_VARIANT,
     459                 :             :                 G_TYPE_INT64,
     460                 :             :                 G_TYPE_UINT64);
     461                 :           1 :   g_signal_set_va_marshaller (s, G_TYPE_FROM_CLASS (klass),
     462                 :             :                               test_VOID__INT_BOOLEAN_CHAR_UCHAR_UINT_LONG_ULONG_ENUM_FLAGS_FLOAT_DOUBLE_STRING_PARAM_BOXED_POINTER_OBJECT_VARIANT_INT64_UINT64v);
     463                 :             : 
     464                 :           1 :   g_signal_new ("all-types-generic",
     465                 :             :                 G_TYPE_FROM_CLASS (klass),
     466                 :             :                 G_SIGNAL_RUN_LAST,
     467                 :             :                 G_STRUCT_OFFSET (TestClass, all_types),
     468                 :             :                 NULL, NULL,
     469                 :             :                 NULL,
     470                 :             :                 G_TYPE_NONE,
     471                 :             :                 19,
     472                 :             :                 G_TYPE_INT,
     473                 :             :                 G_TYPE_BOOLEAN,
     474                 :             :                 G_TYPE_CHAR,
     475                 :             :                 G_TYPE_UCHAR,
     476                 :             :                 G_TYPE_UINT,
     477                 :             :                 G_TYPE_LONG,
     478                 :             :                 G_TYPE_ULONG,
     479                 :             :                 enum_type,
     480                 :             :                 flags_type,
     481                 :             :                 G_TYPE_FLOAT,
     482                 :             :                 G_TYPE_DOUBLE,
     483                 :             :                 G_TYPE_STRING,
     484                 :           1 :                 G_TYPE_PARAM_LONG,
     485                 :             :                 G_TYPE_BYTES,
     486                 :             :                 G_TYPE_POINTER,
     487                 :             :                 test_get_type (),
     488                 :             :                 G_TYPE_VARIANT,
     489                 :             :                 G_TYPE_INT64,
     490                 :             :                 G_TYPE_UINT64);
     491                 :           1 :   g_signal_new ("all-types-null",
     492                 :             :                 G_TYPE_FROM_CLASS (klass),
     493                 :             :                 G_SIGNAL_RUN_LAST,
     494                 :             :                 G_STRUCT_OFFSET (TestClass, all_types_null),
     495                 :             :                 NULL, NULL,
     496                 :             :                 test_VOID__INT_BOOLEAN_CHAR_UCHAR_UINT_LONG_ULONG_ENUM_FLAGS_FLOAT_DOUBLE_STRING_PARAM_BOXED_POINTER_OBJECT_VARIANT_INT64_UINT64,
     497                 :             :                 G_TYPE_NONE,
     498                 :             :                 19,
     499                 :             :                 G_TYPE_INT,
     500                 :             :                 G_TYPE_BOOLEAN,
     501                 :             :                 G_TYPE_CHAR,
     502                 :             :                 G_TYPE_UCHAR,
     503                 :             :                 G_TYPE_UINT,
     504                 :             :                 G_TYPE_LONG,
     505                 :             :                 G_TYPE_ULONG,
     506                 :             :                 enum_type,
     507                 :             :                 flags_type,
     508                 :             :                 G_TYPE_FLOAT,
     509                 :             :                 G_TYPE_DOUBLE,
     510                 :             :                 G_TYPE_STRING,
     511                 :           1 :                 G_TYPE_PARAM_LONG,
     512                 :             :                 G_TYPE_BYTES,
     513                 :             :                 G_TYPE_POINTER,
     514                 :             :                 test_get_type (),
     515                 :             :                 G_TYPE_VARIANT,
     516                 :             :                 G_TYPE_INT64,
     517                 :             :                 G_TYPE_UINT64);
     518                 :           1 :   g_signal_new ("all-types-empty",
     519                 :             :                 G_TYPE_FROM_CLASS (klass),
     520                 :             :                 G_SIGNAL_RUN_LAST,
     521                 :             :                 0,
     522                 :             :                 NULL, NULL,
     523                 :             :                 test_VOID__INT_BOOLEAN_CHAR_UCHAR_UINT_LONG_ULONG_ENUM_FLAGS_FLOAT_DOUBLE_STRING_PARAM_BOXED_POINTER_OBJECT_VARIANT_INT64_UINT64,
     524                 :             :                 G_TYPE_NONE,
     525                 :             :                 19,
     526                 :             :                 G_TYPE_INT,
     527                 :             :                 G_TYPE_BOOLEAN,
     528                 :             :                 G_TYPE_CHAR,
     529                 :             :                 G_TYPE_UCHAR,
     530                 :             :                 G_TYPE_UINT,
     531                 :             :                 G_TYPE_LONG,
     532                 :             :                 G_TYPE_ULONG,
     533                 :             :                 enum_type,
     534                 :             :                 flags_type,
     535                 :             :                 G_TYPE_FLOAT,
     536                 :             :                 G_TYPE_DOUBLE,
     537                 :             :                 G_TYPE_STRING,
     538                 :           1 :                 G_TYPE_PARAM_LONG,
     539                 :             :                 G_TYPE_BYTES,
     540                 :             :                 G_TYPE_POINTER,
     541                 :             :                 test_get_type (),
     542                 :             :                 G_TYPE_VARIANT,
     543                 :             :                 G_TYPE_INT64,
     544                 :             :                 G_TYPE_UINT64);
     545                 :           1 : }
     546                 :             : 
     547                 :             : typedef struct _Test Test2;
     548                 :             : typedef struct _TestClass Test2Class;
     549                 :             : 
     550                 :             : static GType test2_get_type (void);
     551                 :           3 : G_DEFINE_TYPE (Test2, test2, G_TYPE_OBJECT)
     552                 :             : 
     553                 :             : static void
     554                 :           1 : test2_init (Test2 *test)
     555                 :             : {
     556                 :           1 : }
     557                 :             : 
     558                 :             : static void
     559                 :           1 : test2_class_init (Test2Class *klass)
     560                 :             : {
     561                 :           1 : }
     562                 :             : 
     563                 :             : static void
     564                 :           1 : test_variant_signal (void)
     565                 :             : {
     566                 :             :   Test *test;
     567                 :             :   GVariant *v;
     568                 :             : 
     569                 :             :   /* Tests that the signal emission consumes the variant,
     570                 :             :    * even if there are no handlers connected.
     571                 :             :    */
     572                 :             : 
     573                 :           1 :   test = g_object_new (test_get_type (), NULL);
     574                 :             : 
     575                 :           1 :   v = g_variant_new_boolean (TRUE);
     576                 :           1 :   g_variant_ref (v);
     577                 :           1 :   g_assert_true (g_variant_is_floating (v));
     578                 :           1 :   g_signal_emit_by_name (test, "variant-changed-no-slot", v);
     579                 :           1 :   g_assert_false (g_variant_is_floating (v));
     580                 :           1 :   g_variant_unref (v);
     581                 :             : 
     582                 :           1 :   v = g_variant_new_boolean (TRUE);
     583                 :           1 :   g_variant_ref (v);
     584                 :           1 :   g_assert_true (g_variant_is_floating (v));
     585                 :           1 :   g_signal_emit_by_name (test, "variant-changed", v);
     586                 :           1 :   g_assert_false (g_variant_is_floating (v));
     587                 :           1 :   g_variant_unref (v);
     588                 :             : 
     589                 :           1 :   g_object_unref (test);
     590                 :           1 : }
     591                 :             : 
     592                 :             : static void
     593                 :           1 : on_generic_marshaller_1 (Test *obj,
     594                 :             :                          gint8 v_schar,
     595                 :             :                          guint8 v_uchar,
     596                 :             :                          gint v_int,
     597                 :             :                          glong v_long,
     598                 :             :                          gpointer v_pointer,
     599                 :             :                          gdouble v_double,
     600                 :             :                          gfloat v_float,
     601                 :             :                          gpointer user_data)
     602                 :             : {
     603                 :           1 :   g_assert_cmpint (v_schar, ==, 42);
     604                 :           1 :   g_assert_cmpint (v_uchar, ==, 43);
     605                 :           1 :   g_assert_cmpint (v_int, ==, 4096);
     606                 :           1 :   g_assert_cmpint (v_long, ==, 8192);
     607                 :           1 :   g_assert_null (v_pointer);
     608                 :           1 :   g_assert_cmpfloat (v_double, >, 0.0);
     609                 :           1 :   g_assert_cmpfloat (v_double, <, 1.0);
     610                 :           1 :   g_assert_cmpfloat (v_float, >, 5.0);
     611                 :           1 :   g_assert_cmpfloat (v_float, <, 6.0);
     612                 :           1 : }
     613                 :             :                          
     614                 :             : static void
     615                 :           1 : test_generic_marshaller_signal_1 (void)
     616                 :             : {
     617                 :             :   Test *test;
     618                 :           1 :   test = g_object_new (test_get_type (), NULL);
     619                 :             : 
     620                 :           1 :   g_signal_connect (test, "generic-marshaller-1", G_CALLBACK (on_generic_marshaller_1), NULL);
     621                 :             : 
     622                 :           1 :   g_signal_emit_by_name (test, "generic-marshaller-1", 42, 43, 4096, 8192, NULL, 0.5, 5.5);
     623                 :             : 
     624                 :           1 :   g_object_unref (test);
     625                 :           1 : }
     626                 :             : 
     627                 :             : static void
     628                 :           1 : on_generic_marshaller_2 (Test *obj,
     629                 :             :                          gint        v_int1,
     630                 :             :                          TestEnum    v_enum,
     631                 :             :                          gint        v_int2,
     632                 :             :                          TestUnsignedEnum v_uenum,
     633                 :             :                          gint        v_int3)
     634                 :             : {
     635                 :           1 :   g_assert_cmpint (v_int1, ==, 42);
     636                 :           1 :   g_assert_cmpint (v_enum, ==, TEST_ENUM_BAR);
     637                 :           1 :   g_assert_cmpint (v_int2, ==, 43);
     638                 :           1 :   g_assert_cmpint (v_uenum, ==, TEST_UNSIGNED_ENUM_BAR);
     639                 :           1 :   g_assert_cmpint (v_int3, ==, 44);
     640                 :           1 : }
     641                 :             : 
     642                 :             : static void
     643                 :           1 : test_generic_marshaller_signal_2 (void)
     644                 :             : {
     645                 :             :   Test *test;
     646                 :           1 :   test = g_object_new (test_get_type (), NULL);
     647                 :             : 
     648                 :           1 :   g_signal_connect (test, "generic-marshaller-2", G_CALLBACK (on_generic_marshaller_2), NULL);
     649                 :             : 
     650                 :           1 :   g_signal_emit_by_name (test, "generic-marshaller-2", 42, TEST_ENUM_BAR, 43, TEST_UNSIGNED_ENUM_BAR, 44);
     651                 :             : 
     652                 :           1 :   g_object_unref (test);
     653                 :           1 : }
     654                 :             : 
     655                 :             : static TestEnum
     656                 :           1 : on_generic_marshaller_enum_return_signed_1 (Test *obj)
     657                 :             : {
     658                 :           1 :   return TEST_ENUM_NEGATIVE;
     659                 :             : }
     660                 :             : 
     661                 :             : static TestEnum
     662                 :           1 : on_generic_marshaller_enum_return_signed_2 (Test *obj)
     663                 :             : {
     664                 :           1 :   return TEST_ENUM_BAR;
     665                 :             : }
     666                 :             : 
     667                 :             : static void
     668                 :           1 : test_generic_marshaller_signal_enum_return_signed (void)
     669                 :             : {
     670                 :             :   Test *test;
     671                 :             :   guint id;
     672                 :           1 :   TestEnum retval = 0;
     673                 :             : 
     674                 :           1 :   test = g_object_new (test_get_type (), NULL);
     675                 :             : 
     676                 :             :   /* Test return value NEGATIVE */
     677                 :           1 :   id = g_signal_connect (test,
     678                 :             :                          "generic-marshaller-enum-return-signed",
     679                 :             :                          G_CALLBACK (on_generic_marshaller_enum_return_signed_1),
     680                 :             :                          NULL);
     681                 :           1 :   g_signal_emit_by_name (test, "generic-marshaller-enum-return-signed", &retval);
     682                 :           1 :   g_assert_cmpint (retval, ==, TEST_ENUM_NEGATIVE);
     683                 :           1 :   g_signal_handler_disconnect (test, id);
     684                 :             : 
     685                 :             :   /* Test return value BAR */
     686                 :           1 :   retval = 0;
     687                 :           1 :   id = g_signal_connect (test,
     688                 :             :                          "generic-marshaller-enum-return-signed",
     689                 :             :                          G_CALLBACK (on_generic_marshaller_enum_return_signed_2),
     690                 :             :                          NULL);
     691                 :           1 :   g_signal_emit_by_name (test, "generic-marshaller-enum-return-signed", &retval);
     692                 :           1 :   g_assert_cmpint (retval, ==, TEST_ENUM_BAR);
     693                 :           1 :   g_signal_handler_disconnect (test, id);
     694                 :             : 
     695                 :           1 :   g_object_unref (test);
     696                 :           1 : }
     697                 :             : 
     698                 :             : static TestUnsignedEnum
     699                 :           1 : on_generic_marshaller_enum_return_unsigned_1 (Test *obj)
     700                 :             : {
     701                 :           1 :   return TEST_UNSIGNED_ENUM_FOO;
     702                 :             : }
     703                 :             : 
     704                 :             : static TestUnsignedEnum
     705                 :           1 : on_generic_marshaller_enum_return_unsigned_2 (Test *obj)
     706                 :             : {
     707                 :           1 :   return TEST_UNSIGNED_ENUM_BAR;
     708                 :             : }
     709                 :             : 
     710                 :             : static void
     711                 :           1 : test_generic_marshaller_signal_enum_return_unsigned (void)
     712                 :             : {
     713                 :             :   Test *test;
     714                 :             :   guint id;
     715                 :           1 :   TestUnsignedEnum retval = 0;
     716                 :             : 
     717                 :           1 :   test = g_object_new (test_get_type (), NULL);
     718                 :             : 
     719                 :             :   /* Test return value FOO */
     720                 :           1 :   id = g_signal_connect (test,
     721                 :             :                          "generic-marshaller-enum-return-unsigned",
     722                 :             :                          G_CALLBACK (on_generic_marshaller_enum_return_unsigned_1),
     723                 :             :                          NULL);
     724                 :           1 :   g_signal_emit_by_name (test, "generic-marshaller-enum-return-unsigned", &retval);
     725                 :           1 :   g_assert_cmpint (retval, ==, TEST_UNSIGNED_ENUM_FOO);
     726                 :           1 :   g_signal_handler_disconnect (test, id);
     727                 :             : 
     728                 :             :   /* Test return value BAR */
     729                 :           1 :   retval = 0;
     730                 :           1 :   id = g_signal_connect (test,
     731                 :             :                          "generic-marshaller-enum-return-unsigned",
     732                 :             :                          G_CALLBACK (on_generic_marshaller_enum_return_unsigned_2),
     733                 :             :                          NULL);
     734                 :           1 :   g_signal_emit_by_name (test, "generic-marshaller-enum-return-unsigned", &retval);
     735                 :           1 :   g_assert_cmpint (retval, ==, TEST_UNSIGNED_ENUM_BAR);
     736                 :           1 :   g_signal_handler_disconnect (test, id);
     737                 :             : 
     738                 :           1 :   g_object_unref (test);
     739                 :           1 : }
     740                 :             : 
     741                 :             : /**********************/
     742                 :             : 
     743                 :             : static gint
     744                 :           4 : on_generic_marshaller_int_return_signed_1 (Test *obj)
     745                 :             : {
     746                 :           4 :   return -30;
     747                 :             : }
     748                 :             : 
     749                 :             : static gint
     750                 :           3 : on_generic_marshaller_int_return_signed_2 (Test *obj)
     751                 :             : {
     752                 :           3 :   return 2;
     753                 :             : }
     754                 :             : 
     755                 :             : static void
     756                 :           1 : test_generic_marshaller_signal_int_return (void)
     757                 :             : {
     758                 :             :   Test *test;
     759                 :             :   guint id;
     760                 :           1 :   gint retval = 0;
     761                 :             : 
     762                 :           1 :   test = g_object_new (test_get_type (), NULL);
     763                 :             : 
     764                 :             :   /* Test return value -30 */
     765                 :           1 :   id = g_signal_connect (test,
     766                 :             :                          "generic-marshaller-int-return",
     767                 :             :                          G_CALLBACK (on_generic_marshaller_int_return_signed_1),
     768                 :             :                          NULL);
     769                 :           1 :   g_signal_emit_by_name (test, "generic-marshaller-int-return", &retval);
     770                 :           1 :   g_assert_cmpint (retval, ==, -30);
     771                 :           1 :   g_signal_handler_disconnect (test, id);
     772                 :             : 
     773                 :             :   /* Test return value positive */
     774                 :           1 :   retval = 0;
     775                 :           1 :   id = g_signal_connect (test,
     776                 :             :                          "generic-marshaller-int-return",
     777                 :             :                          G_CALLBACK (on_generic_marshaller_int_return_signed_2),
     778                 :             :                          NULL);
     779                 :           1 :   g_signal_emit_by_name (test, "generic-marshaller-int-return", &retval);
     780                 :           1 :   g_assert_cmpint (retval, ==, 2);
     781                 :           1 :   g_signal_handler_disconnect (test, id);
     782                 :             : 
     783                 :             :   /* Same test for va marshaller */
     784                 :             : 
     785                 :             :   /* Test return value -30 */
     786                 :           1 :   id = g_signal_connect (test,
     787                 :             :                          "va-marshaller-int-return",
     788                 :             :                          G_CALLBACK (on_generic_marshaller_int_return_signed_1),
     789                 :             :                          NULL);
     790                 :           1 :   g_signal_emit_by_name (test, "va-marshaller-int-return", &retval);
     791                 :           1 :   g_assert_cmpint (retval, ==, -30);
     792                 :           1 :   g_signal_handler_disconnect (test, id);
     793                 :             : 
     794                 :             :   /* Test return value positive */
     795                 :           1 :   retval = 0;
     796                 :           1 :   id = g_signal_connect (test,
     797                 :             :                          "va-marshaller-int-return",
     798                 :             :                          G_CALLBACK (on_generic_marshaller_int_return_signed_2),
     799                 :             :                          NULL);
     800                 :           1 :   g_signal_emit_by_name (test, "va-marshaller-int-return", &retval);
     801                 :           1 :   g_assert_cmpint (retval, ==, 2);
     802                 :           1 :   g_signal_handler_disconnect (test, id);
     803                 :             : 
     804                 :           1 :   g_object_unref (test);
     805                 :           1 : }
     806                 :             : 
     807                 :             : static guint
     808                 :           2 : on_generic_marshaller_uint_return_1 (Test *obj)
     809                 :             : {
     810                 :           2 :   return 1;
     811                 :             : }
     812                 :             : 
     813                 :             : static guint
     814                 :           2 : on_generic_marshaller_uint_return_2 (Test *obj)
     815                 :             : {
     816                 :           2 :   return G_MAXUINT;
     817                 :             : }
     818                 :             : 
     819                 :             : static void
     820                 :           1 : test_generic_marshaller_signal_uint_return (void)
     821                 :             : {
     822                 :             :   Test *test;
     823                 :             :   guint id;
     824                 :           1 :   guint retval = 0;
     825                 :             : 
     826                 :           1 :   test = g_object_new (test_get_type (), NULL);
     827                 :             : 
     828                 :           1 :   id = g_signal_connect (test,
     829                 :             :                          "generic-marshaller-uint-return",
     830                 :             :                          G_CALLBACK (on_generic_marshaller_uint_return_1),
     831                 :             :                          NULL);
     832                 :           1 :   g_signal_emit_by_name (test, "generic-marshaller-uint-return", &retval);
     833                 :           1 :   g_assert_cmpint (retval, ==, 1);
     834                 :           1 :   g_signal_handler_disconnect (test, id);
     835                 :             : 
     836                 :           1 :   retval = 0;
     837                 :           1 :   id = g_signal_connect (test,
     838                 :             :                          "generic-marshaller-uint-return",
     839                 :             :                          G_CALLBACK (on_generic_marshaller_uint_return_2),
     840                 :             :                          NULL);
     841                 :           1 :   g_signal_emit_by_name (test, "generic-marshaller-uint-return", &retval);
     842                 :           1 :   g_assert_cmpint (retval, ==, G_MAXUINT);
     843                 :           1 :   g_signal_handler_disconnect (test, id);
     844                 :             : 
     845                 :             :   /* Same test for va marshaller */
     846                 :             : 
     847                 :           1 :   id = g_signal_connect (test,
     848                 :             :                          "va-marshaller-uint-return",
     849                 :             :                          G_CALLBACK (on_generic_marshaller_uint_return_1),
     850                 :             :                          NULL);
     851                 :           1 :   g_signal_emit_by_name (test, "va-marshaller-uint-return", &retval);
     852                 :           1 :   g_assert_cmpint (retval, ==, 1);
     853                 :           1 :   g_signal_handler_disconnect (test, id);
     854                 :             : 
     855                 :           1 :   retval = 0;
     856                 :           1 :   id = g_signal_connect (test,
     857                 :             :                          "va-marshaller-uint-return",
     858                 :             :                          G_CALLBACK (on_generic_marshaller_uint_return_2),
     859                 :             :                          NULL);
     860                 :           1 :   g_signal_emit_by_name (test, "va-marshaller-uint-return", &retval);
     861                 :           1 :   g_assert_cmpint (retval, ==, G_MAXUINT);
     862                 :           1 :   g_signal_handler_disconnect (test, id);
     863                 :             : 
     864                 :           1 :   g_object_unref (test);
     865                 :           1 : }
     866                 :             : 
     867                 :             : static gpointer
     868                 :           1 : on_generic_marshaller_interface_return (Test *test)
     869                 :             : {
     870                 :           1 :   return g_object_new (baa_get_type (), NULL);
     871                 :             : }
     872                 :             : 
     873                 :             : static void
     874                 :           1 : test_generic_marshaller_signal_interface_return (void)
     875                 :             : {
     876                 :             :   Test *test;
     877                 :             :   guint id;
     878                 :             :   gpointer retval;
     879                 :             : 
     880                 :           1 :   test = g_object_new (test_get_type (), NULL);
     881                 :             : 
     882                 :             :   /* Test return value -30 */
     883                 :           1 :   id = g_signal_connect (test,
     884                 :             :                          "generic-marshaller-interface-return",
     885                 :             :                          G_CALLBACK (on_generic_marshaller_interface_return),
     886                 :             :                          NULL);
     887                 :           1 :   g_signal_emit_by_name (test, "generic-marshaller-interface-return", &retval);
     888                 :           1 :   g_assert_true (g_type_check_instance_is_a ((GTypeInstance*)retval, foo_get_type ()));
     889                 :           1 :   g_object_unref (retval);
     890                 :             : 
     891                 :           1 :   g_signal_handler_disconnect (test, id);
     892                 :             : 
     893                 :           1 :   g_object_unref (test);
     894                 :           1 : }
     895                 :             : 
     896                 :             : static const GSignalInvocationHint dont_use_this = { 0, };
     897                 :             : 
     898                 :             : static void
     899                 :           1 : custom_marshaller_callback (Test                  *test,
     900                 :             :                             GSignalInvocationHint *hint,
     901                 :             :                             gpointer               unused)
     902                 :             : {
     903                 :             :   GSignalInvocationHint *ihint;
     904                 :             : 
     905                 :           1 :   g_assert_true (hint != &dont_use_this);
     906                 :             : 
     907                 :           1 :   ihint = g_signal_get_invocation_hint (test);
     908                 :             : 
     909                 :           1 :   g_assert_cmpuint (hint->signal_id, ==, ihint->signal_id);
     910                 :           1 :   g_assert_cmpuint (hint->detail , ==, ihint->detail);
     911                 :           1 :   g_assert_cmpflags (GSignalFlags, hint->run_type, ==, ihint->run_type); 
     912                 :           1 : }
     913                 :             : 
     914                 :             : static void
     915                 :           1 : test_custom_marshaller (void)
     916                 :             : {
     917                 :             :   Test *test;
     918                 :             : 
     919                 :           1 :   test = g_object_new (test_get_type (), NULL);
     920                 :             : 
     921                 :           1 :   g_signal_connect (test,
     922                 :             :                     "custom-marshaller",
     923                 :             :                     G_CALLBACK (custom_marshaller_callback),
     924                 :             :                     NULL);
     925                 :             : 
     926                 :           1 :   g_signal_emit_by_name (test, "custom-marshaller", &dont_use_this);
     927                 :             : 
     928                 :           1 :   g_object_unref (test);
     929                 :           1 : }
     930                 :             : 
     931                 :             : static int all_type_handlers_count = 0;
     932                 :             : 
     933                 :             : static void
     934                 :          26 : all_types_handler (Test *test, int i, gboolean b, char c, guchar uc, guint ui, glong l, gulong ul, MyEnum e, MyFlags f, float fl, double db, char *str, GParamSpec *param, GBytes *bytes, gpointer ptr, Test *obj, GVariant *var, gint64 i64, guint64 ui64)
     935                 :             : {
     936                 :          26 :   all_type_handlers_count++;
     937                 :             : 
     938                 :          26 :   g_assert_cmpint (i, ==, 42);
     939                 :          26 :   g_assert_cmpint (b, ==, TRUE);
     940                 :          26 :   g_assert_cmpint (c, ==, 17);
     941                 :          26 :   g_assert_cmpuint (uc, ==, 140);
     942                 :          26 :   g_assert_cmpuint (ui, ==, G_MAXUINT - 42);
     943                 :          26 :   g_assert_cmpint (l, ==, -1117);
     944                 :          26 :   g_assert_cmpuint (ul, ==, G_MAXULONG - 999);
     945                 :          26 :   g_assert_cmpenum (MyEnum, e, ==, MY_ENUM_VALUE);
     946                 :          26 :   g_assert_cmpflags (MyFlags, f, ==, MY_FLAGS_FIRST_BIT | MY_FLAGS_THIRD_BIT | MY_FLAGS_LAST_BIT);
     947                 :          26 :   g_assert_cmpfloat (fl, ==, 0.25);
     948                 :          26 :   g_assert_cmpfloat (db, ==, 1.5);
     949                 :          26 :   g_assert_cmpstr (str, ==, "Test");
     950                 :          26 :   g_assert_cmpstr (g_param_spec_get_nick (param), ==, "nick");
     951                 :          26 :   g_assert_cmpstr (g_bytes_get_data (bytes, NULL), ==, "Blah");
     952                 :          26 :   g_assert_true (ptr == &enum_type);
     953                 :          26 :   g_assert_cmpuint (g_variant_get_uint16 (var), == , 99);
     954                 :          26 :   g_assert_cmpint (i64, ==, G_MAXINT64 - 1234);
     955                 :          26 :   g_assert_cmpuint (ui64, ==, G_MAXUINT64 - 123456);
     956                 :          26 : }
     957                 :             : 
     958                 :             : static void
     959                 :          16 : all_types_handler_cb (Test *test, int i, gboolean b, char c, guchar uc, guint ui, glong l, gulong ul, MyEnum e, guint f, float fl, double db, char *str, GParamSpec *param, GBytes *bytes, gpointer ptr, Test *obj, GVariant *var, gint64 i64, guint64 ui64, gpointer user_data)
     960                 :             : {
     961                 :          16 :   g_assert_true (user_data == &flags_type);
     962                 :          16 :   all_types_handler (test, i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, obj, var, i64, ui64);
     963                 :          16 : }
     964                 :             : 
     965                 :             : static void
     966                 :           1 : test_all_types (void)
     967                 :             : {
     968                 :             :   Test *test;
     969                 :             : 
     970                 :           1 :   int i = 42;
     971                 :           1 :   gboolean b = TRUE;
     972                 :           1 :   char c = 17;
     973                 :           1 :   guchar uc = 140;
     974                 :           1 :   guint ui = G_MAXUINT - 42;
     975                 :           1 :   glong l =  -1117;
     976                 :           1 :   gulong ul = G_MAXULONG - 999;
     977                 :           1 :   MyEnum e = MY_ENUM_VALUE;
     978                 :           1 :   MyFlags f = MY_FLAGS_FIRST_BIT | MY_FLAGS_THIRD_BIT | MY_FLAGS_LAST_BIT;
     979                 :           1 :   float fl = 0.25;
     980                 :           1 :   double db = 1.5;
     981                 :           1 :   char *str = "Test";
     982                 :           1 :   GParamSpec *param = g_param_spec_long  ("param", "nick", "blurb", 0, 10, 4, 0);
     983                 :           1 :   GBytes *bytes = g_bytes_new_static ("Blah", 5);
     984                 :           1 :   gpointer ptr = &enum_type;
     985                 :           1 :   GVariant *var = g_variant_new_uint16 (99);
     986                 :             :   gint64 i64;
     987                 :             :   guint64 ui64;
     988                 :           1 :   g_variant_ref_sink (var);
     989                 :           1 :   i64 = G_MAXINT64 - 1234;
     990                 :           1 :   ui64 = G_MAXUINT64 - 123456;
     991                 :             : 
     992                 :           1 :   test = g_object_new (test_get_type (), NULL);
     993                 :             : 
     994                 :           1 :   all_type_handlers_count = 0;
     995                 :             : 
     996                 :           1 :   g_signal_emit_by_name (test, "all-types",
     997                 :             :                          i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
     998                 :           1 :   g_signal_emit_by_name (test, "all-types-va",
     999                 :             :                          i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
    1000                 :           1 :   g_signal_emit_by_name (test, "all-types-generic",
    1001                 :             :                          i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
    1002                 :           1 :   g_signal_emit_by_name (test, "all-types-empty",
    1003                 :             :                          i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
    1004                 :           1 :   g_signal_emit_by_name (test, "all-types-null",
    1005                 :             :                          i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
    1006                 :             : 
    1007                 :           1 :   g_assert_cmpint (all_type_handlers_count, ==, 3);
    1008                 :             : 
    1009                 :           1 :   all_type_handlers_count = 0;
    1010                 :             : 
    1011                 :           1 :   g_signal_connect (test, "all-types", G_CALLBACK (all_types_handler_cb), &flags_type);
    1012                 :           1 :   g_signal_connect (test, "all-types-va", G_CALLBACK (all_types_handler_cb), &flags_type);
    1013                 :           1 :   g_signal_connect (test, "all-types-generic", G_CALLBACK (all_types_handler_cb), &flags_type);
    1014                 :           1 :   g_signal_connect (test, "all-types-empty", G_CALLBACK (all_types_handler_cb), &flags_type);
    1015                 :           1 :   g_signal_connect (test, "all-types-null", G_CALLBACK (all_types_handler_cb), &flags_type);
    1016                 :             : 
    1017                 :           1 :   g_signal_emit_by_name (test, "all-types",
    1018                 :             :                          i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
    1019                 :           1 :   g_signal_emit_by_name (test, "all-types-va",
    1020                 :             :                          i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
    1021                 :           1 :   g_signal_emit_by_name (test, "all-types-generic",
    1022                 :             :                          i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
    1023                 :           1 :   g_signal_emit_by_name (test, "all-types-empty",
    1024                 :             :                          i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
    1025                 :           1 :   g_signal_emit_by_name (test, "all-types-null",
    1026                 :             :                          i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
    1027                 :             : 
    1028                 :           1 :   g_assert_cmpint (all_type_handlers_count, ==, 3 + 5);
    1029                 :             : 
    1030                 :           1 :   all_type_handlers_count = 0;
    1031                 :             : 
    1032                 :           1 :   g_signal_connect (test, "all-types", G_CALLBACK (all_types_handler_cb), &flags_type);
    1033                 :           1 :   g_signal_connect (test, "all-types-va", G_CALLBACK (all_types_handler_cb), &flags_type);
    1034                 :           1 :   g_signal_connect (test, "all-types-generic", G_CALLBACK (all_types_handler_cb), &flags_type);
    1035                 :           1 :   g_signal_connect (test, "all-types-empty", G_CALLBACK (all_types_handler_cb), &flags_type);
    1036                 :           1 :   g_signal_connect (test, "all-types-null", G_CALLBACK (all_types_handler_cb), &flags_type);
    1037                 :             : 
    1038                 :           1 :   g_signal_emit_by_name (test, "all-types",
    1039                 :             :                          i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
    1040                 :           1 :   g_signal_emit_by_name (test, "all-types-va",
    1041                 :             :                          i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
    1042                 :           1 :   g_signal_emit_by_name (test, "all-types-generic",
    1043                 :             :                          i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
    1044                 :           1 :   g_signal_emit_by_name (test, "all-types-empty",
    1045                 :             :                          i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
    1046                 :           1 :   g_signal_emit_by_name (test, "all-types-null",
    1047                 :             :                          i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
    1048                 :             : 
    1049                 :           1 :   g_assert_cmpint (all_type_handlers_count, ==, 3 + 5 + 5);
    1050                 :             : 
    1051                 :           1 :   g_object_unref (test);
    1052                 :           1 :   g_param_spec_unref (param);
    1053                 :           1 :   g_bytes_unref (bytes);
    1054                 :           1 :   g_variant_unref (var);
    1055                 :           1 : }
    1056                 :             : 
    1057                 :             : static void
    1058                 :           1 : test_connect (void)
    1059                 :             : {
    1060                 :             :   GObject *test;
    1061                 :             :   gint retval;
    1062                 :             : 
    1063                 :           1 :   test = g_object_new (test_get_type (), NULL);
    1064                 :             : 
    1065                 :           1 :   g_object_connect (test,
    1066                 :             :                     "signal::generic-marshaller-int-return",
    1067                 :             :                     G_CALLBACK (on_generic_marshaller_int_return_signed_1),
    1068                 :             :                     NULL,
    1069                 :             :                     "object-signal::va-marshaller-int-return",
    1070                 :             :                     G_CALLBACK (on_generic_marshaller_int_return_signed_2),
    1071                 :             :                     NULL,
    1072                 :             :                     NULL);
    1073                 :           1 :   g_signal_emit_by_name (test, "generic-marshaller-int-return", &retval);
    1074                 :           1 :   g_assert_cmpint (retval, ==, -30);
    1075                 :           1 :   g_signal_emit_by_name (test, "va-marshaller-int-return", &retval);
    1076                 :           1 :   g_assert_cmpint (retval, ==, 2);
    1077                 :             : 
    1078                 :           1 :   g_object_disconnect (test,
    1079                 :             :                        "any-signal",
    1080                 :             :                        G_CALLBACK (on_generic_marshaller_int_return_signed_1),
    1081                 :             :                        NULL,
    1082                 :             :                        "any-signal::va-marshaller-int-return",
    1083                 :             :                        G_CALLBACK (on_generic_marshaller_int_return_signed_2),
    1084                 :             :                        NULL,
    1085                 :             :                        NULL);
    1086                 :             : 
    1087                 :           1 :   g_object_unref (test);
    1088                 :           1 : }
    1089                 :             : 
    1090                 :             : static void
    1091                 :           1 : simple_handler1 (GObject *sender,
    1092                 :             :                  GObject *target)
    1093                 :             : {
    1094                 :           1 :   g_object_unref (target);
    1095                 :           1 : }
    1096                 :             : 
    1097                 :             : static void
    1098                 :           1 : simple_handler2 (GObject *sender,
    1099                 :             :                  GObject *target)
    1100                 :             : {
    1101                 :           1 :   g_object_unref (target);
    1102                 :           1 : }
    1103                 :             : 
    1104                 :             : static void
    1105                 :           1 : test_destroy_target_object (void)
    1106                 :             : {
    1107                 :             :   Test *sender, *target1, *target2;
    1108                 :             : 
    1109                 :           1 :   sender = g_object_new (test_get_type (), NULL);
    1110                 :           1 :   target1 = g_object_new (test_get_type (), NULL);
    1111                 :           1 :   target2 = g_object_new (test_get_type (), NULL);
    1112                 :           1 :   g_signal_connect_object (sender, "simple", G_CALLBACK (simple_handler1),
    1113                 :             :                            target1, G_CONNECT_DEFAULT);
    1114                 :           1 :   g_signal_connect_object (sender, "simple", G_CALLBACK (simple_handler2),
    1115                 :             :                            target2, G_CONNECT_DEFAULT);
    1116                 :           1 :   g_signal_emit_by_name (sender, "simple");
    1117                 :           1 :   g_object_unref (sender);
    1118                 :           1 : }
    1119                 :             : 
    1120                 :             : static gboolean
    1121                 :          26 : hook_func (GSignalInvocationHint *ihint,
    1122                 :             :            guint                  n_params,
    1123                 :             :            const GValue          *params,
    1124                 :             :            gpointer               data)
    1125                 :             : {
    1126                 :          26 :   gint *count = data;
    1127                 :             : 
    1128                 :          26 :   (*count)++;
    1129                 :             : 
    1130                 :          26 :   return TRUE;
    1131                 :             : }
    1132                 :             : 
    1133                 :             : static gboolean
    1134                 :          11 : hook_func_removal (GSignalInvocationHint *ihint,
    1135                 :             :                    guint                  n_params,
    1136                 :             :                    const GValue          *params,
    1137                 :             :                    gpointer               data)
    1138                 :             : {
    1139                 :          11 :   gint *count = data;
    1140                 :             : 
    1141                 :          11 :   (*count)++;
    1142                 :             : 
    1143                 :          11 :   return FALSE;
    1144                 :             : }
    1145                 :             : 
    1146                 :             : static void
    1147                 :           1 : simple_handler_remove_hook (GObject *sender,
    1148                 :             :                             gpointer data)
    1149                 :             : {
    1150                 :           1 :   gulong *hook = data;
    1151                 :             : 
    1152                 :           1 :   g_signal_remove_emission_hook (simple_id, *hook);
    1153                 :           1 : }
    1154                 :             : 
    1155                 :             : static void
    1156                 :           1 : test_emission_hook (void)
    1157                 :             : {
    1158                 :             :   GObject *test1, *test2;
    1159                 :           1 :   gint count = 0;
    1160                 :             :   gulong hook;
    1161                 :             :   gulong connection_id;
    1162                 :             : 
    1163                 :           1 :   test1 = g_object_new (test_get_type (), NULL);
    1164                 :           1 :   test2 = g_object_new (test_get_type (), NULL);
    1165                 :             : 
    1166                 :           1 :   hook = g_signal_add_emission_hook (simple_id, 0, hook_func, &count, NULL);
    1167                 :           1 :   g_assert_cmpint (count, ==, 0);
    1168                 :           1 :   g_signal_emit_by_name (test1, "simple");
    1169                 :           1 :   g_assert_cmpint (count, ==, 1);
    1170                 :           1 :   g_signal_emit_by_name (test2, "simple");
    1171                 :           1 :   g_assert_cmpint (count, ==, 2);
    1172                 :           1 :   g_signal_remove_emission_hook (simple_id, hook);
    1173                 :           1 :   g_signal_emit_by_name (test1, "simple");
    1174                 :           1 :   g_assert_cmpint (count, ==, 2);
    1175                 :             : 
    1176                 :           1 :   count = 0;
    1177                 :           1 :   hook = g_signal_add_emission_hook (simple_id, 0, hook_func_removal, &count, NULL);
    1178                 :           1 :   g_assert_cmpint (count, ==, 0);
    1179                 :           1 :   g_signal_emit_by_name (test1, "simple");
    1180                 :           1 :   g_assert_cmpint (count, ==, 1);
    1181                 :           1 :   g_signal_emit_by_name (test2, "simple");
    1182                 :           1 :   g_assert_cmpint (count, ==, 1);
    1183                 :             : 
    1184                 :           1 :   g_test_expect_message ("GLib-GObject", G_LOG_LEVEL_CRITICAL,
    1185                 :             :                          "*simple* had no hook * to remove");
    1186                 :           1 :   g_signal_remove_emission_hook (simple_id, hook);
    1187                 :           1 :   g_test_assert_expected_messages ();
    1188                 :             : 
    1189                 :           1 :   count = 0;
    1190                 :           1 :   hook = g_signal_add_emission_hook (simple_id, 0, hook_func, &count, NULL);
    1191                 :           1 :   connection_id = g_signal_connect (test1, "simple",
    1192                 :             :                                     G_CALLBACK (simple_handler_remove_hook), &hook);
    1193                 :           1 :   g_assert_cmpint (count, ==, 0);
    1194                 :           1 :   g_signal_emit_by_name (test1, "simple");
    1195                 :           1 :   g_assert_cmpint (count, ==, 1);
    1196                 :           1 :   g_signal_emit_by_name (test2, "simple");
    1197                 :           1 :   g_assert_cmpint (count, ==, 1);
    1198                 :             : 
    1199                 :           1 :   g_test_expect_message ("GLib-GObject", G_LOG_LEVEL_CRITICAL,
    1200                 :             :                          "*simple* had no hook * to remove");
    1201                 :           1 :   g_signal_remove_emission_hook (simple_id, hook);
    1202                 :           1 :   g_test_assert_expected_messages ();
    1203                 :             : 
    1204                 :           1 :   g_clear_signal_handler (&connection_id, test1);
    1205                 :             : 
    1206                 :             :   gulong hooks[10];
    1207                 :           1 :   count = 0;
    1208                 :             : 
    1209                 :          11 :   for (size_t i = 0; i < G_N_ELEMENTS (hooks); ++i)
    1210                 :          10 :     hooks[i] = g_signal_add_emission_hook (simple_id, 0, hook_func, &count, NULL);
    1211                 :             : 
    1212                 :           1 :   g_assert_cmpint (count, ==, 0);
    1213                 :           1 :   g_signal_emit_by_name (test1, "simple");
    1214                 :           1 :   g_assert_cmpint (count, ==, 10);
    1215                 :           1 :   g_signal_emit_by_name (test2, "simple");
    1216                 :           1 :   g_assert_cmpint (count, ==, 20);
    1217                 :             : 
    1218                 :          11 :   for (size_t i = 0; i < G_N_ELEMENTS (hooks); ++i)
    1219                 :          10 :     g_signal_remove_emission_hook (simple_id, hooks[i]);
    1220                 :             : 
    1221                 :           1 :   g_signal_emit_by_name (test1, "simple");
    1222                 :           1 :   g_assert_cmpint (count, ==, 20);
    1223                 :             : 
    1224                 :           1 :   count = 0;
    1225                 :             : 
    1226                 :          11 :   for (size_t i = 0; i < G_N_ELEMENTS (hooks); ++i)
    1227                 :          10 :     hooks[i] = g_signal_add_emission_hook (simple_id, 0, hook_func_removal, &count, NULL);
    1228                 :             : 
    1229                 :           1 :   g_assert_cmpint (count, ==, 0);
    1230                 :           1 :   g_signal_emit_by_name (test1, "simple");
    1231                 :           1 :   g_assert_cmpint (count, ==, 10);
    1232                 :           1 :   g_signal_emit_by_name (test2, "simple");
    1233                 :           1 :   g_assert_cmpint (count, ==, 10);
    1234                 :             : 
    1235                 :          11 :   for (size_t i = 0; i < G_N_ELEMENTS (hooks); ++i)
    1236                 :             :     {
    1237                 :          10 :       g_test_expect_message ("GLib-GObject", G_LOG_LEVEL_CRITICAL,
    1238                 :             :                          "*simple* had no hook * to remove");
    1239                 :          10 :       g_signal_remove_emission_hook (simple_id, hooks[i]);
    1240                 :          10 :       g_test_assert_expected_messages ();
    1241                 :             :     }
    1242                 :             : 
    1243                 :           1 :   g_object_unref (test1);
    1244                 :           1 :   g_object_unref (test2);
    1245                 :           1 : }
    1246                 :             : 
    1247                 :             : static void
    1248                 :           1 : simple_cb (gpointer instance, gpointer data)
    1249                 :             : {
    1250                 :             :   GSignalInvocationHint *ihint;
    1251                 :             : 
    1252                 :           1 :   ihint = g_signal_get_invocation_hint (instance);
    1253                 :             : 
    1254                 :           1 :   g_assert_cmpstr (g_signal_name (ihint->signal_id), ==, "simple");
    1255                 :             : 
    1256                 :           1 :   g_signal_emit_by_name (instance, "simple-2");
    1257                 :           1 : }
    1258                 :             : 
    1259                 :             : static void
    1260                 :           1 : simple2_cb (gpointer instance, gpointer data)
    1261                 :             : {
    1262                 :             :   GSignalInvocationHint *ihint;
    1263                 :             : 
    1264                 :           1 :   ihint = g_signal_get_invocation_hint (instance);
    1265                 :             : 
    1266                 :           1 :   g_assert_cmpstr (g_signal_name (ihint->signal_id), ==, "simple-2");
    1267                 :           1 : }
    1268                 :             : 
    1269                 :             : static void
    1270                 :           1 : test_invocation_hint (void)
    1271                 :             : {
    1272                 :             :   GObject *test;
    1273                 :             : 
    1274                 :           1 :   test = g_object_new (test_get_type (), NULL);
    1275                 :             : 
    1276                 :           1 :   g_signal_connect (test, "simple", G_CALLBACK (simple_cb), NULL);
    1277                 :           1 :   g_signal_connect (test, "simple-2", G_CALLBACK (simple2_cb), NULL);
    1278                 :           1 :   g_signal_emit_by_name (test, "simple");
    1279                 :             : 
    1280                 :           1 :   g_object_unref (test);
    1281                 :           1 : }
    1282                 :             : 
    1283                 :             : static gboolean
    1284                 :           3 : accumulator_sum (GSignalInvocationHint *ihint,
    1285                 :             :                  GValue                *return_accu,
    1286                 :             :                  const GValue          *handler_return,
    1287                 :             :                  gpointer               data)
    1288                 :             : {
    1289                 :           3 :   gint acc = g_value_get_int (return_accu);
    1290                 :           3 :   gint ret = g_value_get_int (handler_return);
    1291                 :             : 
    1292                 :           3 :   g_assert_cmpint (ret, >, 0);
    1293                 :             : 
    1294                 :           3 :   if (ihint->run_type & G_SIGNAL_ACCUMULATOR_FIRST_RUN)
    1295                 :             :     {
    1296                 :           1 :       g_assert_cmpint (acc, ==, 0);
    1297                 :           1 :       g_assert_cmpint (ret, ==, 1);
    1298                 :           1 :       g_assert_true (ihint->run_type & G_SIGNAL_RUN_FIRST);
    1299                 :           1 :       g_assert_false (ihint->run_type & G_SIGNAL_RUN_LAST);
    1300                 :             :     }
    1301                 :           2 :   else if (ihint->run_type & G_SIGNAL_RUN_FIRST)
    1302                 :             :     {
    1303                 :             :       /* Only the first signal handler was called so far */
    1304                 :           1 :       g_assert_cmpint (acc, ==, 1);
    1305                 :           1 :       g_assert_cmpint (ret, ==, 2);
    1306                 :           1 :       g_assert_false (ihint->run_type & G_SIGNAL_RUN_LAST);
    1307                 :             :     }
    1308                 :           1 :   else if (ihint->run_type & G_SIGNAL_RUN_LAST)
    1309                 :             :     {
    1310                 :             :       /* Only the first two signal handler were called so far */
    1311                 :           1 :       g_assert_cmpint (acc, ==, 3);
    1312                 :           1 :       g_assert_cmpint (ret, ==, 3);
    1313                 :           1 :       g_assert_false (ihint->run_type & G_SIGNAL_RUN_FIRST);
    1314                 :             :     }
    1315                 :             :   else
    1316                 :             :     {
    1317                 :             :       g_assert_not_reached ();
    1318                 :             :     }
    1319                 :             : 
    1320                 :           3 :   g_value_set_int (return_accu, acc + ret);
    1321                 :             : 
    1322                 :             :   /* Continue with the other signal handlers as long as the sum is < 6,
    1323                 :             :    * i.e. don't run simple_accumulator_4_cb() */
    1324                 :           3 :   return acc + ret < 6;
    1325                 :             : }
    1326                 :             : 
    1327                 :             : static gint
    1328                 :           1 : simple_accumulator_1_cb (gpointer instance, gpointer data)
    1329                 :             : {
    1330                 :           1 :   return 1;
    1331                 :             : }
    1332                 :             : 
    1333                 :             : static gint
    1334                 :           1 : simple_accumulator_2_cb (gpointer instance, gpointer data)
    1335                 :             : {
    1336                 :           1 :   return 2;
    1337                 :             : }
    1338                 :             : 
    1339                 :             : static gint
    1340                 :           1 : simple_accumulator_3_cb (gpointer instance, gpointer data)
    1341                 :             : {
    1342                 :           1 :   return 3;
    1343                 :             : }
    1344                 :             : 
    1345                 :             : static gint
    1346                 :           0 : simple_accumulator_4_cb (gpointer instance, gpointer data)
    1347                 :             : {
    1348                 :           0 :   return 4;
    1349                 :             : }
    1350                 :             : 
    1351                 :             : static void
    1352                 :           1 : test_accumulator (void)
    1353                 :             : {
    1354                 :             :   GObject *test;
    1355                 :           1 :   gint ret = -1;
    1356                 :             : 
    1357                 :           1 :   test = g_object_new (test_get_type (), NULL);
    1358                 :             : 
    1359                 :             :   /* Connect in reverse order to make sure that LAST signal handlers are
    1360                 :             :    * called after FIRST signal handlers but signal handlers in each "group"
    1361                 :             :    * are called in the order they were registered */
    1362                 :           1 :   g_signal_connect_after (test, "simple-accumulator", G_CALLBACK (simple_accumulator_3_cb), NULL);
    1363                 :           1 :   g_signal_connect_after (test, "simple-accumulator", G_CALLBACK (simple_accumulator_4_cb), NULL);
    1364                 :           1 :   g_signal_connect (test, "simple-accumulator", G_CALLBACK (simple_accumulator_1_cb), NULL);
    1365                 :           1 :   g_signal_connect (test, "simple-accumulator", G_CALLBACK (simple_accumulator_2_cb), NULL);
    1366                 :           1 :   g_signal_emit_by_name (test, "simple-accumulator", &ret);
    1367                 :             : 
    1368                 :             :   /* simple_accumulator_4_cb() is not run because accumulator is 6 */
    1369                 :           1 :   g_assert_cmpint (ret, ==, 6);
    1370                 :             : 
    1371                 :           1 :   g_object_unref (test);
    1372                 :           1 : }
    1373                 :             : 
    1374                 :             : static gboolean
    1375                 :          22 : accumulator_concat_string (GSignalInvocationHint *ihint, GValue *return_accu, const GValue *handler_return, gpointer data)
    1376                 :             : {
    1377                 :          22 :   const gchar *acc = g_value_get_string (return_accu);
    1378                 :          22 :   const gchar *ret = g_value_get_string (handler_return);
    1379                 :             : 
    1380                 :          22 :   g_assert_nonnull (ret);
    1381                 :             : 
    1382                 :          22 :   if (acc == NULL)
    1383                 :           6 :     g_value_set_string (return_accu, ret);
    1384                 :             :   else
    1385                 :          16 :     g_value_take_string (return_accu, g_strconcat (acc, ret, NULL));
    1386                 :             : 
    1387                 :          22 :   return TRUE;
    1388                 :             : }
    1389                 :             : 
    1390                 :             : static gchar *
    1391                 :           6 : accumulator_class_before_cb (gpointer instance, gpointer data)
    1392                 :             : {
    1393                 :           6 :   return g_strdup ("before");
    1394                 :             : }
    1395                 :             : 
    1396                 :             : static gchar *
    1397                 :           6 : accumulator_class_after_cb (gpointer instance, gpointer data)
    1398                 :             : {
    1399                 :           6 :   return g_strdup ("after");
    1400                 :             : }
    1401                 :             : 
    1402                 :             : static gchar *
    1403                 :          10 : accumulator_class (Test *test)
    1404                 :             : {
    1405                 :          10 :   return g_strdup ("class");
    1406                 :             : }
    1407                 :             : 
    1408                 :             : static void
    1409                 :           1 : test_accumulator_class (void)
    1410                 :             : {
    1411                 :             :   const struct {
    1412                 :             :     const gchar *signal_name;
    1413                 :             :     const gchar *return_string;
    1414                 :           1 :   } tests[] = {
    1415                 :             :     {"accumulator-class-first", "classbeforeafter"},
    1416                 :             :     {"accumulator-class-last", "beforeclassafter"},
    1417                 :             :     {"accumulator-class-cleanup", "beforeafterclass"},
    1418                 :             :     {"accumulator-class-first-last", "classbeforeclassafter"},
    1419                 :             :     {"accumulator-class-first-last-cleanup", "classbeforeclassafterclass"},
    1420                 :             :     {"accumulator-class-last-cleanup", "beforeclassafterclass"},
    1421                 :             :   };
    1422                 :             :   gsize i;
    1423                 :             : 
    1424                 :           7 :   for (i = 0; i < G_N_ELEMENTS (tests); i++)
    1425                 :             :     {
    1426                 :             :       GObject *test;
    1427                 :           6 :       gchar *ret = NULL;
    1428                 :             : 
    1429                 :           6 :       g_test_message ("Signal: %s", tests[i].signal_name);
    1430                 :             : 
    1431                 :           6 :       test = g_object_new (test_get_type (), NULL);
    1432                 :             : 
    1433                 :           6 :       g_signal_connect (test, tests[i].signal_name, G_CALLBACK (accumulator_class_before_cb), NULL);
    1434                 :           6 :       g_signal_connect_after (test, tests[i].signal_name, G_CALLBACK (accumulator_class_after_cb), NULL);
    1435                 :           6 :       g_signal_emit_by_name (test, tests[i].signal_name, &ret);
    1436                 :             : 
    1437                 :           6 :       g_assert_cmpstr (ret, ==, tests[i].return_string);
    1438                 :           6 :       g_free (ret);
    1439                 :             : 
    1440                 :           6 :       g_object_unref (test);
    1441                 :             :     }
    1442                 :           1 : }
    1443                 :             : 
    1444                 :             : static gboolean
    1445                 :          27 : in_set (const gchar *s,
    1446                 :             :         const gchar *set[])
    1447                 :             : {
    1448                 :             :   gint i;
    1449                 :             : 
    1450                 :         378 :   for (i = 0; set[i]; i++)
    1451                 :             :     {
    1452                 :         378 :       if (g_strcmp0 (s, set[i]) == 0)
    1453                 :          27 :         return TRUE;
    1454                 :             :     }
    1455                 :             : 
    1456                 :           0 :   return FALSE;
    1457                 :             : }
    1458                 :             : 
    1459                 :             : static void
    1460                 :           1 : test_introspection (void)
    1461                 :             : {
    1462                 :             :   guint *ids;
    1463                 :             :   guint n_ids;
    1464                 :             :   const gchar *name;
    1465                 :             :   guint i;
    1466                 :           1 :   const gchar *names[] = {
    1467                 :             :     "simple",
    1468                 :             :     "simple-detailed",
    1469                 :             :     "simple-2",
    1470                 :             :     "simple-accumulator",
    1471                 :             :     "accumulator-class-first",
    1472                 :             :     "accumulator-class-last",
    1473                 :             :     "accumulator-class-cleanup",
    1474                 :             :     "accumulator-class-first-last",
    1475                 :             :     "accumulator-class-first-last-cleanup",
    1476                 :             :     "accumulator-class-last-cleanup",
    1477                 :             :     "generic-marshaller-1",
    1478                 :             :     "generic-marshaller-2",
    1479                 :             :     "generic-marshaller-enum-return-signed",
    1480                 :             :     "generic-marshaller-enum-return-unsigned",
    1481                 :             :     "generic-marshaller-int-return",
    1482                 :             :     "va-marshaller-int-return",
    1483                 :             :     "generic-marshaller-uint-return",
    1484                 :             :     "generic-marshaller-interface-return",
    1485                 :             :     "va-marshaller-uint-return",
    1486                 :             :     "variant-changed-no-slot",
    1487                 :             :     "variant-changed",
    1488                 :             :     "all-types",
    1489                 :             :     "all-types-va",
    1490                 :             :     "all-types-generic",
    1491                 :             :     "all-types-null",
    1492                 :             :     "all-types-empty",
    1493                 :             :     "custom-marshaller",
    1494                 :             :     NULL
    1495                 :             :   };
    1496                 :             :   GSignalQuery query;
    1497                 :             : 
    1498                 :           1 :   ids = g_signal_list_ids (test_get_type (), &n_ids);
    1499                 :           1 :   g_assert_cmpuint (n_ids, ==, g_strv_length ((gchar**)names));
    1500                 :             : 
    1501                 :          28 :   for (i = 0; i < n_ids; i++)
    1502                 :             :     {
    1503                 :          27 :       name = g_signal_name (ids[i]);
    1504                 :          27 :       g_assert_true (in_set (name, names));
    1505                 :             :     }
    1506                 :             : 
    1507                 :           1 :   g_signal_query (simple_id, &query);
    1508                 :           1 :   g_assert_cmpuint (query.signal_id, ==, simple_id);
    1509                 :           1 :   g_assert_cmpstr (query.signal_name, ==, "simple");
    1510                 :           1 :   g_assert_true (query.itype == test_get_type ());
    1511                 :           1 :   g_assert_cmpint (query.signal_flags, ==, G_SIGNAL_RUN_LAST);
    1512                 :           1 :   g_assert_cmpint (query.return_type, ==, G_TYPE_NONE);
    1513                 :           1 :   g_assert_cmpuint (query.n_params, ==, 0);
    1514                 :             : 
    1515                 :           1 :   g_free (ids);
    1516                 :           1 : }
    1517                 :             : 
    1518                 :             : static void
    1519                 :           7 : test_handler (gpointer instance, gpointer data)
    1520                 :             : {
    1521                 :           7 :   gint *count = data;
    1522                 :             : 
    1523                 :           7 :   (*count)++;
    1524                 :           7 : }
    1525                 :             : 
    1526                 :             : static void
    1527                 :           1 : test_block_handler (void)
    1528                 :             : {
    1529                 :             :   GObject *test1, *test2;
    1530                 :           1 :   gint count1 = 0;
    1531                 :           1 :   gint count2 = 0;
    1532                 :             :   gulong handler1, handler;
    1533                 :             : 
    1534                 :           1 :   test1 = g_object_new (test_get_type (), NULL);
    1535                 :           1 :   test2 = g_object_new (test_get_type (), NULL);
    1536                 :             : 
    1537                 :           1 :   handler1 = g_signal_connect (test1, "simple", G_CALLBACK (test_handler), &count1);
    1538                 :           1 :   g_signal_connect (test2, "simple", G_CALLBACK (test_handler), &count2);
    1539                 :             : 
    1540                 :           1 :   handler = g_signal_handler_find (test1, G_SIGNAL_MATCH_ID, simple_id, 0, NULL, NULL, NULL);
    1541                 :             : 
    1542                 :           1 :   g_assert_true (handler == handler1);
    1543                 :             : 
    1544                 :           1 :   g_assert_cmpint (count1, ==, 0);
    1545                 :           1 :   g_assert_cmpint (count2, ==, 0);
    1546                 :             : 
    1547                 :           1 :   g_signal_emit_by_name (test1, "simple");
    1548                 :           1 :   g_signal_emit_by_name (test2, "simple");
    1549                 :             : 
    1550                 :           1 :   g_assert_cmpint (count1, ==, 1);
    1551                 :           1 :   g_assert_cmpint (count2, ==, 1);
    1552                 :             : 
    1553                 :           1 :   g_signal_handler_block (test1, handler1);
    1554                 :             : 
    1555                 :           1 :   g_signal_emit_by_name (test1, "simple");
    1556                 :           1 :   g_signal_emit_by_name (test2, "simple");
    1557                 :             : 
    1558                 :           1 :   g_assert_cmpint (count1, ==, 1);
    1559                 :           1 :   g_assert_cmpint (count2, ==, 2);
    1560                 :             : 
    1561                 :           1 :   g_signal_handler_unblock (test1, handler1);
    1562                 :             : 
    1563                 :           1 :   g_signal_emit_by_name (test1, "simple");
    1564                 :           1 :   g_signal_emit_by_name (test2, "simple");
    1565                 :             : 
    1566                 :           1 :   g_assert_cmpint (count1, ==, 2);
    1567                 :           1 :   g_assert_cmpint (count2, ==, 3);
    1568                 :             : 
    1569                 :           1 :   g_assert_cmpuint (g_signal_handlers_block_matched (test1, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, test_block_handler, NULL), ==, 0);
    1570                 :           1 :   g_assert_cmpuint (g_signal_handlers_block_matched (test2, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, test_handler, NULL), ==, 1);
    1571                 :             : 
    1572                 :           1 :   g_signal_emit_by_name (test1, "simple");
    1573                 :           1 :   g_signal_emit_by_name (test2, "simple");
    1574                 :             : 
    1575                 :           1 :   g_assert_cmpint (count1, ==, 3);
    1576                 :           1 :   g_assert_cmpint (count2, ==, 3);
    1577                 :             : 
    1578                 :           1 :   g_signal_handlers_unblock_matched (test2, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, test_handler, NULL);
    1579                 :             : 
    1580                 :             :   /* Test match by signal ID. */
    1581                 :           1 :   g_assert_cmpuint (g_signal_handlers_block_matched (test1, G_SIGNAL_MATCH_ID, simple_id, 0, NULL, NULL, NULL), ==, 1);
    1582                 :             : 
    1583                 :           1 :   g_signal_emit_by_name (test1, "simple");
    1584                 :           1 :   g_signal_emit_by_name (test2, "simple");
    1585                 :             : 
    1586                 :           1 :   g_assert_cmpint (count1, ==, 3);
    1587                 :           1 :   g_assert_cmpint (count2, ==, 4);
    1588                 :             : 
    1589                 :           1 :   g_assert_cmpuint (g_signal_handlers_unblock_matched (test1, G_SIGNAL_MATCH_ID, simple_id, 0, NULL, NULL, NULL), ==, 1);
    1590                 :             : 
    1591                 :             :   /* Match types are conjunctive */
    1592                 :           1 :   g_assert_cmpuint (g_signal_handlers_block_matched (test1, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, test_handler, "will not match"), ==, 0);
    1593                 :           1 :   g_assert_cmpuint (g_signal_handlers_block_matched (test1, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, test_handler, &count1), ==, 1);
    1594                 :           1 :   g_assert_cmpuint (g_signal_handlers_unblock_matched (test1, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, test_handler, &count1), ==, 1);
    1595                 :             : 
    1596                 :             :   /* Test g_signal_handlers_disconnect_matched for G_SIGNAL_MATCH_ID match */
    1597                 :           1 :   g_assert_cmpuint (g_signal_handlers_disconnect_matched (test1,
    1598                 :             :                                                           G_SIGNAL_MATCH_ID,
    1599                 :             :                                                           simple_id, 0,
    1600                 :             :                                                           NULL, NULL, NULL),
    1601                 :             :                     ==,
    1602                 :             :                     1);
    1603                 :           1 :   g_assert_cmpuint (g_signal_handler_find (test1,
    1604                 :             :                                            G_SIGNAL_MATCH_ID,
    1605                 :             :                                            simple_id, 0,
    1606                 :             :                                            NULL, NULL, NULL),
    1607                 :             :                     ==,
    1608                 :             :                     0);
    1609                 :             : 
    1610                 :           1 :   g_object_unref (test1);
    1611                 :           1 :   g_object_unref (test2);
    1612                 :           1 : }
    1613                 :             : 
    1614                 :             : static void
    1615                 :           1 : stop_emission (gpointer instance, gpointer data)
    1616                 :             : {
    1617                 :           1 :   g_signal_stop_emission (instance, simple_id, 0);
    1618                 :           1 : }
    1619                 :             : 
    1620                 :             : static void
    1621                 :           1 : stop_emission_by_name (gpointer instance, gpointer data)
    1622                 :             : {
    1623                 :           1 :   g_signal_stop_emission_by_name (instance, "simple");
    1624                 :           1 : }
    1625                 :             : 
    1626                 :             : static void
    1627                 :           0 : dont_reach (gpointer instance, gpointer data)
    1628                 :             : {
    1629                 :             :   g_assert_not_reached ();
    1630                 :             : }
    1631                 :             : 
    1632                 :             : static void
    1633                 :           1 : test_stop_emission (void)
    1634                 :             : {
    1635                 :             :   GObject *test1;
    1636                 :             :   gulong handler;
    1637                 :             : 
    1638                 :           1 :   test1 = g_object_new (test_get_type (), NULL);
    1639                 :           1 :   handler = g_signal_connect (test1, "simple", G_CALLBACK (stop_emission), NULL);
    1640                 :           1 :   g_signal_connect_after (test1, "simple", G_CALLBACK (dont_reach), NULL);
    1641                 :             : 
    1642                 :           1 :   g_signal_emit_by_name (test1, "simple");
    1643                 :             : 
    1644                 :           1 :   g_signal_handler_disconnect (test1, handler);
    1645                 :           1 :   g_signal_connect (test1, "simple", G_CALLBACK (stop_emission_by_name), NULL);
    1646                 :             : 
    1647                 :           1 :   g_signal_emit_by_name (test1, "simple");
    1648                 :             : 
    1649                 :           1 :   g_object_unref (test1);
    1650                 :           1 : }
    1651                 :             : 
    1652                 :             : static void
    1653                 :           1 : test_signal_disconnect_wrong_object (void)
    1654                 :             : {
    1655                 :             :   Test *object, *object2;
    1656                 :             :   Test2 *object3;
    1657                 :             :   guint signal_id;
    1658                 :             : 
    1659                 :           1 :   object = g_object_new (test_get_type (), NULL);
    1660                 :           1 :   object2 = g_object_new (test_get_type (), NULL);
    1661                 :           1 :   object3 = g_object_new (test2_get_type (), NULL);
    1662                 :             : 
    1663                 :           1 :   signal_id = g_signal_connect (object,
    1664                 :             :                                 "simple",
    1665                 :             :                                 G_CALLBACK (simple_handler1),
    1666                 :             :                                 NULL);
    1667                 :             : 
    1668                 :             :   /* disconnect from the wrong object (same type), should warn */
    1669                 :           1 :   g_test_expect_message ("GLib-GObject", G_LOG_LEVEL_CRITICAL,
    1670                 :             :                          "*: instance '*' has no handler with id '*'");
    1671                 :           1 :   g_signal_handler_disconnect (object2, signal_id);
    1672                 :           1 :   g_test_assert_expected_messages ();
    1673                 :             : 
    1674                 :             :   /* and from an object of the wrong type */
    1675                 :           1 :   g_test_expect_message ("GLib-GObject", G_LOG_LEVEL_CRITICAL,
    1676                 :             :                          "*: instance '*' has no handler with id '*'");
    1677                 :           1 :   g_signal_handler_disconnect (object3, signal_id);
    1678                 :           1 :   g_test_assert_expected_messages ();
    1679                 :             : 
    1680                 :             :   /* it's still connected */
    1681                 :           1 :   g_assert_true (g_signal_handler_is_connected (object, signal_id));
    1682                 :             : 
    1683                 :           1 :   g_object_unref (object);
    1684                 :           1 :   g_object_unref (object2);
    1685                 :           1 :   g_object_unref (object3);
    1686                 :           1 : }
    1687                 :             : 
    1688                 :             : static void
    1689                 :           1 : test_clear_signal_handler (void)
    1690                 :             : {
    1691                 :             :   GObject *test_obj;
    1692                 :             :   gulong handler;
    1693                 :             : 
    1694                 :           1 :   test_obj = g_object_new (test_get_type (), NULL);
    1695                 :             : 
    1696                 :           1 :   handler = g_signal_connect (test_obj, "simple", G_CALLBACK (dont_reach), NULL);
    1697                 :           1 :   g_assert_cmpuint (handler, >, 0);
    1698                 :             : 
    1699                 :           1 :   g_clear_signal_handler (&handler, test_obj);
    1700                 :           1 :   g_assert_cmpuint (handler, ==, 0);
    1701                 :             : 
    1702                 :           1 :   g_signal_emit_by_name (test_obj, "simple");
    1703                 :             : 
    1704                 :           1 :   g_clear_signal_handler (&handler, test_obj);
    1705                 :             : 
    1706                 :           1 :   if (g_test_undefined ())
    1707                 :             :     {
    1708                 :           1 :       handler = g_random_int_range (0x01, 0xFF);
    1709                 :           1 :       g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
    1710                 :             :                              "*instance '* has no handler with id *'");
    1711                 :           1 :       g_clear_signal_handler (&handler, test_obj);
    1712                 :           1 :       g_assert_cmpuint (handler, ==, 0);
    1713                 :           1 :       g_test_assert_expected_messages ();
    1714                 :             :     }
    1715                 :             : 
    1716                 :           1 :   g_object_unref (test_obj);
    1717                 :           1 : }
    1718                 :             : 
    1719                 :             : static void
    1720                 :           1 : test_lookup (void)
    1721                 :             : {
    1722                 :             :   GTypeClass *test_class;
    1723                 :             :   guint signal_id, saved_signal_id;
    1724                 :             : 
    1725                 :           1 :   g_test_summary ("Test that g_signal_lookup() works with a variety of inputs.");
    1726                 :             : 
    1727                 :           1 :   test_class = g_type_class_ref (test_get_type ());
    1728                 :             : 
    1729                 :           1 :   signal_id = g_signal_lookup ("all-types", test_get_type ());
    1730                 :           1 :   g_assert_cmpint (signal_id, !=, 0);
    1731                 :             : 
    1732                 :           1 :   saved_signal_id = signal_id;
    1733                 :             : 
    1734                 :             :   /* Try with a non-canonical name. */
    1735                 :           1 :   signal_id = g_signal_lookup ("all_types", test_get_type ());
    1736                 :           1 :   g_assert_cmpint (signal_id, ==, saved_signal_id);
    1737                 :             : 
    1738                 :             :   /* Looking up a non-existent signal should return nothing. */
    1739                 :           1 :   g_assert_cmpint (g_signal_lookup ("nope", test_get_type ()), ==, 0);
    1740                 :             : 
    1741                 :           1 :   g_type_class_unref (test_class);
    1742                 :           1 : }
    1743                 :             : 
    1744                 :             : static void
    1745                 :           1 : test_lookup_invalid (void)
    1746                 :             : {
    1747                 :           1 :   g_test_summary ("Test that g_signal_lookup() emits a warning if looking up an invalid signal name.");
    1748                 :             : 
    1749                 :           1 :   if (g_test_subprocess ())
    1750                 :             :     {
    1751                 :             :       GTypeClass *test_class;
    1752                 :             :       guint signal_id;
    1753                 :             : 
    1754                 :           0 :       test_class = g_type_class_ref (test_get_type ());
    1755                 :             : 
    1756                 :           0 :       signal_id = g_signal_lookup ("", test_get_type ());
    1757                 :           0 :       g_assert_cmpint (signal_id, ==, 0);
    1758                 :             : 
    1759                 :           0 :       g_type_class_unref (test_class);
    1760                 :           0 :       return;
    1761                 :             :     }
    1762                 :             : 
    1763                 :           1 :   g_test_trap_subprocess (NULL, 0, G_TEST_SUBPROCESS_DEFAULT);
    1764                 :           1 :   g_test_trap_assert_failed ();
    1765                 :           1 :   g_test_trap_assert_stderr ("*CRITICAL*unable to look up invalid signal name*");
    1766                 :             : }
    1767                 :             : 
    1768                 :             : static void
    1769                 :           1 : test_parse_name (void)
    1770                 :             : {
    1771                 :             :   GTypeClass *test_class;
    1772                 :             :   guint signal_id, saved_signal_id;
    1773                 :             :   gboolean retval;
    1774                 :             :   GQuark detail, saved_detail;
    1775                 :             : 
    1776                 :           1 :   g_test_summary ("Test that g_signal_parse_name() works with a variety of inputs.");
    1777                 :             : 
    1778                 :           1 :   test_class = g_type_class_ref (test_get_type ());
    1779                 :             : 
    1780                 :             :   /* Simple test. */
    1781                 :           1 :   retval = g_signal_parse_name ("simple-detailed", test_get_type (), &signal_id, &detail, TRUE);
    1782                 :           1 :   g_assert_true (retval);
    1783                 :           1 :   g_assert_cmpint (signal_id, !=, 0);
    1784                 :           1 :   g_assert_cmpint (detail, ==, 0);
    1785                 :             : 
    1786                 :           1 :   saved_signal_id = signal_id;
    1787                 :             : 
    1788                 :             :   /* Simple test with detail. */
    1789                 :           1 :   retval = g_signal_parse_name ("simple-detailed::a-detail", test_get_type (), &signal_id, &detail, TRUE);
    1790                 :           1 :   g_assert_true (retval);
    1791                 :           1 :   g_assert_cmpint (signal_id, ==, saved_signal_id);
    1792                 :           1 :   g_assert_cmpint (detail, !=, 0);
    1793                 :             : 
    1794                 :           1 :   saved_detail = detail;
    1795                 :             : 
    1796                 :             :   /* Simple test with the same detail again. */
    1797                 :           1 :   retval = g_signal_parse_name ("simple-detailed::a-detail", test_get_type (), &signal_id, &detail, FALSE);
    1798                 :           1 :   g_assert_true (retval);
    1799                 :           1 :   g_assert_cmpint (signal_id, ==, saved_signal_id);
    1800                 :           1 :   g_assert_cmpint (detail, ==, saved_detail);
    1801                 :             : 
    1802                 :             :   /* Simple test with a new detail. */
    1803                 :           1 :   retval = g_signal_parse_name ("simple-detailed::another-detail", test_get_type (), &signal_id, &detail, FALSE);
    1804                 :           1 :   g_assert_true (retval);
    1805                 :           1 :   g_assert_cmpint (signal_id, ==, saved_signal_id);
    1806                 :           1 :   g_assert_cmpint (detail, ==, 0);  /* we didn’t force the quark */
    1807                 :             : 
    1808                 :             :   /* Canonicalisation shouldn’t affect the results. */
    1809                 :           1 :   retval = g_signal_parse_name ("simple_detailed::a-detail", test_get_type (), &signal_id, &detail, FALSE);
    1810                 :           1 :   g_assert_true (retval);
    1811                 :           1 :   g_assert_cmpint (signal_id, ==, saved_signal_id);
    1812                 :           1 :   g_assert_cmpint (detail, ==, saved_detail);
    1813                 :             : 
    1814                 :             :   /* Details don’t have to look like property names. */
    1815                 :           1 :   retval = g_signal_parse_name ("simple-detailed::hello::world", test_get_type (), &signal_id, &detail, TRUE);
    1816                 :           1 :   g_assert_true (retval);
    1817                 :           1 :   g_assert_cmpint (signal_id, ==, saved_signal_id);
    1818                 :           1 :   g_assert_cmpint (detail, !=, 0);
    1819                 :             : 
    1820                 :             :   /* Trying to parse a detail for a signal which isn’t %G_SIGNAL_DETAILED should fail. */
    1821                 :           1 :   retval = g_signal_parse_name ("all-types::a-detail", test_get_type (), &signal_id, &detail, FALSE);
    1822                 :           1 :   g_assert_false (retval);
    1823                 :             : 
    1824                 :           1 :   g_type_class_unref (test_class);
    1825                 :           1 : }
    1826                 :             : 
    1827                 :             : static void
    1828                 :           1 : test_parse_name_invalid (void)
    1829                 :             : {
    1830                 :             :   GTypeClass *test_class;
    1831                 :             :   gsize i;
    1832                 :             :   guint signal_id;
    1833                 :             :   GQuark detail;
    1834                 :           1 :   const gchar *vectors[] =
    1835                 :             :     {
    1836                 :             :       "",
    1837                 :             :       "7zip",
    1838                 :             :       "invalid:signal",
    1839                 :             :       "simple-detailed::",
    1840                 :             :       "simple-detailed:",
    1841                 :             :       ":",
    1842                 :             :       "::",
    1843                 :             :       ":valid-detail",
    1844                 :             :       "::valid-detail",
    1845                 :             :     };
    1846                 :             : 
    1847                 :           1 :   g_test_summary ("Test that g_signal_parse_name() ignores a variety of invalid inputs.");
    1848                 :             : 
    1849                 :           1 :   test_class = g_type_class_ref (test_get_type ());
    1850                 :             : 
    1851                 :          10 :   for (i = 0; i < G_N_ELEMENTS (vectors); i++)
    1852                 :             :     {
    1853                 :           9 :       g_test_message ("Parser input: %s", vectors[i]);
    1854                 :           9 :       g_assert_false (g_signal_parse_name (vectors[i], test_get_type (), &signal_id, &detail, TRUE));
    1855                 :             :     }
    1856                 :             : 
    1857                 :           1 :   g_type_class_unref (test_class);
    1858                 :           1 : }
    1859                 :             : 
    1860                 :             : static void
    1861                 :           3 : test_signals_invalid_name (gconstpointer test_data)
    1862                 :             : {
    1863                 :           3 :   const gchar *signal_name = test_data;
    1864                 :             : 
    1865                 :           3 :   g_test_summary ("Check that g_signal_new() rejects invalid signal names.");
    1866                 :             : 
    1867                 :           3 :   if (g_test_subprocess ())
    1868                 :             :     {
    1869                 :           0 :       g_signal_new (signal_name,
    1870                 :             :                     test_get_type (),
    1871                 :             :                     G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE,
    1872                 :             :                     0,
    1873                 :             :                     NULL, NULL,
    1874                 :             :                     NULL,
    1875                 :             :                     G_TYPE_NONE,
    1876                 :             :                     0);
    1877                 :           0 :       return;
    1878                 :             :     }
    1879                 :             : 
    1880                 :           3 :   g_test_trap_subprocess (NULL, 0, G_TEST_SUBPROCESS_DEFAULT);
    1881                 :           3 :   g_test_trap_assert_failed ();
    1882                 :           3 :   g_test_trap_assert_stderr ("*CRITICAL*g_signal_is_valid_name (signal_name)*");
    1883                 :             : }
    1884                 :             : 
    1885                 :             : static void
    1886                 :           1 : test_signal_is_valid_name (void)
    1887                 :             : {
    1888                 :           1 :   const gchar *valid_names[] =
    1889                 :             :     {
    1890                 :             :       "signal",
    1891                 :             :       "i",
    1892                 :             :       "multiple-segments",
    1893                 :             :       "segment0-SEGMENT1",
    1894                 :             :       "using_underscores",
    1895                 :             :     };
    1896                 :           1 :   const gchar *invalid_names[] =
    1897                 :             :     {
    1898                 :             :       "",
    1899                 :             :       "7zip",
    1900                 :             :       "my_int:hello",
    1901                 :             :     };
    1902                 :             :   gsize i;
    1903                 :             : 
    1904                 :           6 :   for (i = 0; i < G_N_ELEMENTS (valid_names); i++)
    1905                 :           5 :     g_assert_true (g_signal_is_valid_name (valid_names[i]));
    1906                 :             : 
    1907                 :           4 :   for (i = 0; i < G_N_ELEMENTS (invalid_names); i++)
    1908                 :           3 :     g_assert_false (g_signal_is_valid_name (invalid_names[i]));
    1909                 :           1 : }
    1910                 :             : 
    1911                 :             : static void
    1912                 :           1 : test_emitv (void)
    1913                 :             : {
    1914                 :             :   GArray *values;
    1915                 :             :   GObject *test;
    1916                 :           1 :   GValue return_value = G_VALUE_INIT;
    1917                 :           1 :   gint count = 0;
    1918                 :             :   guint signal_id;
    1919                 :             :   gulong hook;
    1920                 :             :   gulong id;
    1921                 :             : 
    1922                 :           1 :   test = g_object_new (test_get_type (), NULL);
    1923                 :             : 
    1924                 :           1 :   values = g_array_new (TRUE, TRUE, sizeof (GValue));
    1925                 :           1 :   g_array_set_clear_func (values, (GDestroyNotify) g_value_unset);
    1926                 :             : 
    1927                 :           1 :   g_array_set_size (values, 1);
    1928                 :           1 :   g_value_init (&g_array_index (values, GValue, 0), G_TYPE_OBJECT);
    1929                 :           1 :   g_value_set_object (&g_array_index (values, GValue, 0), test);
    1930                 :           1 :   hook = g_signal_add_emission_hook (simple_id, 0, hook_func, &count, NULL);
    1931                 :           1 :   g_assert_cmpint (count, ==, 0);
    1932                 :           1 :   g_signal_emitv ((GValue *) values->data, simple_id, 0, NULL);
    1933                 :           1 :   g_assert_cmpint (count, ==, 1);
    1934                 :           1 :   g_signal_remove_emission_hook (simple_id, hook);
    1935                 :             : 
    1936                 :           1 :   g_array_set_size (values, 20);
    1937                 :           1 :   g_value_init (&g_array_index (values, GValue, 1), G_TYPE_INT);
    1938                 :           1 :   g_value_set_int (&g_array_index (values, GValue, 1), 42);
    1939                 :             : 
    1940                 :           1 :   g_value_init (&g_array_index (values, GValue, 2), G_TYPE_BOOLEAN);
    1941                 :           1 :   g_value_set_boolean (&g_array_index (values, GValue, 2), TRUE);
    1942                 :             : 
    1943                 :           1 :   g_value_init (&g_array_index (values, GValue, 3), G_TYPE_CHAR);
    1944                 :           1 :   g_value_set_schar (&g_array_index (values, GValue, 3), 17);
    1945                 :             : 
    1946                 :           1 :   g_value_init (&g_array_index (values, GValue, 4), G_TYPE_UCHAR);
    1947                 :           1 :   g_value_set_uchar (&g_array_index (values, GValue, 4), 140);
    1948                 :             : 
    1949                 :           1 :   g_value_init (&g_array_index (values, GValue, 5), G_TYPE_UINT);
    1950                 :           1 :   g_value_set_uint (&g_array_index (values, GValue, 5), G_MAXUINT - 42);
    1951                 :             : 
    1952                 :           1 :   g_value_init (&g_array_index (values, GValue, 6), G_TYPE_LONG);
    1953                 :           1 :   g_value_set_long (&g_array_index (values, GValue, 6), -1117);
    1954                 :             : 
    1955                 :           1 :   g_value_init (&g_array_index (values, GValue, 7), G_TYPE_ULONG);
    1956                 :           1 :   g_value_set_ulong (&g_array_index (values, GValue, 7), G_MAXULONG - 999);
    1957                 :             : 
    1958                 :           1 :   g_value_init (&g_array_index (values, GValue, 8), enum_type);
    1959                 :           1 :   g_value_set_enum (&g_array_index (values, GValue, 8), MY_ENUM_VALUE);
    1960                 :             : 
    1961                 :           1 :   g_value_init (&g_array_index (values, GValue, 9), flags_type);
    1962                 :           1 :   g_value_set_flags (&g_array_index (values, GValue, 9),
    1963                 :             :                      MY_FLAGS_FIRST_BIT | MY_FLAGS_THIRD_BIT | MY_FLAGS_LAST_BIT);
    1964                 :             : 
    1965                 :           1 :   g_value_init (&g_array_index (values, GValue, 10), G_TYPE_FLOAT);
    1966                 :           1 :   g_value_set_float (&g_array_index (values, GValue, 10), 0.25);
    1967                 :             : 
    1968                 :           1 :   g_value_init (&g_array_index (values, GValue, 11), G_TYPE_DOUBLE);
    1969                 :           1 :   g_value_set_double (&g_array_index (values, GValue, 11), 1.5);
    1970                 :             : 
    1971                 :           1 :   g_value_init (&g_array_index (values, GValue, 12), G_TYPE_STRING);
    1972                 :           1 :   g_value_set_string (&g_array_index (values, GValue, 12), "Test");
    1973                 :             : 
    1974                 :           1 :   g_value_init (&g_array_index (values, GValue, 13), G_TYPE_PARAM_LONG);
    1975                 :           1 :   g_value_take_param (&g_array_index (values, GValue, 13),
    1976                 :             :                       g_param_spec_long  ("param", "nick", "blurb", 0, 10, 4, 0));
    1977                 :             : 
    1978                 :           1 :   g_value_init (&g_array_index (values, GValue, 14), G_TYPE_BYTES);
    1979                 :           1 :   g_value_take_boxed (&g_array_index (values, GValue, 14),
    1980                 :           1 :                       g_bytes_new_static ("Blah", 5));
    1981                 :             : 
    1982                 :           1 :   g_value_init (&g_array_index (values, GValue, 15), G_TYPE_POINTER);
    1983                 :           1 :   g_value_set_pointer (&g_array_index (values, GValue, 15), &enum_type);
    1984                 :             : 
    1985                 :           1 :   g_value_init (&g_array_index (values, GValue, 16), test_get_type ());
    1986                 :           1 :   g_value_set_object (&g_array_index (values, GValue, 16), test);
    1987                 :             : 
    1988                 :           1 :   g_value_init (&g_array_index (values, GValue, 17), G_TYPE_VARIANT);
    1989                 :           1 :   g_value_take_variant (&g_array_index (values, GValue, 17),
    1990                 :             :                         g_variant_ref_sink (g_variant_new_uint16 (99)));
    1991                 :             : 
    1992                 :           1 :   g_value_init (&g_array_index (values, GValue, 18), G_TYPE_INT64);
    1993                 :           1 :   g_value_set_int64 (&g_array_index (values, GValue, 18), G_MAXINT64 - 1234);
    1994                 :             : 
    1995                 :           1 :   g_value_init (&g_array_index (values, GValue, 19), G_TYPE_UINT64);
    1996                 :           1 :   g_value_set_uint64 (&g_array_index (values, GValue, 19), G_MAXUINT64 - 123456);
    1997                 :             : 
    1998                 :           1 :   id = g_signal_connect (test, "all-types", G_CALLBACK (all_types_handler_cb), &flags_type);
    1999                 :           1 :   signal_id = g_signal_lookup ("all-types", test_get_type ());
    2000                 :           1 :   g_assert_cmpuint (signal_id, >, 0);
    2001                 :             : 
    2002                 :           1 :   count = 0;
    2003                 :           1 :   hook = g_signal_add_emission_hook (signal_id, 0, hook_func, &count, NULL);
    2004                 :           1 :   g_assert_cmpint (count, ==, 0);
    2005                 :           1 :   g_signal_emitv ((GValue *) values->data, signal_id, 0, NULL);
    2006                 :           1 :   g_assert_cmpint (count, ==, 1);
    2007                 :           1 :   g_signal_remove_emission_hook (signal_id, hook);
    2008                 :           1 :   g_clear_signal_handler (&id, test);
    2009                 :             : 
    2010                 :             : 
    2011                 :           1 :   signal_id = g_signal_lookup ("generic-marshaller-int-return", test_get_type ());
    2012                 :           1 :   g_assert_cmpuint (signal_id, >, 0);
    2013                 :           1 :   g_array_set_size (values, 1);
    2014                 :             : 
    2015                 :           1 :   id = g_signal_connect (test,
    2016                 :             :                          "generic-marshaller-int-return",
    2017                 :             :                          G_CALLBACK (on_generic_marshaller_int_return_signed_1),
    2018                 :             :                          NULL);
    2019                 :             : 
    2020                 :           1 :   count = 0;
    2021                 :           1 :   hook = g_signal_add_emission_hook (signal_id, 0, hook_func, &count, NULL);
    2022                 :           1 :   g_assert_cmpint (count, ==, 0);
    2023                 :           1 :   g_value_init (&return_value, G_TYPE_INT);
    2024                 :           1 :   g_signal_emitv ((GValue *) values->data, signal_id, 0, &return_value);
    2025                 :           1 :   g_assert_cmpint (count, ==, 1);
    2026                 :           1 :   g_assert_cmpint (g_value_get_int (&return_value), ==, -30);
    2027                 :           1 :   g_signal_remove_emission_hook (signal_id, hook);
    2028                 :           1 :   g_clear_signal_handler (&id, test);
    2029                 :             : 
    2030                 :             : #ifdef G_ENABLE_DEBUG
    2031                 :           1 :   g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
    2032                 :             :                          "*return*value*generic-marshaller-int-return*NULL*");
    2033                 :           1 :   g_signal_emitv ((GValue *) values->data, signal_id, 0, NULL);
    2034                 :           1 :   g_test_assert_expected_messages ();
    2035                 :             : 
    2036                 :           1 :   g_value_unset (&return_value);
    2037                 :           1 :   g_value_init (&return_value, G_TYPE_FLOAT);
    2038                 :           1 :   g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
    2039                 :             :                          "*return*value*generic-marshaller-int-return*gfloat*");
    2040                 :           1 :   g_signal_emitv ((GValue *) values->data, signal_id, 0, &return_value);
    2041                 :           1 :   g_test_assert_expected_messages ();
    2042                 :             : #endif
    2043                 :             : 
    2044                 :           1 :   g_object_unref (test);
    2045                 :           1 :   g_array_unref (values);
    2046                 :           1 : }
    2047                 :             : 
    2048                 :             : typedef struct
    2049                 :             : {
    2050                 :             :   GWeakRef wr;
    2051                 :             :   gulong handler;
    2052                 :             : } TestWeakRefDisconnect;
    2053                 :             : 
    2054                 :             : static void
    2055                 :           1 : weak_ref_disconnect_notify (gpointer  data,
    2056                 :             :                             GObject  *where_object_was)
    2057                 :             : {
    2058                 :           1 :   TestWeakRefDisconnect *state = data;
    2059                 :           1 :   g_assert_null (g_weak_ref_get (&state->wr));
    2060                 :           1 :   state->handler = 0;
    2061                 :           1 : }
    2062                 :             : 
    2063                 :             : static void
    2064                 :           1 : test_weak_ref_disconnect (void)
    2065                 :             : {
    2066                 :             :   TestWeakRefDisconnect state;
    2067                 :             :   GObject *test;
    2068                 :             : 
    2069                 :           1 :   test = g_object_new (test_get_type (), NULL);
    2070                 :           1 :   g_weak_ref_init (&state.wr, test);
    2071                 :           1 :   state.handler = g_signal_connect_data (test,
    2072                 :             :                                          "simple",
    2073                 :             :                                          G_CALLBACK (dont_reach),
    2074                 :             :                                          &state,
    2075                 :             :                                          (GClosureNotify) weak_ref_disconnect_notify,
    2076                 :             :                                          0);
    2077                 :           1 :   g_assert_cmpint (state.handler, >, 0);
    2078                 :             : 
    2079                 :           1 :   g_object_unref (test);
    2080                 :             : 
    2081                 :           1 :   g_assert_cmpint (state.handler, ==, 0);
    2082                 :           1 :   g_assert_null (g_weak_ref_get (&state.wr));
    2083                 :           1 :   g_weak_ref_clear (&state.wr);
    2084                 :           1 : }
    2085                 :             : 
    2086                 :             : /* --- */
    2087                 :             : 
    2088                 :             : int
    2089                 :           1 : main (int argc,
    2090                 :             :      char *argv[])
    2091                 :             : {
    2092                 :           1 :   g_test_init (&argc, &argv, NULL);
    2093                 :             : 
    2094                 :           1 :   g_test_add_func ("/gobject/signals/all-types", test_all_types);
    2095                 :           1 :   g_test_add_func ("/gobject/signals/variant", test_variant_signal);
    2096                 :           1 :   g_test_add_func ("/gobject/signals/destroy-target-object", test_destroy_target_object);
    2097                 :           1 :   g_test_add_func ("/gobject/signals/generic-marshaller-1", test_generic_marshaller_signal_1);
    2098                 :           1 :   g_test_add_func ("/gobject/signals/generic-marshaller-2", test_generic_marshaller_signal_2);
    2099                 :           1 :   g_test_add_func ("/gobject/signals/generic-marshaller-enum-return-signed", test_generic_marshaller_signal_enum_return_signed);
    2100                 :           1 :   g_test_add_func ("/gobject/signals/generic-marshaller-enum-return-unsigned", test_generic_marshaller_signal_enum_return_unsigned);
    2101                 :           1 :   g_test_add_func ("/gobject/signals/generic-marshaller-int-return", test_generic_marshaller_signal_int_return);
    2102                 :           1 :   g_test_add_func ("/gobject/signals/generic-marshaller-uint-return", test_generic_marshaller_signal_uint_return);
    2103                 :           1 :   g_test_add_func ("/gobject/signals/generic-marshaller-interface-return", test_generic_marshaller_signal_interface_return);
    2104                 :           1 :   g_test_add_func ("/gobject/signals/custom-marshaller", test_custom_marshaller);
    2105                 :           1 :   g_test_add_func ("/gobject/signals/connect", test_connect);
    2106                 :           1 :   g_test_add_func ("/gobject/signals/emission-hook", test_emission_hook);
    2107                 :           1 :   g_test_add_func ("/gobject/signals/emitv", test_emitv);
    2108                 :           1 :   g_test_add_func ("/gobject/signals/accumulator", test_accumulator);
    2109                 :           1 :   g_test_add_func ("/gobject/signals/accumulator-class", test_accumulator_class);
    2110                 :           1 :   g_test_add_func ("/gobject/signals/introspection", test_introspection);
    2111                 :           1 :   g_test_add_func ("/gobject/signals/block-handler", test_block_handler);
    2112                 :           1 :   g_test_add_func ("/gobject/signals/stop-emission", test_stop_emission);
    2113                 :           1 :   g_test_add_func ("/gobject/signals/invocation-hint", test_invocation_hint);
    2114                 :           1 :   g_test_add_func ("/gobject/signals/test-disconnection-wrong-object", test_signal_disconnect_wrong_object);
    2115                 :           1 :   g_test_add_func ("/gobject/signals/clear-signal-handler", test_clear_signal_handler);
    2116                 :           1 :   g_test_add_func ("/gobject/signals/lookup", test_lookup);
    2117                 :           1 :   g_test_add_func ("/gobject/signals/lookup/invalid", test_lookup_invalid);
    2118                 :           1 :   g_test_add_func ("/gobject/signals/parse-name", test_parse_name);
    2119                 :           1 :   g_test_add_func ("/gobject/signals/parse-name/invalid", test_parse_name_invalid);
    2120                 :           1 :   g_test_add_data_func ("/gobject/signals/invalid-name/colon", "my_int:hello", test_signals_invalid_name);
    2121                 :           1 :   g_test_add_data_func ("/gobject/signals/invalid-name/first-char", "7zip", test_signals_invalid_name);
    2122                 :           1 :   g_test_add_data_func ("/gobject/signals/invalid-name/empty", "", test_signals_invalid_name);
    2123                 :           1 :   g_test_add_func ("/gobject/signals/is-valid-name", test_signal_is_valid_name);
    2124                 :           1 :   g_test_add_func ("/gobject/signals/weak-ref-disconnect", test_weak_ref_disconnect);
    2125                 :             : 
    2126                 :           1 :   return g_test_run ();
    2127                 :             : }
        

Generated by: LCOV version 2.0-1