| /* |
| * Copyright 2022 Simon McVittie |
| * SPDX-License-Identifier: LGPL-2.1-or-later |
| */ |
| |
| #include <glib-object.h> |
| #include <glib.h> |
| |
| 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 (); |
| } |