Branch data Line data Source code
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 [ + + + - : 9 : G_DEFINE_TYPE (MyObject, my_object, G_TYPE_OBJECT);
+ - ]
38 : :
39 : : static void
40 : 3 : my_object_init (MyObject *self)
41 : : {
42 : 3 : }
43 : :
44 : : static void
45 : 12 : my_object_set_property (GObject *object,
46 : : guint prop_id,
47 : : const GValue *value,
48 : : GParamSpec *param_spec)
49 : : {
50 : 12 : MyObject *self = (MyObject *) object;
51 : :
52 [ + + + + : 12 : switch ((Property) prop_id)
- ]
53 : : {
54 : 2 : case PROP_NORMAL:
55 : 2 : self->normal = g_value_get_int (value);
56 : 2 : break;
57 : :
58 : 4 : case PROP_NORMAL_CONSTRUCT:
59 : 4 : self->normal_construct = g_value_get_int (value);
60 : 4 : break;
61 : :
62 : 2 : case PROP_DEPRECATED:
63 : 2 : self->deprecated = g_value_get_int (value);
64 : 2 : break;
65 : :
66 : 4 : case PROP_DEPRECATED_CONSTRUCT:
67 : 4 : self->deprecated_construct = g_value_get_int (value);
68 : 4 : break;
69 : :
70 : 0 : case PROP_0:
71 : : case N_PROPS:
72 : : default:
73 : : g_assert_not_reached ();
74 : : }
75 : 12 : }
76 : :
77 : : static void
78 : 0 : my_object_get_property (GObject *object,
79 : : guint prop_id,
80 : : GValue *value,
81 : : GParamSpec *param_spec)
82 : : {
83 : 0 : MyObject *self = (MyObject *) object;
84 : :
85 [ # # # # : 0 : switch ((Property) prop_id)
# ]
86 : : {
87 : 0 : case PROP_NORMAL:
88 : 0 : g_value_set_int (value, self->normal);
89 : 0 : break;
90 : :
91 : 0 : case PROP_NORMAL_CONSTRUCT:
92 : 0 : g_value_set_int (value, self->normal_construct);
93 : 0 : break;
94 : :
95 : 0 : case PROP_DEPRECATED:
96 : 0 : g_value_set_int (value, self->deprecated);
97 : 0 : break;
98 : :
99 : 0 : case PROP_DEPRECATED_CONSTRUCT:
100 : 0 : g_value_set_int (value, self->deprecated_construct);
101 : 0 : break;
102 : :
103 : 0 : case PROP_0:
104 : : case N_PROPS:
105 : : default:
106 : : g_assert_not_reached ();
107 : : }
108 : 0 : }
109 : :
110 : : static void
111 : 3 : my_object_class_init (MyObjectClass *cls)
112 : : {
113 : 3 : GObjectClass *object_class = G_OBJECT_CLASS (cls);
114 : :
115 : 3 : 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 : 3 : 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 : 3 : 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 : 3 : 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 : 3 : object_class->get_property = my_object_get_property;
136 : 3 : object_class->set_property = my_object_set_property;
137 : 3 : g_object_class_install_properties (object_class, N_PROPS, props);
138 : 3 : }
139 : :
140 : : static void
141 : 2 : test_construct (void)
142 : : {
143 [ + + ]: 2 : if (g_test_subprocess ())
144 : : {
145 : : MyObject *o;
146 : :
147 : : /* Don't crash on deprecation warnings, so we can see all of them */
148 : 1 : g_log_set_always_fatal (G_LOG_FATAL_MASK);
149 : 1 : g_log_set_fatal_mask ("GLib-GObject", G_LOG_FATAL_MASK);
150 : :
151 : 1 : 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 : 1 : g_printerr ("Constructed object");
158 : 1 : g_assert_cmpint (o->normal, ==, 1);
159 : 1 : g_assert_cmpint (o->normal_construct, ==, 2);
160 : 1 : g_assert_cmpint (o->deprecated, ==, 3);
161 : 1 : g_assert_cmpint (o->deprecated_construct, ==, 4);
162 : 1 : g_clear_object (&o);
163 : 1 : return;
164 : : }
165 : :
166 : 1 : g_test_trap_subprocess (NULL, 0, G_TEST_SUBPROCESS_DEFAULT);
167 : 1 : g_test_trap_assert_stderr ("*The property MyObject:deprecated-construct is deprecated*");
168 : 1 : g_test_trap_assert_stderr ("*The property MyObject:deprecated is deprecated*");
169 : 1 : g_test_trap_assert_stderr_unmatched ("*The property MyObject:normal*");
170 : 1 : g_test_trap_assert_passed ();
171 : : }
172 : :
173 : : static void
174 : 2 : test_def_construct (void)
175 : : {
176 [ + + ]: 2 : if (g_test_subprocess ())
177 : : {
178 : : MyObject *o;
179 : :
180 : : /* Don't crash on deprecation warnings, so we can see all of them */
181 : 1 : g_log_set_always_fatal (G_LOG_FATAL_MASK);
182 : 1 : g_log_set_fatal_mask ("GLib-GObject", G_LOG_FATAL_MASK);
183 : :
184 : 1 : o = g_object_new (my_object_get_type (),
185 : : NULL);
186 : 1 : g_printerr ("Constructed object");
187 : 1 : g_assert_cmpint (o->normal, ==, 0);
188 : 1 : g_assert_cmpint (o->normal_construct, ==, -1);
189 : 1 : g_assert_cmpint (o->deprecated, ==, 0);
190 : 1 : g_assert_cmpint (o->deprecated_construct, ==, -1);
191 : 1 : g_clear_object (&o);
192 : 1 : return;
193 : : }
194 : :
195 : 1 : g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2748");
196 : 1 : g_test_trap_subprocess (NULL, 0, G_TEST_SUBPROCESS_DEFAULT);
197 : 1 : g_test_trap_assert_stderr_unmatched ("*The property MyObject:deprecated*");
198 : 1 : g_test_trap_assert_stderr_unmatched ("*The property MyObject:normal*");
199 : 1 : g_test_trap_assert_passed ();
200 : : }
201 : :
202 : : static void
203 : 2 : test_set (void)
204 : : {
205 [ + + ]: 2 : if (g_test_subprocess ())
206 : : {
207 : : MyObject *o;
208 : :
209 : : /* Don't crash on deprecation warnings, so we can see all of them */
210 : 1 : g_log_set_always_fatal (G_LOG_FATAL_MASK);
211 : 1 : g_log_set_fatal_mask ("GLib-GObject", G_LOG_FATAL_MASK);
212 : :
213 : 1 : o = g_object_new (my_object_get_type (),
214 : : NULL);
215 : 1 : g_printerr ("Constructed object");
216 : 1 : g_assert_cmpint (o->normal, ==, 0);
217 : 1 : g_assert_cmpint (o->normal_construct, ==, -1);
218 : 1 : g_assert_cmpint (o->deprecated, ==, 0);
219 : 1 : g_assert_cmpint (o->deprecated_construct, ==, -1);
220 : :
221 : 1 : g_object_set (o,
222 : : "normal", 1,
223 : : "normal-construct", 2,
224 : : "deprecated", 3,
225 : : "deprecated-construct", 4,
226 : : NULL);
227 : 1 : g_printerr ("Set properties");
228 : 1 : g_assert_cmpint (o->normal, ==, 1);
229 : 1 : g_assert_cmpint (o->normal_construct, ==, 2);
230 : 1 : g_assert_cmpint (o->deprecated, ==, 3);
231 : 1 : g_assert_cmpint (o->deprecated_construct, ==, 4);
232 : :
233 : 1 : g_clear_object (&o);
234 : 1 : return;
235 : : }
236 : :
237 : 1 : g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2748");
238 : 1 : g_test_trap_subprocess (NULL, 0, G_TEST_SUBPROCESS_DEFAULT);
239 : 1 : g_test_trap_assert_stderr ("*The property MyObject:deprecated-construct is deprecated*");
240 : 1 : g_test_trap_assert_stderr ("*The property MyObject:deprecated is deprecated*");
241 : 1 : g_test_trap_assert_stderr_unmatched ("*The property MyObject:normal*");
242 : 1 : g_test_trap_assert_passed ();
243 : : }
244 : :
245 : : int
246 : 4 : main (int argc, char *argv[])
247 : : {
248 : 4 : g_test_init (&argc, &argv, NULL);
249 : :
250 : 4 : g_setenv ("G_ENABLE_DIAGNOSTIC", "1", TRUE);
251 : :
252 : 4 : g_test_set_nonfatal_assertions ();
253 : 4 : g_test_add_func ("/deprecated-properties/construct", test_construct);
254 : 4 : g_test_add_func ("/deprecated-properties/default-construct", test_def_construct);
255 : 4 : g_test_add_func ("/deprecated-properties/set", test_set);
256 : 4 : return g_test_run ();
257 : : }
|