(root)/
glib-2.79.0/
gobject/
tests/
deprecated-properties.c
       1  /*
       2   * Copyright 2022 Simon McVittie
       3   * SPDX-License-Identifier: LGPL-2.1-or-later
       4   */
       5  
       6  #include <glib-object.h>
       7  #include <glib.h>
       8  
       9  typedef struct
      10  {
      11    GObject parent;
      12    int normal;
      13    int normal_construct;
      14    int deprecated;
      15    int deprecated_construct;
      16  } MyObject;
      17  
      18  typedef struct
      19  {
      20    GObjectClass parent;
      21  } MyObjectClass;
      22  
      23  typedef enum
      24  {
      25    PROP_0,
      26    PROP_NORMAL,
      27    PROP_NORMAL_CONSTRUCT,
      28    PROP_DEPRECATED,
      29    PROP_DEPRECATED_CONSTRUCT,
      30    N_PROPS
      31  } Property;
      32  
      33  static GParamSpec *props[N_PROPS] = { NULL };
      34  
      35  static GType my_object_get_type (void);
      36  
      37  G_DEFINE_TYPE (MyObject, my_object, G_TYPE_OBJECT);
      38  
      39  static void
      40  my_object_init (MyObject *self)
      41  {
      42  }
      43  
      44  static void
      45  my_object_set_property (GObject *object,
      46                          guint prop_id,
      47                          const GValue *value,
      48                          GParamSpec *param_spec)
      49  {
      50    MyObject *self = (MyObject *) object;
      51  
      52    switch ((Property) prop_id)
      53      {
      54      case PROP_NORMAL:
      55        self->normal = g_value_get_int (value);
      56        break;
      57  
      58      case PROP_NORMAL_CONSTRUCT:
      59        self->normal_construct = g_value_get_int (value);
      60        break;
      61  
      62      case PROP_DEPRECATED:
      63        self->deprecated = g_value_get_int (value);
      64        break;
      65  
      66      case PROP_DEPRECATED_CONSTRUCT:
      67        self->deprecated_construct = g_value_get_int (value);
      68        break;
      69  
      70      case PROP_0:
      71      case N_PROPS:
      72      default:
      73        g_assert_not_reached ();
      74      }
      75  }
      76  
      77  static void
      78  my_object_get_property (GObject *object,
      79                          guint prop_id,
      80                          GValue *value,
      81                          GParamSpec *param_spec)
      82  {
      83    MyObject *self = (MyObject *) object;
      84  
      85    switch ((Property) prop_id)
      86      {
      87      case PROP_NORMAL:
      88        g_value_set_int (value, self->normal);
      89        break;
      90  
      91      case PROP_NORMAL_CONSTRUCT:
      92        g_value_set_int (value, self->normal_construct);
      93        break;
      94  
      95      case PROP_DEPRECATED:
      96        g_value_set_int (value, self->deprecated);
      97        break;
      98  
      99      case PROP_DEPRECATED_CONSTRUCT:
     100        g_value_set_int (value, self->deprecated_construct);
     101        break;
     102  
     103      case PROP_0:
     104      case N_PROPS:
     105      default:
     106        g_assert_not_reached ();
     107      }
     108  }
     109  
     110  static void
     111  my_object_class_init (MyObjectClass *cls)
     112  {
     113    GObjectClass *object_class = G_OBJECT_CLASS (cls);
     114  
     115    props[PROP_NORMAL] = g_param_spec_int ("normal", NULL, NULL,
     116                                           G_MININT, G_MAXINT, -1,
     117                                           (G_PARAM_READWRITE |
     118                                            G_PARAM_STATIC_STRINGS));
     119    props[PROP_NORMAL_CONSTRUCT] = g_param_spec_int ("normal-construct", NULL, NULL,
     120                                                     G_MININT, G_MAXINT, -1,
     121                                                     (G_PARAM_READWRITE |
     122                                                      G_PARAM_STATIC_STRINGS |
     123                                                      G_PARAM_CONSTRUCT));
     124    props[PROP_DEPRECATED] = g_param_spec_int ("deprecated", NULL, NULL,
     125                                               G_MININT, G_MAXINT, -1,
     126                                               (G_PARAM_READWRITE |
     127                                                G_PARAM_STATIC_STRINGS |
     128                                                G_PARAM_DEPRECATED));
     129    props[PROP_DEPRECATED_CONSTRUCT] = g_param_spec_int ("deprecated-construct", NULL, NULL,
     130                                                         G_MININT, G_MAXINT, -1,
     131                                                         (G_PARAM_READWRITE |
     132                                                          G_PARAM_STATIC_STRINGS |
     133                                                          G_PARAM_CONSTRUCT |
     134                                                          G_PARAM_DEPRECATED));
     135    object_class->get_property = my_object_get_property;
     136    object_class->set_property = my_object_set_property;
     137    g_object_class_install_properties (object_class, N_PROPS, props);
     138  }
     139  
     140  static void
     141  test_construct (void)
     142  {
     143    if (g_test_subprocess ())
     144      {
     145        MyObject *o;
     146  
     147        /* Don't crash on deprecation warnings, so we can see all of them */
     148        g_log_set_always_fatal (G_LOG_FATAL_MASK);
     149        g_log_set_fatal_mask ("GLib-GObject", G_LOG_FATAL_MASK);
     150  
     151        o = g_object_new (my_object_get_type (),
     152                          "normal", 1,
     153                          "normal-construct", 2,
     154                          "deprecated", 3,
     155                          "deprecated-construct", 4,
     156                          NULL);
     157        g_printerr ("Constructed object");
     158        g_assert_cmpint (o->normal, ==, 1);
     159        g_assert_cmpint (o->normal_construct, ==, 2);
     160        g_assert_cmpint (o->deprecated, ==, 3);
     161        g_assert_cmpint (o->deprecated_construct, ==, 4);
     162        g_clear_object (&o);
     163        return;
     164      }
     165  
     166    g_test_trap_subprocess (NULL, 0, G_TEST_SUBPROCESS_DEFAULT);
     167    g_test_trap_assert_stderr ("*The property MyObject:deprecated-construct is deprecated*");
     168    g_test_trap_assert_stderr ("*The property MyObject:deprecated is deprecated*");
     169    g_test_trap_assert_stderr_unmatched ("*The property MyObject:normal*");
     170    g_test_trap_assert_passed ();
     171  }
     172  
     173  static void
     174  test_def_construct (void)
     175  {
     176    if (g_test_subprocess ())
     177      {
     178        MyObject *o;
     179  
     180        /* Don't crash on deprecation warnings, so we can see all of them */
     181        g_log_set_always_fatal (G_LOG_FATAL_MASK);
     182        g_log_set_fatal_mask ("GLib-GObject", G_LOG_FATAL_MASK);
     183  
     184        o = g_object_new (my_object_get_type (),
     185                          NULL);
     186        g_printerr ("Constructed object");
     187        g_assert_cmpint (o->normal, ==, 0);
     188        g_assert_cmpint (o->normal_construct, ==, -1);
     189        g_assert_cmpint (o->deprecated, ==, 0);
     190        g_assert_cmpint (o->deprecated_construct, ==, -1);
     191        g_clear_object (&o);
     192        return;
     193      }
     194  
     195    g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2748");
     196    g_test_trap_subprocess (NULL, 0, G_TEST_SUBPROCESS_DEFAULT);
     197    g_test_trap_assert_stderr_unmatched ("*The property MyObject:deprecated*");
     198    g_test_trap_assert_stderr_unmatched ("*The property MyObject:normal*");
     199    g_test_trap_assert_passed ();
     200  }
     201  
     202  static void
     203  test_set (void)
     204  {
     205    if (g_test_subprocess ())
     206      {
     207        MyObject *o;
     208  
     209        /* Don't crash on deprecation warnings, so we can see all of them */
     210        g_log_set_always_fatal (G_LOG_FATAL_MASK);
     211        g_log_set_fatal_mask ("GLib-GObject", G_LOG_FATAL_MASK);
     212  
     213        o = g_object_new (my_object_get_type (),
     214                          NULL);
     215        g_printerr ("Constructed object");
     216        g_assert_cmpint (o->normal, ==, 0);
     217        g_assert_cmpint (o->normal_construct, ==, -1);
     218        g_assert_cmpint (o->deprecated, ==, 0);
     219        g_assert_cmpint (o->deprecated_construct, ==, -1);
     220  
     221        g_object_set (o,
     222                      "normal", 1,
     223                      "normal-construct", 2,
     224                      "deprecated", 3,
     225                      "deprecated-construct", 4,
     226                      NULL);
     227        g_printerr ("Set properties");
     228        g_assert_cmpint (o->normal, ==, 1);
     229        g_assert_cmpint (o->normal_construct, ==, 2);
     230        g_assert_cmpint (o->deprecated, ==, 3);
     231        g_assert_cmpint (o->deprecated_construct, ==, 4);
     232  
     233        g_clear_object (&o);
     234        return;
     235      }
     236  
     237    g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2748");
     238    g_test_trap_subprocess (NULL, 0, G_TEST_SUBPROCESS_DEFAULT);
     239    g_test_trap_assert_stderr ("*The property MyObject:deprecated-construct is deprecated*");
     240    g_test_trap_assert_stderr ("*The property MyObject:deprecated is deprecated*");
     241    g_test_trap_assert_stderr_unmatched ("*The property MyObject:normal*");
     242    g_test_trap_assert_passed ();
     243  }
     244  
     245  int
     246  main (int argc, char *argv[])
     247  {
     248    g_test_init (&argc, &argv, NULL);
     249  
     250    g_setenv ("G_ENABLE_DIAGNOSTIC", "1", TRUE);
     251  
     252    g_test_set_nonfatal_assertions ();
     253    g_test_add_func ("/deprecated-properties/construct", test_construct);
     254    g_test_add_func ("/deprecated-properties/default-construct", test_def_construct);
     255    g_test_add_func ("/deprecated-properties/set", test_set);
     256    return g_test_run ();
     257  }