2 * Copyright 2022 Simon McVittie
3 * SPDX-License-Identifier: LGPL-2.1-or-later
6 #include <glib-object.h>
15 int deprecated_construct;
27 PROP_NORMAL_CONSTRUCT,
29 PROP_DEPRECATED_CONSTRUCT,
33 static GParamSpec *props[N_PROPS] = { NULL };
35 static GType my_object_get_type (void);
37 G_DEFINE_TYPE (MyObject, my_object, G_TYPE_OBJECT);
40 my_object_init (MyObject *self)
45 my_object_set_property (GObject *object,
48 GParamSpec *param_spec)
50 MyObject *self = (MyObject *) object;
52 switch ((Property) prop_id)
55 self->normal = g_value_get_int (value);
58 case PROP_NORMAL_CONSTRUCT:
59 self->normal_construct = g_value_get_int (value);
63 self->deprecated = g_value_get_int (value);
66 case PROP_DEPRECATED_CONSTRUCT:
67 self->deprecated_construct = g_value_get_int (value);
73 g_assert_not_reached ();
78 my_object_get_property (GObject *object,
81 GParamSpec *param_spec)
83 MyObject *self = (MyObject *) object;
85 switch ((Property) prop_id)
88 g_value_set_int (value, self->normal);
91 case PROP_NORMAL_CONSTRUCT:
92 g_value_set_int (value, self->normal_construct);
96 g_value_set_int (value, self->deprecated);
99 case PROP_DEPRECATED_CONSTRUCT:
100 g_value_set_int (value, self->deprecated_construct);
106 g_assert_not_reached ();
111 my_object_class_init (MyObjectClass *cls)
113 GObjectClass *object_class = G_OBJECT_CLASS (cls);
115 props[PROP_NORMAL] = g_param_spec_int ("normal", NULL, NULL,
116 G_MININT, G_MAXINT, -1,
118 G_PARAM_STATIC_STRINGS));
119 props[PROP_NORMAL_CONSTRUCT] = g_param_spec_int ("normal-construct", NULL, NULL,
120 G_MININT, G_MAXINT, -1,
122 G_PARAM_STATIC_STRINGS |
124 props[PROP_DEPRECATED] = g_param_spec_int ("deprecated", NULL, NULL,
125 G_MININT, G_MAXINT, -1,
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,
132 G_PARAM_STATIC_STRINGS |
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);
141 test_construct (void)
143 if (g_test_subprocess ())
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);
151 o = g_object_new (my_object_get_type (),
153 "normal-construct", 2,
155 "deprecated-construct", 4,
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);
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 ();
174 test_def_construct (void)
176 if (g_test_subprocess ())
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);
184 o = g_object_new (my_object_get_type (),
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);
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 ();
205 if (g_test_subprocess ())
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);
213 o = g_object_new (my_object_get_type (),
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);
223 "normal-construct", 2,
225 "deprecated-construct", 4,
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);
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 ();
246 main (int argc, char *argv[])
248 g_test_init (&argc, &argv, NULL);
250 g_setenv ("G_ENABLE_DIAGNOSTIC", "1", TRUE);
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 ();