From fef0408eaadca1444b752698d2a291b91c8b89a0 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Tue, 13 Sep 2022 11:13:01 +0100 Subject: [PATCH] gobject: Add a test for deprecated properties Reproduces: https://gitlab.gnome.org/GNOME/glib/-/issues/2748 Signed-off-by: Simon McVittie --- gobject/tests/deprecated-properties.c | 257 ++++++++++++++++++++++++++ gobject/tests/meson.build | 1 + 2 files changed, 258 insertions(+) create mode 100644 gobject/tests/deprecated-properties.c diff --git a/gobject/tests/deprecated-properties.c b/gobject/tests/deprecated-properties.c new file mode 100644 index 000000000..fd9cb0a45 --- /dev/null +++ b/gobject/tests/deprecated-properties.c @@ -0,0 +1,257 @@ +/* + * Copyright 2022 Simon McVittie + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#include +#include + +typedef struct +{ + GObject parent; + int normal; + int normal_construct; + int deprecated; + int deprecated_construct; +} MyObject; + +typedef struct +{ + GObjectClass parent; +} MyObjectClass; + +typedef enum +{ + PROP_0, + PROP_NORMAL, + PROP_NORMAL_CONSTRUCT, + PROP_DEPRECATED, + PROP_DEPRECATED_CONSTRUCT, + N_PROPS +} Property; + +static GParamSpec *props[N_PROPS] = { NULL }; + +static GType my_object_get_type (void); + +G_DEFINE_TYPE (MyObject, my_object, G_TYPE_OBJECT); + +static void +my_object_init (MyObject *self) +{ +} + +static void +my_object_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *param_spec) +{ + MyObject *self = (MyObject *) object; + + switch ((Property) prop_id) + { + case PROP_NORMAL: + self->normal = g_value_get_int (value); + break; + + case PROP_NORMAL_CONSTRUCT: + self->normal_construct = g_value_get_int (value); + break; + + case PROP_DEPRECATED: + self->deprecated = g_value_get_int (value); + break; + + case PROP_DEPRECATED_CONSTRUCT: + self->deprecated_construct = g_value_get_int (value); + break; + + case PROP_0: + case N_PROPS: + default: + g_assert_not_reached (); + } +} + +static void +my_object_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *param_spec) +{ + MyObject *self = (MyObject *) object; + + switch ((Property) prop_id) + { + case PROP_NORMAL: + g_value_set_int (value, self->normal); + break; + + case PROP_NORMAL_CONSTRUCT: + g_value_set_int (value, self->normal_construct); + break; + + case PROP_DEPRECATED: + g_value_set_int (value, self->deprecated); + break; + + case PROP_DEPRECATED_CONSTRUCT: + g_value_set_int (value, self->deprecated_construct); + break; + + case PROP_0: + case N_PROPS: + default: + g_assert_not_reached (); + } +} + +static void +my_object_class_init (MyObjectClass *cls) +{ + GObjectClass *object_class = G_OBJECT_CLASS (cls); + + props[PROP_NORMAL] = g_param_spec_int ("normal", NULL, NULL, + G_MININT, G_MAXINT, -1, + (G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + props[PROP_NORMAL_CONSTRUCT] = g_param_spec_int ("normal-construct", NULL, NULL, + G_MININT, G_MAXINT, -1, + (G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS | + G_PARAM_CONSTRUCT)); + props[PROP_DEPRECATED] = g_param_spec_int ("deprecated", NULL, NULL, + G_MININT, G_MAXINT, -1, + (G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS | + G_PARAM_DEPRECATED)); + props[PROP_DEPRECATED_CONSTRUCT] = g_param_spec_int ("deprecated-construct", NULL, NULL, + G_MININT, G_MAXINT, -1, + (G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS | + G_PARAM_CONSTRUCT | + G_PARAM_DEPRECATED)); + object_class->get_property = my_object_get_property; + object_class->set_property = my_object_set_property; + g_object_class_install_properties (object_class, N_PROPS, props); +} + +static void +test_construct (void) +{ + if (g_test_subprocess ()) + { + MyObject *o; + + /* Don't crash on deprecation warnings, so we can see all of them */ + g_log_set_always_fatal (G_LOG_FATAL_MASK); + g_log_set_fatal_mask ("GLib-GObject", G_LOG_FATAL_MASK); + + o = g_object_new (my_object_get_type (), + "normal", 1, + "normal-construct", 2, + "deprecated", 3, + "deprecated-construct", 4, + NULL); + g_printerr ("Constructed object"); + g_assert_cmpint (o->normal, ==, 1); + g_assert_cmpint (o->normal_construct, ==, 2); + g_assert_cmpint (o->deprecated, ==, 3); + g_assert_cmpint (o->deprecated_construct, ==, 4); + g_clear_object (&o); + return; + } + + g_test_trap_subprocess (NULL, 0, G_TEST_SUBPROCESS_DEFAULT); + g_test_trap_assert_stderr ("*The property MyObject:deprecated-construct is deprecated*"); + g_test_trap_assert_stderr ("*The property MyObject:deprecated is deprecated*"); + g_test_trap_assert_stderr_unmatched ("*The property MyObject:normal*"); + g_test_trap_assert_passed (); +} + +static void +test_def_construct (void) +{ + if (g_test_subprocess ()) + { + MyObject *o; + + /* Don't crash on deprecation warnings, so we can see all of them */ + g_log_set_always_fatal (G_LOG_FATAL_MASK); + g_log_set_fatal_mask ("GLib-GObject", G_LOG_FATAL_MASK); + + o = g_object_new (my_object_get_type (), + NULL); + g_printerr ("Constructed object"); + g_assert_cmpint (o->normal, ==, 0); + g_assert_cmpint (o->normal_construct, ==, -1); + g_assert_cmpint (o->deprecated, ==, 0); + g_assert_cmpint (o->deprecated_construct, ==, -1); + g_clear_object (&o); + return; + } + + g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2748"); + g_test_trap_subprocess (NULL, 0, G_TEST_SUBPROCESS_DEFAULT); + g_test_trap_assert_stderr_unmatched ("*The property MyObject:deprecated*"); + g_test_trap_assert_stderr_unmatched ("*The property MyObject:normal*"); + g_test_trap_assert_passed (); +} + +static void +test_set (void) +{ + if (g_test_subprocess ()) + { + MyObject *o; + + /* Don't crash on deprecation warnings, so we can see all of them */ + g_log_set_always_fatal (G_LOG_FATAL_MASK); + g_log_set_fatal_mask ("GLib-GObject", G_LOG_FATAL_MASK); + + o = g_object_new (my_object_get_type (), + NULL); + g_printerr ("Constructed object"); + g_assert_cmpint (o->normal, ==, 0); + g_assert_cmpint (o->normal_construct, ==, -1); + g_assert_cmpint (o->deprecated, ==, 0); + g_assert_cmpint (o->deprecated_construct, ==, -1); + + g_object_set (o, + "normal", 1, + "normal-construct", 2, + "deprecated", 3, + "deprecated-construct", 4, + NULL); + g_printerr ("Set properties"); + g_assert_cmpint (o->normal, ==, 1); + g_assert_cmpint (o->normal_construct, ==, 2); + g_assert_cmpint (o->deprecated, ==, 3); + g_assert_cmpint (o->deprecated_construct, ==, 4); + + g_clear_object (&o); + return; + } + + g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2748"); + g_test_trap_subprocess (NULL, 0, G_TEST_SUBPROCESS_DEFAULT); + g_test_trap_assert_stderr ("*The property MyObject:deprecated-construct is deprecated*"); + g_test_trap_assert_stderr ("*The property MyObject:deprecated is deprecated*"); + g_test_trap_assert_stderr_unmatched ("*The property MyObject:normal*"); + g_test_trap_assert_passed (); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_setenv ("G_ENABLE_DIAGNOSTIC", "1", TRUE); + + g_test_set_nonfatal_assertions (); + g_test_add_func ("/deprecated-properties/construct", test_construct); + g_test_add_func ("/deprecated-properties/default-construct", test_def_construct); + g_test_add_func ("/deprecated-properties/set", test_set); + return g_test_run (); +} diff --git a/gobject/tests/meson.build b/gobject/tests/meson.build index 58cf4ab1f..c3fc29f6b 100644 --- a/gobject/tests/meson.build +++ b/gobject/tests/meson.build @@ -42,6 +42,7 @@ gobject_tests = { 'source' : ['defaultiface.c', 'testmodule.c'], }, 'deftype' : {}, + 'deprecated-properties' : {}, 'dynamictype' : { 'source' : ['dynamictype.c', 'testmodule.c'], },