2 * Copyright (C) 2006-2007 Async Open Source
3 * Authors: Johan Dahlin
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.
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.
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/>.
26 #include <gdk/gdkkeysyms.h>
28 /* exported for GtkBuilder */
29 void signal_normal (GtkWindow *window, GParamSpec spec);
30 void signal_after (GtkWindow *window, GParamSpec spec);
31 void signal_object (GtkButton *button, GParamSpec spec);
32 void signal_object_after (GtkButton *button, GParamSpec spec);
33 void signal_first (GtkButton *button, GParamSpec spec);
34 void signal_second (GtkButton *button, GParamSpec spec);
35 void signal_extra (GtkButton *button, GParamSpec spec);
36 void signal_extra2 (GtkButton *button, GParamSpec spec);
38 /* Copied from gtkiconfactory.c; keep in sync! */
50 builder_new_from_string (const gchar *buffer,
57 builder = gtk_builder_new ();
59 gtk_builder_set_translation_domain (builder, domain);
60 gtk_builder_add_from_string (builder, buffer, length, &error);
63 g_print ("ERROR: %s", error->message);
76 builder = gtk_builder_new ();
79 gtk_builder_add_from_string (builder, "<xxx/>", -1, &error);
80 g_assert (g_error_matches (error,
82 GTK_BUILDER_ERROR_UNHANDLED_TAG));
86 gtk_builder_add_from_string (builder, "<interface invalid=\"X\"/>", -1, &error);
87 g_assert (g_error_matches (error,
89 GTK_BUILDER_ERROR_INVALID_ATTRIBUTE));
93 gtk_builder_add_from_string (builder, "<interface><child/></interface>", -1, &error);
94 g_assert (g_error_matches (error,
96 GTK_BUILDER_ERROR_INVALID_TAG));
100 gtk_builder_add_from_string (builder, "<interface><object class=\"GtkVBox\" id=\"a\"><object class=\"GtkHBox\" id=\"b\"/></object></interface>", -1, &error);
101 g_assert (g_error_matches (error,
103 GTK_BUILDER_ERROR_INVALID_TAG));
104 g_error_free (error);
107 gtk_builder_add_from_string (builder, "<interface><object class=\"Unknown\" id=\"a\"></object></interface>", -1, &error);
108 g_assert (g_error_matches (error,
110 GTK_BUILDER_ERROR_INVALID_VALUE));
111 g_error_free (error);
114 gtk_builder_add_from_string (builder, "<interface><object class=\"GtkWidget\" id=\"a\" constructor=\"none\"></object></interface>", -1, &error);
115 g_assert (g_error_matches (error,
117 GTK_BUILDER_ERROR_INVALID_VALUE));
118 g_error_free (error);
121 gtk_builder_add_from_string (builder, "<interface><object class=\"GtkButton\" id=\"a\"><child internal-child=\"foobar\"><object class=\"GtkButton\" id=\"int\"/></child></object></interface>", -1, &error);
122 g_assert (g_error_matches (error,
124 GTK_BUILDER_ERROR_INVALID_VALUE));
125 g_error_free (error);
128 gtk_builder_add_from_string (builder, "<interface><object class=\"GtkButton\" id=\"a\"></object><object class=\"GtkButton\" id=\"a\"/></object></interface>", -1, &error);
129 g_assert (g_error_matches (error,
131 GTK_BUILDER_ERROR_DUPLICATE_ID));
132 g_error_free (error);
134 g_object_unref (builder);
137 static int normal = 0;
138 static int after = 0;
139 static int object = 0;
140 static int object_after = 0;
142 void /* exported for GtkBuilder */
143 signal_normal (GtkWindow *window, GParamSpec spec)
145 g_assert (GTK_IS_WINDOW (window));
146 g_assert (normal == 0);
147 g_assert (after == 0);
152 void /* exported for GtkBuilder */
153 signal_after (GtkWindow *window, GParamSpec spec)
155 g_assert (GTK_IS_WINDOW (window));
156 g_assert (normal == 1);
157 g_assert (after == 0);
162 void /* exported for GtkBuilder */
163 signal_object (GtkButton *button, GParamSpec spec)
165 g_assert (GTK_IS_BUTTON (button));
166 g_assert (object == 0);
167 g_assert (object_after == 0);
172 void /* exported for GtkBuilder */
173 signal_object_after (GtkButton *button, GParamSpec spec)
175 g_assert (GTK_IS_BUTTON (button));
176 g_assert (object == 1);
177 g_assert (object_after == 0);
182 void /* exported for GtkBuilder */
183 signal_first (GtkButton *button, GParamSpec spec)
185 g_assert (normal == 0);
189 void /* exported for GtkBuilder */
190 signal_second (GtkButton *button, GParamSpec spec)
192 g_assert (normal == 10);
196 void /* exported for GtkBuilder */
197 signal_extra (GtkButton *button, GParamSpec spec)
199 g_assert (normal == 20);
203 void /* exported for GtkBuilder */
204 signal_extra2 (GtkButton *button, GParamSpec spec)
206 g_assert (normal == 30);
211 test_connect_signals (void)
215 const gchar buffer[] =
217 " <object class=\"GtkButton\" id=\"button\"/>"
218 " <object class=\"GtkWindow\" id=\"window1\">"
219 " <signal name=\"notify::title\" handler=\"signal_normal\"/>"
220 " <signal name=\"notify::title\" handler=\"signal_after\" after=\"yes\"/>"
221 " <signal name=\"notify::title\" handler=\"signal_object\""
222 " object=\"button\"/>"
223 " <signal name=\"notify::title\" handler=\"signal_object_after\""
224 " object=\"button\" after=\"yes\"/>"
227 const gchar buffer_order[] =
229 " <object class=\"GtkWindow\" id=\"window1\">"
230 " <signal name=\"notify::title\" handler=\"signal_first\"/>"
231 " <signal name=\"notify::title\" handler=\"signal_second\"/>"
234 const gchar buffer_extra[] =
236 " <object class=\"GtkWindow\" id=\"window2\">"
237 " <signal name=\"notify::title\" handler=\"signal_extra\"/>"
240 const gchar buffer_extra2[] =
242 " <object class=\"GtkWindow\" id=\"window3\">"
243 " <signal name=\"notify::title\" handler=\"signal_extra2\"/>"
246 const gchar buffer_after_child[] =
248 " <object class=\"GtkWindow\" id=\"window1\">"
250 " <object class=\"GtkButton\" id=\"button1\"/>"
252 " <signal name=\"notify::title\" handler=\"signal_normal\"/>"
256 builder = builder_new_from_string (buffer, -1, NULL);
257 gtk_builder_connect_signals (builder, NULL);
259 window = gtk_builder_get_object (builder, "window1");
260 gtk_window_set_title (GTK_WINDOW (window), "test");
262 g_assert_cmpint (normal, ==, 1);
263 g_assert_cmpint (after, ==, 1);
264 g_assert_cmpint (object, ==, 1);
265 g_assert_cmpint (object_after, ==, 1);
267 gtk_widget_destroy (GTK_WIDGET (window));
268 g_object_unref (builder);
270 builder = builder_new_from_string (buffer_order, -1, NULL);
271 gtk_builder_connect_signals (builder, NULL);
272 window = gtk_builder_get_object (builder, "window1");
274 gtk_window_set_title (GTK_WINDOW (window), "test");
275 g_assert (normal == 20);
277 gtk_widget_destroy (GTK_WIDGET (window));
279 gtk_builder_add_from_string (builder, buffer_extra,
280 strlen (buffer_extra), NULL);
281 gtk_builder_add_from_string (builder, buffer_extra2,
282 strlen (buffer_extra2), NULL);
283 gtk_builder_connect_signals (builder, NULL);
284 window = gtk_builder_get_object (builder, "window2");
285 gtk_window_set_title (GTK_WINDOW (window), "test");
286 g_assert (normal == 30);
288 gtk_widget_destroy (GTK_WIDGET (window));
289 window = gtk_builder_get_object (builder, "window3");
290 gtk_window_set_title (GTK_WINDOW (window), "test");
291 g_assert (normal == 40);
292 gtk_widget_destroy (GTK_WIDGET (window));
294 g_object_unref (builder);
296 /* new test, reset globals */
300 builder = builder_new_from_string (buffer_after_child, -1, NULL);
301 window = gtk_builder_get_object (builder, "window1");
302 gtk_builder_connect_signals (builder, NULL);
303 gtk_window_set_title (GTK_WINDOW (window), "test");
305 g_assert (normal == 1);
306 gtk_widget_destroy (GTK_WIDGET (window));
307 g_object_unref (builder);
311 test_uimanager_simple (void)
314 GObject *window, *uimgr, *menubar;
315 GObject *menu, *label;
317 const gchar buffer[] =
319 " <object class=\"GtkUIManager\" id=\"uimgr1\"/>"
322 const gchar buffer2[] =
324 " <object class=\"GtkUIManager\" id=\"uimgr1\">"
326 " <object class=\"GtkActionGroup\" id=\"ag1\">"
328 " <object class=\"GtkAction\" id=\"file\">"
329 " <property name=\"label\">_File</property>"
331 " <accelerator key=\"n\" modifiers=\"GDK_CONTROL_MASK\"/>"
336 " <menubar name=\"menubar1\">"
337 " <menu action=\"file\">"
342 " <object class=\"GtkWindow\" id=\"window1\">"
344 " <object class=\"GtkMenuBar\" id=\"menubar1\" constructor=\"uimgr1\"/>"
349 builder = builder_new_from_string (buffer, -1, NULL);
351 uimgr = gtk_builder_get_object (builder, "uimgr1");
352 g_assert (GTK_IS_UI_MANAGER (uimgr));
353 g_object_unref (builder);
355 builder = builder_new_from_string (buffer2, -1, NULL);
357 menubar = gtk_builder_get_object (builder, "menubar1");
358 g_assert (GTK_IS_MENU_BAR (menubar));
360 children = gtk_container_get_children (GTK_CONTAINER (menubar));
361 menu = children->data;
362 g_assert (GTK_IS_MENU_ITEM (menu));
363 g_assert (strcmp (gtk_widget_get_name (GTK_WIDGET (menu)), "file") == 0);
364 g_list_free (children);
366 label = G_OBJECT (gtk_bin_get_child (GTK_BIN (menu)));
367 g_assert (GTK_IS_LABEL (label));
368 g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0);
370 window = gtk_builder_get_object (builder, "window1");
371 gtk_widget_destroy (GTK_WIDGET (window));
372 g_object_unref (builder);
379 const gchar buffer1[] = "<interface/>";
380 const gchar buffer2[] = "<interface domain=\"domain\"/>";
383 builder = builder_new_from_string (buffer1, -1, NULL);
384 domain = gtk_builder_get_translation_domain (builder);
385 g_assert (domain == NULL);
386 g_object_unref (builder);
388 builder = builder_new_from_string (buffer1, -1, "domain-1");
389 domain = gtk_builder_get_translation_domain (builder);
391 g_assert (strcmp (domain, "domain-1") == 0);
392 g_object_unref (builder);
394 builder = builder_new_from_string (buffer2, -1, NULL);
395 domain = gtk_builder_get_translation_domain (builder);
396 g_assert (domain == NULL);
397 g_object_unref (builder);
402 test_translation (void)
405 const gchar buffer[] =
407 " <object class=\"GtkWindow\" id=\"window1\">"
409 " <object class=\"GtkLabel\" id=\"label\">"
410 " <property name=\"label\" translatable=\"yes\">File</property>"
415 GtkLabel *window, *label;
417 setlocale (LC_ALL, "sv_SE");
418 textdomain ("builder");
419 bindtextdomain ("builder", "tests");
421 builder = builder_new_from_string (buffer, -1, NULL);
422 label = GTK_LABEL (gtk_builder_get_object (builder, "label"));
423 g_assert (strcmp (gtk_label_get_text (label), "Arkiv") == 0);
425 window = gtk_builder_get_object (builder, "window1");
426 gtk_widget_destroy (GTK_WIDGET (window));
427 g_object_unref (builder);
432 test_sizegroup (void)
434 GtkBuilder * builder;
435 const gchar buffer1[] =
436 "<interface domain=\"test\">"
437 " <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
438 " <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
440 " <widget name=\"radio1\"/>"
441 " <widget name=\"radio2\"/>"
444 " <object class=\"GtkWindow\" id=\"window1\">"
446 " <object class=\"GtkVBox\" id=\"vbox1\">"
448 " <object class=\"GtkRadioButton\" id=\"radio1\"/>"
451 " <object class=\"GtkRadioButton\" id=\"radio2\"/>"
457 const gchar buffer2[] =
458 "<interface domain=\"test\">"
459 " <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
460 " <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
465 const gchar buffer3[] =
466 "<interface domain=\"test\">"
467 " <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
468 " <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
470 " <widget name=\"radio1\"/>"
471 " <widget name=\"radio2\"/>"
474 " <object class=\"GtkSizeGroup\" id=\"sizegroup2\">"
475 " <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
477 " <widget name=\"radio1\"/>"
478 " <widget name=\"radio2\"/>"
481 " <object class=\"GtkWindow\" id=\"window1\">"
483 " <object class=\"GtkVBox\" id=\"vbox1\">"
485 " <object class=\"GtkRadioButton\" id=\"radio1\"/>"
488 " <object class=\"GtkRadioButton\" id=\"radio2\"/>"
497 builder = builder_new_from_string (buffer1, -1, NULL);
498 sizegroup = gtk_builder_get_object (builder, "sizegroup1");
499 widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
500 g_assert (g_slist_length (widgets) == 2);
501 g_slist_free (widgets);
502 g_object_unref (builder);
504 builder = builder_new_from_string (buffer2, -1, NULL);
505 sizegroup = gtk_builder_get_object (builder, "sizegroup1");
506 widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
507 g_assert (g_slist_length (widgets) == 0);
508 g_slist_free (widgets);
509 g_object_unref (builder);
511 builder = builder_new_from_string (buffer3, -1, NULL);
512 sizegroup = gtk_builder_get_object (builder, "sizegroup1");
513 widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
514 g_assert (g_slist_length (widgets) == 2);
515 g_slist_free (widgets);
516 sizegroup = gtk_builder_get_object (builder, "sizegroup2");
517 widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
518 g_assert (g_slist_length (widgets) == 2);
519 g_slist_free (widgets);
524 window = gtk_builder_get_object (builder, "window1");
525 gtk_widget_destroy (GTK_WIDGET (window));
528 g_object_unref (builder);
532 test_list_store (void)
534 const gchar buffer1[] =
536 " <object class=\"GtkListStore\" id=\"liststore1\">"
538 " <column type=\"gchararray\"/>"
539 " <column type=\"guint\"/>"
543 const char buffer2[] =
545 " <object class=\"GtkListStore\" id=\"liststore1\">"
547 " <column type=\"gchararray\"/>"
548 " <column type=\"gchararray\"/>"
549 " <column type=\"gint\"/>"
553 " <col id=\"0\" translatable=\"yes\">John</col>"
554 " <col id=\"1\" context=\"foo\">Doe</col>"
555 " <col id=\"2\" comment=\"foobar\">25</col>"
558 " <col id=\"0\">Johan</col>"
559 " <col id=\"1\">Dole</col>"
560 " <col id=\"2\">50</col>"
565 const char buffer3[] =
567 " <object class=\"GtkListStore\" id=\"liststore1\">"
569 " <column type=\"gchararray\"/>"
570 " <column type=\"gchararray\"/>"
571 " <column type=\"gint\"/>"
575 " <col id=\"1\" context=\"foo\">Doe</col>"
576 " <col id=\"0\" translatable=\"yes\">John</col>"
577 " <col id=\"2\" comment=\"foobar\">25</col>"
580 " <col id=\"2\">50</col>"
581 " <col id=\"1\">Dole</col>"
582 " <col id=\"0\">Johan</col>"
585 " <col id=\"2\">19</col>"
593 gchar *surname, *lastname;
596 builder = builder_new_from_string (buffer1, -1, NULL);
597 store = gtk_builder_get_object (builder, "liststore1");
598 g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 2);
599 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
600 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_UINT);
601 g_object_unref (builder);
603 builder = builder_new_from_string (buffer2, -1, NULL);
604 store = gtk_builder_get_object (builder, "liststore1");
605 g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 3);
606 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
607 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_STRING);
608 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2) == G_TYPE_INT);
610 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter) == TRUE);
611 gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
616 g_assert (surname != NULL);
617 g_assert (strcmp (surname, "John") == 0);
619 g_assert (lastname != NULL);
620 g_assert (strcmp (lastname, "Doe") == 0);
622 g_assert (age == 25);
623 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE);
625 gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
630 g_assert (surname != NULL);
631 g_assert (strcmp (surname, "Johan") == 0);
633 g_assert (lastname != NULL);
634 g_assert (strcmp (lastname, "Dole") == 0);
636 g_assert (age == 50);
637 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == FALSE);
639 g_object_unref (builder);
641 builder = builder_new_from_string (buffer3, -1, NULL);
642 store = gtk_builder_get_object (builder, "liststore1");
643 g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 3);
644 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
645 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_STRING);
646 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2) == G_TYPE_INT);
648 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter) == TRUE);
649 gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
654 g_assert (surname != NULL);
655 g_assert (strcmp (surname, "John") == 0);
657 g_assert (lastname != NULL);
658 g_assert (strcmp (lastname, "Doe") == 0);
660 g_assert (age == 25);
661 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE);
663 gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
668 g_assert (surname != NULL);
669 g_assert (strcmp (surname, "Johan") == 0);
671 g_assert (lastname != NULL);
672 g_assert (strcmp (lastname, "Dole") == 0);
674 g_assert (age == 50);
675 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE);
677 gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
682 g_assert (surname == NULL);
683 g_assert (lastname == NULL);
684 g_assert (age == 19);
685 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == FALSE);
687 g_object_unref (builder);
691 test_tree_store (void)
693 const gchar buffer[] =
694 "<interface domain=\"test\">"
695 " <object class=\"GtkTreeStore\" id=\"treestore1\">"
697 " <column type=\"gchararray\"/>"
698 " <column type=\"guint\"/>"
705 builder = builder_new_from_string (buffer, -1, NULL);
706 store = gtk_builder_get_object (builder, "treestore1");
707 g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 2);
708 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
709 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_UINT);
711 g_object_unref (builder);
717 const gchar buffer[] =
719 " <object class=\"GtkAction\" id=\"action\"/>"
720 " <object class=\"GtkActionGroup\" id=\"actiongroup\"/>"
721 " <object class=\"GtkAlignment\" id=\"alignment\"/>"
722 " <object class=\"GtkArrow\" id=\"arrow\"/>"
723 " <object class=\"GtkButton\" id=\"button\"/>"
724 " <object class=\"GtkCheckButton\" id=\"checkbutton\"/>"
725 " <object class=\"GtkDialog\" id=\"dialog\"/>"
726 " <object class=\"GtkDrawingArea\" id=\"drawingarea\"/>"
727 " <object class=\"GtkEventBox\" id=\"eventbox\"/>"
728 " <object class=\"GtkEntry\" id=\"entry\"/>"
729 " <object class=\"GtkFontButton\" id=\"fontbutton\"/>"
730 " <object class=\"GtkHButtonBox\" id=\"hbuttonbox\"/>"
731 " <object class=\"GtkHBox\" id=\"hbox\"/>"
732 " <object class=\"GtkHPaned\" id=\"hpaned\"/>"
733 " <object class=\"GtkHScale\" id=\"hscale\"/>"
734 " <object class=\"GtkHScrollbar\" id=\"hscrollbar\"/>"
735 " <object class=\"GtkHSeparator\" id=\"hseparator\"/>"
736 " <object class=\"GtkImage\" id=\"image\"/>"
737 " <object class=\"GtkLabel\" id=\"label\"/>"
738 " <object class=\"GtkListStore\" id=\"liststore\"/>"
739 " <object class=\"GtkMenuBar\" id=\"menubar\"/>"
740 " <object class=\"GtkNotebook\" id=\"notebook\"/>"
741 " <object class=\"GtkProgressBar\" id=\"progressbar\"/>"
742 " <object class=\"GtkRadioButton\" id=\"radiobutton\"/>"
743 " <object class=\"GtkSizeGroup\" id=\"sizegroup\"/>"
744 " <object class=\"GtkScrolledWindow\" id=\"scrolledwindow\"/>"
745 " <object class=\"GtkSpinButton\" id=\"spinbutton\"/>"
746 " <object class=\"GtkStatusbar\" id=\"statusbar\"/>"
747 " <object class=\"GtkTextView\" id=\"textview\"/>"
748 " <object class=\"GtkToggleAction\" id=\"toggleaction\"/>"
749 " <object class=\"GtkToggleButton\" id=\"togglebutton\"/>"
750 " <object class=\"GtkToolbar\" id=\"toolbar\"/>"
751 " <object class=\"GtkTreeStore\" id=\"treestore\"/>"
752 " <object class=\"GtkTreeView\" id=\"treeview\"/>"
753 " <object class=\"GtkTable\" id=\"table\"/>"
754 " <object class=\"GtkVBox\" id=\"vbox\"/>"
755 " <object class=\"GtkVButtonBox\" id=\"vbuttonbox\"/>"
756 " <object class=\"GtkVScrollbar\" id=\"vscrollbar\"/>"
757 " <object class=\"GtkVSeparator\" id=\"vseparator\"/>"
758 " <object class=\"GtkViewport\" id=\"viewport\"/>"
759 " <object class=\"GtkVPaned\" id=\"vpaned\"/>"
760 " <object class=\"GtkVScale\" id=\"vscale\"/>"
761 " <object class=\"GtkWindow\" id=\"window\"/>"
762 " <object class=\"GtkUIManager\" id=\"uimanager\"/>"
764 const gchar buffer2[] =
766 " <object type-func=\"gtk_window_get_type\" id=\"window\"/>"
768 const gchar buffer3[] =
770 " <object type-func=\"xxx_invalid_get_type_function\" id=\"window\"/>"
776 builder = builder_new_from_string (buffer, -1, NULL);
777 gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "dialog")));
778 gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "window")));
779 g_object_unref (builder);
781 builder = builder_new_from_string (buffer2, -1, NULL);
782 window = gtk_builder_get_object (builder, "window");
783 g_assert (GTK_IS_WINDOW (window));
784 gtk_widget_destroy (GTK_WIDGET (window));
785 g_object_unref (builder);
788 builder = gtk_builder_new ();
789 gtk_builder_add_from_string (builder, buffer3, -1, &error);
790 g_assert (g_error_matches (error,
792 GTK_BUILDER_ERROR_INVALID_TYPE_FUNCTION));
793 g_error_free (error);
794 g_object_unref (builder);
798 test_spin_button (void)
801 const gchar buffer[] =
803 "<object class=\"GtkAdjustment\" id=\"adjustment1\">"
804 "<property name=\"lower\">0</property>"
805 "<property name=\"upper\">10</property>"
806 "<property name=\"step-increment\">2</property>"
807 "<property name=\"page-increment\">3</property>"
808 "<property name=\"page-size\">0</property>"
809 "<property name=\"value\">1</property>"
811 "<object class=\"GtkSpinButton\" id=\"spinbutton1\">"
812 "<property name=\"visible\">True</property>"
813 "<property name=\"adjustment\">adjustment1</property>"
817 GtkAdjustment *adjustment;
820 builder = builder_new_from_string (buffer, -1, NULL);
821 obj = gtk_builder_get_object (builder, "spinbutton1");
822 g_assert (GTK_IS_SPIN_BUTTON (obj));
823 adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (obj));
824 g_assert (GTK_IS_ADJUSTMENT (adjustment));
825 g_object_get (adjustment, "value", &value, NULL);
826 g_assert (value == 1);
827 g_object_get (adjustment, "lower", &value, NULL);
828 g_assert (value == 0);
829 g_object_get (adjustment, "upper", &value, NULL);
830 g_assert (value == 10);
831 g_object_get (adjustment, "step-increment", &value, NULL);
832 g_assert (value == 2);
833 g_object_get (adjustment, "page-increment", &value, NULL);
834 g_assert (value == 3);
835 g_object_get (adjustment, "page-size", &value, NULL);
836 g_assert (value == 0);
838 g_object_unref (builder);
845 const gchar buffer[] =
847 " <object class=\"GtkNotebook\" id=\"notebook1\">"
849 " <object class=\"GtkLabel\" id=\"label1\">"
850 " <property name=\"label\">label1</property>"
853 " <child type=\"tab\">"
854 " <object class=\"GtkLabel\" id=\"tablabel1\">"
855 " <property name=\"label\">tab_label1</property>"
859 " <object class=\"GtkLabel\" id=\"label2\">"
860 " <property name=\"label\">label2</property>"
863 " <child type=\"tab\">"
864 " <object class=\"GtkLabel\" id=\"tablabel2\">"
865 " <property name=\"label\">tab_label2</property>"
873 builder = builder_new_from_string (buffer, -1, NULL);
874 notebook = gtk_builder_get_object (builder, "notebook1");
875 g_assert (notebook != NULL);
876 g_assert (gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)) == 2);
878 label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 0);
879 g_assert (GTK_IS_LABEL (label));
880 g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "label1") == 0);
881 label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), label);
882 g_assert (GTK_IS_LABEL (label));
883 g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "tab_label1") == 0);
885 label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 1);
886 g_assert (GTK_IS_LABEL (label));
887 g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "label2") == 0);
888 label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), label);
889 g_assert (GTK_IS_LABEL (label));
890 g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "tab_label2") == 0);
892 g_object_unref (builder);
896 test_construct_only_property (void)
899 const gchar buffer[] =
901 " <object class=\"GtkWindow\" id=\"window1\">"
902 " <property name=\"type\">GTK_WINDOW_POPUP</property>"
905 const gchar buffer2[] =
907 " <object class=\"GtkTextTagTable\" id=\"tagtable1\"/>"
908 " <object class=\"GtkTextBuffer\" id=\"textbuffer1\">"
909 " <property name=\"tag-table\">tagtable1</property>"
912 GObject *widget, *tagtable, *textbuffer;
915 builder = builder_new_from_string (buffer, -1, NULL);
916 widget = gtk_builder_get_object (builder, "window1");
917 g_object_get (widget, "type", &type, NULL);
918 g_assert (type == GTK_WINDOW_POPUP);
920 gtk_widget_destroy (GTK_WIDGET (widget));
921 g_object_unref (builder);
923 builder = builder_new_from_string (buffer2, -1, NULL);
924 textbuffer = gtk_builder_get_object (builder, "textbuffer1");
925 g_assert (textbuffer != NULL);
926 g_object_get (textbuffer, "tag-table", &tagtable, NULL);
927 g_assert (tagtable == gtk_builder_get_object (builder, "tagtable1"));
928 g_object_unref (tagtable);
929 g_object_unref (builder);
933 test_object_properties (void)
936 const gchar buffer[] =
938 " <object class=\"GtkWindow\" id=\"window1\">"
940 " <object class=\"GtkVBox\" id=\"vbox\">"
941 " <property name=\"border-width\">10</property>"
943 " <object class=\"GtkLabel\" id=\"label1\">"
944 " <property name=\"mnemonic-widget\">spinbutton1</property>"
948 " <object class=\"GtkSpinButton\" id=\"spinbutton1\"/>"
954 const gchar buffer2[] =
956 " <object class=\"GtkWindow\" id=\"window2\"/>"
958 GObject *label, *spinbutton, *window;
960 builder = builder_new_from_string (buffer, -1, NULL);
961 label = gtk_builder_get_object (builder, "label1");
962 g_assert (label != NULL);
963 spinbutton = gtk_builder_get_object (builder, "spinbutton1");
964 g_assert (spinbutton != NULL);
965 g_assert (spinbutton == (GObject*)gtk_label_get_mnemonic_widget (GTK_LABEL (label)));
967 gtk_builder_add_from_string (builder, buffer2, -1, NULL);
968 window = gtk_builder_get_object (builder, "window2");
969 g_assert (window != NULL);
970 gtk_widget_destroy (GTK_WIDGET (window));
972 g_object_unref (builder);
978 GtkBuilder * builder;
979 GtkWidget *content_area, *dialog_action_area;
981 const gchar buffer1[] =
983 " <object class=\"GtkWindow\" id=\"window1\">"
985 " <object class=\"GtkButton\" id=\"button1\">"
986 " <property name=\"label\">Hello</property>"
991 const gchar buffer2[] =
993 " <object class=\"GtkDialog\" id=\"dialog1\">"
994 " <child internal-child=\"vbox\">"
995 " <object class=\"GtkVBox\" id=\"dialog1-vbox\">"
996 " <property name=\"border-width\">10</property>"
997 " <child internal-child=\"action_area\">"
998 " <object class=\"GtkHButtonBox\" id=\"dialog1-action_area\">"
999 " <property name=\"border-width\">20</property>"
1007 GObject *window, *button;
1008 GObject *dialog, *vbox, *action_area;
1010 builder = builder_new_from_string (buffer1, -1, NULL);
1011 window = gtk_builder_get_object (builder, "window1");
1012 g_assert (window != NULL);
1013 g_assert (GTK_IS_WINDOW (window));
1015 button = gtk_builder_get_object (builder, "button1");
1016 g_assert (button != NULL);
1017 g_assert (GTK_IS_BUTTON (button));
1018 g_assert (gtk_widget_get_parent (GTK_WIDGET(button)) != NULL);
1019 g_assert (strcmp (gtk_buildable_get_name (GTK_BUILDABLE (gtk_widget_get_parent (GTK_WIDGET (button)))), "window1") == 0);
1021 gtk_widget_destroy (GTK_WIDGET (window));
1022 g_object_unref (builder);
1024 builder = builder_new_from_string (buffer2, -1, NULL);
1025 dialog = gtk_builder_get_object (builder, "dialog1");
1026 g_assert (dialog != NULL);
1027 g_assert (GTK_IS_DIALOG (dialog));
1028 children = gtk_container_get_children (GTK_CONTAINER (dialog));
1029 g_assert (g_list_length (children) == 1);
1030 g_list_free (children);
1032 vbox = gtk_builder_get_object (builder, "dialog1-vbox");
1033 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
1034 g_assert (vbox != NULL);
1035 g_assert (GTK_IS_BOX (vbox));
1036 g_assert (gtk_orientable_get_orientation (GTK_ORIENTABLE (vbox)) == GTK_ORIENTATION_VERTICAL);
1037 g_assert (strcmp (gtk_buildable_get_name (GTK_BUILDABLE (gtk_widget_get_parent (GTK_WIDGET (vbox)))), "dialog1") == 0);
1038 g_assert (gtk_container_get_border_width (GTK_CONTAINER (vbox)) == 10);
1039 g_assert (strcmp (gtk_buildable_get_name (GTK_BUILDABLE (content_area)), "dialog1-vbox") == 0);
1041 action_area = gtk_builder_get_object (builder, "dialog1-action_area");
1042 dialog_action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog));
1043 g_assert (action_area != NULL);
1044 g_assert (GTK_IS_BUTTON_BOX (action_area));
1045 g_assert (gtk_orientable_get_orientation (GTK_ORIENTABLE (action_area)) == GTK_ORIENTATION_HORIZONTAL);
1046 g_assert (gtk_widget_get_parent (GTK_WIDGET (action_area)) != NULL);
1047 g_assert (gtk_container_get_border_width (GTK_CONTAINER (action_area)) == 20);
1048 g_assert (dialog_action_area != NULL);
1049 g_assert (gtk_buildable_get_name (GTK_BUILDABLE (action_area)) != NULL);
1050 g_assert (strcmp (gtk_buildable_get_name (GTK_BUILDABLE (dialog_action_area)), "dialog1-action_area") == 0);
1051 gtk_widget_destroy (GTK_WIDGET (dialog));
1052 g_object_unref (builder);
1056 test_child_properties (void)
1058 GtkBuilder * builder;
1059 const gchar buffer1[] =
1061 " <object class=\"GtkBox\" id=\"vbox1\">"
1063 " <object class=\"GtkLabel\" id=\"label1\"/>"
1065 " <property name=\"pack-type\">start</property>"
1069 " <object class=\"GtkLabel\" id=\"label2\"/>"
1071 " <property name=\"pack-type\">end</property>"
1077 GObject *label, *vbox;
1078 GtkPackType pack_type;
1080 builder = builder_new_from_string (buffer1, -1, NULL);
1081 vbox = gtk_builder_get_object (builder, "vbox1");
1082 g_assert (GTK_IS_BOX (vbox));
1084 label = gtk_builder_get_object (builder, "label1");
1085 g_assert (GTK_IS_LABEL (label));
1086 gtk_container_child_get (GTK_CONTAINER (vbox),
1091 g_assert (pack_type == GTK_PACK_START);
1093 label = gtk_builder_get_object (builder, "label2");
1094 g_assert (GTK_IS_LABEL (label));
1095 gtk_container_child_get (GTK_CONTAINER (vbox),
1100 g_assert (pack_type == GTK_PACK_END);
1102 g_object_unref (builder);
1106 test_treeview_column (void)
1108 GtkBuilder *builder;
1109 const gchar buffer[] =
1111 "<object class=\"GtkListStore\" id=\"liststore1\">"
1113 " <column type=\"gchararray\"/>"
1114 " <column type=\"guint\"/>"
1118 " <col id=\"0\">John</col>"
1119 " <col id=\"1\">25</col>"
1123 "<object class=\"GtkWindow\" id=\"window1\">"
1125 " <object class=\"GtkTreeView\" id=\"treeview1\">"
1126 " <property name=\"visible\">True</property>"
1127 " <property name=\"model\">liststore1</property>"
1129 " <object class=\"GtkTreeViewColumn\" id=\"column1\">"
1130 " <property name=\"title\">Test</property>"
1132 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1134 " <attribute name=\"text\">1</attribute>"
1140 " <object class=\"GtkTreeViewColumn\" id=\"column2\">"
1141 " <property name=\"title\">Number</property>"
1143 " <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
1145 " <attribute name=\"text\">0</attribute>"
1154 GObject *window, *treeview;
1155 GtkTreeViewColumn *column;
1160 builder = builder_new_from_string (buffer, -1, NULL);
1161 treeview = gtk_builder_get_object (builder, "treeview1");
1162 g_assert (treeview);
1163 g_assert (GTK_IS_TREE_VIEW (treeview));
1164 column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), 0);
1165 g_assert (GTK_IS_TREE_VIEW_COLUMN (column));
1166 g_assert (strcmp (gtk_tree_view_column_get_title (column), "Test") == 0);
1168 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
1169 g_assert (g_list_length (renderers) == 1);
1170 renderer = g_list_nth_data (renderers, 0);
1171 g_assert (renderer);
1172 g_assert (GTK_IS_CELL_RENDERER_TEXT (renderer));
1173 g_list_free (renderers);
1175 gtk_widget_realize (GTK_WIDGET (treeview));
1177 renderer = gtk_builder_get_object (builder, "renderer1");
1178 g_object_get (renderer, "text", &text, NULL);
1180 g_assert (strcmp (text, "25") == 0);
1183 renderer = gtk_builder_get_object (builder, "renderer2");
1184 g_object_get (renderer, "text", &text, NULL);
1186 g_assert (strcmp (text, "John") == 0);
1189 gtk_widget_unrealize (GTK_WIDGET (treeview));
1191 window = gtk_builder_get_object (builder, "window1");
1192 gtk_widget_destroy (GTK_WIDGET (window));
1194 g_object_unref (builder);
1198 test_icon_view (void)
1200 GtkBuilder *builder;
1201 const gchar buffer[] =
1203 " <object class=\"GtkListStore\" id=\"liststore1\">"
1205 " <column type=\"gchararray\"/>"
1206 " <column type=\"GdkPixbuf\"/>"
1210 " <col id=\"0\">test</col>"
1214 " <object class=\"GtkWindow\" id=\"window1\">"
1216 " <object class=\"GtkIconView\" id=\"iconview1\">"
1217 " <property name=\"model\">liststore1</property>"
1218 " <property name=\"text-column\">0</property>"
1219 " <property name=\"pixbuf-column\">1</property>"
1220 " <property name=\"visible\">True</property>"
1222 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1224 " <attribute name=\"text\">0</attribute>"
1231 GObject *window, *iconview;
1233 builder = builder_new_from_string (buffer, -1, NULL);
1234 iconview = gtk_builder_get_object (builder, "iconview1");
1235 g_assert (iconview);
1236 g_assert (GTK_IS_ICON_VIEW (iconview));
1238 window = gtk_builder_get_object (builder, "window1");
1239 gtk_widget_destroy (GTK_WIDGET (window));
1240 g_object_unref (builder);
1244 test_combo_box (void)
1246 GtkBuilder *builder;
1247 const gchar buffer[] =
1249 " <object class=\"GtkListStore\" id=\"liststore1\">"
1251 " <column type=\"guint\"/>"
1252 " <column type=\"gchararray\"/>"
1256 " <col id=\"0\">1</col>"
1257 " <col id=\"1\">Foo</col>"
1260 " <col id=\"0\">2</col>"
1261 " <col id=\"1\">Bar</col>"
1265 " <object class=\"GtkWindow\" id=\"window1\">"
1267 " <object class=\"GtkComboBox\" id=\"combobox1\">"
1268 " <property name=\"model\">liststore1</property>"
1269 " <property name=\"visible\">True</property>"
1271 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1273 " <attribute name=\"text\">0</attribute>"
1277 " <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
1279 " <attribute name=\"text\">1</attribute>"
1286 GObject *window, *combobox, *renderer;
1289 builder = builder_new_from_string (buffer, -1, NULL);
1290 combobox = gtk_builder_get_object (builder, "combobox1");
1291 g_assert (combobox);
1292 gtk_widget_realize (GTK_WIDGET (combobox));
1294 renderer = gtk_builder_get_object (builder, "renderer2");
1295 g_assert (renderer);
1296 g_object_get (renderer, "text", &text, NULL);
1298 g_assert (strcmp (text, "Bar") == 0);
1301 renderer = gtk_builder_get_object (builder, "renderer1");
1302 g_assert (renderer);
1303 g_object_get (renderer, "text", &text, NULL);
1305 g_assert (strcmp (text, "2") == 0);
1308 window = gtk_builder_get_object (builder, "window1");
1309 gtk_widget_destroy (GTK_WIDGET (window));
1311 g_object_unref (builder);
1316 test_combo_box_entry (void)
1318 GtkBuilder *builder;
1319 const gchar buffer[] =
1321 " <object class=\"GtkListStore\" id=\"liststore1\">"
1323 " <column type=\"guint\"/>"
1324 " <column type=\"gchararray\"/>"
1328 " <col id=\"0\">1</col>"
1329 " <col id=\"1\">Foo</col>"
1332 " <col id=\"0\">2</col>"
1333 " <col id=\"1\">Bar</col>"
1337 " <object class=\"GtkWindow\" id=\"window1\">"
1339 " <object class=\"GtkComboBox\" id=\"comboboxentry1\">"
1340 " <property name=\"model\">liststore1</property>"
1341 " <property name=\"has-entry\">True</property>"
1342 " <property name=\"visible\">True</property>"
1344 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1346 " <attribute name=\"text\">0</attribute>"
1350 " <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
1352 " <attribute name=\"text\">1</attribute>"
1359 GObject *window, *combobox, *renderer;
1362 builder = builder_new_from_string (buffer, -1, NULL);
1363 combobox = gtk_builder_get_object (builder, "comboboxentry1");
1364 g_assert (combobox);
1366 renderer = gtk_builder_get_object (builder, "renderer2");
1367 g_assert (renderer);
1368 g_object_get (renderer, "text", &text, NULL);
1370 g_assert (strcmp (text, "Bar") == 0);
1373 renderer = gtk_builder_get_object (builder, "renderer1");
1374 g_assert (renderer);
1375 g_object_get (renderer, "text", &text, NULL);
1377 g_assert (strcmp (text, "2") == 0);
1380 window = gtk_builder_get_object (builder, "window1");
1381 gtk_widget_destroy (GTK_WIDGET (window));
1383 g_object_unref (builder);
1388 test_cell_view (void)
1390 GtkBuilder *builder;
1391 const gchar *buffer =
1393 " <object class=\"GtkListStore\" id=\"liststore1\">"
1395 " <column type=\"gchararray\"/>"
1399 " <col id=\"0\">test</col>"
1403 " <object class=\"GtkWindow\" id=\"window1\">"
1405 " <object class=\"GtkCellView\" id=\"cellview1\">"
1406 " <property name=\"visible\">True</property>"
1407 " <property name=\"model\">liststore1</property>"
1408 " <accelerator key=\"f\" modifiers=\"GDK_CONTROL_MASK\" signal=\"grab_focus\"/>"
1410 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1412 " <attribute name=\"text\">0</attribute>"
1420 GObject *model, *window;
1426 builder = builder_new_from_string (buffer, -1, NULL);
1427 cellview = gtk_builder_get_object (builder, "cellview1");
1429 g_assert (cellview);
1430 g_assert (GTK_IS_CELL_VIEW (cellview));
1431 g_object_get (cellview, "model", &model, NULL);
1433 g_assert (GTK_IS_TREE_MODEL (model));
1434 g_object_unref (model);
1435 path = gtk_tree_path_new_first ();
1436 gtk_cell_view_set_displayed_row (GTK_CELL_VIEW (cellview), path);
1438 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (cellview));
1439 g_assert (renderers);
1440 g_assert (g_list_length (renderers) == 1);
1442 gtk_widget_realize (GTK_WIDGET (cellview));
1444 renderer = g_list_nth_data (renderers, 0);
1445 g_list_free (renderers);
1446 g_assert (renderer);
1447 g_object_get (renderer, "text", &text, NULL);
1448 g_assert (strcmp (text, "test") == 0);
1450 gtk_tree_path_free (path);
1452 window = gtk_builder_get_object (builder, "window1");
1453 gtk_widget_destroy (GTK_WIDGET (window));
1455 g_object_unref (builder);
1461 GtkBuilder * builder;
1462 const gchar buffer1[] =
1464 " <object class=\"GtkDialog\" id=\"dialog1\">"
1465 " <child internal-child=\"vbox\">"
1466 " <object class=\"GtkVBox\" id=\"dialog1-vbox\">"
1467 " <child internal-child=\"action_area\">"
1468 " <object class=\"GtkHButtonBox\" id=\"dialog1-action_area\">"
1470 " <object class=\"GtkButton\" id=\"button_cancel\"/>"
1473 " <object class=\"GtkButton\" id=\"button_ok\"/>"
1480 " <action-widget response=\"3\">button_ok</action-widget>"
1481 " <action-widget response=\"-5\">button_cancel</action-widget>"
1482 " </action-widgets>"
1488 GObject *button_cancel;
1490 builder = builder_new_from_string (buffer1, -1, NULL);
1491 dialog1 = gtk_builder_get_object (builder, "dialog1");
1492 button_ok = gtk_builder_get_object (builder, "button_ok");
1493 g_assert (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_ok)) == 3);
1494 button_cancel = gtk_builder_get_object (builder, "button_cancel");
1495 g_assert (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_cancel)) == -5);
1497 gtk_widget_destroy (GTK_WIDGET (dialog1));
1498 g_object_unref (builder);
1502 test_message_dialog (void)
1504 GtkBuilder * builder;
1505 const gchar buffer1[] =
1507 " <object class=\"GtkMessageDialog\" id=\"dialog1\">"
1508 " <child internal-child=\"message_area\">"
1509 " <object class=\"GtkVBox\" id=\"dialog-message-area\">"
1511 " <object class=\"GtkExpander\" id=\"expander\"/>"
1521 builder = builder_new_from_string (buffer1, -1, NULL);
1522 dialog1 = gtk_builder_get_object (builder, "dialog1");
1523 expander = gtk_builder_get_object (builder, "expander");
1524 g_assert (GTK_IS_EXPANDER (expander));
1525 g_assert (gtk_widget_get_parent (GTK_WIDGET (expander)) == gtk_message_dialog_get_message_area (GTK_MESSAGE_DIALOG (dialog1)));
1527 gtk_widget_destroy (GTK_WIDGET (dialog1));
1528 g_object_unref (builder);
1532 test_accelerators (void)
1534 GtkBuilder *builder;
1535 const gchar *buffer =
1537 " <object class=\"GtkWindow\" id=\"window1\">"
1539 " <object class=\"GtkButton\" id=\"button1\">"
1540 " <accelerator key=\"q\" modifiers=\"GDK_CONTROL_MASK\" signal=\"clicked\"/>"
1545 const gchar *buffer2 =
1547 " <object class=\"GtkWindow\" id=\"window1\">"
1549 " <object class=\"GtkTreeView\" id=\"treeview1\">"
1550 " <signal name=\"cursor-changed\" handler=\"gtk_main_quit\"/>"
1551 " <accelerator key=\"f\" modifiers=\"GDK_CONTROL_MASK\" signal=\"grab_focus\"/>"
1557 GSList *accel_groups;
1558 GObject *accel_group;
1560 builder = builder_new_from_string (buffer, -1, NULL);
1561 window1 = gtk_builder_get_object (builder, "window1");
1563 g_assert (GTK_IS_WINDOW (window1));
1565 accel_groups = gtk_accel_groups_from_object (window1);
1566 g_assert (g_slist_length (accel_groups) == 1);
1567 accel_group = g_slist_nth_data (accel_groups, 0);
1568 g_assert (accel_group);
1570 gtk_widget_destroy (GTK_WIDGET (window1));
1571 g_object_unref (builder);
1573 builder = builder_new_from_string (buffer2, -1, NULL);
1574 window1 = gtk_builder_get_object (builder, "window1");
1576 g_assert (GTK_IS_WINDOW (window1));
1578 accel_groups = gtk_accel_groups_from_object (window1);
1579 g_assert (g_slist_length (accel_groups) == 1);
1580 accel_group = g_slist_nth_data (accel_groups, 0);
1581 g_assert (accel_group);
1583 gtk_widget_destroy (GTK_WIDGET (window1));
1584 g_object_unref (builder);
1590 const gchar *buffer =
1592 " <object class=\"GtkWindow\" id=\"window1\">"
1594 " <object class=\"GtkButton\" id=\"button1\">"
1595 " <property name=\"can-focus\">True</property>"
1596 " <property name=\"has-focus\">True</property>"
1601 const gchar *buffer2 =
1603 " <object class=\"GtkWindow\" id=\"window1\">"
1605 " <object class=\"GtkButton\" id=\"button1\">"
1606 " <property name=\"can-default\">True</property>"
1607 " <property name=\"has-default\">True</property>"
1612 const gchar *buffer3 =
1614 " <object class=\"GtkWindow\" id=\"window1\">"
1616 " <object class=\"GtkVBox\" id=\"vbox1\">"
1618 " <object class=\"GtkLabel\" id=\"label1\">"
1619 " <child internal-child=\"accessible\">"
1620 " <object class=\"AtkObject\" id=\"a11y-label1\">"
1621 " <property name=\"AtkObject::accessible-name\">A Label</property>"
1625 " <relation target=\"button1\" type=\"label-for\"/>"
1630 " <object class=\"GtkButton\" id=\"button1\">"
1632 " <action action_name=\"click\" description=\"Sliff\"/>"
1633 " <action action_name=\"clack\" translatable=\"yes\">Sniff</action>"
1641 GtkBuilder *builder;
1642 GObject *window1, *button1, *label1;
1643 AtkObject *accessible;
1644 AtkRelationSet *relation_set;
1645 AtkRelation *relation;
1648 builder = builder_new_from_string (buffer, -1, NULL);
1649 button1 = gtk_builder_get_object (builder, "button1");
1652 g_assert (gtk_widget_has_focus (GTK_WIDGET (button1)));
1654 window1 = gtk_builder_get_object (builder, "window1");
1655 gtk_widget_destroy (GTK_WIDGET (window1));
1657 g_object_unref (builder);
1659 builder = builder_new_from_string (buffer2, -1, NULL);
1660 button1 = gtk_builder_get_object (builder, "button1");
1662 g_assert (gtk_widget_get_receives_default (GTK_WIDGET (button1)));
1664 g_object_unref (builder);
1666 builder = builder_new_from_string (buffer3, -1, NULL);
1668 window1 = gtk_builder_get_object (builder, "window1");
1669 label1 = gtk_builder_get_object (builder, "label1");
1671 accessible = gtk_widget_get_accessible (GTK_WIDGET (label1));
1672 relation_set = atk_object_ref_relation_set (accessible);
1673 g_return_if_fail (atk_relation_set_get_n_relations (relation_set) == 1);
1674 relation = atk_relation_set_get_relation (relation_set, 0);
1675 g_return_if_fail (relation != NULL);
1676 g_return_if_fail (ATK_IS_RELATION (relation));
1677 g_return_if_fail (atk_relation_get_relation_type (relation) != ATK_RELATION_LABELLED_BY);
1678 g_object_unref (relation_set);
1680 g_object_get (G_OBJECT (accessible), "accessible-name", &name, NULL);
1681 g_return_if_fail (strcmp (name, "A Label") == 0);
1684 gtk_widget_destroy (GTK_WIDGET (window1));
1685 g_object_unref (builder);
1691 const gchar *buffer1 =
1693 " <object class=\"GtkWindow\" id=\"window1\">"
1694 " <property name=\"title\"></property>"
1697 const gchar *buffer2 =
1699 " <object class=\"GtkWindow\" id=\"window1\">"
1702 GtkBuilder *builder;
1706 builder = builder_new_from_string (buffer1, -1, NULL);
1707 window1 = gtk_builder_get_object (builder, "window1");
1708 g_object_get (window1, "title", &title, NULL);
1709 g_assert (strcmp (title, "") == 0);
1711 gtk_widget_destroy (GTK_WIDGET (window1));
1712 g_object_unref (builder);
1714 builder = builder_new_from_string (buffer2, -1, NULL);
1715 window1 = gtk_builder_get_object (builder, "window1");
1716 gtk_widget_destroy (GTK_WIDGET (window1));
1717 g_object_unref (builder);
1721 test_value_from_string (void)
1723 GValue value = G_VALUE_INIT;
1724 GError *error = NULL;
1725 GtkBuilder *builder;
1727 builder = gtk_builder_new ();
1729 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_STRING, "test", &value, &error));
1730 g_assert (G_VALUE_HOLDS_STRING (&value));
1731 g_assert (strcmp (g_value_get_string (&value), "test") == 0);
1732 g_value_unset (&value);
1734 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "true", &value, &error));
1735 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1736 g_assert (g_value_get_boolean (&value) == TRUE);
1737 g_value_unset (&value);
1739 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "false", &value, &error));
1740 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1741 g_assert (g_value_get_boolean (&value) == FALSE);
1742 g_value_unset (&value);
1744 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yes", &value, &error));
1745 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1746 g_assert (g_value_get_boolean (&value) == TRUE);
1747 g_value_unset (&value);
1749 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "no", &value, &error));
1750 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1751 g_assert (g_value_get_boolean (&value) == FALSE);
1752 g_value_unset (&value);
1754 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "0", &value, &error));
1755 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1756 g_assert (g_value_get_boolean (&value) == FALSE);
1757 g_value_unset (&value);
1759 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "1", &value, &error));
1760 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1761 g_assert (g_value_get_boolean (&value) == TRUE);
1762 g_value_unset (&value);
1764 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "tRuE", &value, &error));
1765 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1766 g_assert (g_value_get_boolean (&value) == TRUE);
1767 g_value_unset (&value);
1769 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "blaurgh", &value, &error) == FALSE);
1770 g_value_unset (&value);
1771 g_assert (g_error_matches (error,
1773 GTK_BUILDER_ERROR_INVALID_VALUE));
1774 g_error_free (error);
1777 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yess", &value, &error) == FALSE);
1778 g_value_unset (&value);
1779 g_assert (g_error_matches (error,
1781 GTK_BUILDER_ERROR_INVALID_VALUE));
1782 g_error_free (error);
1785 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "trueee", &value, &error) == FALSE);
1786 g_value_unset (&value);
1787 g_assert (g_error_matches (error,
1789 GTK_BUILDER_ERROR_INVALID_VALUE));
1790 g_error_free (error);
1793 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "", &value, &error) == FALSE);
1794 g_value_unset (&value);
1795 g_assert (g_error_matches (error,
1797 GTK_BUILDER_ERROR_INVALID_VALUE));
1798 g_error_free (error);
1801 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "12345", &value, &error));
1802 g_assert (G_VALUE_HOLDS_INT (&value));
1803 g_assert (g_value_get_int (&value) == 12345);
1804 g_value_unset (&value);
1806 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_LONG, "9912345", &value, &error));
1807 g_assert (G_VALUE_HOLDS_LONG (&value));
1808 g_assert (g_value_get_long (&value) == 9912345);
1809 g_value_unset (&value);
1811 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_UINT, "2345", &value, &error));
1812 g_assert (G_VALUE_HOLDS_UINT (&value));
1813 g_assert (g_value_get_uint (&value) == 2345);
1814 g_value_unset (&value);
1816 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "1.454", &value, &error));
1817 g_assert (G_VALUE_HOLDS_FLOAT (&value));
1818 g_assert (fabs (g_value_get_float (&value) - 1.454) < 0.00001);
1819 g_value_unset (&value);
1821 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "abc", &value, &error) == FALSE);
1822 g_value_unset (&value);
1823 g_assert (g_error_matches (error,
1825 GTK_BUILDER_ERROR_INVALID_VALUE));
1826 g_error_free (error);
1829 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "/-+,abc", &value, &error) == FALSE);
1830 g_value_unset (&value);
1831 g_assert (g_error_matches (error,
1833 GTK_BUILDER_ERROR_INVALID_VALUE));
1834 g_error_free (error);
1837 g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "toplevel", &value, &error) == TRUE);
1838 g_assert (G_VALUE_HOLDS_ENUM (&value));
1839 g_assert (g_value_get_enum (&value) == GTK_WINDOW_TOPLEVEL);
1840 g_value_unset (&value);
1842 g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "sliff", &value, &error) == FALSE);
1843 g_value_unset (&value);
1844 g_assert (g_error_matches (error,
1846 GTK_BUILDER_ERROR_INVALID_VALUE));
1847 g_error_free (error);
1850 g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "foobar", &value, &error) == FALSE);
1851 g_value_unset (&value);
1852 g_assert (g_error_matches (error,
1854 GTK_BUILDER_ERROR_INVALID_VALUE));
1855 g_error_free (error);
1858 g_object_unref (builder);
1861 static gboolean model_freed = FALSE;
1864 model_weakref (gpointer data,
1871 test_reference_counting (void)
1873 GtkBuilder *builder;
1874 const gchar buffer1[] =
1876 " <object class=\"GtkListStore\" id=\"liststore1\"/>"
1877 " <object class=\"GtkListStore\" id=\"liststore2\"/>"
1878 " <object class=\"GtkWindow\" id=\"window1\">"
1880 " <object class=\"GtkTreeView\" id=\"treeview1\">"
1881 " <property name=\"model\">liststore1</property>"
1886 const gchar buffer2[] =
1888 " <object class=\"GtkVBox\" id=\"vbox1\">"
1890 " <object class=\"GtkLabel\" id=\"label1\"/>"
1892 " <property name=\"pack-type\">start</property>"
1897 GObject *window, *treeview, *model;
1899 builder = builder_new_from_string (buffer1, -1, NULL);
1900 window = gtk_builder_get_object (builder, "window1");
1901 treeview = gtk_builder_get_object (builder, "treeview1");
1902 model = gtk_builder_get_object (builder, "liststore1");
1903 g_object_unref (builder);
1905 g_object_weak_ref (model, (GWeakNotify)model_weakref, NULL);
1907 g_assert (model_freed == FALSE);
1908 gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), NULL);
1909 g_assert (model_freed == TRUE);
1911 gtk_widget_destroy (GTK_WIDGET (window));
1913 builder = builder_new_from_string (buffer2, -1, NULL);
1914 g_object_unref (builder);
1918 test_icon_factory (void)
1920 GtkBuilder *builder;
1921 const gchar buffer1[] =
1923 " <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
1925 " <source stock-id=\"apple-red\" filename=\"apple-red.png\"/>"
1929 const gchar buffer2[] =
1931 " <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
1933 " <source stock-id=\"sliff\" direction=\"rtl\" state=\"active\""
1934 " size=\"menu\" filename=\"sloff.png\"/>"
1935 " <source stock-id=\"sliff\" direction=\"ltr\" state=\"selected\""
1936 " size=\"dnd\" filename=\"slurf.png\"/>"
1941 const gchar buffer3[] =
1943 " <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
1947 const gchar buffer4[] =
1949 " <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
1955 const gchar buffer5[] =
1957 " <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
1963 GError *error = NULL;
1966 GtkIconSet *icon_set;
1967 GtkIconSource *icon_source;
1970 builder = builder_new_from_string (buffer1, -1, NULL);
1971 factory = gtk_builder_get_object (builder, "iconfactory1");
1972 g_assert (factory != NULL);
1974 icon_set = gtk_icon_factory_lookup (GTK_ICON_FACTORY (factory), "apple-red");
1975 g_assert (icon_set != NULL);
1976 gtk_icon_factory_add_default (GTK_ICON_FACTORY (factory));
1977 image = gtk_image_new_from_stock ("apple-red", GTK_ICON_SIZE_BUTTON);
1978 g_assert (image != NULL);
1979 g_object_ref_sink (image);
1980 g_object_unref (image);
1982 g_object_unref (builder);
1984 builder = builder_new_from_string (buffer2, -1, NULL);
1985 factory = gtk_builder_get_object (builder, "iconfactory1");
1986 g_assert (factory != NULL);
1988 icon_set = gtk_icon_factory_lookup (GTK_ICON_FACTORY (factory), "sliff");
1989 g_assert (icon_set != NULL);
1990 g_assert (g_slist_length (icon_set->sources) == 2);
1992 icon_source = icon_set->sources->data;
1993 g_assert (gtk_icon_source_get_direction (icon_source) == GTK_TEXT_DIR_RTL);
1994 g_assert (gtk_icon_source_get_state (icon_source) == GTK_STATE_ACTIVE);
1995 g_assert (gtk_icon_source_get_size (icon_source) == GTK_ICON_SIZE_MENU);
1996 g_assert (g_str_has_suffix (gtk_icon_source_get_filename (icon_source), "sloff.png"));
1998 icon_source = icon_set->sources->next->data;
1999 g_assert (gtk_icon_source_get_direction (icon_source) == GTK_TEXT_DIR_LTR);
2000 g_assert (gtk_icon_source_get_state (icon_source) == GTK_STATE_SELECTED);
2001 g_assert (gtk_icon_source_get_size (icon_source) == GTK_ICON_SIZE_DND);
2002 g_assert (g_str_has_suffix (gtk_icon_source_get_filename (icon_source), "slurf.png"));
2004 g_object_unref (builder);
2008 gtk_builder_add_from_string (builder, buffer3, -1, &error);
2009 g_assert (g_error_matches (error,
2011 GTK_BUILDER_ERROR_INVALID_TAG));
2012 g_error_free (error);
2015 gtk_builder_add_from_string (builder, buffer4, -1, &error);
2016 g_assert (g_error_matches (error,
2018 GTK_BUILDER_ERROR_INVALID_TAG));
2019 g_error_free (error);
2022 gtk_builder_add_from_string (builder, buffer5, -1, &error);
2023 g_assert (g_error_matches (error,
2025 GTK_BUILDER_ERROR_INVALID_ATTRIBUTE));
2026 g_error_free (error);
2033 gboolean foreground;
2041 filter_pango_attrs (PangoAttribute *attr,
2044 FoundAttrs *found = (FoundAttrs *)data;
2046 if (attr->klass->type == PANGO_ATTR_WEIGHT)
2047 found->weight = TRUE;
2048 else if (attr->klass->type == PANGO_ATTR_FOREGROUND)
2049 found->foreground = TRUE;
2050 else if (attr->klass->type == PANGO_ATTR_UNDERLINE)
2051 found->underline = TRUE;
2052 /* Make sure optional start/end properties are working */
2053 else if (attr->klass->type == PANGO_ATTR_SIZE &&
2054 attr->start_index == 5 &&
2055 attr->end_index == 10)
2057 else if (attr->klass->type == PANGO_ATTR_FONT_DESC)
2058 found->font_desc = TRUE;
2059 else if (attr->klass->type == PANGO_ATTR_LANGUAGE)
2060 found->language = TRUE;
2066 test_pango_attributes (void)
2068 GtkBuilder *builder;
2069 FoundAttrs found = { 0, };
2070 const gchar buffer[] =
2072 " <object class=\"GtkLabel\" id=\"label1\">"
2074 " <attribute name=\"weight\" value=\"PANGO_WEIGHT_BOLD\"/>"
2075 " <attribute name=\"foreground\" value=\"DarkSlateGray\"/>"
2076 " <attribute name=\"underline\" value=\"True\"/>"
2077 " <attribute name=\"size\" value=\"4\" start=\"5\" end=\"10\"/>"
2078 " <attribute name=\"font-desc\" value=\"Sans Italic 22\"/>"
2079 " <attribute name=\"language\" value=\"pt_BR\"/>"
2083 const gchar err_buffer1[] =
2085 " <object class=\"GtkLabel\" id=\"label1\">"
2087 " <attribute name=\"weight\"/>"
2091 const gchar err_buffer2[] =
2093 " <object class=\"GtkLabel\" id=\"label1\">"
2095 " <attribute name=\"weight\" value=\"PANGO_WEIGHT_BOLD\" unrecognized=\"True\"/>"
2101 GError *error = NULL;
2102 PangoAttrList *attrs, *filtered;
2104 /* Test attributes are set */
2105 builder = builder_new_from_string (buffer, -1, NULL);
2106 label = gtk_builder_get_object (builder, "label1");
2107 g_assert (label != NULL);
2109 attrs = gtk_label_get_attributes (GTK_LABEL (label));
2110 g_assert (attrs != NULL);
2112 filtered = pango_attr_list_filter (attrs, filter_pango_attrs, &found);
2113 g_assert (filtered);
2114 pango_attr_list_unref (filtered);
2116 g_assert (found.weight);
2117 g_assert (found.foreground);
2118 g_assert (found.underline);
2119 g_assert (found.size);
2120 g_assert (found.language);
2121 g_assert (found.font_desc);
2123 g_object_unref (builder);
2125 /* Test errors are set */
2126 builder = gtk_builder_new ();
2127 gtk_builder_add_from_string (builder, err_buffer1, -1, &error);
2128 label = gtk_builder_get_object (builder, "label1");
2129 g_assert (g_error_matches (error,
2131 GTK_BUILDER_ERROR_MISSING_ATTRIBUTE));
2132 g_object_unref (builder);
2133 g_error_free (error);
2136 builder = gtk_builder_new ();
2137 gtk_builder_add_from_string (builder, err_buffer2, -1, &error);
2138 label = gtk_builder_get_object (builder, "label1");
2140 g_assert (g_error_matches (error,
2142 GTK_BUILDER_ERROR_INVALID_ATTRIBUTE));
2143 g_object_unref (builder);
2144 g_error_free (error);
2148 test_requires (void)
2150 GtkBuilder *builder;
2151 GError *error = NULL;
2153 const gchar buffer_fmt[] =
2155 " <requires lib=\"gtk+\" version=\"%d.%d\"/>"
2158 buffer = g_strdup_printf (buffer_fmt, GTK_MAJOR_VERSION, GTK_MINOR_VERSION + 1);
2159 builder = gtk_builder_new ();
2160 gtk_builder_add_from_string (builder, buffer, -1, &error);
2161 g_assert (g_error_matches (error,
2163 GTK_BUILDER_ERROR_VERSION_MISMATCH));
2164 g_object_unref (builder);
2165 g_error_free (error);
2170 test_add_objects (void)
2172 GtkBuilder *builder;
2176 GtkUIManager *manager;
2178 GObject *menu, *label;
2180 gchar *objects[2] = {"mainbox", NULL};
2181 gchar *objects2[3] = {"mainbox", "window2", NULL};
2182 gchar *objects3[3] = {"uimgr1", "menubar1"};
2183 gchar *objects4[2] = {"uimgr1", NULL};
2184 const gchar buffer[] =
2186 " <object class=\"GtkWindow\" id=\"window\">"
2188 " <object class=\"GtkVBox\" id=\"mainbox\">"
2189 " <property name=\"visible\">True</property>"
2191 " <object class=\"GtkLabel\" id=\"label1\">"
2192 " <property name=\"visible\">True</property>"
2193 " <property name=\"label\" translatable=\"no\">first label</property>"
2197 " <object class=\"GtkLabel\" id=\"label2\">"
2198 " <property name=\"visible\">True</property>"
2199 " <property name=\"label\" translatable=\"no\">second label</property>"
2202 " <property name=\"position\">1</property>"
2208 " <object class=\"GtkWindow\" id=\"window2\">"
2210 " <object class=\"GtkLabel\" id=\"label3\">"
2211 " <property name=\"label\" translatable=\"no\">second label</property>"
2216 const gchar buffer2[] =
2218 " <object class=\"GtkUIManager\" id=\"uimgr1\">"
2220 " <object class=\"GtkActionGroup\" id=\"ag1\">"
2222 " <object class=\"GtkAction\" id=\"file\">"
2223 " <property name=\"label\">_File</property>"
2225 " <accelerator key=\"n\" modifiers=\"GDK_CONTROL_MASK\"/>"
2230 " <menubar name=\"menubar1\">"
2231 " <menu action=\"file\">"
2236 " <object class=\"GtkWindow\" id=\"window1\">"
2238 " <object class=\"GtkMenuBar\" id=\"menubar1\" constructor=\"uimgr1\"/>"
2244 builder = gtk_builder_new ();
2245 ret = gtk_builder_add_objects_from_string (builder, buffer, -1, objects, &error);
2247 g_assert (error == NULL);
2248 obj = gtk_builder_get_object (builder, "window");
2249 g_assert (obj == NULL);
2250 obj = gtk_builder_get_object (builder, "window2");
2251 g_assert (obj == NULL);
2252 obj = gtk_builder_get_object (builder, "mainbox");
2253 g_assert (GTK_IS_WIDGET (obj));
2254 g_object_unref (builder);
2257 builder = gtk_builder_new ();
2258 ret = gtk_builder_add_objects_from_string (builder, buffer, -1, objects2, &error);
2260 g_assert (error == NULL);
2261 obj = gtk_builder_get_object (builder, "window");
2262 g_assert (obj == NULL);
2263 obj = gtk_builder_get_object (builder, "window2");
2264 g_assert (GTK_IS_WINDOW (obj));
2265 gtk_widget_destroy (GTK_WIDGET (obj));
2266 obj = gtk_builder_get_object (builder, "mainbox");
2267 g_assert (GTK_IS_WIDGET (obj));
2268 g_object_unref (builder);
2270 /* test cherry picking a ui manager and menubar that depends on it */
2272 builder = gtk_builder_new ();
2273 ret = gtk_builder_add_objects_from_string (builder, buffer2, -1, objects3, &error);
2275 obj = gtk_builder_get_object (builder, "uimgr1");
2276 g_assert (GTK_IS_UI_MANAGER (obj));
2277 obj = gtk_builder_get_object (builder, "file");
2278 g_assert (GTK_IS_ACTION (obj));
2279 obj = gtk_builder_get_object (builder, "menubar1");
2280 g_assert (GTK_IS_MENU_BAR (obj));
2281 menubar = GTK_WIDGET (obj);
2283 children = gtk_container_get_children (GTK_CONTAINER (menubar));
2284 menu = children->data;
2285 g_assert (menu != NULL);
2286 g_assert (GTK_IS_MENU_ITEM (menu));
2287 g_assert (strcmp (gtk_widget_get_name (GTK_WIDGET (menu)), "file") == 0);
2288 g_list_free (children);
2290 label = G_OBJECT (gtk_bin_get_child (GTK_BIN (menu)));
2291 g_assert (label != NULL);
2292 g_assert (GTK_IS_LABEL (label));
2293 g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0);
2295 g_object_unref (builder);
2297 /* test cherry picking just the ui manager */
2299 builder = gtk_builder_new ();
2300 ret = gtk_builder_add_objects_from_string (builder, buffer2, -1, objects4, &error);
2302 obj = gtk_builder_get_object (builder, "uimgr1");
2303 g_assert (GTK_IS_UI_MANAGER (obj));
2304 manager = GTK_UI_MANAGER (obj);
2305 obj = gtk_builder_get_object (builder, "file");
2306 g_assert (GTK_IS_ACTION (obj));
2307 menubar = gtk_ui_manager_get_widget (manager, "/menubar1");
2308 g_assert (GTK_IS_MENU_BAR (menubar));
2310 children = gtk_container_get_children (GTK_CONTAINER (menubar));
2311 menu = children->data;
2312 g_assert (menu != NULL);
2313 g_assert (GTK_IS_MENU_ITEM (menu));
2314 g_assert (strcmp (gtk_widget_get_name (GTK_WIDGET (menu)), "file") == 0);
2315 g_list_free (children);
2317 label = G_OBJECT (gtk_bin_get_child (GTK_BIN (menu)));
2318 g_assert (label != NULL);
2319 g_assert (GTK_IS_LABEL (label));
2320 g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0);
2322 g_object_unref (builder);
2326 get_parent_menubar (GtkWidget *menuitem)
2328 GtkMenuShell *menu_shell;
2329 GtkWidget *attach = NULL;
2331 menu_shell = GTK_MENU_SHELL (gtk_widget_get_parent (menuitem));
2333 g_assert (GTK_IS_MENU_SHELL (menu_shell));
2335 while (menu_shell && !GTK_IS_MENU_BAR (menu_shell))
2337 if (GTK_IS_MENU (menu_shell) &&
2338 (attach = gtk_menu_get_attach_widget (GTK_MENU (menu_shell))) != NULL)
2339 menu_shell = GTK_MENU_SHELL (gtk_widget_get_parent (attach));
2344 return menu_shell ? GTK_WIDGET (menu_shell) : NULL;
2350 const gchar *buffer =
2352 " <object class=\"GtkWindow\" id=\"window1\">"
2354 " <group name=\"accelgroup1\"/>"
2357 " <object class=\"GtkVBox\" id=\"vbox1\">"
2358 " <property name=\"visible\">True</property>"
2359 " <property name=\"orientation\">vertical</property>"
2361 " <object class=\"GtkMenuBar\" id=\"menubar1\">"
2362 " <property name=\"visible\">True</property>"
2364 " <object class=\"GtkMenuItem\" id=\"menuitem1\">"
2365 " <property name=\"visible\">True</property>"
2366 " <property name=\"label\" translatable=\"yes\">_File</property>"
2367 " <property name=\"use_underline\">True</property>"
2368 " <child type=\"submenu\">"
2369 " <object class=\"GtkMenu\" id=\"menu1\">"
2370 " <property name=\"visible\">True</property>"
2372 " <object class=\"GtkImageMenuItem\" id=\"imagemenuitem1\">"
2373 " <property name=\"label\">gtk-new</property>"
2374 " <property name=\"visible\">True</property>"
2375 " <property name=\"use_stock\">True</property>"
2376 " <property name=\"accel_group\">accelgroup1</property>"
2388 "<object class=\"GtkAccelGroup\" id=\"accelgroup1\"/>"
2391 const gchar *buffer1 =
2393 " <object class=\"GtkWindow\" id=\"window1\">"
2395 " <group name=\"accelgroup1\"/>"
2398 " <object class=\"GtkVBox\" id=\"vbox1\">"
2399 " <property name=\"visible\">True</property>"
2400 " <property name=\"orientation\">vertical</property>"
2402 " <object class=\"GtkMenuBar\" id=\"menubar1\">"
2403 " <property name=\"visible\">True</property>"
2405 " <object class=\"GtkImageMenuItem\" id=\"imagemenuitem1\">"
2406 " <property name=\"visible\">True</property>"
2408 " <object class=\"GtkLabel\" id=\"custom1\">"
2409 " <property name=\"visible\">True</property>"
2410 " <property name=\"label\">a label</property>"
2420 "<object class=\"GtkAccelGroup\" id=\"accelgroup1\"/>"
2422 GtkBuilder *builder;
2424 GtkWidget *window, *item;
2425 GtkAccelGroup *accel_group;
2426 GtkWidget *item_accel_label, *sample_accel_label, *sample_menu_item, *custom;
2428 /* Check that the item has the correct accel label string set
2430 builder = builder_new_from_string (buffer, -1, NULL);
2431 window = (GtkWidget *)gtk_builder_get_object (builder, "window1");
2432 item = (GtkWidget *)gtk_builder_get_object (builder, "imagemenuitem1");
2433 accel_group = (GtkAccelGroup *)gtk_builder_get_object (builder, "accelgroup1");
2435 gtk_widget_show_all (window);
2437 sample_menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
2439 child = gtk_bin_get_child (GTK_BIN (sample_menu_item));
2441 g_assert (GTK_IS_ACCEL_LABEL (child));
2442 sample_accel_label = child;
2443 gtk_widget_show (sample_accel_label);
2445 child = gtk_bin_get_child (GTK_BIN (item));
2447 g_assert (GTK_IS_ACCEL_LABEL (child));
2448 item_accel_label = child;
2450 gtk_accel_label_refetch (GTK_ACCEL_LABEL (sample_accel_label));
2451 gtk_accel_label_refetch (GTK_ACCEL_LABEL (item_accel_label));
2453 g_assert (gtk_label_get_text (GTK_LABEL (sample_accel_label)) != NULL);
2454 g_assert (gtk_label_get_text (GTK_LABEL (item_accel_label)) != NULL);
2455 g_assert (strcmp (gtk_label_get_text (GTK_LABEL (item_accel_label)),
2456 gtk_label_get_text (GTK_LABEL (sample_accel_label))) == 0);
2458 /* Check the menu hierarchy worked here */
2459 g_assert (get_parent_menubar (item));
2461 gtk_widget_destroy (GTK_WIDGET (window));
2462 gtk_widget_destroy (sample_menu_item);
2463 g_object_unref (builder);
2466 /* Check that we can add alien children to menu items via normal
2467 * GtkContainer apis.
2469 builder = builder_new_from_string (buffer1, -1, NULL);
2470 window = (GtkWidget *)gtk_builder_get_object (builder, "window1");
2471 item = (GtkWidget *)gtk_builder_get_object (builder, "imagemenuitem1");
2472 custom = (GtkWidget *)gtk_builder_get_object (builder, "custom1");
2474 g_assert (gtk_widget_get_parent (custom) == item);
2476 gtk_widget_destroy (GTK_WIDGET (window));
2477 g_object_unref (builder);
2483 test_file (const gchar *filename)
2485 GtkBuilder *builder;
2486 GError *error = NULL;
2487 GSList *l, *objects;
2489 builder = gtk_builder_new ();
2491 if (!gtk_builder_add_from_file (builder, filename, &error))
2493 g_error ("%s", error->message);
2494 g_error_free (error);
2498 objects = gtk_builder_get_objects (builder);
2499 for (l = objects; l; l = l->next)
2501 GObject *obj = (GObject*)l->data;
2503 if (GTK_IS_DIALOG (obj))
2505 g_print ("Running dialog %s.\n",
2506 gtk_widget_get_name (GTK_WIDGET (obj)));
2507 gtk_dialog_run (GTK_DIALOG (obj));
2509 else if (GTK_IS_WINDOW (obj))
2511 g_signal_connect (obj, "destroy", G_CALLBACK (gtk_main_quit), NULL);
2512 g_print ("Showing %s.\n",
2513 gtk_widget_get_name (GTK_WIDGET (obj)));
2514 gtk_widget_show_all (GTK_WIDGET (obj));
2520 g_object_unref (builder);
2525 test_message_area (void)
2527 GtkBuilder *builder;
2528 GObject *obj, *obj1;
2529 const gchar buffer[] =
2531 " <object class=\"GtkInfoBar\" id=\"infobar1\">"
2532 " <child internal-child=\"content_area\">"
2533 " <object class=\"GtkHBox\" id=\"contentarea1\">"
2535 " <object class=\"GtkLabel\" id=\"content\">"
2536 " <property name=\"label\" translatable=\"yes\">Message</property>"
2539 " <property name='expand'>False</property>"
2544 " <child internal-child=\"action_area\">"
2545 " <object class=\"GtkVButtonBox\" id=\"actionarea1\">"
2547 " <object class=\"GtkButton\" id=\"button_ok\">"
2548 " <property name=\"label\">gtk-ok</property>"
2549 " <property name=\"use-stock\">yes</property>"
2555 " <action-widget response=\"1\">button_ok</action-widget>"
2556 " </action-widgets>"
2560 builder = builder_new_from_string (buffer, -1, NULL);
2561 obj = gtk_builder_get_object (builder, "infobar1");
2562 g_assert (GTK_IS_INFO_BAR (obj));
2563 obj1 = gtk_builder_get_object (builder, "content");
2564 g_assert (GTK_IS_LABEL (obj1));
2565 g_assert (gtk_widget_get_parent (gtk_widget_get_parent (GTK_WIDGET (obj1))) == GTK_WIDGET (obj));
2567 obj1 = gtk_builder_get_object (builder, "button_ok");
2568 g_assert (GTK_IS_BUTTON (obj1));
2569 g_assert (gtk_widget_get_parent (gtk_widget_get_parent (GTK_WIDGET (obj1))) == GTK_WIDGET (obj));
2571 g_object_unref (builder);
2577 GtkBuilder *builder;
2578 GObject *obj, *obj1;
2579 const gchar buffer[] =
2581 " <object class=\"GtkWindow\" id=\"window\">"
2583 " <menu id='edit-menu'>"
2586 " <attribute name='label'>Undo</attribute>"
2587 " <attribute name='action'>undo</attribute>"
2590 " <attribute name='label'>Redo</attribute>"
2591 " <attribute name='action'>redo</attribute>"
2594 " <section></section>"
2596 " <attribute name='label'>Copy & Paste</attribute>"
2598 " <attribute name='label'>Cut</attribute>"
2599 " <attribute name='action'>cut</attribute>"
2602 " <attribute name='label'>Copy</attribute>"
2603 " <attribute name='action'>copy</attribute>"
2606 " <attribute name='label'>Paste</attribute>"
2607 " <attribute name='action'>paste</attribute>"
2610 " <item><link name='section' id='blargh'>"
2612 " <attribute name='label'>Bold</attribute>"
2613 " <attribute name='action'>bold</attribute>"
2616 " <attribute name='label'>Language</attribute>"
2618 " <attribute name='label'>Latin</attribute>"
2619 " <attribute name='action'>lang</attribute>"
2620 " <attribute name='target'>'latin'</attribute>"
2623 " <attribute name='label'>Greek</attribute>"
2624 " <attribute name='action'>lang</attribute>"
2625 " <attribute name='target'>'greek'</attribute>"
2628 " <attribute name='label'>Urdu</attribute>"
2629 " <attribute name='action'>lang</attribute>"
2630 " <attribute name='target'>'urdu'</attribute>"
2637 builder = builder_new_from_string (buffer, -1, NULL);
2638 obj = gtk_builder_get_object (builder, "window");
2639 g_assert (GTK_IS_WINDOW (obj));
2640 obj1 = gtk_builder_get_object (builder, "edit-menu");
2641 g_assert (G_IS_MENU_MODEL (obj1));
2642 obj1 = gtk_builder_get_object (builder, "blargh");
2643 g_assert (G_IS_MENU_MODEL (obj1));
2644 g_object_unref (builder);
2648 test_level_bar (void)
2650 GtkBuilder *builder;
2651 GError *error = NULL;
2652 GObject *obj, *obj1;
2653 const gchar buffer1[] =
2655 " <object class=\"GtkWindow\" id=\"window\">"
2657 " <object class=\"GtkLevelBar\" id=\"levelbar\">"
2658 " <property name=\"value\">4.70</property>"
2659 " <property name=\"min-value\">2</property>"
2660 " <property name=\"max-value\">5</property>"
2662 " <offset name=\"low\" value=\"2.25\"/>"
2663 " <offset name=\"custom\" value=\"3\"/>"
2664 " <offset name=\"high\" value=\"3\"/>"
2670 const gchar buffer2[] =
2672 " <object class=\"GtkLevelBar\" id=\"levelbar\">"
2674 " <offset name=\"low\" bogus_attr=\"foo\"/>"
2678 const gchar buffer3[] =
2680 " <object class=\"GtkLevelBar\" id=\"levelbar\">"
2682 " <offset name=\"low\" value=\"1\"/>"
2689 builder = gtk_builder_new ();
2690 gtk_builder_add_from_string (builder, buffer1, -1, &error);
2691 g_assert (error == NULL);
2693 obj = gtk_builder_get_object (builder, "window");
2694 g_assert (GTK_IS_WINDOW (obj));
2695 obj1 = gtk_builder_get_object (builder, "levelbar");
2696 g_assert (GTK_IS_LEVEL_BAR (obj1));
2697 g_object_unref (builder);
2700 builder = gtk_builder_new ();
2701 gtk_builder_add_from_string (builder, buffer2, -1, &error);
2702 g_assert (g_error_matches (error,
2704 GTK_BUILDER_ERROR_INVALID_ATTRIBUTE));
2705 g_error_free (error);
2706 g_object_unref (builder);
2709 builder = gtk_builder_new ();
2710 gtk_builder_add_from_string (builder, buffer3, -1, &error);
2711 g_assert (g_error_matches (error,
2713 GTK_BUILDER_ERROR_UNHANDLED_TAG));
2714 g_error_free (error);
2715 g_object_unref (builder);
2718 static GObject *external_object = NULL, *external_object_swapped = NULL;
2721 on_button_clicked (GtkButton *button, GObject *data)
2723 external_object = data;
2727 on_button_clicked_swapped (GObject *data, GtkButton *button)
2729 external_object_swapped = data;
2733 test_expose_object (void)
2735 GtkBuilder *builder;
2736 GError *error = NULL;
2739 const gchar buffer[] =
2741 " <object class=\"GtkButton\" id=\"button\">"
2742 " <property name=\"image\">external_image</property>"
2743 " <signal name=\"clicked\" handler=\"on_button_clicked\" object=\"builder\" swapped=\"no\"/>"
2744 " <signal name=\"clicked\" handler=\"on_button_clicked_swapped\" object=\"builder\"/>"
2748 image = gtk_image_new ();
2749 builder = gtk_builder_new ();
2750 gtk_builder_expose_object (builder, "external_image", G_OBJECT (image));
2751 gtk_builder_expose_object (builder, "builder", G_OBJECT (builder));
2752 gtk_builder_add_from_string (builder, buffer, -1, &error);
2753 g_assert (error == NULL);
2755 obj = gtk_builder_get_object (builder, "button");
2756 g_assert (GTK_IS_BUTTON (obj));
2758 g_assert (gtk_button_get_image (GTK_BUTTON (obj)) == image);
2760 /* Connect signals and fake clicked event */
2761 gtk_builder_connect_signals (builder, NULL);
2762 gtk_button_clicked (GTK_BUTTON (obj));
2764 g_assert (external_object == G_OBJECT (builder));
2765 g_assert (external_object_swapped == G_OBJECT (builder));
2769 main (int argc, char **argv)
2771 /* initialize test program */
2772 gtk_test_init (&argc, &argv);
2776 test_file (argv[1]);
2780 g_test_add_func ("/Builder/Parser", test_parser);
2781 g_test_add_func ("/Builder/Types", test_types);
2782 g_test_add_func ("/Builder/Construct-Only Properties", test_construct_only_property);
2783 g_test_add_func ("/Builder/Children", test_children);
2784 g_test_add_func ("/Builder/Child Properties", test_child_properties);
2785 g_test_add_func ("/Builder/Object Properties", test_object_properties);
2786 g_test_add_func ("/Builder/Notebook", test_notebook);
2787 g_test_add_func ("/Builder/Domain", test_domain);
2788 g_test_add_func ("/Builder/Signal Autoconnect", test_connect_signals);
2789 g_test_add_func ("/Builder/UIManager Simple", test_uimanager_simple);
2790 g_test_add_func ("/Builder/Spin Button", test_spin_button);
2791 g_test_add_func ("/Builder/SizeGroup", test_sizegroup);
2792 g_test_add_func ("/Builder/ListStore", test_list_store);
2793 g_test_add_func ("/Builder/TreeStore", test_tree_store);
2794 g_test_add_func ("/Builder/TreeView Column", test_treeview_column);
2795 g_test_add_func ("/Builder/IconView", test_icon_view);
2796 g_test_add_func ("/Builder/ComboBox", test_combo_box);
2798 g_test_add_func ("/Builder/ComboBox Entry", test_combo_box_entry);
2800 g_test_add_func ("/Builder/CellView", test_cell_view);
2801 g_test_add_func ("/Builder/Dialog", test_dialog);
2802 g_test_add_func ("/Builder/Accelerators", test_accelerators);
2803 g_test_add_func ("/Builder/Widget", test_widget);
2804 g_test_add_func ("/Builder/Value From String", test_value_from_string);
2805 g_test_add_func ("/Builder/Reference Counting", test_reference_counting);
2806 g_test_add_func ("/Builder/Window", test_window);
2807 g_test_add_func ("/Builder/IconFactory", test_icon_factory);
2808 g_test_add_func ("/Builder/PangoAttributes", test_pango_attributes);
2809 g_test_add_func ("/Builder/Requires", test_requires);
2810 g_test_add_func ("/Builder/AddObjects", test_add_objects);
2811 g_test_add_func ("/Builder/Menus", test_menus);
2812 g_test_add_func ("/Builder/MessageArea", test_message_area);
2813 g_test_add_func ("/Builder/MessageDialog", test_message_dialog);
2814 g_test_add_func ("/Builder/GMenu", test_gmenu);
2815 g_test_add_func ("/Builder/LevelBar", test_level_bar);
2816 g_test_add_func ("/Builder/Expose Object", test_expose_object);
2818 return g_test_run();