1 /* ADG - Automatic Drawing Generation
2 * Copyright (C) 2007-2021 Nicola Fontana <ntd at entidi.it>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
27 _adg_gtk_layout_new(void)
32 canvas
= adg_test_canvas();
33 layout
= ADG_GTK_LAYOUT(adg_gtk_layout_new_with_canvas(canvas
));
34 g_object_unref(canvas
);
40 _adg_property_hadjustment(void)
43 GtkAdjustment
*valid_adjustment
, *invalid_adjustment
, *hadjustment
;
45 layout
= ADG_GTK_LAYOUT(adg_gtk_layout_new());
46 valid_adjustment
= (GtkAdjustment
*) gtk_adjustment_new(0, 0, 0, 0, 0, 0);
47 invalid_adjustment
= adg_test_invalid_pointer();
49 g_object_ref(valid_adjustment
);
51 /* Using the public APIs */
52 g_test_message("The implementation must provide a fallback adjustment");
53 hadjustment
= adg_gtk_layout_get_hadjustment(layout
);
54 g_assert_true(GTK_IS_ADJUSTMENT(hadjustment
));
56 adg_gtk_layout_set_hadjustment(layout
, NULL
);
57 hadjustment
= adg_gtk_layout_get_hadjustment(layout
);
58 g_assert_true(GTK_IS_ADJUSTMENT(hadjustment
));
60 adg_gtk_layout_set_hadjustment(layout
, valid_adjustment
);
61 hadjustment
= adg_gtk_layout_get_hadjustment(layout
);
62 g_assert_true(hadjustment
== valid_adjustment
);
64 adg_gtk_layout_set_hadjustment(layout
, invalid_adjustment
);
65 hadjustment
= adg_gtk_layout_get_hadjustment(layout
);
66 g_assert_true(hadjustment
== valid_adjustment
);
68 adg_gtk_layout_set_hadjustment(layout
, NULL
);
69 hadjustment
= adg_gtk_layout_get_hadjustment(layout
);
70 g_assert_true(hadjustment
!= valid_adjustment
);
71 g_assert_true(GTK_IS_ADJUSTMENT(hadjustment
));
73 /* Using GObject property methods */
74 g_object_set(layout
, "hadjustment", NULL
, NULL
);
75 g_object_get(layout
, "hadjustment", &hadjustment
, NULL
);
76 g_assert_true(GTK_IS_ADJUSTMENT(hadjustment
));
77 g_object_unref(hadjustment
);
79 g_object_set(layout
, "hadjustment", valid_adjustment
, NULL
);
80 g_object_get(layout
, "hadjustment", &hadjustment
, NULL
);
81 g_assert_true(hadjustment
== valid_adjustment
);
82 g_object_unref(hadjustment
);
84 g_object_set(layout
, "hadjustment", invalid_adjustment
, NULL
);
85 g_object_get(layout
, "hadjustment", &hadjustment
, NULL
);
86 g_assert_true(hadjustment
== valid_adjustment
);
87 g_object_unref(hadjustment
);
89 g_object_set(layout
, "hadjustment", NULL
, NULL
);
90 g_object_get(layout
, "hadjustment", &hadjustment
, NULL
);
91 g_assert_true(hadjustment
!= valid_adjustment
);
92 g_assert_true(GTK_IS_ADJUSTMENT(hadjustment
));
93 g_object_unref(hadjustment
);
95 gtk_widget_destroy(GTK_WIDGET(layout
));
96 g_object_unref(valid_adjustment
);
100 _adg_property_vadjustment(void)
102 AdgGtkLayout
*layout
;
103 GtkAdjustment
*valid_adjustment
, *invalid_adjustment
, *vadjustment
;
105 layout
= ADG_GTK_LAYOUT(adg_gtk_layout_new());
106 valid_adjustment
= (GtkAdjustment
*) gtk_adjustment_new(0, 0, 0, 0, 0, 0);
107 invalid_adjustment
= adg_test_invalid_pointer();
109 g_object_ref(valid_adjustment
);
111 /* Using the public APIs */
112 g_test_message("The implementation must provide a fallback adjustment");
113 vadjustment
= adg_gtk_layout_get_vadjustment(layout
);
114 g_assert_true(GTK_IS_ADJUSTMENT(vadjustment
));
116 adg_gtk_layout_set_vadjustment(layout
, NULL
);
117 vadjustment
= adg_gtk_layout_get_vadjustment(layout
);
118 g_assert_true(GTK_IS_ADJUSTMENT(vadjustment
));
120 adg_gtk_layout_set_vadjustment(layout
, valid_adjustment
);
121 vadjustment
= adg_gtk_layout_get_vadjustment(layout
);
122 g_assert_true(vadjustment
== valid_adjustment
);
124 adg_gtk_layout_set_vadjustment(layout
, invalid_adjustment
);
125 vadjustment
= adg_gtk_layout_get_vadjustment(layout
);
126 g_assert_true(vadjustment
== valid_adjustment
);
128 adg_gtk_layout_set_vadjustment(layout
, NULL
);
129 vadjustment
= adg_gtk_layout_get_vadjustment(layout
);
130 g_assert_true(vadjustment
!= valid_adjustment
);
131 g_assert_true(GTK_IS_ADJUSTMENT(vadjustment
));
133 /* Using GObject property methods */
134 g_object_set(layout
, "vadjustment", NULL
, NULL
);
135 g_object_get(layout
, "vadjustment", &vadjustment
, NULL
);
136 g_assert_true(GTK_IS_ADJUSTMENT(vadjustment
));
137 g_object_unref(vadjustment
);
139 g_object_set(layout
, "vadjustment", valid_adjustment
, NULL
);
140 g_object_get(layout
, "vadjustment", &vadjustment
, NULL
);
141 g_assert_true(vadjustment
== valid_adjustment
);
142 g_object_unref(vadjustment
);
144 g_object_set(layout
, "vadjustment", invalid_adjustment
, NULL
);
145 g_object_get(layout
, "vadjustment", &vadjustment
, NULL
);
146 g_assert_true(vadjustment
== valid_adjustment
);
147 g_object_unref(vadjustment
);
149 g_object_set(layout
, "vadjustment", NULL
, NULL
);
150 g_object_get(layout
, "vadjustment", &vadjustment
, NULL
);
151 g_assert_true(vadjustment
!= valid_adjustment
);
152 g_assert_true(GTK_IS_ADJUSTMENT(vadjustment
));
153 g_object_unref(vadjustment
);
155 gtk_widget_destroy(GTK_WIDGET(layout
));
156 g_object_unref(valid_adjustment
);
162 _adg_property_hscroll_policy(void)
164 AdgGtkLayout
*layout
;
165 GtkScrollablePolicy policy
;
167 layout
= ADG_GTK_LAYOUT(adg_gtk_layout_new());
169 /* Using the public APIs */
170 g_assert_cmpint(gtk_scrollable_get_hscroll_policy(GTK_SCROLLABLE(layout
)), ==, GTK_SCROLL_MINIMUM
);
172 gtk_scrollable_set_hscroll_policy(GTK_SCROLLABLE(layout
), GTK_SCROLL_NATURAL
);
173 g_assert_cmpint(gtk_scrollable_get_hscroll_policy(GTK_SCROLLABLE(layout
)), ==, GTK_SCROLL_NATURAL
);
175 g_object_set(layout
, "hscroll-policy", GTK_SCROLL_MINIMUM
, NULL
);
176 g_object_get(layout
, "hscroll-policy", &policy
, NULL
);
177 g_assert_cmpint(policy
, ==, GTK_SCROLL_MINIMUM
);
179 gtk_widget_destroy(GTK_WIDGET(layout
));
183 _adg_property_vscroll_policy(void)
185 AdgGtkLayout
*layout
;
186 GtkScrollablePolicy policy
;
188 layout
= ADG_GTK_LAYOUT(adg_gtk_layout_new());
190 /* Using the public APIs */
191 g_assert_cmpint(gtk_scrollable_get_vscroll_policy(GTK_SCROLLABLE(layout
)), ==, GTK_SCROLL_MINIMUM
);
193 gtk_scrollable_set_vscroll_policy(GTK_SCROLLABLE(layout
), GTK_SCROLL_NATURAL
);
194 g_assert_cmpint(gtk_scrollable_get_vscroll_policy(GTK_SCROLLABLE(layout
)), ==, GTK_SCROLL_NATURAL
);
196 g_object_set(layout
, "vscroll-policy", GTK_SCROLL_MINIMUM
, NULL
);
197 g_object_get(layout
, "vscroll-policy", &policy
, NULL
);
198 g_assert_cmpint(policy
, ==, GTK_SCROLL_MINIMUM
);
200 gtk_widget_destroy(GTK_WIDGET(layout
));
206 _adg_method_size_allocate(void)
208 AdgGtkLayout
*layout
;
210 cairo_matrix_t scale_x200
;
211 GtkAllocation allocation
;
212 GtkAdjustment
*adjustment
;
214 layout
= ADG_GTK_LAYOUT(adg_gtk_layout_new());
215 cairo_matrix_init_scale(&scale_x200
, 200, 200);
217 /* Allocation does not work if the widget is not visible: without a
218 * top-level this will hopefully do not require an X server running */
219 gtk_widget_show(GTK_WIDGET(layout
));
221 adjustment
= adg_gtk_layout_get_hadjustment(layout
);
222 g_assert_nonnull(adjustment
);
223 adg_assert_isapprox(gtk_adjustment_get_lower(adjustment
), 0);
224 adg_assert_isapprox(gtk_adjustment_get_upper(adjustment
), 0);
225 adg_assert_isapprox(gtk_adjustment_get_page_size(adjustment
), 0);
226 adg_assert_isapprox(gtk_adjustment_get_value(adjustment
), 0);
228 adjustment
= adg_gtk_layout_get_vadjustment(layout
);
229 g_assert_nonnull(adjustment
);
230 adg_assert_isapprox(gtk_adjustment_get_lower(adjustment
), 0);
231 adg_assert_isapprox(gtk_adjustment_get_upper(adjustment
), 0);
232 adg_assert_isapprox(gtk_adjustment_get_page_size(adjustment
), 0);
233 adg_assert_isapprox(gtk_adjustment_get_value(adjustment
), 0);
235 allocation
.width
= 100;
236 allocation
.height
= 100;
237 gtk_widget_size_allocate(GTK_WIDGET(layout
), &allocation
);
239 adjustment
= adg_gtk_layout_get_hadjustment(layout
);
240 g_assert_nonnull(adjustment
);
241 adg_assert_isapprox(gtk_adjustment_get_lower(adjustment
), 0);
242 adg_assert_isapprox(gtk_adjustment_get_upper(adjustment
), 0);
243 adg_assert_isapprox(gtk_adjustment_get_page_size(adjustment
), 0);
244 adg_assert_isapprox(gtk_adjustment_get_value(adjustment
), 0);
246 adjustment
= adg_gtk_layout_get_vadjustment(layout
);
247 g_assert_nonnull(adjustment
);
248 adg_assert_isapprox(gtk_adjustment_get_lower(adjustment
), 0);
249 adg_assert_isapprox(gtk_adjustment_get_upper(adjustment
), 0);
250 adg_assert_isapprox(gtk_adjustment_get_page_size(adjustment
), 0);
251 adg_assert_isapprox(gtk_adjustment_get_value(adjustment
), 0);
253 /* The allocation phase is one-shot, so I must destroy and recreate
254 * the AdgGtkLayout widget every time to trigger the size allocation */
255 gtk_widget_destroy(GTK_WIDGET(layout
));
256 layout
= _adg_gtk_layout_new();
257 canvas
= adg_gtk_area_get_canvas(ADG_GTK_AREA(layout
));
258 gtk_widget_show(GTK_WIDGET(layout
));
260 adg_entity_transform_global_map(ADG_ENTITY(canvas
),
262 ADG_TRANSFORM_AFTER
);
264 adjustment
= adg_gtk_layout_get_hadjustment(layout
);
265 g_assert_nonnull(adjustment
);
266 adg_assert_isapprox(gtk_adjustment_get_lower(adjustment
), 0);
267 adg_assert_isapprox(gtk_adjustment_get_upper(adjustment
), 0);
268 adg_assert_isapprox(gtk_adjustment_get_page_size(adjustment
), 0);
269 adg_assert_isapprox(gtk_adjustment_get_value(adjustment
), 0);
271 adjustment
= adg_gtk_layout_get_vadjustment(layout
);
272 g_assert_nonnull(adjustment
);
273 adg_assert_isapprox(gtk_adjustment_get_lower(adjustment
), 0);
274 adg_assert_isapprox(gtk_adjustment_get_upper(adjustment
), 0);
275 adg_assert_isapprox(gtk_adjustment_get_page_size(adjustment
), 0);
276 adg_assert_isapprox(gtk_adjustment_get_value(adjustment
), 0);
278 allocation
.width
= 100;
279 allocation
.height
= 100;
280 gtk_widget_size_allocate(GTK_WIDGET(layout
), &allocation
);
282 adjustment
= adg_gtk_layout_get_hadjustment(layout
);
283 g_assert_nonnull(adjustment
);
284 adg_assert_isapprox(gtk_adjustment_get_lower(adjustment
), -50);
285 adg_assert_isapprox(gtk_adjustment_get_upper(adjustment
), 150);
286 adg_assert_isapprox(gtk_adjustment_get_page_size(adjustment
), 100);
287 adg_assert_isapprox(gtk_adjustment_get_value(adjustment
), 0);
289 adjustment
= adg_gtk_layout_get_vadjustment(layout
);
290 g_assert_nonnull(adjustment
);
291 adg_assert_isapprox(gtk_adjustment_get_lower(adjustment
), -50);
292 adg_assert_isapprox(gtk_adjustment_get_upper(adjustment
), 150);
293 adg_assert_isapprox(gtk_adjustment_get_page_size(adjustment
), 100);
294 adg_assert_isapprox(gtk_adjustment_get_value(adjustment
), 0);
296 allocation
.width
= 20;
297 allocation
.height
= 30;
298 gtk_widget_size_allocate(GTK_WIDGET(layout
), &allocation
);
300 adjustment
= adg_gtk_layout_get_hadjustment(layout
);
301 g_assert_nonnull(adjustment
);
302 adg_assert_isapprox(gtk_adjustment_get_lower(adjustment
), -50);
303 adg_assert_isapprox(gtk_adjustment_get_upper(adjustment
), 150);
304 adg_assert_isapprox(gtk_adjustment_get_page_size(adjustment
), 20);
305 adg_assert_isapprox(gtk_adjustment_get_value(adjustment
), 0);
307 adjustment
= adg_gtk_layout_get_vadjustment(layout
);
308 g_assert_nonnull(adjustment
);
309 adg_assert_isapprox(gtk_adjustment_get_lower(adjustment
), -50);
310 adg_assert_isapprox(gtk_adjustment_get_upper(adjustment
), 150);
311 adg_assert_isapprox(gtk_adjustment_get_page_size(adjustment
), 30);
312 adg_assert_isapprox(gtk_adjustment_get_value(adjustment
), 0);
314 adg_gtk_area_canvas_changed(ADG_GTK_AREA(layout
), NULL
);
316 gtk_widget_destroy(GTK_WIDGET(layout
));
320 _adg_method_value_changed(void)
322 AdgGtkLayout
*layout
;
324 cairo_matrix_t scale_x200
;
325 GtkAllocation allocation
;
326 GtkAdjustment
*adjustment
;
328 layout
= _adg_gtk_layout_new();
329 canvas
= adg_gtk_area_get_canvas(ADG_GTK_AREA(layout
));
330 cairo_matrix_init_scale(&scale_x200
, 200, 200);
332 adg_entity_transform_global_map(ADG_ENTITY(canvas
),
334 ADG_TRANSFORM_AFTER
);
336 /* Allocation does not work if the widget is not visible: without a
337 * top-level this will hopefully do not require an X server running */
338 gtk_widget_show(GTK_WIDGET(layout
));
340 allocation
.width
= 100;
341 allocation
.height
= 100;
342 gtk_widget_size_allocate(GTK_WIDGET(layout
), &allocation
);
344 adjustment
= adg_gtk_layout_get_hadjustment(layout
);
345 gtk_adjustment_set_value(adjustment
, 100);
347 adjustment
= adg_gtk_layout_get_vadjustment(layout
);
348 gtk_adjustment_set_value(adjustment
, 40);
350 adjustment
= adg_gtk_layout_get_hadjustment(layout
);
351 g_assert_nonnull(adjustment
);
352 adg_assert_isapprox(gtk_adjustment_get_lower(adjustment
), -50);
353 adg_assert_isapprox(gtk_adjustment_get_upper(adjustment
), 150);
354 adg_assert_isapprox(gtk_adjustment_get_page_size(adjustment
), 100);
356 adg_assert_isapprox(gtk_adjustment_get_value(adjustment
), 100);
359 adg_assert_isapprox(gtk_adjustment_get_value(adjustment
), 50);
362 adjustment
= adg_gtk_layout_get_vadjustment(layout
);
363 g_assert_nonnull(adjustment
);
364 adg_assert_isapprox(gtk_adjustment_get_lower(adjustment
), -50);
365 adg_assert_isapprox(gtk_adjustment_get_upper(adjustment
), 150);
366 adg_assert_isapprox(gtk_adjustment_get_page_size(adjustment
), 100);
367 adg_assert_isapprox(gtk_adjustment_get_value(adjustment
), 40);
369 gtk_widget_destroy(GTK_WIDGET(layout
));
373 _adg_method_set_parent(void)
375 AdgGtkLayout
*layout
;
376 GtkScrolledWindow
*scrolled_window
;
377 GtkPolicyType hpolicy
, vpolicy
;
380 layout
= _adg_gtk_layout_new();
381 scrolled_window
= GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL
, NULL
));
383 gtk_scrolled_window_set_policy(scrolled_window
,
384 GTK_POLICY_ALWAYS
, GTK_POLICY_ALWAYS
);
385 gtk_scrolled_window_get_policy(scrolled_window
, &hpolicy
, &vpolicy
);
386 g_assert_cmpint(hpolicy
, ==, GTK_POLICY_ALWAYS
);
387 g_assert_cmpint(vpolicy
, ==, GTK_POLICY_ALWAYS
);
389 gtk_widget_get_size_request(GTK_WIDGET(scrolled_window
), &width
, &height
);
390 g_assert_cmpint(width
, ==, -1);
391 g_assert_cmpint(height
, ==, -1);
393 /* Adding layout inside scrolled_window triggers some customization
395 gtk_container_add(GTK_CONTAINER(scrolled_window
), GTK_WIDGET(layout
));
397 /* Ensure the scrolling policy is set to NEVER */
398 gtk_scrolled_window_get_policy(scrolled_window
, &hpolicy
, &vpolicy
);
399 g_assert_cmpint(hpolicy
, ==, GTK_POLICY_NEVER
);
400 g_assert_cmpint(vpolicy
, ==, GTK_POLICY_NEVER
);
402 /* Check the scrolled window size has been updated */
403 gtk_widget_get_size_request(GTK_WIDGET(scrolled_window
), &width
, &height
);
405 /* The current implementation adds 1 pixel margin, so 1x1 becomes 3x3 */
406 g_assert_cmpint(width
, ==, 3);
407 g_assert_cmpint(height
, ==, 3);
409 gtk_widget_destroy(GTK_WIDGET(scrolled_window
));
414 main(int argc
, char *argv
[])
416 adg_test_init(&argc
, &argv
);
417 gtk_init_check(&argc
, &argv
);
419 adg_test_add_object_checks("/adg/gtk/layout/type/object", ADG_GTK_TYPE_LAYOUT
);
421 g_test_add_func("/adg-gtk/layout/property/hadjustment", _adg_property_hadjustment
);
422 g_test_add_func("/adg-gtk/layout/property/vadjustment", _adg_property_vadjustment
);
424 g_test_add_func("/adg-gtk/layout/property/hscroll-policy", _adg_property_hscroll_policy
);
425 g_test_add_func("/adg-gtk/layout/property/vscroll-policy", _adg_property_vscroll_policy
);
428 g_test_add_func("/adg-gtk/layout/method/size-allocate", _adg_method_size_allocate
);
429 g_test_add_func("/adg-gtk/layout/method/value-changed", _adg_method_value_changed
);
430 g_test_add_func("/adg-gtk/layout/method/parent-set", _adg_method_set_parent
);