doc: update copyright line for 2021
[adg.git] / src / adg / tests / test-gtk-layout.c
blob323595be08896a9e2d1d5d5a9823d655d8c1559f
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.
21 #include <config.h>
22 #include <adg-test.h>
23 #include <adg.h>
26 static AdgGtkLayout *
27 _adg_gtk_layout_new(void)
29 AdgGtkLayout *layout;
30 AdgCanvas *canvas;
32 canvas = adg_test_canvas();
33 layout = ADG_GTK_LAYOUT(adg_gtk_layout_new_with_canvas(canvas));
34 g_object_unref(canvas);
36 return layout;
39 static void
40 _adg_property_hadjustment(void)
42 AdgGtkLayout *layout;
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);
99 static void
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);
159 #ifdef GTK3_ENABLED
161 static void
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));
182 static void
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));
203 #endif
205 static void
206 _adg_method_size_allocate(void)
208 AdgGtkLayout *layout;
209 AdgCanvas *canvas;
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),
261 &scale_x200,
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));
319 static void
320 _adg_method_value_changed(void)
322 AdgGtkLayout *layout;
323 AdgCanvas *canvas;
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),
333 &scale_x200,
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);
355 #ifdef GTK2_ENABLED
356 adg_assert_isapprox(gtk_adjustment_get_value(adjustment), 100);
357 #endif
358 #ifdef GTK3_ENABLED
359 adg_assert_isapprox(gtk_adjustment_get_value(adjustment), 50);
360 #endif
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));
372 static void
373 _adg_method_set_parent(void)
375 AdgGtkLayout *layout;
376 GtkScrolledWindow *scrolled_window;
377 GtkPolicyType hpolicy, vpolicy;
378 gint width, height;
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
394 * of the latter */
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);
423 #ifdef GTK3_ENABLED
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);
426 #endif
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);
432 return g_test_run();