1/* buildertest.c
2 * Copyright (C) 2006-2007 Async Open Source
3 * Authors: Johan Dahlin
4 * Henrique Romano
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
15 *
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#include <string.h>
21#include <libintl.h>
22#include <locale.h>
23#include <math.h>
24
25#include <gtk/gtk.h>
26#include <gdk/gdkkeysyms.h>
27
28#ifdef G_OS_WIN32
29# define _BUILDER_TEST_EXPORT __declspec(dllexport)
30#else
31# define _BUILDER_TEST_EXPORT
32#endif
33
34/* exported for GtkBuilder */
35_BUILDER_TEST_EXPORT void signal_normal (GtkWindow *window, GParamSpec *spec);
36_BUILDER_TEST_EXPORT void signal_after (GtkWindow *window, GParamSpec *spec);
37_BUILDER_TEST_EXPORT void signal_object (GtkButton *button, GParamSpec *spec);
38_BUILDER_TEST_EXPORT void signal_object_after (GtkButton *button, GParamSpec *spec);
39_BUILDER_TEST_EXPORT void signal_first (GtkButton *button, GParamSpec *spec);
40_BUILDER_TEST_EXPORT void signal_second (GtkButton *button, GParamSpec *spec);
41_BUILDER_TEST_EXPORT void signal_extra (GtkButton *button, GParamSpec *spec);
42_BUILDER_TEST_EXPORT void signal_extra2 (GtkButton *button, GParamSpec *spec);
43
44
45static GtkBuilder *
46builder_new_from_string (const char *buffer,
47 gsize length,
48 const char *domain)
49{
50 GtkBuilder *builder;
51 GError *error = NULL;
52
53 builder = gtk_builder_new ();
54 if (domain)
55 gtk_builder_set_translation_domain (builder, domain);
56 gtk_builder_add_from_string (builder, buffer, length, error: &error);
57 if (error)
58 {
59 g_print (format: "ERROR: %s", error->message);
60 g_error_free (error);
61 }
62
63 return builder;
64}
65
66static void
67test_parser (void)
68{
69 GtkBuilder *builder;
70 GError *error;
71
72 builder = gtk_builder_new ();
73
74 error = NULL;
75 gtk_builder_add_from_string (builder, buffer: "<xxx/>", length: -1, error: &error);
76 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_UNHANDLED_TAG);
77 g_error_free (error);
78
79 error = NULL;
80 gtk_builder_add_from_string (builder, buffer: "<interface invalid=\"X\"/>", length: -1, error: &error);
81 g_assert_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE);
82 g_error_free (error);
83
84 error = NULL;
85 gtk_builder_add_from_string (builder, buffer: "<interface><child/></interface>", length: -1, error: &error);
86 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_TAG);
87 g_error_free (error);
88
89 error = NULL;
90 gtk_builder_add_from_string (builder, buffer: "<interface><object class=\"GtkBox\" id=\"a\"><object class=\"GtkBox\" id=\"b\"/></object></interface>", length: -1, error: &error);
91 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_TAG);
92 g_error_free (error);
93
94 error = NULL;
95 gtk_builder_add_from_string (builder, buffer: "<interface><object class=\"Unknown\" id=\"a\"></object></interface>", length: -1, error: &error);
96 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE);
97 g_error_free (error);
98
99 error = NULL;
100 gtk_builder_add_from_string (builder, buffer: "<interface><object class=\"GtkWidget\" id=\"a\" constructor=\"none\"></object></interface>", length: -1, error: &error);
101 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE);
102 g_error_free (error);
103
104 error = NULL;
105 gtk_builder_add_from_string (builder, buffer: "<interface><object class=\"GtkButton\" id=\"a\"><child internal-child=\"foobar\"><object class=\"GtkButton\" id=\"int\"/></child></object></interface>", length: -1, error: &error);
106 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE);
107 g_error_free (error);
108
109 error = NULL;
110 gtk_builder_add_from_string (builder, buffer: "<interface><object class=\"GtkButton\" id=\"a\"></object><object class=\"GtkButton\" id=\"a\"/></object></interface>", length: -1, error: &error);
111 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_DUPLICATE_ID);
112 g_error_free (error);
113
114 error = NULL;
115 gtk_builder_add_from_string (builder, buffer: "<interface><object class=\"GtkButton\" id=\"a\"><property name=\"deafbeef\"></property></object></interface>", length: -1, error: &error);
116 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_PROPERTY);
117 g_error_free (error);
118
119 error = NULL;
120 gtk_builder_add_from_string (builder, buffer: "<interface><object class=\"GtkButton\" id=\"a\"><signal name=\"deafbeef\" handler=\"gtk_true\"/></object></interface>", length: -1, error: &error);
121 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_SIGNAL);
122 g_error_free (error);
123
124 g_object_unref (object: builder);
125}
126
127static int normal = 0;
128static int after = 0;
129static int object = 0;
130static int object_after = 0;
131
132void /* exported for GtkBuilder */
133signal_normal (GtkWindow *window, GParamSpec *spec)
134{
135 g_assert_true (GTK_IS_WINDOW (window));
136 g_assert_true (normal == 0);
137 g_assert_true (after == 0);
138
139 normal++;
140}
141
142void /* exported for GtkBuilder */
143signal_after (GtkWindow *window, GParamSpec *spec)
144{
145 g_assert_true (GTK_IS_WINDOW (window));
146 g_assert_true (normal == 1);
147 g_assert_true (after == 0);
148
149 after++;
150}
151
152void /* exported for GtkBuilder */
153signal_object (GtkButton *button, GParamSpec *spec)
154{
155 g_assert_true (GTK_IS_BUTTON (button));
156 g_assert_true (object == 0);
157 g_assert_true (object_after == 0);
158
159 object++;
160}
161
162void /* exported for GtkBuilder */
163signal_object_after (GtkButton *button, GParamSpec *spec)
164{
165 g_assert_true (GTK_IS_BUTTON (button));
166 g_assert_true (object == 1);
167 g_assert_true (object_after == 0);
168
169 object_after++;
170}
171
172void /* exported for GtkBuilder */
173signal_first (GtkButton *button, GParamSpec *spec)
174{
175 g_assert_true (normal == 0);
176 normal = 10;
177}
178
179void /* exported for GtkBuilder */
180signal_second (GtkButton *button, GParamSpec *spec)
181{
182 g_assert_true (normal == 10);
183 normal = 20;
184}
185
186void /* exported for GtkBuilder */
187signal_extra (GtkButton *button, GParamSpec *spec)
188{
189 g_assert_true (normal == 20);
190 normal = 30;
191}
192
193void /* exported for GtkBuilder */
194signal_extra2 (GtkButton *button, GParamSpec *spec)
195{
196 g_assert_true (normal == 30);
197 normal = 40;
198}
199
200static void
201test_connect_signals (void)
202{
203 GtkBuilder *builder;
204 GObject *window;
205 const char buffer[] =
206 "<interface>"
207 " <object class=\"GtkButton\" id=\"button\"/>"
208 " <object class=\"GtkWindow\" id=\"window1\">"
209 " <signal name=\"notify::title\" handler=\"signal_normal\"/>"
210 " <signal name=\"notify::title\" handler=\"signal_after\" after=\"yes\"/>"
211 " <signal name=\"notify::title\" handler=\"signal_object\""
212 " object=\"button\"/>"
213 " <signal name=\"notify::title\" handler=\"signal_object_after\""
214 " object=\"button\" after=\"yes\"/>"
215 " </object>"
216 "</interface>";
217 const char buffer_order[] =
218 "<interface>"
219 " <object class=\"GtkWindow\" id=\"window1\">"
220 " <signal name=\"notify::title\" handler=\"signal_first\"/>"
221 " <signal name=\"notify::title\" handler=\"signal_second\"/>"
222 " </object>"
223 "</interface>";
224 const char buffer_extra[] =
225 "<interface>"
226 " <object class=\"GtkWindow\" id=\"window2\">"
227 " <signal name=\"notify::title\" handler=\"signal_extra\"/>"
228 " </object>"
229 "</interface>";
230 const char buffer_extra2[] =
231 "<interface>"
232 " <object class=\"GtkWindow\" id=\"window3\">"
233 " <signal name=\"notify::title\" handler=\"signal_extra2\"/>"
234 " </object>"
235 "</interface>";
236 const char buffer_after_child[] =
237 "<interface>"
238 " <object class=\"GtkWindow\" id=\"window1\">"
239 " <child>"
240 " <object class=\"GtkButton\" id=\"button1\"/>"
241 " </child>"
242 " <signal name=\"notify::title\" handler=\"signal_normal\"/>"
243 " </object>"
244 "</interface>";
245
246 builder = builder_new_from_string (buffer, length: -1, NULL);
247
248 window = gtk_builder_get_object (builder, name: "window1");
249 gtk_window_set_title (GTK_WINDOW (window), title: "test");
250
251 g_assert_cmpint (normal, ==, 1);
252 g_assert_cmpint (after, ==, 1);
253 g_assert_cmpint (object, ==, 1);
254 g_assert_cmpint (object_after, ==, 1);
255
256 gtk_window_destroy (GTK_WINDOW (window));
257 g_object_unref (object: builder);
258
259 builder = builder_new_from_string (buffer: buffer_order, length: -1, NULL);
260 window = gtk_builder_get_object (builder, name: "window1");
261 normal = 0;
262 gtk_window_set_title (GTK_WINDOW (window), title: "test");
263 g_assert_true (normal == 20);
264
265 gtk_window_destroy (GTK_WINDOW (window));
266
267 gtk_builder_add_from_string (builder, buffer: buffer_extra,
268 length: strlen (s: buffer_extra), NULL);
269 gtk_builder_add_from_string (builder, buffer: buffer_extra2,
270 length: strlen (s: buffer_extra2), NULL);
271 window = gtk_builder_get_object (builder, name: "window2");
272 gtk_window_set_title (GTK_WINDOW (window), title: "test");
273 g_assert_true (normal == 30);
274
275 gtk_window_destroy (GTK_WINDOW (window));
276 window = gtk_builder_get_object (builder, name: "window3");
277 gtk_window_set_title (GTK_WINDOW (window), title: "test");
278 g_assert_true (normal == 40);
279 gtk_window_destroy (GTK_WINDOW (window));
280
281 g_object_unref (object: builder);
282
283 /* new test, reset globals */
284 after = 0;
285 normal = 0;
286
287 builder = builder_new_from_string (buffer: buffer_after_child, length: -1, NULL);
288 window = gtk_builder_get_object (builder, name: "window1");
289 gtk_window_set_title (GTK_WINDOW (window), title: "test");
290
291 g_assert_true (normal == 1);
292 gtk_window_destroy (GTK_WINDOW (window));
293 g_object_unref (object: builder);
294}
295
296static void
297test_domain (void)
298{
299 GtkBuilder *builder;
300 const char buffer1[] = "<interface/>";
301 const char buffer2[] = "<interface domain=\"domain\"/>";
302 const char *domain;
303
304 builder = builder_new_from_string (buffer: buffer1, length: -1, NULL);
305 domain = gtk_builder_get_translation_domain (builder);
306 g_assert_true (domain == NULL);
307 g_object_unref (object: builder);
308
309 builder = builder_new_from_string (buffer: buffer1, length: -1, domain: "domain-1");
310 domain = gtk_builder_get_translation_domain (builder);
311 g_assert_nonnull (domain);
312 g_assert_true (strcmp (domain, "domain-1") == 0);
313 g_object_unref (object: builder);
314
315 builder = builder_new_from_string (buffer: buffer2, length: -1, NULL);
316 domain = gtk_builder_get_translation_domain (builder);
317 g_assert_null (domain);
318 g_object_unref (object: builder);
319}
320
321#if 0
322static void
323test_translation (void)
324{
325 GtkBuilder *builder;
326 const char buffer[] =
327 "<interface>"
328 " <object class=\"GtkWindow\" id=\"window1\">"
329 " <child>"
330 " <object class=\"GtkLabel\" id=\"label\">"
331 " <property name=\"label\" translatable=\"yes\">File</property>"
332 " </object>"
333 " </child>"
334 " </object>"
335 "</interface>";
336 GtkLabel *window, *label;
337
338 setlocale (LC_ALL, "sv_SE");
339 textdomain ("builder");
340 bindtextdomain ("builder", "tests");
341
342 builder = builder_new_from_string (buffer, -1, NULL);
343 label = GTK_LABEL (gtk_builder_get_object (builder, "label"));
344 g_assert_true (strcmp (gtk_label_get_text (label), "Arkiv") == 0);
345
346 window = gtk_builder_get_object (builder, "window1");
347 gtk_window_destroy (GTK_WINDOW (window));
348 g_object_unref (builder);
349}
350#endif
351
352static void
353test_sizegroup (void)
354{
355 GtkBuilder * builder;
356 const char buffer1[] =
357 "<interface domain=\"test\">"
358 " <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
359 " <property name=\"mode\">horizontal</property>"
360 " <widgets>"
361 " <widget name=\"radio1\"/>"
362 " <widget name=\"radio2\"/>"
363 " </widgets>"
364 " </object>"
365 " <object class=\"GtkWindow\" id=\"window1\">"
366 " <child>"
367 " <object class=\"GtkBox\" id=\"vbox1\">"
368 " <property name=\"orientation\">vertical</property>"
369 " <child>"
370 " <object class=\"GtkCheckButton\" id=\"radio1\"/>"
371 " </child>"
372 " <child>"
373 " <object class=\"GtkCheckButton\" id=\"radio2\"/>"
374 " </child>"
375 " </object>"
376 " </child>"
377 " </object>"
378 "</interface>";
379 const char buffer2[] =
380 "<interface domain=\"test\">"
381 " <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
382 " <property name=\"mode\">horizontal</property>"
383 " <widgets>"
384 " </widgets>"
385 " </object>"
386 "</interface>";
387 const char buffer3[] =
388 "<interface domain=\"test\">"
389 " <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
390 " <property name=\"mode\">horizontal</property>"
391 " <widgets>"
392 " <widget name=\"radio1\"/>"
393 " <widget name=\"radio2\"/>"
394 " </widgets>"
395 " </object>"
396 " <object class=\"GtkSizeGroup\" id=\"sizegroup2\">"
397 " <property name=\"mode\">horizontal</property>"
398 " <widgets>"
399 " <widget name=\"radio1\"/>"
400 " <widget name=\"radio2\"/>"
401 " </widgets>"
402 " </object>"
403 " <object class=\"GtkWindow\" id=\"window1\">"
404 " <child>"
405 " <object class=\"GtkBox\" id=\"vbox1\">"
406 " <property name=\"orientation\">vertical</property>"
407 " <child>"
408 " <object class=\"GtkCheckButton\" id=\"radio1\"/>"
409 " </child>"
410 " <child>"
411 " <object class=\"GtkCheckButton\" id=\"radio2\"/>"
412 " </child>"
413 " </object>"
414 " </child>"
415 " </object>"
416 "</interface>";
417 GObject *sizegroup;
418 GSList *widgets;
419
420 builder = builder_new_from_string (buffer: buffer1, length: -1, NULL);
421 sizegroup = gtk_builder_get_object (builder, name: "sizegroup1");
422 widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
423 g_assert_cmpint (g_slist_length (widgets), ==, 2);
424 g_slist_free (list: widgets);
425 g_object_unref (object: builder);
426
427 builder = builder_new_from_string (buffer: buffer2, length: -1, NULL);
428 sizegroup = gtk_builder_get_object (builder, name: "sizegroup1");
429 widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
430 g_assert_cmpint (g_slist_length (widgets), ==, 0);
431 g_slist_free (list: widgets);
432 g_object_unref (object: builder);
433
434 builder = builder_new_from_string (buffer: buffer3, length: -1, NULL);
435 sizegroup = gtk_builder_get_object (builder, name: "sizegroup1");
436 widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
437 g_assert_cmpint (g_slist_length (widgets), ==, 2);
438 g_slist_free (list: widgets);
439 sizegroup = gtk_builder_get_object (builder, name: "sizegroup2");
440 widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
441 g_assert_cmpint (g_slist_length (widgets), ==, 2);
442 g_slist_free (list: widgets);
443
444#if 0
445 {
446 GObject *window;
447 window = gtk_builder_get_object (builder, "window1");
448 gtk_window_destroy (GTK_WINDOW (window));
449 }
450#endif
451 g_object_unref (object: builder);
452}
453
454static void
455test_list_store (void)
456{
457 const char buffer1[] =
458 "<interface>"
459 " <object class=\"GtkListStore\" id=\"liststore1\">"
460 " <columns>"
461 " <column type=\"gchararray\"/>"
462 " <column type=\"guint\"/>"
463 " </columns>"
464 " </object>"
465 "</interface>";
466 const char buffer2[] =
467 "<interface>"
468 " <object class=\"GtkListStore\" id=\"liststore1\">"
469 " <columns>"
470 " <column type=\"gchararray\"/>"
471 " <column type=\"gchararray\"/>"
472 " <column type=\"gint\"/>"
473 " </columns>"
474 " <data>"
475 " <row>"
476 " <col id=\"0\" translatable=\"yes\">John</col>"
477 " <col id=\"1\" context=\"foo\">Doe</col>"
478 " <col id=\"2\" comments=\"foobar\">25</col>"
479 " </row>"
480 " <row>"
481 " <col id=\"0\">Johan</col>"
482 " <col id=\"1\">Dole</col>"
483 " <col id=\"2\">50</col>"
484 " </row>"
485 " </data>"
486 " </object>"
487 "</interface>";
488 const char buffer3[] =
489 "<interface>"
490 " <object class=\"GtkListStore\" id=\"liststore1\">"
491 " <columns>"
492 " <column type=\"gchararray\"/>"
493 " <column type=\"gchararray\"/>"
494 " <column type=\"gint\"/>"
495 " </columns>"
496 " <data>"
497 " <row>"
498 " <col id=\"1\" context=\"foo\">Doe</col>"
499 " <col id=\"0\" translatable=\"yes\">John</col>"
500 " <col id=\"2\" comments=\"foobar\">25</col>"
501 " </row>"
502 " <row>"
503 " <col id=\"2\">50</col>"
504 " <col id=\"1\">Dole</col>"
505 " <col id=\"0\">Johan</col>"
506 " </row>"
507 " <row>"
508 " <col id=\"2\">19</col>"
509 " </row>"
510 " </data>"
511 " </object>"
512 "</interface>";
513 GtkBuilder *builder;
514 GObject *store;
515 GtkTreeIter iter;
516 char *surname, *lastname;
517 int age;
518
519 builder = builder_new_from_string (buffer: buffer1, length: -1, NULL);
520 store = gtk_builder_get_object (builder, name: "liststore1");
521 g_assert_cmpint (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)), ==, 2);
522 g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0), ==, G_TYPE_STRING);
523 g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1), ==, G_TYPE_UINT);
524 g_object_unref (object: builder);
525
526 builder = builder_new_from_string (buffer: buffer2, length: -1, NULL);
527 store = gtk_builder_get_object (builder, name: "liststore1");
528 g_assert_cmpint (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)), ==, 3);
529 g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0), ==, G_TYPE_STRING);
530 g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1), ==, G_TYPE_STRING);
531 g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2), ==, G_TYPE_INT);
532
533 g_assert_cmpint (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter), ==, TRUE);
534 gtk_tree_model_get (GTK_TREE_MODEL (store), iter: &iter,
535 0, &surname,
536 1, &lastname,
537 2, &age,
538 -1);
539 g_assert_cmpstr (surname, ==, "John");
540 g_free (mem: surname);
541 g_assert_cmpstr (lastname, ==, "Doe");
542 g_free (mem: lastname);
543 g_assert_cmpint (age, ==, 25);
544 g_assert_true (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter));
545
546 gtk_tree_model_get (GTK_TREE_MODEL (store), iter: &iter,
547 0, &surname,
548 1, &lastname,
549 2, &age,
550 -1);
551 g_assert_cmpstr (surname, ==, "Johan");
552 g_free (mem: surname);
553 g_assert_cmpstr (lastname, ==, "Dole");
554 g_free (mem: lastname);
555 g_assert_cmpint (age, ==, 50);
556 g_assert_false (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter));
557
558 g_object_unref (object: builder);
559
560 builder = builder_new_from_string (buffer: buffer3, length: -1, NULL);
561 store = gtk_builder_get_object (builder, name: "liststore1");
562 g_assert_cmpint (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)), ==, 3);
563 g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0), ==, G_TYPE_STRING);
564 g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1), ==, G_TYPE_STRING);
565 g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2), ==, G_TYPE_INT);
566
567 g_assert_true (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
568 gtk_tree_model_get (GTK_TREE_MODEL (store), iter: &iter,
569 0, &surname,
570 1, &lastname,
571 2, &age,
572 -1);
573 g_assert_cmpstr (surname, ==, "John");
574 g_free (mem: surname);
575 g_assert_cmpstr (lastname, ==, "Doe");
576 g_free (mem: lastname);
577 g_assert_cmpint (age, ==, 25);
578 g_assert_true (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter));
579
580 gtk_tree_model_get (GTK_TREE_MODEL (store), iter: &iter,
581 0, &surname,
582 1, &lastname,
583 2, &age,
584 -1);
585 g_assert_cmpstr (surname, ==, "Johan");
586 g_free (mem: surname);
587 g_assert_cmpstr (lastname, ==, "Dole");
588 g_free (mem: lastname);
589 g_assert_cmpint (age, ==, 50);
590 g_assert_true (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter));
591
592 gtk_tree_model_get (GTK_TREE_MODEL (store), iter: &iter,
593 0, &surname,
594 1, &lastname,
595 2, &age,
596 -1);
597 g_assert_null (surname);
598 g_assert_null (lastname);
599 g_assert_cmpint (age, ==, 19);
600 g_assert_false (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter));
601
602 g_object_unref (object: builder);
603}
604
605static void
606test_tree_store (void)
607{
608 const char buffer[] =
609 "<interface domain=\"test\">"
610 " <object class=\"GtkTreeStore\" id=\"treestore1\">"
611 " <columns>"
612 " <column type=\"gchararray\"/>"
613 " <column type=\"guint\"/>"
614 " </columns>"
615 " </object>"
616 "</interface>";
617 GtkBuilder *builder;
618 GObject *store;
619
620 builder = builder_new_from_string (buffer, length: -1, NULL);
621 store = gtk_builder_get_object (builder, name: "treestore1");
622 g_assert_cmpint (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)), ==, 2);
623 g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0), ==, G_TYPE_STRING);
624 g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1), ==, G_TYPE_UINT);
625
626 g_object_unref (object: builder);
627}
628
629static void
630test_types (void)
631{
632 const char buffer[] =
633 "<interface>"
634 " <object class=\"GtkBox\" id=\"box\"/>"
635 " <object class=\"GtkButton\" id=\"button\"/>"
636 " <object class=\"GtkCheckButton\" id=\"checkbutton\"/>"
637 " <object class=\"GtkDialog\" id=\"dialog\"/>"
638 " <object class=\"GtkDrawingArea\" id=\"drawingarea\"/>"
639 " <object class=\"GtkEntry\" id=\"entry\"/>"
640 " <object class=\"GtkFontButton\" id=\"fontbutton\"/>"
641 " <object class=\"GtkImage\" id=\"image\"/>"
642 " <object class=\"GtkLabel\" id=\"label\"/>"
643 " <object class=\"GtkListStore\" id=\"liststore\"/>"
644 " <object class=\"GtkNotebook\" id=\"notebook\"/>"
645 " <object class=\"GtkProgressBar\" id=\"progressbar\"/>"
646 " <object class=\"GtkSizeGroup\" id=\"sizegroup\"/>"
647 " <object class=\"GtkScrolledWindow\" id=\"scrolledwindow\"/>"
648 " <object class=\"GtkSpinButton\" id=\"spinbutton\"/>"
649 " <object class=\"GtkStatusbar\" id=\"statusbar\"/>"
650 " <object class=\"GtkTextView\" id=\"textview\"/>"
651 " <object class=\"GtkToggleButton\" id=\"togglebutton\"/>"
652 " <object class=\"GtkTreeStore\" id=\"treestore\"/>"
653 " <object class=\"GtkTreeView\" id=\"treeview\"/>"
654 " <object class=\"GtkViewport\" id=\"viewport\"/>"
655 " <object class=\"GtkWindow\" id=\"window\"/>"
656 "</interface>";
657 const char buffer2[] =
658 "<interface>"
659 " <object class=\"GtkWindow\" type-func=\"gtk_window_get_type\" id=\"window\"/>"
660 "</interface>";
661 const char buffer3[] =
662 "<interface>"
663 " <object class=\"XXXInvalidType\" type-func=\"gtk_window_get_type\" id=\"window\"/>"
664 "</interface>";
665 const char buffer4[] =
666 "<interface>"
667 " <object class=\"GtkWindow\" type-func=\"xxx_invalid_get_type_function\" id=\"window\"/>"
668 "</interface>";
669 const char buffer5[] =
670 "<interface>"
671 " <object type-func=\"gtk_window_get_type\" id=\"window\"/>"
672 "</interface>";
673 GtkBuilder *builder;
674 GObject *window;
675 GError *error;
676
677 builder = builder_new_from_string (buffer, length: -1, NULL);
678 gtk_window_destroy (GTK_WINDOW (gtk_builder_get_object (builder, "dialog")));
679 gtk_window_destroy (GTK_WINDOW (gtk_builder_get_object (builder, "window")));
680 g_object_unref (object: builder);
681
682 builder = builder_new_from_string (buffer: buffer2, length: -1, NULL);
683 window = gtk_builder_get_object (builder, name: "window");
684 g_assert_true (GTK_IS_WINDOW (window));
685 gtk_window_destroy (GTK_WINDOW (window));
686 g_object_unref (object: builder);
687
688 builder = builder_new_from_string (buffer: buffer3, length: -1, NULL);
689 window = gtk_builder_get_object (builder, name: "window");
690 g_assert_true (GTK_IS_WINDOW (window));
691 gtk_window_destroy (GTK_WINDOW (window));
692 g_object_unref (object: builder);
693
694 error = NULL;
695 builder = gtk_builder_new ();
696 gtk_builder_add_from_string (builder, buffer: buffer4, length: -1, error: &error);
697 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_TYPE_FUNCTION);
698 g_error_free (error);
699 g_object_unref (object: builder);
700
701 error = NULL;
702 builder = gtk_builder_new ();
703 gtk_builder_add_from_string (builder, buffer: buffer5, length: -1, error: &error);
704 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_MISSING_ATTRIBUTE);
705 g_error_free (error);
706 g_object_unref (object: builder);
707}
708
709static void
710test_spin_button (void)
711{
712 GtkBuilder *builder;
713 const char buffer[] =
714 "<interface>"
715 "<object class=\"GtkAdjustment\" id=\"adjustment1\">"
716 "<property name=\"lower\">0</property>"
717 "<property name=\"upper\">10</property>"
718 "<property name=\"step-increment\">2</property>"
719 "<property name=\"page-increment\">3</property>"
720 "<property name=\"page-size\">0</property>"
721 "<property name=\"value\">1</property>"
722 "</object>"
723 "<object class=\"GtkSpinButton\" id=\"spinbutton1\">"
724 "<property name=\"visible\">True</property>"
725 "<property name=\"adjustment\">adjustment1</property>"
726 "</object>"
727 "</interface>";
728 GObject *obj;
729 GtkAdjustment *adjustment;
730 double value;
731
732 builder = builder_new_from_string (buffer, length: -1, NULL);
733 obj = gtk_builder_get_object (builder, name: "spinbutton1");
734 g_assert_true (GTK_IS_SPIN_BUTTON (obj));
735 adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (obj));
736 g_assert_true (GTK_IS_ADJUSTMENT (adjustment));
737 g_object_get (object: adjustment, first_property_name: "value", &value, NULL);
738 g_assert_cmpint (value, ==, 1);
739 g_object_get (object: adjustment, first_property_name: "lower", &value, NULL);
740 g_assert_cmpint (value, ==, 0);
741 g_object_get (object: adjustment, first_property_name: "upper", &value, NULL);
742 g_assert_cmpint (value, ==, 10);
743 g_object_get (object: adjustment, first_property_name: "step-increment", &value, NULL);
744 g_assert_cmpint (value, ==, 2);
745 g_object_get (object: adjustment, first_property_name: "page-increment", &value, NULL);
746 g_assert_cmpint (value, ==, 3);
747 g_object_get (object: adjustment, first_property_name: "page-size", &value, NULL);
748 g_assert_cmpint (value, ==, 0);
749
750 g_object_unref (object: builder);
751}
752
753static void
754test_notebook (void)
755{
756 GtkBuilder *builder;
757 const char buffer[] =
758 "<interface>"
759 " <object class=\"GtkNotebook\" id=\"notebook1\">"
760 " <child>"
761 " <object class=\"GtkNotebookPage\">"
762 " <property name=\"child\">"
763 " <object class=\"GtkLabel\" id=\"label1\">"
764 " <property name=\"label\">label1</property>"
765 " </object>"
766 " </property>"
767 " <property name=\"tab\">"
768 " <object class=\"GtkLabel\" id=\"tablabel1\">"
769 " <property name=\"label\">tab_label1</property>"
770 " </object>"
771 " </property>"
772 " </object>"
773 " </child>"
774 " <child>"
775 " <object class=\"GtkNotebookPage\">"
776 " <property name=\"child\">"
777 " <object class=\"GtkLabel\" id=\"label2\">"
778 " <property name=\"label\">label2</property>"
779 " </object>"
780 " </property>"
781 " <property name=\"tab\">"
782 " <object class=\"GtkLabel\" id=\"tablabel2\">"
783 " <property name=\"label\">tab_label2</property>"
784 " </object>"
785 " </property>"
786 " </object>"
787 " </child>"
788 " </object>"
789 "</interface>";
790 GObject *notebook;
791 GtkWidget *label;
792
793 builder = builder_new_from_string (buffer, length: -1, NULL);
794 notebook = gtk_builder_get_object (builder, name: "notebook1");
795 g_assert_nonnull (notebook);
796 g_assert_cmpint (gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)), ==, 2);
797
798 label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), page_num: 0);
799 g_assert_true (GTK_IS_LABEL (label));
800 g_assert_cmpstr (gtk_label_get_label (GTK_LABEL (label)), ==, "label1");
801 label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), child: label);
802 g_assert_true (GTK_IS_LABEL (label));
803 g_assert_cmpstr (gtk_label_get_label (GTK_LABEL (label)), ==, "tab_label1");
804
805 label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), page_num: 1);
806 g_assert_true (GTK_IS_LABEL (label));
807 g_assert_cmpstr (gtk_label_get_label (GTK_LABEL (label)), ==, "label2");
808 label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), child: label);
809 g_assert_true (GTK_IS_LABEL (label));
810 g_assert_cmpstr (gtk_label_get_label (GTK_LABEL (label)), ==, "tab_label2");
811
812 g_object_unref (object: builder);
813}
814
815static void
816test_construct_only_property (void)
817{
818 GtkBuilder *builder;
819 const char buffer[] =
820 "<interface>"
821 " <object class=\"GtkWindow\" id=\"window1\">"
822 " <property name=\"css-name\">amazing</property>"
823 " </object>"
824 "</interface>";
825 const char buffer2[] =
826 "<interface>"
827 " <object class=\"GtkTextTagTable\" id=\"tagtable1\"/>"
828 " <object class=\"GtkTextBuffer\" id=\"textbuffer1\">"
829 " <property name=\"tag-table\">tagtable1</property>"
830 " </object>"
831 "</interface>";
832 GObject *widget, *tagtable, *textbuffer;
833
834 builder = builder_new_from_string (buffer, length: -1, NULL);
835 widget = gtk_builder_get_object (builder, name: "window1");
836 g_assert_cmpstr (gtk_widget_get_css_name (GTK_WIDGET (widget)), ==, "amazing");
837
838 gtk_window_destroy (GTK_WINDOW (widget));
839 g_object_unref (object: builder);
840
841 builder = builder_new_from_string (buffer: buffer2, length: -1, NULL);
842 textbuffer = gtk_builder_get_object (builder, name: "textbuffer1");
843 g_assert_nonnull (textbuffer);
844 g_object_get (object: textbuffer, first_property_name: "tag-table", &tagtable, NULL);
845 g_assert_true (tagtable == gtk_builder_get_object (builder, "tagtable1"));
846 g_object_unref (object: tagtable);
847 g_object_unref (object: builder);
848}
849
850static void
851test_object_properties (void)
852{
853 GtkBuilder *builder;
854 const char buffer[] =
855 "<interface>"
856 " <object class=\"GtkWindow\" id=\"window1\">"
857 " <child>"
858 " <object class=\"GtkBox\" id=\"vbox\">"
859 " <property name=\"orientation\">vertical</property>"
860 " <child>"
861 " <object class=\"GtkLabel\" id=\"label1\">"
862 " <property name=\"mnemonic-widget\">spinbutton1</property>"
863 " </object>"
864 " </child>"
865 " <child>"
866 " <object class=\"GtkSpinButton\" id=\"spinbutton1\"/>"
867 " </child>"
868 " </object>"
869 " </child>"
870 " </object>"
871 "</interface>";
872 const char buffer2[] =
873 "<interface>"
874 " <object class=\"GtkWindow\" id=\"window2\"/>"
875 "</interface>";
876 GObject *label, *spinbutton, *window;
877
878 builder = builder_new_from_string (buffer, length: -1, NULL);
879 label = gtk_builder_get_object (builder, name: "label1");
880 g_assert_nonnull (label);
881 spinbutton = gtk_builder_get_object (builder, name: "spinbutton1");
882 g_assert_nonnull (spinbutton);
883 g_assert_true (spinbutton == (GObject*)gtk_label_get_mnemonic_widget (GTK_LABEL (label)));
884
885 gtk_builder_add_from_string (builder, buffer: buffer2, length: -1, NULL);
886 window = gtk_builder_get_object (builder, name: "window2");
887 g_assert_nonnull (window);
888 gtk_window_destroy (GTK_WINDOW (window));
889
890 g_object_unref (object: builder);
891}
892
893static void
894test_children (void)
895{
896 GtkBuilder * builder;
897 GtkWidget *content_area;
898 const char buffer1[] =
899 "<interface>"
900 " <object class=\"GtkWindow\" id=\"window1\">"
901 " <child>"
902 " <object class=\"GtkButton\" id=\"button1\">"
903 " <property name=\"label\">Hello</property>"
904 " </object>"
905 " </child>"
906 " </object>"
907 "</interface>";
908 const char buffer2[] =
909 "<interface>"
910 " <object class=\"GtkDialog\" id=\"dialog1\">"
911 " <property name=\"use_header_bar\">1</property>"
912 " <child internal-child=\"content_area\">"
913 " <object class=\"GtkBox\" id=\"dialog1-vbox\">"
914 " <property name=\"orientation\">vertical</property>"
915 " <child internal-child=\"action_area\">"
916 " <object class=\"GtkBox\" id=\"dialog1-action_area\">"
917 " <property name=\"orientation\">horizontal</property>"
918 " </object>"
919 " </child>"
920 " </object>"
921 " </child>"
922 " </object>"
923 "</interface>";
924
925 GObject *window, *button;
926 GObject *dialog, *vbox, *action_area;
927 GtkWidget *child;
928 int count;
929
930 builder = builder_new_from_string (buffer: buffer1, length: -1, NULL);
931 window = gtk_builder_get_object (builder, name: "window1");
932 g_assert_true (GTK_IS_WINDOW (window));
933
934 button = gtk_builder_get_object (builder, name: "button1");
935 g_assert_true (GTK_IS_BUTTON (button));
936 g_assert_nonnull (gtk_widget_get_parent (GTK_WIDGET(button)));
937 g_assert_cmpstr (gtk_buildable_get_buildable_id (GTK_BUILDABLE (gtk_widget_get_parent (GTK_WIDGET (button)))), ==, "window1");
938
939 gtk_window_destroy (GTK_WINDOW (window));
940 g_object_unref (object: builder);
941
942 builder = builder_new_from_string (buffer: buffer2, length: -1, NULL);
943 dialog = gtk_builder_get_object (builder, name: "dialog1");
944 g_assert_true (GTK_IS_DIALOG (dialog));
945 count = 0;
946 for (child = gtk_widget_get_first_child (GTK_WIDGET (dialog));
947 child != NULL;
948 child = gtk_widget_get_next_sibling (widget: child))
949 count++;
950 g_assert_cmpint (count, ==, 2);
951
952 vbox = gtk_builder_get_object (builder, name: "dialog1-vbox");
953 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
954 g_assert_true (GTK_IS_BOX (vbox));
955 g_assert_cmpint (gtk_orientable_get_orientation (GTK_ORIENTABLE (vbox)), ==, GTK_ORIENTATION_VERTICAL);
956 g_assert_cmpstr (gtk_buildable_get_buildable_id (GTK_BUILDABLE (content_area)), ==, "dialog1-vbox");
957
958 action_area = gtk_builder_get_object (builder, name: "dialog1-action_area");
959 g_assert_true (GTK_IS_BOX (action_area));
960 g_assert_cmpint (gtk_orientable_get_orientation (GTK_ORIENTABLE (action_area)), ==, GTK_ORIENTATION_HORIZONTAL);
961 g_assert_nonnull (gtk_widget_get_parent (GTK_WIDGET (action_area)));
962 g_assert_nonnull (gtk_buildable_get_buildable_id (GTK_BUILDABLE (action_area)));
963 gtk_window_destroy (GTK_WINDOW (dialog));
964 g_object_unref (object: builder);
965}
966
967static void
968test_layout_properties (void)
969{
970 GtkBuilder * builder;
971 const char buffer1[] =
972 "<interface>"
973 " <object class=\"GtkGrid\" id=\"grid1\">"
974 " <child>"
975 " <object class=\"GtkLabel\" id=\"label1\">"
976 " <layout>"
977 " <property name=\"column\">1</property>"
978 " </layout>"
979 " </object>"
980 " </child>"
981 " <child>"
982 " <object class=\"GtkLabel\" id=\"label2\">"
983 " <layout>"
984 " <property name=\"column\">0</property>"
985 " </layout>"
986 " </object>"
987 " </child>"
988 " </object>"
989 "</interface>";
990
991 GObject *label, *vbox;
992
993 builder = builder_new_from_string (buffer: buffer1, length: -1, NULL);
994 vbox = gtk_builder_get_object (builder, name: "grid1");
995 g_assert_true (GTK_IS_GRID (vbox));
996
997 label = gtk_builder_get_object (builder, name: "label1");
998 g_assert_true (GTK_IS_LABEL (label));
999
1000 label = gtk_builder_get_object (builder, name: "label2");
1001 g_assert_true (GTK_IS_LABEL (label));
1002
1003 g_object_unref (object: builder);
1004}
1005
1006static void
1007test_treeview_column (void)
1008{
1009 GtkBuilder *builder;
1010 const char buffer[] =
1011 "<interface>"
1012 "<object class=\"GtkListStore\" id=\"liststore1\">"
1013 " <columns>"
1014 " <column type=\"gchararray\"/>"
1015 " <column type=\"guint\"/>"
1016 " </columns>"
1017 " <data>"
1018 " <row>"
1019 " <col id=\"0\">John</col>"
1020 " <col id=\"1\">25</col>"
1021 " </row>"
1022 " </data>"
1023 "</object>"
1024 "<object class=\"GtkWindow\" id=\"window1\">"
1025 " <child>"
1026 " <object class=\"GtkTreeView\" id=\"treeview1\">"
1027 " <property name=\"visible\">True</property>"
1028 " <property name=\"model\">liststore1</property>"
1029 " <child>"
1030 " <object class=\"GtkTreeViewColumn\" id=\"column1\">"
1031 " <property name=\"title\">Test</property>"
1032 " <child>"
1033 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1034 " <attributes>"
1035 " <attribute name=\"text\">1</attribute>"
1036 " </attributes>"
1037 " </child>"
1038 " </object>"
1039 " </child>"
1040 " <child>"
1041 " <object class=\"GtkTreeViewColumn\" id=\"column2\">"
1042 " <property name=\"title\">Number</property>"
1043 " <child>"
1044 " <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
1045 " <attributes>"
1046 " <attribute name=\"text\">0</attribute>"
1047 " </attributes>"
1048 " </child>"
1049 " </object>"
1050 " </child>"
1051 " </object>"
1052 " </child>"
1053 "</object>"
1054 "</interface>";
1055 GObject *window, *treeview;
1056 GtkTreeViewColumn *column;
1057 GList *renderers;
1058 GObject *renderer;
1059
1060 builder = builder_new_from_string (buffer, length: -1, NULL);
1061 treeview = gtk_builder_get_object (builder, name: "treeview1");
1062 g_assert_true (GTK_IS_TREE_VIEW (treeview));
1063 column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), n: 0);
1064 g_assert_true (GTK_IS_TREE_VIEW_COLUMN (column));
1065 g_assert_cmpstr (gtk_tree_view_column_get_title (column), ==, "Test");
1066
1067 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
1068 g_assert_cmpint (g_list_length (renderers), ==, 1);
1069 renderer = g_list_nth_data (list: renderers, n: 0);
1070 g_assert_true (GTK_IS_CELL_RENDERER_TEXT (renderer));
1071 g_list_free (list: renderers);
1072
1073 window = gtk_builder_get_object (builder, name: "window1");
1074 gtk_window_destroy (GTK_WINDOW (window));
1075
1076 g_object_unref (object: builder);
1077}
1078
1079static void
1080test_icon_view (void)
1081{
1082 GtkBuilder *builder;
1083 const char buffer[] =
1084 "<interface>"
1085 " <object class=\"GtkListStore\" id=\"liststore1\">"
1086 " <columns>"
1087 " <column type=\"gchararray\"/>"
1088 " <column type=\"GdkPixbuf\"/>"
1089 " </columns>"
1090 " <data>"
1091 " <row>"
1092 " <col id=\"0\">test</col>"
1093 " </row>"
1094 " </data>"
1095 " </object>"
1096 " <object class=\"GtkWindow\" id=\"window1\">"
1097 " <child>"
1098 " <object class=\"GtkIconView\" id=\"iconview1\">"
1099 " <property name=\"model\">liststore1</property>"
1100 " <property name=\"text-column\">0</property>"
1101 " <property name=\"pixbuf-column\">1</property>"
1102 " <property name=\"visible\">True</property>"
1103 " <child>"
1104 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1105 " <attributes>"
1106 " <attribute name=\"text\">0</attribute>"
1107 " </attributes>"
1108 " </child>"
1109 " </object>"
1110 " </child>"
1111 " </object>"
1112 "</interface>";
1113 GObject *window, *iconview;
1114
1115 builder = builder_new_from_string (buffer, length: -1, NULL);
1116 iconview = gtk_builder_get_object (builder, name: "iconview1");
1117 g_assert_true (GTK_IS_ICON_VIEW (iconview));
1118
1119 window = gtk_builder_get_object (builder, name: "window1");
1120 gtk_window_destroy (GTK_WINDOW (window));
1121 g_object_unref (object: builder);
1122}
1123
1124static void
1125test_combo_box (void)
1126{
1127 GtkBuilder *builder;
1128 const char buffer[] =
1129 "<interface>"
1130 " <object class=\"GtkListStore\" id=\"liststore1\">"
1131 " <columns>"
1132 " <column type=\"guint\"/>"
1133 " <column type=\"gchararray\"/>"
1134 " </columns>"
1135 " <data>"
1136 " <row>"
1137 " <col id=\"0\">1</col>"
1138 " <col id=\"1\">Foo</col>"
1139 " </row>"
1140 " <row>"
1141 " <col id=\"0\">2</col>"
1142 " <col id=\"1\">Bar</col>"
1143 " </row>"
1144 " </data>"
1145 " </object>"
1146 " <object class=\"GtkWindow\" id=\"window1\">"
1147 " <child>"
1148 " <object class=\"GtkComboBox\" id=\"combobox1\">"
1149 " <property name=\"model\">liststore1</property>"
1150 " <property name=\"visible\">True</property>"
1151 " <child>"
1152 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1153 " <attributes>"
1154 " <attribute name=\"text\">0</attribute>"
1155 " </attributes>"
1156 " </child>"
1157 " <child>"
1158 " <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
1159 " <attributes>"
1160 " <attribute name=\"text\">1</attribute>"
1161 " </attributes>"
1162 " </child>"
1163 " </object>"
1164 " </child>"
1165 " </object>"
1166 "</interface>";
1167 GObject *window, *combobox;
1168
1169 builder = builder_new_from_string (buffer, length: -1, NULL);
1170 combobox = gtk_builder_get_object (builder, name: "combobox1");
1171 g_assert_nonnull (combobox);
1172
1173 window = gtk_builder_get_object (builder, name: "window1");
1174 gtk_window_destroy (GTK_WINDOW (window));
1175
1176 g_object_unref (object: builder);
1177}
1178
1179#if 0
1180static void
1181test_combo_box_entry (void)
1182{
1183 GtkBuilder *builder;
1184 const char buffer[] =
1185 "<interface>"
1186 " <object class=\"GtkListStore\" id=\"liststore1\">"
1187 " <columns>"
1188 " <column type=\"guint\"/>"
1189 " <column type=\"gchararray\"/>"
1190 " </columns>"
1191 " <data>"
1192 " <row>"
1193 " <col id=\"0\">1</col>"
1194 " <col id=\"1\">Foo</col>"
1195 " </row>"
1196 " <row>"
1197 " <col id=\"0\">2</col>"
1198 " <col id=\"1\">Bar</col>"
1199 " </row>"
1200 " </data>"
1201 " </object>"
1202 " <object class=\"GtkWindow\" id=\"window1\">"
1203 " <child>"
1204 " <object class=\"GtkComboBox\" id=\"comboboxentry1\">"
1205 " <property name=\"model\">liststore1</property>"
1206 " <property name=\"has-entry\">True</property>"
1207 " <property name=\"visible\">True</property>"
1208 " <child>"
1209 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1210 " <attributes>"
1211 " <attribute name=\"text\">0</attribute>"
1212 " </attributes>"
1213 " </child>"
1214 " <child>"
1215 " <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
1216 " <attributes>"
1217 " <attribute name=\"text\">1</attribute>"
1218 " </attributes>"
1219 " </child>"
1220 " </object>"
1221 " </child>"
1222 " </object>"
1223 "</interface>";
1224 GObject *window, *combobox, *renderer;
1225 char *text;
1226
1227 builder = builder_new_from_string (buffer, -1, NULL);
1228 combobox = gtk_builder_get_object (builder, "comboboxentry1");
1229 g_assert_nonnull (combobox);
1230
1231 renderer = gtk_builder_get_object (builder, "renderer2");
1232 g_assert_nonnull (renderer);
1233 g_object_get (renderer, "text", &text, NULL);
1234 g_assert_cmpstr (text, ==, "Bar");
1235 g_free (text);
1236
1237 renderer = gtk_builder_get_object (builder, "renderer1");
1238 g_assert_nonnull (renderer);
1239 g_object_get (renderer, "text", &text, NULL);
1240 g_assert_cmpstr (text, ==, "2");
1241 g_free (text);
1242
1243 window = gtk_builder_get_object (builder, "window1");
1244 gtk_window_destroy (GTK_WINDOW (window));
1245
1246 g_object_unref (builder);
1247}
1248#endif
1249
1250static void
1251test_cell_view (void)
1252{
1253 GtkBuilder *builder;
1254 const char *buffer =
1255 "<interface>"
1256 " <object class=\"GtkListStore\" id=\"liststore1\">"
1257 " <columns>"
1258 " <column type=\"gchararray\"/>"
1259 " </columns>"
1260 " <data>"
1261 " <row>"
1262 " <col id=\"0\">test</col>"
1263 " </row>"
1264 " </data>"
1265 " </object>"
1266 " <object class=\"GtkWindow\" id=\"window1\">"
1267 " <child>"
1268 " <object class=\"GtkCellView\" id=\"cellview1\">"
1269 " <property name=\"visible\">True</property>"
1270 " <property name=\"model\">liststore1</property>"
1271 " <child>"
1272 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1273 " <attributes>"
1274 " <attribute name=\"text\">0</attribute>"
1275 " </attributes>"
1276 " </child>"
1277 " </object>"
1278 " </child>"
1279 " </object>"
1280 "</interface>";
1281 GObject *cellview;
1282 GObject *model, *window;
1283 GtkTreePath *path;
1284 GList *renderers;
1285
1286 builder = builder_new_from_string (buffer, length: -1, NULL);
1287 cellview = gtk_builder_get_object (builder, name: "cellview1");
1288 g_assert_nonnull (builder);
1289 g_assert_true (GTK_IS_CELL_VIEW (cellview));
1290 g_object_get (object: cellview, first_property_name: "model", &model, NULL);
1291 g_assert_true (GTK_IS_TREE_MODEL (model));
1292 g_object_unref (object: model);
1293 path = gtk_tree_path_new_first ();
1294 gtk_cell_view_set_displayed_row (GTK_CELL_VIEW (cellview), path);
1295
1296 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (cellview));
1297 g_assert_cmpint (g_list_length (renderers), ==, 1);
1298
1299 window = gtk_builder_get_object (builder, name: "window1");
1300 g_assert_nonnull (window);
1301 gtk_window_destroy (GTK_WINDOW (window));
1302
1303 g_object_unref (object: builder);
1304}
1305
1306static void
1307test_dialog (void)
1308{
1309 GtkBuilder * builder;
1310 const char buffer1[] =
1311 "<interface>"
1312 " <object class=\"GtkDialog\" id=\"dialog1\">"
1313 " <child internal-child=\"content_area\">"
1314 " <object class=\"GtkBox\" id=\"dialog1-vbox\">"
1315 " <property name=\"orientation\">vertical</property>"
1316 " <child internal-child=\"action_area\">"
1317 " <object class=\"GtkBox\" id=\"dialog1-action_area\">"
1318 " <property name=\"orientation\">horizontal</property>"
1319 " <child>"
1320 " <object class=\"GtkButton\" id=\"button_cancel\"/>"
1321 " </child>"
1322 " <child>"
1323 " <object class=\"GtkButton\" id=\"button_ok\"/>"
1324 " </child>"
1325 " </object>"
1326 " </child>"
1327 " </object>"
1328 " </child>"
1329 " <action-widgets>"
1330 " <action-widget response=\"3\">button_ok</action-widget>"
1331 " <action-widget response=\"-5\">button_cancel</action-widget>"
1332 " </action-widgets>"
1333 " </object>"
1334 "</interface>";
1335
1336 GObject *dialog1;
1337 GObject *button_ok;
1338 GObject *button_cancel;
1339
1340 builder = builder_new_from_string (buffer: buffer1, length: -1, NULL);
1341 dialog1 = gtk_builder_get_object (builder, name: "dialog1");
1342 button_ok = gtk_builder_get_object (builder, name: "button_ok");
1343 g_assert_cmpint (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_ok)), ==, 3);
1344 button_cancel = gtk_builder_get_object (builder, name: "button_cancel");
1345 g_assert_cmpint (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_cancel)), ==, -5);
1346
1347 gtk_window_destroy (GTK_WINDOW (dialog1));
1348 g_object_unref (object: builder);
1349}
1350
1351static void
1352test_message_dialog (void)
1353{
1354 GtkBuilder * builder;
1355 const char buffer1[] =
1356 "<interface>"
1357 " <object class=\"GtkMessageDialog\" id=\"dialog1\">"
1358 " <child internal-child=\"message_area\">"
1359 " <object class=\"GtkBox\" id=\"dialog-message-area\">"
1360 " <property name=\"orientation\">vertical</property>"
1361 " <child>"
1362 " <object class=\"GtkExpander\" id=\"expander\"/>"
1363 " </child>"
1364 " </object>"
1365 " </child>"
1366 " </object>"
1367 "</interface>";
1368
1369 GObject *dialog1;
1370 GObject *expander;
1371
1372 builder = builder_new_from_string (buffer: buffer1, length: -1, NULL);
1373 dialog1 = gtk_builder_get_object (builder, name: "dialog1");
1374 expander = gtk_builder_get_object (builder, name: "expander");
1375 g_assert_true (GTK_IS_EXPANDER (expander));
1376 g_assert_true (gtk_widget_get_parent (GTK_WIDGET (expander)) == gtk_message_dialog_get_message_area (GTK_MESSAGE_DIALOG (dialog1)));
1377
1378 gtk_window_destroy (GTK_WINDOW (dialog1));
1379 g_object_unref (object: builder);
1380}
1381
1382static void
1383test_widget (void)
1384{
1385 const char *buffer =
1386 "<interface>"
1387 " <object class=\"GtkWindow\" id=\"window1\">"
1388 " <property name=\"focus-widget\">button1</property>"
1389 " <child>"
1390 " <object class=\"GtkButton\" id=\"button1\">"
1391 " </object>"
1392 " </child>"
1393 " </object>"
1394 "</interface>";
1395 const char *buffer2 =
1396 "<interface>"
1397 " <object class=\"GtkWindow\" id=\"window1\">"
1398 " <child>"
1399 " <object class=\"GtkButton\" id=\"button1\">"
1400 " <property name=\"receives-default\">True</property>"
1401 " </object>"
1402 " </child>"
1403 " </object>"
1404 "</interface>";
1405 const char *buffer3 =
1406 "<interface>"
1407 " <object class=\"GtkWindow\" id=\"window1\">"
1408 " <child>"
1409 " <object class=\"GtkBox\" id=\"vbox1\">"
1410 " <property name=\"orientation\">vertical</property>"
1411 " <child>"
1412 " <object class=\"GtkLabel\" id=\"label1\">"
1413 " </object>"
1414 " </child>"
1415 " <child>"
1416 " <object class=\"GtkButton\" id=\"button1\">"
1417 " </object>"
1418 " </child>"
1419 " </object>"
1420 " </child>"
1421 " </object>"
1422 "</interface>";
1423 const char *buffer4 =
1424 "<interface>"
1425 " <object class=\"GtkWindow\" id=\"window1\">"
1426 " <child>"
1427 " <object class=\"GtkLabel\" id=\"label1\">"
1428 " <property name=\"label\">Thelabel</property>"
1429 " </object>"
1430 " </child>"
1431 " </object>"
1432 "</interface>";
1433 GtkBuilder *builder;
1434 GObject *window1, *button1, *label1;
1435
1436 builder = builder_new_from_string (buffer, length: -1, NULL);
1437 button1 = gtk_builder_get_object (builder, name: "button1");
1438
1439 g_assert_true (gtk_widget_has_focus (GTK_WIDGET (button1)));
1440 window1 = gtk_builder_get_object (builder, name: "window1");
1441 gtk_window_destroy (GTK_WINDOW (window1));
1442
1443 g_object_unref (object: builder);
1444
1445 builder = builder_new_from_string (buffer: buffer2, length: -1, NULL);
1446 button1 = gtk_builder_get_object (builder, name: "button1");
1447
1448 g_assert_true (gtk_widget_get_receives_default (GTK_WIDGET (button1)));
1449
1450 g_object_unref (object: builder);
1451
1452 builder = builder_new_from_string (buffer: buffer3, length: -1, NULL);
1453
1454 window1 = gtk_builder_get_object (builder, name: "window1");
1455 label1 = gtk_builder_get_object (builder, name: "label1");
1456 g_assert_true (GTK_IS_LABEL (label1));
1457
1458 gtk_window_destroy (GTK_WINDOW (window1));
1459 g_object_unref (object: builder);
1460
1461 builder = builder_new_from_string (buffer: buffer4, length: -1, NULL);
1462 label1 = gtk_builder_get_object (builder, name: "label1");
1463 g_assert_true (GTK_IS_LABEL (label1));
1464
1465 g_object_unref (object: builder);
1466}
1467
1468static void
1469test_window (void)
1470{
1471 const char *buffer1 =
1472 "<interface>"
1473 " <object class=\"GtkWindow\" id=\"window1\">"
1474 " <property name=\"title\"></property>"
1475 " </object>"
1476 "</interface>";
1477 const char *buffer2 =
1478 "<interface>"
1479 " <object class=\"GtkWindow\" id=\"window1\">"
1480 " </object>"
1481 "</interface>";
1482 GtkBuilder *builder;
1483 GObject *window1;
1484 char *title;
1485
1486 builder = builder_new_from_string (buffer: buffer1, length: -1, NULL);
1487 window1 = gtk_builder_get_object (builder, name: "window1");
1488 g_object_get (object: window1, first_property_name: "title", &title, NULL);
1489 g_assert_cmpstr (title, ==, "");
1490 g_free (mem: title);
1491 gtk_window_destroy (GTK_WINDOW (window1));
1492 g_object_unref (object: builder);
1493
1494 builder = builder_new_from_string (buffer: buffer2, length: -1, NULL);
1495 window1 = gtk_builder_get_object (builder, name: "window1");
1496 gtk_window_destroy (GTK_WINDOW (window1));
1497 g_object_unref (object: builder);
1498}
1499
1500static void
1501test_value_from_string (void)
1502{
1503 GValue value = G_VALUE_INIT;
1504 GError *error = NULL;
1505 GtkBuilder *builder;
1506
1507 builder = gtk_builder_new ();
1508
1509 g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_STRING, "test", &value, &error));
1510 g_assert_true (G_VALUE_HOLDS_STRING (&value));
1511 g_assert_cmpstr (g_value_get_string (&value), ==, "test");
1512 g_value_unset (value: &value);
1513
1514 g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "true", &value, &error));
1515 g_assert_true (G_VALUE_HOLDS_BOOLEAN (&value));
1516 g_assert_true (g_value_get_boolean (&value));
1517 g_value_unset (value: &value);
1518
1519 g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "false", &value, &error));
1520 g_assert_true (G_VALUE_HOLDS_BOOLEAN (&value));
1521 g_assert_false (g_value_get_boolean (&value));
1522 g_value_unset (value: &value);
1523
1524 g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yes", &value, &error));
1525 g_assert_true (G_VALUE_HOLDS_BOOLEAN (&value));
1526 g_assert_true (g_value_get_boolean (&value));
1527 g_value_unset (value: &value);
1528
1529 g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "no", &value, &error));
1530 g_assert_true (G_VALUE_HOLDS_BOOLEAN (&value));
1531 g_assert_false (g_value_get_boolean (&value));
1532 g_value_unset (value: &value);
1533
1534 g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "0", &value, &error));
1535 g_assert_true (G_VALUE_HOLDS_BOOLEAN (&value));
1536 g_assert_false (g_value_get_boolean (&value));
1537 g_value_unset (value: &value);
1538
1539 g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "1", &value, &error));
1540 g_assert_true (G_VALUE_HOLDS_BOOLEAN (&value));
1541 g_assert_true (g_value_get_boolean (&value));
1542 g_value_unset (value: &value);
1543
1544 g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "tRuE", &value, &error));
1545 g_assert_true (G_VALUE_HOLDS_BOOLEAN (&value));
1546 g_assert_true (g_value_get_boolean (&value));
1547 g_value_unset (value: &value);
1548
1549 g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "blaurgh", &value, &error) == FALSE);
1550 g_value_unset (value: &value);
1551 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE);
1552 g_error_free (error);
1553 error = NULL;
1554
1555 g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yess", &value, &error) == FALSE);
1556 g_value_unset (value: &value);
1557 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE);
1558 g_error_free (error);
1559 error = NULL;
1560
1561 g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "trueee", &value, &error) == FALSE);
1562 g_value_unset (value: &value);
1563 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE);
1564 g_error_free (error);
1565 error = NULL;
1566
1567 g_assert_false (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "", &value, &error));
1568 g_value_unset (value: &value);
1569 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE);
1570 g_error_free (error);
1571 error = NULL;
1572
1573 g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "12345", &value, &error));
1574 g_assert_true (G_VALUE_HOLDS_INT (&value));
1575 g_assert_cmpint (g_value_get_int (&value), ==, 12345);
1576 g_value_unset (value: &value);
1577
1578 g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_LONG, "9912345", &value, &error));
1579 g_assert_true (G_VALUE_HOLDS_LONG (&value));
1580 g_assert_cmpint (g_value_get_long (&value), ==, 9912345);
1581 g_value_unset (value: &value);
1582
1583 g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_UINT, "2345", &value, &error));
1584 g_assert_true (G_VALUE_HOLDS_UINT (&value));
1585 g_assert_cmpint (g_value_get_uint (&value), ==, 2345);
1586 g_value_unset (value: &value);
1587
1588 g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_INT64, "-2345", &value, &error));
1589 g_assert_true (G_VALUE_HOLDS_INT64 (&value));
1590 g_assert_cmpint (g_value_get_int64 (&value), ==, -2345);
1591 g_value_unset (value: &value);
1592
1593 g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_UINT64, "2345", &value, &error));
1594 g_assert_true (G_VALUE_HOLDS_UINT64 (&value));
1595 g_assert_cmpint (g_value_get_uint64 (&value), ==, 2345);
1596 g_value_unset (value: &value);
1597
1598 g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "1.454", &value, &error));
1599 g_assert_true (G_VALUE_HOLDS_FLOAT (&value));
1600 g_assert_cmpfloat (fabs (g_value_get_float (&value) - 1.454), <, 0.00001);
1601 g_value_unset (value: &value);
1602
1603 g_assert_false (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "abc", &value, &error));
1604 g_value_unset (value: &value);
1605 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE);
1606 g_error_free (error);
1607 error = NULL;
1608
1609 g_assert_false (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "/-+,abc", &value, &error));
1610 g_value_unset (value: &value);
1611 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE);
1612 g_error_free (error);
1613 error = NULL;
1614
1615 g_assert_true (gtk_builder_value_from_string_type (builder, GTK_TYPE_TEXT_DIRECTION, "rtl", &value, &error));
1616 g_assert_true (G_VALUE_HOLDS_ENUM (&value));
1617 g_assert_cmpint (g_value_get_enum (&value), ==, GTK_TEXT_DIR_RTL);
1618 g_value_unset (value: &value);
1619
1620 g_assert_false (gtk_builder_value_from_string_type (builder, GTK_TYPE_TEXT_DIRECTION, "sliff", &value, &error));
1621 g_value_unset (value: &value);
1622 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE);
1623 g_error_free (error);
1624 error = NULL;
1625
1626 g_assert_false (gtk_builder_value_from_string_type (builder, GTK_TYPE_TEXT_DIRECTION, "foobar", &value, &error));
1627 g_value_unset (value: &value);
1628 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE);
1629 g_error_free (error);
1630 error = NULL;
1631
1632 g_object_unref (object: builder);
1633}
1634
1635static gboolean model_freed = FALSE;
1636
1637static void
1638model_weakref (gpointer data,
1639 GObject *model)
1640{
1641 model_freed = TRUE;
1642}
1643
1644static void
1645test_reference_counting (void)
1646{
1647 GtkBuilder *builder;
1648 const char buffer1[] =
1649 "<interface>"
1650 " <object class=\"GtkListStore\" id=\"liststore1\"/>"
1651 " <object class=\"GtkListStore\" id=\"liststore2\"/>"
1652 " <object class=\"GtkWindow\" id=\"window1\">"
1653 " <child>"
1654 " <object class=\"GtkTreeView\" id=\"treeview1\">"
1655 " <property name=\"model\">liststore1</property>"
1656 " </object>"
1657 " </child>"
1658 " </object>"
1659 "</interface>";
1660 const char buffer2[] =
1661 "<interface>"
1662 " <object class=\"GtkBox\" id=\"vbox1\">"
1663 " <property name=\"orientation\">vertical</property>"
1664 " <child>"
1665 " <object class=\"GtkLabel\" id=\"label1\"/>"
1666 " </child>"
1667 " </object>"
1668 "</interface>";
1669 GObject *window, *treeview, *model;
1670
1671 builder = builder_new_from_string (buffer: buffer1, length: -1, NULL);
1672 window = gtk_builder_get_object (builder, name: "window1");
1673 treeview = gtk_builder_get_object (builder, name: "treeview1");
1674 model = gtk_builder_get_object (builder, name: "liststore1");
1675 g_object_unref (object: builder);
1676
1677 g_object_weak_ref (object: model, notify: (GWeakNotify)model_weakref, NULL);
1678
1679 g_assert_false (model_freed);
1680 gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), NULL);
1681 g_assert_true (model_freed);
1682
1683 gtk_window_destroy (GTK_WINDOW (window));
1684
1685 builder = builder_new_from_string (buffer: buffer2, length: -1, NULL);
1686 g_object_unref (object: builder);
1687}
1688
1689G_GNUC_BEGIN_IGNORE_DEPRECATIONS
1690
1691typedef struct {
1692 gboolean weight;
1693 gboolean foreground;
1694 gboolean underline;
1695 gboolean size;
1696 gboolean font_desc;
1697 gboolean language;
1698} FoundAttrs;
1699
1700static gboolean
1701filter_pango_attrs (PangoAttribute *attr,
1702 gpointer data)
1703{
1704 FoundAttrs *found = (FoundAttrs *)data;
1705
1706 if (attr->klass->type == PANGO_ATTR_WEIGHT)
1707 found->weight = TRUE;
1708 else if (attr->klass->type == PANGO_ATTR_FOREGROUND)
1709 found->foreground = TRUE;
1710 else if (attr->klass->type == PANGO_ATTR_UNDERLINE)
1711 found->underline = TRUE;
1712 /* Make sure optional start/end properties are working */
1713 else if (attr->klass->type == PANGO_ATTR_SIZE &&
1714 attr->start_index == 5 &&
1715 attr->end_index == 10)
1716 found->size = TRUE;
1717 else if (attr->klass->type == PANGO_ATTR_FONT_DESC)
1718 found->font_desc = TRUE;
1719 else if (attr->klass->type == PANGO_ATTR_LANGUAGE)
1720 found->language = TRUE;
1721
1722 return TRUE;
1723}
1724
1725static void
1726test_pango_attributes (void)
1727{
1728 GtkBuilder *builder;
1729 FoundAttrs found = { 0, };
1730 const char buffer[] =
1731 "<interface>"
1732 " <object class=\"GtkLabel\" id=\"label1\">"
1733 " <attributes>"
1734 " <attribute name=\"weight\" value=\"PANGO_WEIGHT_BOLD\"/>"
1735 " <attribute name=\"foreground\" value=\"DarkSlateGray\"/>"
1736 " <attribute name=\"underline\" value=\"True\"/>"
1737 " <attribute name=\"size\" value=\"4\" start=\"5\" end=\"10\"/>"
1738 " <attribute name=\"font-desc\" value=\"Sans Italic 22\"/>"
1739 " <attribute name=\"language\" value=\"pt_BR\"/>"
1740 " </attributes>"
1741 " </object>"
1742 "</interface>";
1743 const char err_buffer1[] =
1744 "<interface>"
1745 " <object class=\"GtkLabel\" id=\"label1\">"
1746 " <attributes>"
1747 " <attribute name=\"weight\"/>"
1748 " </attributes>"
1749 " </object>"
1750 "</interface>";
1751 const char err_buffer2[] =
1752 "<interface>"
1753 " <object class=\"GtkLabel\" id=\"label1\">"
1754 " <attributes>"
1755 " <attribute name=\"weight\" value=\"PANGO_WEIGHT_BOLD\" unrecognized=\"True\"/>"
1756 " </attributes>"
1757 " </object>"
1758 "</interface>";
1759
1760 GObject *label;
1761 GError *error = NULL;
1762 PangoAttrList *attrs, *filtered;
1763
1764 /* Test attributes are set */
1765 builder = builder_new_from_string (buffer, length: -1, NULL);
1766 label = gtk_builder_get_object (builder, name: "label1");
1767 g_assert_nonnull (label);
1768
1769 attrs = gtk_label_get_attributes (GTK_LABEL (label));
1770 g_assert_nonnull (attrs);
1771
1772 filtered = pango_attr_list_filter (list: attrs, func: filter_pango_attrs, data: &found);
1773 g_assert_true (filtered);
1774 pango_attr_list_unref (list: filtered);
1775
1776 g_assert_true (found.weight);
1777 g_assert_true (found.foreground);
1778 g_assert_true (found.underline);
1779 g_assert_true (found.size);
1780 g_assert_true (found.language);
1781 g_assert_true (found.font_desc);
1782
1783 g_object_unref (object: builder);
1784
1785 /* Test errors are set */
1786 builder = gtk_builder_new ();
1787 gtk_builder_add_from_string (builder, buffer: err_buffer1, length: -1, error: &error);
1788 label = gtk_builder_get_object (builder, name: "label1");
1789 g_assert_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_MISSING_ATTRIBUTE);
1790 g_object_unref (object: builder);
1791 g_error_free (error);
1792 error = NULL;
1793
1794 builder = gtk_builder_new ();
1795 gtk_builder_add_from_string (builder, buffer: err_buffer2, length: -1, error: &error);
1796 label = gtk_builder_get_object (builder, name: "label1");
1797
1798 g_assert_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE);
1799 g_object_unref (object: builder);
1800 g_error_free (error);
1801}
1802
1803static void
1804test_requires (void)
1805{
1806 GtkBuilder *builder;
1807 GError *error = NULL;
1808 char *buffer;
1809 const char buffer_fmt[] =
1810 "<interface>"
1811 " <requires lib=\"gtk\" version=\"%d.%d\"/>"
1812 "</interface>";
1813
1814 buffer = g_strdup_printf (format: buffer_fmt, GTK_MAJOR_VERSION, GTK_MINOR_VERSION + 1);
1815 builder = gtk_builder_new ();
1816 gtk_builder_add_from_string (builder, buffer, length: -1, error: &error);
1817 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_VERSION_MISMATCH);
1818 g_object_unref (object: builder);
1819 g_error_free (error);
1820 g_free (mem: buffer);
1821}
1822
1823static void
1824test_add_objects (void)
1825{
1826 GtkBuilder *builder;
1827 GError *error;
1828 int ret;
1829 GObject *obj;
1830 const char *objects[2] = {"mainbox", NULL};
1831 const char *objects2[3] = {"mainbox", "window2", NULL};
1832 const char buffer[] =
1833 "<interface>"
1834 " <object class=\"GtkWindow\" id=\"window\">"
1835 " <child>"
1836 " <object class=\"GtkBox\" id=\"mainbox\">"
1837 " <property name=\"orientation\">vertical</property>"
1838 " <property name=\"visible\">True</property>"
1839 " <child>"
1840 " <object class=\"GtkLabel\" id=\"label1\">"
1841 " <property name=\"visible\">True</property>"
1842 " <property name=\"label\" translatable=\"no\">first label</property>"
1843 " </object>"
1844 " </child>"
1845 " <child>"
1846 " <object class=\"GtkLabel\" id=\"label2\">"
1847 " <property name=\"visible\">True</property>"
1848 " <property name=\"label\" translatable=\"no\">second label</property>"
1849 " </object>"
1850 " </child>"
1851 " </object>"
1852 " </child>"
1853 " </object>"
1854 " <object class=\"GtkWindow\" id=\"window2\">"
1855 " <child>"
1856 " <object class=\"GtkLabel\" id=\"label3\">"
1857 " <property name=\"label\" translatable=\"no\">second label</property>"
1858 " </object>"
1859 " </child>"
1860 " </object>"
1861 "<interface/>";
1862
1863 error = NULL;
1864 builder = gtk_builder_new ();
1865 ret = gtk_builder_add_objects_from_string (builder, buffer, length: -1, object_ids: objects, error: &error);
1866 g_assert_no_error (error);
1867 obj = gtk_builder_get_object (builder, name: "window");
1868 g_assert_null (obj);
1869 obj = gtk_builder_get_object (builder, name: "window2");
1870 g_assert_null (obj);
1871 obj = gtk_builder_get_object (builder, name: "mainbox");
1872 g_assert_true (GTK_IS_WIDGET (obj));
1873 g_object_unref (object: builder);
1874
1875 error = NULL;
1876 builder = gtk_builder_new ();
1877 ret = gtk_builder_add_objects_from_string (builder, buffer, length: -1, object_ids: objects2, error: &error);
1878 g_assert_true (ret);
1879 g_assert_null (error);
1880 obj = gtk_builder_get_object (builder, name: "window");
1881 g_assert_null (obj);
1882 obj = gtk_builder_get_object (builder, name: "window2");
1883 g_assert_true (GTK_IS_WINDOW (obj));
1884 gtk_window_destroy (GTK_WINDOW (obj));
1885 obj = gtk_builder_get_object (builder, name: "mainbox");
1886 g_assert_true (GTK_IS_WIDGET (obj));
1887 g_object_unref (object: builder);
1888}
1889
1890static void
1891test_message_area (void)
1892{
1893 GtkBuilder *builder;
1894 GObject *obj, *obj1;
1895 const char buffer[] =
1896 "<interface>"
1897 " <object class=\"GtkInfoBar\" id=\"infobar1\">"
1898 " <child>"
1899 " <object class=\"GtkBox\" id=\"contentarea1\">"
1900 " <property name=\"orientation\">horizontal</property>"
1901 " <child>"
1902 " <object class=\"GtkLabel\" id=\"content\">"
1903 " <property name=\"label\" translatable=\"yes\">Message</property>"
1904 " </object>"
1905 " </child>"
1906 " </object>"
1907 " </child>"
1908 " <child type=\"action\">"
1909 " <object class=\"GtkButton\" id=\"button_ok\">"
1910 " <property name=\"label\">gtk-ok</property>"
1911 " </object>"
1912 " </child>"
1913 " <action-widgets>"
1914 " <action-widget response=\"1\">button_ok</action-widget>"
1915 " </action-widgets>"
1916 " </object>"
1917 "</interface>";
1918
1919 builder = builder_new_from_string (buffer, length: -1, NULL);
1920 obj = gtk_builder_get_object (builder, name: "infobar1");
1921 g_assert_true (GTK_IS_INFO_BAR (obj));
1922 obj1 = gtk_builder_get_object (builder, name: "content");
1923 g_assert_true (GTK_IS_LABEL (obj1));
1924
1925 obj1 = gtk_builder_get_object (builder, name: "button_ok");
1926 g_assert_true (GTK_IS_BUTTON (obj1));
1927
1928 g_object_unref (object: builder);
1929}
1930
1931static void
1932test_gmenu (void)
1933{
1934 GtkBuilder *builder;
1935 GObject *obj, *obj1;
1936 const char buffer[] =
1937 "<interface>"
1938 " <object class=\"GtkWindow\" id=\"window\">"
1939 " </object>"
1940 " <menu id='edit-menu'>"
1941 " <section>"
1942 " <item>"
1943 " <attribute name='label'>Undo</attribute>"
1944 " <attribute name='action'>undo</attribute>"
1945 " </item>"
1946 " <item>"
1947 " <attribute name='label'>Redo</attribute>"
1948 " <attribute name='action'>redo</attribute>"
1949 " </item>"
1950 " </section>"
1951 " <section></section>"
1952 " <section>"
1953 " <attribute name='label'>Copy &amp; Paste</attribute>"
1954 " <item>"
1955 " <attribute name='label'>Cut</attribute>"
1956 " <attribute name='action'>cut</attribute>"
1957 " </item>"
1958 " <item>"
1959 " <attribute name='label'>Copy</attribute>"
1960 " <attribute name='action'>copy</attribute>"
1961 " </item>"
1962 " <item>"
1963 " <attribute name='label'>Paste</attribute>"
1964 " <attribute name='action'>paste</attribute>"
1965 " </item>"
1966 " </section>"
1967 " <item><link name='section' id='blargh'>"
1968 " <item>"
1969 " <attribute name='label'>Bold</attribute>"
1970 " <attribute name='action'>bold</attribute>"
1971 " </item>"
1972 " <submenu>"
1973 " <attribute name='label'>Language</attribute>"
1974 " <item>"
1975 " <attribute name='label'>Latin</attribute>"
1976 " <attribute name='action'>lang</attribute>"
1977 " <attribute name='target'>'latin'</attribute>"
1978 " </item>"
1979 " <item>"
1980 " <attribute name='label'>Greek</attribute>"
1981 " <attribute name='action'>lang</attribute>"
1982 " <attribute name='target'>'greek'</attribute>"
1983 " </item>"
1984 " <item>"
1985 " <attribute name='label'>Urdu</attribute>"
1986 " <attribute name='action'>lang</attribute>"
1987 " <attribute name='target'>'urdu'</attribute>"
1988 " </item>"
1989 " </submenu>"
1990 " </link></item>"
1991 " </menu>"
1992 "</interface>";
1993
1994 builder = builder_new_from_string (buffer, length: -1, NULL);
1995 obj = gtk_builder_get_object (builder, name: "window");
1996 g_assert_true (GTK_IS_WINDOW (obj));
1997 obj1 = gtk_builder_get_object (builder, name: "edit-menu");
1998 g_assert_true (G_IS_MENU_MODEL (obj1));
1999 obj1 = gtk_builder_get_object (builder, name: "blargh");
2000 g_assert_true (G_IS_MENU_MODEL (obj1));
2001 g_object_unref (object: builder);
2002}
2003
2004static void
2005test_level_bar (void)
2006{
2007 GtkBuilder *builder;
2008 GError *error = NULL;
2009 GObject *obj, *obj1;
2010 const char buffer1[] =
2011 "<interface>"
2012 " <object class=\"GtkWindow\" id=\"window\">"
2013 " <child>"
2014 " <object class=\"GtkLevelBar\" id=\"levelbar\">"
2015 " <property name=\"value\">4.70</property>"
2016 " <property name=\"min-value\">2</property>"
2017 " <property name=\"max-value\">5</property>"
2018 " <offsets>"
2019 " <offset name=\"low\" value=\"2.25\"/>"
2020 " <offset name=\"custom\" value=\"3\"/>"
2021 " <offset name=\"high\" value=\"3\"/>"
2022 " </offsets>"
2023 " </object>"
2024 " </child>"
2025 " </object>"
2026 "</interface>";
2027 const char buffer2[] =
2028 "<interface>"
2029 " <object class=\"GtkLevelBar\" id=\"levelbar\">"
2030 " <offsets>"
2031 " <offset name=\"low\" bogus_attr=\"foo\"/>"
2032 " </offsets>"
2033 " </object>"
2034 "</interface>";
2035 const char buffer3[] =
2036 "<interface>"
2037 " <object class=\"GtkLevelBar\" id=\"levelbar\">"
2038 " <offsets>"
2039 " <offset name=\"low\" value=\"1\"/>"
2040 " </offsets>"
2041 " <bogus_tag>"
2042 " </bogus_tag>"
2043 " </object>"
2044 "</interface>";
2045
2046 builder = gtk_builder_new ();
2047 gtk_builder_add_from_string (builder, buffer: buffer1, length: -1, error: &error);
2048 g_assert_true (error == NULL);
2049
2050 obj = gtk_builder_get_object (builder, name: "window");
2051 g_assert_true (GTK_IS_WINDOW (obj));
2052 obj1 = gtk_builder_get_object (builder, name: "levelbar");
2053 g_assert_true (GTK_IS_LEVEL_BAR (obj1));
2054 g_object_unref (object: builder);
2055
2056 error = NULL;
2057 builder = gtk_builder_new ();
2058 gtk_builder_add_from_string (builder, buffer: buffer2, length: -1, error: &error);
2059 g_assert_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_MISSING_ATTRIBUTE);
2060 g_error_free (error);
2061 g_object_unref (object: builder);
2062
2063 error = NULL;
2064 builder = gtk_builder_new ();
2065 gtk_builder_add_from_string (builder, buffer: buffer3, length: -1, error: &error);
2066 g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_UNHANDLED_TAG);
2067 g_error_free (error);
2068 g_object_unref (object: builder);
2069}
2070
2071static void
2072test_expose_object (void)
2073{
2074 GtkBuilder *builder;
2075 GError *error = NULL;
2076 GtkWidget *menu;
2077 GObject *obj;
2078 const char buffer[] =
2079 "<interface>"
2080 " <object class=\"GtkMenuButton\" id=\"button\">"
2081 " <property name=\"popover\">external_menu</property>"
2082 " </object>"
2083 "</interface>";
2084
2085 menu = gtk_popover_new ();
2086 builder = gtk_builder_new ();
2087 gtk_builder_expose_object (builder, name: "builder", G_OBJECT (builder));
2088 gtk_builder_expose_object (builder, name: "external_menu", G_OBJECT (menu));
2089 gtk_builder_add_from_string (builder, buffer, length: -1, error: &error);
2090 g_assert_no_error (error);
2091
2092 obj = gtk_builder_get_object (builder, name: "button");
2093 g_assert_true (GTK_IS_MENU_BUTTON (obj));
2094
2095 g_assert_true (gtk_menu_button_get_popover (GTK_MENU_BUTTON (obj)) == GTK_POPOVER (menu));
2096
2097 g_object_unref (object: menu);
2098 g_object_unref (object: builder);
2099}
2100
2101static void
2102test_no_ids (void)
2103{
2104 GtkBuilder *builder;
2105 GError *error = NULL;
2106 GObject *obj;
2107 const char buffer[] =
2108 "<interface>"
2109 " <object class=\"GtkInfoBar\">"
2110 " <child>"
2111 " <object class=\"GtkBox\">"
2112 " <property name=\"orientation\">horizontal</property>"
2113 " <child>"
2114 " <object class=\"GtkLabel\">"
2115 " <property name=\"label\" translatable=\"yes\">Message</property>"
2116 " </object>"
2117 " </child>"
2118 " </object>"
2119 " </child>"
2120 " <child type=\"action\">"
2121 " <object class=\"GtkButton\" id=\"button_ok\">"
2122 " <property name=\"label\">gtk-ok</property>"
2123 " </object>"
2124 " </child>"
2125 " <action-widgets>"
2126 " <action-widget response=\"1\">button_ok</action-widget>"
2127 " </action-widgets>"
2128 " </object>"
2129 "</interface>";
2130
2131 builder = gtk_builder_new ();
2132 gtk_builder_add_from_string (builder, buffer, length: -1, error: &error);
2133 g_assert_null (error);
2134
2135 obj = gtk_builder_get_object (builder, name: "button_ok");
2136 g_assert_true (GTK_IS_BUTTON (obj));
2137
2138 g_object_unref (object: builder);
2139}
2140
2141static void
2142test_property_bindings (void)
2143{
2144 const char *buffer =
2145 "<interface>"
2146 " <object class=\"GtkWindow\" id=\"window\">"
2147 " <child>"
2148 " <object class=\"GtkBox\" id=\"vbox\">"
2149 " <property name=\"visible\">True</property>"
2150 " <property name=\"orientation\">vertical</property>"
2151 " <child>"
2152 " <object class=\"GtkCheckButton\" id=\"checkbutton\">"
2153 " <property name=\"active\">false</property>"
2154 " </object>"
2155 " </child>"
2156 " <child>"
2157 " <object class=\"GtkButton\" id=\"button\">"
2158 " <property name=\"sensitive\" bind-source=\"checkbutton\" bind-property=\"active\" bind-flags=\"sync-create\">false</property>"
2159 " </object>"
2160 " </child>"
2161 " <child>"
2162 " <object class=\"GtkButton\" id=\"button2\">"
2163 " <property name=\"sensitive\" bind-source=\"checkbutton\" bind-property=\"active\" />"
2164 " </object>"
2165 " </child>"
2166 " <child>"
2167 " <object class=\"GtkButton\" id=\"button3\">"
2168 " <property name=\"sensitive\" bind-source=\"button\" bind-flags=\"sync-create\" />"
2169 " </object>"
2170 " </child>"
2171 " </object>"
2172 " </child>"
2173 " </object>"
2174 "</interface>";
2175
2176 GtkBuilder *builder;
2177 GObject *checkbutton, *button, *button2, *button3, *window;
2178
2179 builder = builder_new_from_string (buffer, length: -1, NULL);
2180
2181 checkbutton = gtk_builder_get_object (builder, name: "checkbutton");
2182 g_assert_true (GTK_IS_CHECK_BUTTON (checkbutton));
2183 g_assert_true (!gtk_check_button_get_active (GTK_CHECK_BUTTON (checkbutton)));
2184
2185 button = gtk_builder_get_object (builder, name: "button");
2186 g_assert_true (GTK_IS_BUTTON (button));
2187 g_assert_false (gtk_widget_get_sensitive (GTK_WIDGET (button)));
2188
2189 button2 = gtk_builder_get_object (builder, name: "button2");
2190 g_assert_true (GTK_IS_BUTTON (button2));
2191 g_assert_true (gtk_widget_get_sensitive (GTK_WIDGET (button2)));
2192
2193 button3 = gtk_builder_get_object (builder, name: "button3");
2194 g_assert_true (GTK_IS_BUTTON (button3));
2195 g_assert_false (gtk_widget_get_sensitive (GTK_WIDGET (button3)));
2196
2197 gtk_check_button_set_active (GTK_CHECK_BUTTON (checkbutton), TRUE);
2198 g_assert_true (gtk_widget_get_sensitive (GTK_WIDGET (button)));
2199 g_assert_true (gtk_widget_get_sensitive (GTK_WIDGET (button2)));
2200 g_assert_true (gtk_widget_get_sensitive (GTK_WIDGET (button3)));
2201
2202 window = gtk_builder_get_object (builder, name: "window");
2203 gtk_window_destroy (GTK_WINDOW (window));
2204 g_object_unref (object: builder);
2205}
2206
2207#define MY_GTK_GRID_TEMPLATE "\
2208<interface>\n\
2209 <template class=\"MyGtkGrid\" parent=\"GtkGrid\">\n\
2210 <property name=\"visible\">True</property>\n\
2211 <child>\n\
2212 <object class=\"GtkLabel\" id=\"label\">\n\
2213 <property name=\"visible\">True</property>\n\
2214 </object>\n\
2215 </child>\n\
2216 </template>\n\
2217</interface>\n"
2218
2219#define MY_TYPE_GTK_GRID (my_gtk_grid_get_type ())
2220#define MY_IS_GTK_GRID(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_GTK_GRID))
2221
2222typedef struct
2223{
2224 GtkGridClass parent_class;
2225} MyGtkGridClass;
2226
2227typedef struct
2228{
2229 GtkLabel *label;
2230} MyGtkGridPrivate;
2231
2232typedef struct
2233{
2234 GtkGrid parent_instance;
2235 GtkLabel *label;
2236 MyGtkGridPrivate *priv;
2237} MyGtkGrid;
2238
2239G_DEFINE_TYPE_WITH_PRIVATE (MyGtkGrid, my_gtk_grid, GTK_TYPE_GRID);
2240
2241static void
2242my_gtk_grid_init (MyGtkGrid *grid)
2243{
2244 grid->priv = my_gtk_grid_get_instance_private (self: grid);
2245 gtk_widget_init_template (GTK_WIDGET (grid));
2246}
2247
2248static void
2249my_gtk_grid_class_init (MyGtkGridClass *klass)
2250{
2251 GBytes *template = g_bytes_new_static (MY_GTK_GRID_TEMPLATE, size: strlen (MY_GTK_GRID_TEMPLATE));
2252 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
2253
2254 gtk_widget_class_set_template (widget_class, template_bytes: template);
2255 gtk_widget_class_bind_template_child (widget_class, MyGtkGrid, label);
2256 gtk_widget_class_bind_template_child_private (widget_class, MyGtkGrid, label);
2257}
2258
2259static void
2260test_template (void)
2261{
2262 MyGtkGrid *my_gtk_grid;
2263
2264 /* make sure the type we are trying to register does not exist */
2265 g_assert_false (g_type_from_name ("MyGtkGrid"));
2266
2267 /* create the template object */
2268 my_gtk_grid = g_object_new (MY_TYPE_GTK_GRID, NULL);
2269
2270 /* Check everything is fine */
2271 g_assert_true (g_type_from_name ("MyGtkGrid"));
2272 g_assert_true (MY_IS_GTK_GRID (my_gtk_grid));
2273 g_assert_true (my_gtk_grid->label == my_gtk_grid->priv->label);
2274 g_assert_true (GTK_IS_LABEL (my_gtk_grid->label));
2275 g_assert_true (GTK_IS_LABEL (my_gtk_grid->priv->label));
2276}
2277
2278_BUILDER_TEST_EXPORT void
2279on_cellrenderertoggle1_toggled (GtkCellRendererToggle *cell)
2280{
2281}
2282
2283static void
2284test_anaconda_signal (void)
2285{
2286 GtkBuilder *builder;
2287 const char buffer[] =
2288 "<?xml version='1.0' encoding='UTF-8'?>"
2289 "<interface>"
2290 " <requires lib='gtk' version='4.0'/>"
2291 " <object class='GtkListStore' id='liststore1'>"
2292 " <columns>"
2293 " <!-- column-name use -->"
2294 " <column type='gboolean'/>"
2295 " </columns>"
2296 " </object>"
2297 " <object class='GtkWindow' id='window1'>"
2298 " <child>"
2299 " <object class='GtkTreeView' id='treeview1'>"
2300 " <property name='visible'>True</property>"
2301 " <property name='model'>liststore1</property>"
2302 " <child internal-child='selection'>"
2303 " <object class='GtkTreeSelection' id='treeview-selection1'/>"
2304 " </child>"
2305 " <child>"
2306 " <object class='GtkTreeViewColumn' id='treeviewcolumn1'>"
2307 " <property name='title' translatable='yes'>column</property>"
2308 " <child>"
2309 " <object class='GtkCellRendererToggle' id='cellrenderertoggle1'>"
2310 " <signal name='toggled' handler='on_cellrenderertoggle1_toggled' swapped='no'/>"
2311 " </object>"
2312 " <attributes>"
2313 " <attribute name='active'>0</attribute>"
2314 " </attributes>"
2315 " </child>"
2316 " </object>"
2317 " </child>"
2318 " </object>"
2319 " </child>"
2320 " </object>"
2321 "</interface>";
2322
2323 builder = builder_new_from_string (buffer, length: -1, NULL);
2324
2325 g_object_unref (object: builder);
2326}
2327
2328static void
2329test_file_filter (void)
2330{
2331 GtkBuilder *builder;
2332 GObject *obj;
2333 GtkFileFilter *filter;
2334
2335 const char buffer[] =
2336 "<interface>"
2337 " <object class='GtkFileFilter' id='filter1'>"
2338 " <property name='name'>Text and Images</property>"
2339 " <mime-types>"
2340 " <mime-type>text/plain</mime-type>"
2341 " <mime-type>image/*</mime-type>"
2342 " </mime-types>"
2343 " <patterns>"
2344 " <pattern>*.txt</pattern>"
2345 " <pattern>*.png</pattern>"
2346 " </patterns>"
2347 " </object>"
2348 "</interface>";
2349
2350 builder = builder_new_from_string (buffer, length: -1, NULL);
2351 obj = gtk_builder_get_object (builder, name: "filter1");
2352 g_assert_true (GTK_IS_FILE_FILTER (obj));
2353 filter = GTK_FILE_FILTER (obj);
2354 g_assert_cmpstr (gtk_file_filter_get_name (filter), ==, "Text and Images");
2355 g_assert_true (g_strv_contains (gtk_file_filter_get_attributes (filter), G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE));
2356 g_assert_true (g_strv_contains (gtk_file_filter_get_attributes (filter), G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME));
2357
2358 g_object_unref (object: builder);
2359}
2360
2361static void
2362test_shortcuts (void)
2363{
2364 GtkBuilder *builder;
2365 GObject *obj;
2366
2367 const char buffer[] =
2368 "<interface>"
2369 " <object class='GtkBox' id='box'>"
2370 " <child>"
2371 " <object class='GtkShortcutController' id='controller'>"
2372 " <property name='scope'>managed</property>"
2373 " <child>"
2374 " <object class='GtkShortcut'>"
2375 " <property name='trigger'>&lt;Control&gt;k</property>"
2376 " <property name='action'>activate</property>"
2377 " </object>"
2378 " </child>"
2379 " </object>"
2380 " </child>"
2381 " </object>"
2382 "</interface>";
2383
2384 builder = builder_new_from_string (buffer, length: -1, NULL);
2385 obj = gtk_builder_get_object (builder, name: "controller");
2386 g_assert_true (GTK_IS_SHORTCUT_CONTROLLER (obj));
2387 g_object_unref (object: builder);
2388}
2389
2390static void
2391test_transforms (void)
2392{
2393 GtkBuilder * builder;
2394 const char buffer1[] =
2395 "<interface>"
2396 " <object class=\"GtkFixed\" id=\"fixed1\">"
2397 " <child>"
2398 " <object class=\"GtkLabel\" id=\"label1\">"
2399 " <layout>"
2400 " <property name=\"transform\">rotateX(45.0)</property>"
2401 " </layout>"
2402 " </object>"
2403 " </child>"
2404 " <child>"
2405 " <object class=\"GtkLabel\" id=\"label2\">"
2406 " <layout>"
2407 " <property name=\"transform\">scale3d(1,2,3)translate3d(2,3,0)</property>"
2408 " </layout>"
2409 " </object>"
2410 " </child>"
2411 " </object>"
2412 "</interface>";
2413
2414 GObject *label, *vbox;
2415
2416 builder = builder_new_from_string (buffer: buffer1, length: -1, NULL);
2417 vbox = gtk_builder_get_object (builder, name: "fixed1");
2418 g_assert_true (GTK_IS_FIXED (vbox));
2419
2420 label = gtk_builder_get_object (builder, name: "label1");
2421 g_assert_true (GTK_IS_LABEL (label));
2422
2423 label = gtk_builder_get_object (builder, name: "label2");
2424 g_assert_true (GTK_IS_LABEL (label));
2425
2426 g_object_unref (object: builder);
2427}
2428
2429G_MODULE_EXPORT char *
2430builder_get_search (gpointer item)
2431{
2432 return g_strdup (str: gtk_string_filter_get_search (self: item));
2433}
2434
2435G_MODULE_EXPORT char *
2436builder_copy_arg (gpointer item, const char *arg)
2437{
2438 return g_strdup (str: arg);
2439}
2440
2441static void
2442test_expressions (void)
2443{
2444 const char *tests[] = {
2445 "<interface>"
2446 " <object class='GtkStringFilter' id='filter'>"
2447 " <property name='search'>Hello World</property>"
2448 " <property name='expression'><constant type='gchararray'>Hello World</constant></property>"
2449 " </object>"
2450 "</interface>",
2451 "<interface>"
2452 " <object class='GtkStringFilter' id='filter'>"
2453 " <property name='search'>Hello World</property>"
2454 " <property name='expression'><closure type='gchararray' function='builder_get_search'></closure></property>"
2455 " </object>"
2456 "</interface>",
2457 "<interface>"
2458 " <object class='GtkStringFilter' id='filter'>"
2459 " <property name='search'>Hello World</property>"
2460 " <property name='expression'><lookup type='GtkStringFilter' name='search'></lookup></property>"
2461 " </object>"
2462 "</interface>",
2463 "<interface>"
2464 " <object class='GtkStringFilter' id='filter'>"
2465 " <property name='search'>Hello World</property>"
2466 " <property name='expression'><closure type='gchararray' function='builder_copy_arg'>"
2467 " <constant type='gchararray'>Hello World</constant>"
2468 " </closure></property>"
2469 " </object>"
2470 "</interface>",
2471 };
2472 GtkBuilder *builder;
2473 GObject *obj;
2474 guint i;
2475
2476 for (i = 0; i < G_N_ELEMENTS (tests); i++)
2477 {
2478 builder = builder_new_from_string (buffer: tests[i], length: -1, NULL);
2479 obj = gtk_builder_get_object (builder, name: "filter");
2480 g_assert_true (GTK_IS_FILTER (obj));
2481 g_assert_true (gtk_filter_match (GTK_FILTER (obj), obj));
2482
2483 g_object_unref (object: builder);
2484 }
2485}
2486
2487int
2488main (int argc, char **argv)
2489{
2490 /* initialize test program */
2491 gtk_test_init (argcp: &argc, argvp: &argv);
2492
2493 g_test_add_func (testpath: "/Builder/Parser", test_func: test_parser);
2494 g_test_add_func (testpath: "/Builder/Types", test_func: test_types);
2495 g_test_add_func (testpath: "/Builder/Construct-Only Properties", test_func: test_construct_only_property);
2496 g_test_add_func (testpath: "/Builder/Children", test_func: test_children);
2497 g_test_add_func (testpath: "/Builder/Layout Properties", test_func: test_layout_properties);
2498 g_test_add_func (testpath: "/Builder/Object Properties", test_func: test_object_properties);
2499 g_test_add_func (testpath: "/Builder/Notebook", test_func: test_notebook);
2500 g_test_add_func (testpath: "/Builder/Domain", test_func: test_domain);
2501 g_test_add_func (testpath: "/Builder/Signal Autoconnect", test_func: test_connect_signals);
2502 g_test_add_func (testpath: "/Builder/Spin Button", test_func: test_spin_button);
2503 g_test_add_func (testpath: "/Builder/SizeGroup", test_func: test_sizegroup);
2504 g_test_add_func (testpath: "/Builder/ListStore", test_func: test_list_store);
2505 g_test_add_func (testpath: "/Builder/TreeStore", test_func: test_tree_store);
2506 g_test_add_func (testpath: "/Builder/TreeView Column", test_func: test_treeview_column);
2507 g_test_add_func (testpath: "/Builder/IconView", test_func: test_icon_view);
2508 g_test_add_func (testpath: "/Builder/ComboBox", test_func: test_combo_box);
2509#if 0
2510 g_test_add_func ("/Builder/ComboBox Entry", test_combo_box_entry);
2511#endif
2512 g_test_add_func (testpath: "/Builder/CellView", test_func: test_cell_view);
2513 g_test_add_func (testpath: "/Builder/Dialog", test_func: test_dialog);
2514 g_test_add_func (testpath: "/Builder/Widget", test_func: test_widget);
2515 g_test_add_func (testpath: "/Builder/Value From String", test_func: test_value_from_string);
2516 g_test_add_func (testpath: "/Builder/Reference Counting", test_func: test_reference_counting);
2517 g_test_add_func (testpath: "/Builder/Window", test_func: test_window);
2518 g_test_add_func (testpath: "/Builder/PangoAttributes", test_func: test_pango_attributes);
2519 g_test_add_func (testpath: "/Builder/Requires", test_func: test_requires);
2520 g_test_add_func (testpath: "/Builder/AddObjects", test_func: test_add_objects);
2521 g_test_add_func (testpath: "/Builder/MessageArea", test_func: test_message_area);
2522 g_test_add_func (testpath: "/Builder/MessageDialog", test_func: test_message_dialog);
2523 g_test_add_func (testpath: "/Builder/GMenu", test_func: test_gmenu);
2524 g_test_add_func (testpath: "/Builder/LevelBar", test_func: test_level_bar);
2525 g_test_add_func (testpath: "/Builder/Expose Object", test_func: test_expose_object);
2526 g_test_add_func (testpath: "/Builder/Template", test_func: test_template);
2527 g_test_add_func (testpath: "/Builder/No IDs", test_func: test_no_ids);
2528 g_test_add_func (testpath: "/Builder/Property Bindings", test_func: test_property_bindings);
2529 g_test_add_func (testpath: "/Builder/anaconda-signal", test_func: test_anaconda_signal);
2530 g_test_add_func (testpath: "/Builder/FileFilter", test_func: test_file_filter);
2531 g_test_add_func (testpath: "/Builder/Shortcuts", test_func: test_shortcuts);
2532 g_test_add_func (testpath: "/Builder/Transforms", test_func: test_transforms);
2533 g_test_add_func (testpath: "/Builder/Expressions", test_func: test_expressions);
2534
2535 return g_test_run();
2536}
2537
2538

source code of gtk/testsuite/gtk/builder.c