LCOV - code coverage report
Current view: top level - gobject/tests - properties-refcount4.c (source / functions) Coverage Total Hit
Test: unnamed Lines: 89.2 % 65 58
Test Date: 2024-11-26 05:23:01 Functions: 100.0 % 11 11
Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : #include <glib.h>
       2                 :             : #include <glib-object.h>
       3                 :             : 
       4                 :             : #define MY_TYPE_BADGER              (my_badger_get_type ())
       5                 :             : #define MY_BADGER(obj)              (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_BADGER, MyBadger))
       6                 :             : #define MY_IS_BADGER(obj)           (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_BADGER))
       7                 :             : #define MY_BADGER_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), MY_TYPE_BADGER, MyBadgerClass))
       8                 :             : #define MY_IS_BADGER_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), MY_TYPE_BADGER))
       9                 :             : #define MY_BADGER_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS ((obj), MY_TYPE_BADGER, MyBadgerClass))
      10                 :             : 
      11                 :             : enum {
      12                 :             :   PROP_0,
      13                 :             :   PROP_MAMA
      14                 :             : };
      15                 :             : 
      16                 :             : typedef struct _MyBadger MyBadger;
      17                 :             : typedef struct _MyBadgerClass MyBadgerClass;
      18                 :             : 
      19                 :             : struct _MyBadger
      20                 :             : {
      21                 :             :   GObject parent_instance;
      22                 :             : 
      23                 :             :   MyBadger * mama;
      24                 :             :   guint mama_notify_count;
      25                 :             : };
      26                 :             : 
      27                 :             : struct _MyBadgerClass
      28                 :             : {
      29                 :             :   GObjectClass parent_class;
      30                 :             : };
      31                 :             : 
      32                 :             : static GType my_badger_get_type (void);
      33                 :          12 : G_DEFINE_TYPE (MyBadger, my_badger, G_TYPE_OBJECT)
      34                 :             : 
      35                 :             : static void my_badger_dispose (GObject * object);
      36                 :             : 
      37                 :             : static void my_badger_get_property (GObject    *object,
      38                 :             :                                     guint       prop_id,
      39                 :             :                                     GValue     *value,
      40                 :             :                                     GParamSpec *pspec);
      41                 :             : static void my_badger_set_property (GObject      *object,
      42                 :             :                                     guint         prop_id,
      43                 :             :                                     const GValue *value,
      44                 :             :                                     GParamSpec   *pspec);
      45                 :             : 
      46                 :             : static void my_badger_mama_notify (GObject    *object,
      47                 :             :                                    GParamSpec *pspec);
      48                 :             : 
      49                 :             : static void
      50                 :           1 : my_badger_class_init (MyBadgerClass * klass)
      51                 :             : {
      52                 :             :   GObjectClass *gobject_class;
      53                 :             : 
      54                 :           1 :   gobject_class = (GObjectClass *) klass;
      55                 :             : 
      56                 :           1 :   gobject_class->dispose = my_badger_dispose;
      57                 :             : 
      58                 :           1 :   gobject_class->get_property = my_badger_get_property;
      59                 :           1 :   gobject_class->set_property = my_badger_set_property;
      60                 :             : 
      61                 :           1 :   g_object_class_install_property (gobject_class,
      62                 :             :                                    PROP_MAMA,
      63                 :             :                                    g_param_spec_object ("mama",
      64                 :             :                                                         NULL,
      65                 :             :                                                         NULL,
      66                 :             :                                                         MY_TYPE_BADGER,
      67                 :             :                                                         G_PARAM_READWRITE));
      68                 :           1 : }
      69                 :             : 
      70                 :             : static void
      71                 :           2 : my_badger_init (MyBadger * self)
      72                 :             : {
      73                 :           2 :   g_signal_connect (self, "notify::mama", G_CALLBACK (my_badger_mama_notify),
      74                 :             :       NULL);
      75                 :           2 : }
      76                 :             : 
      77                 :             : static void
      78                 :           2 : my_badger_dispose (GObject * object)
      79                 :             : {
      80                 :             :   MyBadger * self;
      81                 :             : 
      82                 :           2 :   self = MY_BADGER (object);
      83                 :             : 
      84                 :           2 :   if (self->mama != NULL)
      85                 :             :     {
      86                 :           1 :       g_object_unref (self->mama);
      87                 :           1 :       self->mama = NULL;
      88                 :             :     }
      89                 :             : 
      90                 :           2 :   G_OBJECT_CLASS (my_badger_parent_class)->dispose (object);
      91                 :           2 : }
      92                 :             : 
      93                 :             : static void
      94                 :           1 : my_badger_get_property (GObject    *object,
      95                 :             :                         guint        prop_id,
      96                 :             :                         GValue     *value,
      97                 :             :                         GParamSpec *pspec)
      98                 :             : {
      99                 :             :   MyBadger *self;
     100                 :             : 
     101                 :           1 :   self = MY_BADGER (object);
     102                 :             : 
     103                 :           1 :   switch (prop_id)
     104                 :             :     {
     105                 :           1 :     case PROP_MAMA:
     106                 :           1 :       g_value_set_object (value, self->mama);
     107                 :           1 :       break;
     108                 :           0 :     default:
     109                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     110                 :           0 :       break;
     111                 :             :     }
     112                 :           1 : }
     113                 :             : 
     114                 :             : static void
     115                 :           2 : my_badger_set_property (GObject      *object,
     116                 :             :                         guint         prop_id,
     117                 :             :                         const GValue *value,
     118                 :             :                         GParamSpec   *pspec)
     119                 :             : {
     120                 :             :   MyBadger *self;
     121                 :             : 
     122                 :           2 :   self = MY_BADGER (object);
     123                 :             : 
     124                 :           2 :   switch (prop_id)
     125                 :             :     {
     126                 :           2 :     case PROP_MAMA:
     127                 :           2 :       if (self->mama)
     128                 :           0 :         g_object_unref (self->mama);
     129                 :           2 :       self->mama = g_value_dup_object (value);
     130                 :           2 :       if (self->mama)
     131                 :           1 :         g_object_set (self->mama, "mama", NULL, NULL); /* another notify */
     132                 :           2 :       break;
     133                 :           0 :     default:
     134                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     135                 :           0 :       break;
     136                 :             :     }
     137                 :           2 : }
     138                 :             : 
     139                 :             : static void
     140                 :           2 : my_badger_mama_notify (GObject    *object,
     141                 :             :                        GParamSpec *pspec)
     142                 :             : {
     143                 :             :   MyBadger *self;
     144                 :             : 
     145                 :           2 :   self = MY_BADGER (object);
     146                 :           2 :   self->mama_notify_count++;
     147                 :           2 : }
     148                 :             : 
     149                 :             : static void
     150                 :           1 : test_refcount_properties_4 (void)
     151                 :             : {
     152                 :             :   MyBadger * badger1, * badger2;
     153                 :             :   gpointer test;
     154                 :             : 
     155                 :           1 :   badger1 = g_object_new (MY_TYPE_BADGER, NULL);
     156                 :           1 :   badger2 = g_object_new (MY_TYPE_BADGER, NULL);
     157                 :             : 
     158                 :           1 :   g_object_set (badger1, "mama", badger2, NULL);
     159                 :           1 :   g_assert_cmpuint (badger1->mama_notify_count, ==, 1);
     160                 :           1 :   g_assert_cmpuint (badger2->mama_notify_count, ==, 1);
     161                 :           1 :   g_object_get (badger1, "mama", &test, NULL);
     162                 :           1 :   g_assert_cmpmem (test, sizeof (MyBadger), badger2, sizeof (MyBadger));
     163                 :           1 :   g_object_unref (test);
     164                 :             : 
     165                 :           1 :   g_object_unref (badger1);
     166                 :           1 :   g_object_unref (badger2);
     167                 :           1 : }
     168                 :             : 
     169                 :             : int
     170                 :           1 : main (int argc, gchar *argv[])
     171                 :             : {
     172                 :           1 :   g_log_set_always_fatal (G_LOG_LEVEL_WARNING |
     173                 :           1 :                           G_LOG_LEVEL_CRITICAL |
     174                 :           1 :                           g_log_set_always_fatal (G_LOG_FATAL_MASK));
     175                 :             : 
     176                 :           1 :   g_test_init (&argc, &argv, NULL);
     177                 :             : 
     178                 :           1 :   g_test_add_func ("/gobject/refcount/properties-4", test_refcount_properties_4);
     179                 :             : 
     180                 :           1 :   return g_test_run ();
     181                 :             : }
        

Generated by: LCOV version 2.0-1