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, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
28 #include <gdk/gdkkeysyms.h>
30 /* Copied from gtkiconfactory.c; keep in sync! */
42 builder_new_from_string (const gchar *buffer,
49 builder = gtk_builder_new ();
51 gtk_builder_set_translation_domain (builder, domain);
52 gtk_builder_add_from_string (builder, buffer, length, &error);
55 g_print ("ERROR: %s", error->message);
68 builder = gtk_builder_new ();
71 gtk_builder_add_from_string (builder, "<xxx/>", -1, &error);
72 g_assert (g_error_matches (error,
74 GTK_BUILDER_ERROR_UNHANDLED_TAG));
78 gtk_builder_add_from_string (builder, "<interface invalid=\"X\"/>", -1, &error);
79 g_assert (g_error_matches (error,
81 GTK_BUILDER_ERROR_INVALID_ATTRIBUTE));
85 gtk_builder_add_from_string (builder, "<interface><child/></interface>", -1, &error);
86 g_assert (g_error_matches (error,
88 GTK_BUILDER_ERROR_INVALID_TAG));
92 gtk_builder_add_from_string (builder, "<interface><object class=\"GtkVBox\" id=\"a\"><object class=\"GtkHBox\" id=\"b\"/></object></interface>", -1, &error);
93 g_assert (g_error_matches (error,
95 GTK_BUILDER_ERROR_INVALID_TAG));
99 gtk_builder_add_from_string (builder, "<interface><object class=\"Unknown\" id=\"a\"></object></interface>", -1, &error);
100 g_assert (g_error_matches (error,
102 GTK_BUILDER_ERROR_INVALID_VALUE));
103 g_error_free (error);
106 gtk_builder_add_from_string (builder, "<interface><object class=\"GtkWidget\" id=\"a\" constructor=\"none\"></object></interface>", -1, &error);
107 g_assert (g_error_matches (error,
109 GTK_BUILDER_ERROR_INVALID_VALUE));
110 g_error_free (error);
113 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);
114 g_assert (g_error_matches (error,
116 GTK_BUILDER_ERROR_INVALID_VALUE));
117 g_error_free (error);
120 gtk_builder_add_from_string (builder, "<interface><object class=\"GtkButton\" id=\"a\"></object><object class=\"GtkButton\" id=\"a\"/></object></interface>", -1, &error);
121 g_assert (g_error_matches (error,
123 GTK_BUILDER_ERROR_DUPLICATE_ID));
124 g_error_free (error);
126 g_object_unref (builder);
129 static int normal = 0;
130 static int after = 0;
131 static int object = 0;
132 static int object_after = 0;
134 void /* exported for GtkBuilder */
135 signal_normal (GtkWindow *window, GParamSpec spec)
137 g_assert (GTK_IS_WINDOW (window));
138 g_assert (normal == 0);
139 g_assert (after == 0);
144 void /* exported for GtkBuilder */
145 signal_after (GtkWindow *window, GParamSpec spec)
147 g_assert (GTK_IS_WINDOW (window));
148 g_assert (normal == 1);
149 g_assert (after == 0);
154 void /* exported for GtkBuilder */
155 signal_object (GtkButton *button, GParamSpec spec)
157 g_assert (GTK_IS_BUTTON (button));
158 g_assert (object == 0);
159 g_assert (object_after == 0);
164 void /* exported for GtkBuilder */
165 signal_object_after (GtkButton *button, GParamSpec spec)
167 g_assert (GTK_IS_BUTTON (button));
168 g_assert (object == 1);
169 g_assert (object_after == 0);
174 void /* exported for GtkBuilder */
175 signal_first (GtkButton *button, GParamSpec spec)
177 g_assert (normal == 0);
181 void /* exported for GtkBuilder */
182 signal_second (GtkButton *button, GParamSpec spec)
184 g_assert (normal == 10);
188 void /* exported for GtkBuilder */
189 signal_extra (GtkButton *button, GParamSpec spec)
191 g_assert (normal == 20);
195 void /* exported for GtkBuilder */
196 signal_extra2 (GtkButton *button, GParamSpec spec)
198 g_assert (normal == 30);
203 test_connect_signals (void)
207 const gchar buffer[] =
209 " <object class=\"GtkButton\" id=\"button\"/>"
210 " <object class=\"GtkWindow\" id=\"window1\">"
211 " <signal name=\"notify::title\" handler=\"signal_normal\"/>"
212 " <signal name=\"notify::title\" handler=\"signal_after\" after=\"yes\"/>"
213 " <signal name=\"notify::title\" handler=\"signal_object\""
214 " object=\"button\"/>"
215 " <signal name=\"notify::title\" handler=\"signal_object_after\""
216 " object=\"button\" after=\"yes\"/>"
219 const gchar buffer_order[] =
221 " <object class=\"GtkWindow\" id=\"window1\">"
222 " <signal name=\"notify::title\" handler=\"signal_first\"/>"
223 " <signal name=\"notify::title\" handler=\"signal_second\"/>"
226 const gchar buffer_extra[] =
228 " <object class=\"GtkWindow\" id=\"window2\">"
229 " <signal name=\"notify::title\" handler=\"signal_extra\"/>"
232 const gchar buffer_extra2[] =
234 " <object class=\"GtkWindow\" id=\"window3\">"
235 " <signal name=\"notify::title\" handler=\"signal_extra2\"/>"
238 const gchar buffer_after_child[] =
240 " <object class=\"GtkWindow\" id=\"window1\">"
242 " <object class=\"GtkButton\" id=\"button1\"/>"
244 " <signal name=\"notify::title\" handler=\"signal_normal\"/>"
248 builder = builder_new_from_string (buffer, -1, NULL);
249 gtk_builder_connect_signals (builder, NULL);
251 window = gtk_builder_get_object (builder, "window1");
252 gtk_window_set_title (GTK_WINDOW (window), "test");
254 g_assert_cmpint (normal, ==, 1);
255 g_assert_cmpint (after, ==, 1);
256 g_assert_cmpint (object, ==, 1);
257 g_assert_cmpint (object_after, ==, 1);
259 gtk_widget_destroy (GTK_WIDGET (window));
260 g_object_unref (builder);
262 builder = builder_new_from_string (buffer_order, -1, NULL);
263 gtk_builder_connect_signals (builder, NULL);
264 window = gtk_builder_get_object (builder, "window1");
266 gtk_window_set_title (GTK_WINDOW (window), "test");
267 g_assert (normal == 20);
269 gtk_widget_destroy (GTK_WIDGET (window));
271 gtk_builder_add_from_string (builder, buffer_extra,
272 strlen (buffer_extra), NULL);
273 gtk_builder_add_from_string (builder, buffer_extra2,
274 strlen (buffer_extra2), NULL);
275 gtk_builder_connect_signals (builder, NULL);
276 window = gtk_builder_get_object (builder, "window2");
277 gtk_window_set_title (GTK_WINDOW (window), "test");
278 g_assert (normal == 30);
280 gtk_widget_destroy (GTK_WIDGET (window));
281 window = gtk_builder_get_object (builder, "window3");
282 gtk_window_set_title (GTK_WINDOW (window), "test");
283 g_assert (normal == 40);
284 gtk_widget_destroy (GTK_WIDGET (window));
286 g_object_unref (builder);
288 /* new test, reset globals */
292 builder = builder_new_from_string (buffer_after_child, -1, NULL);
293 window = gtk_builder_get_object (builder, "window1");
294 gtk_builder_connect_signals (builder, NULL);
295 gtk_window_set_title (GTK_WINDOW (window), "test");
297 g_assert (normal == 1);
298 gtk_widget_destroy (GTK_WIDGET (window));
299 g_object_unref (builder);
303 test_uimanager_simple (void)
306 GObject *window, *uimgr, *menubar;
307 GObject *menu, *label;
309 const gchar buffer[] =
311 " <object class=\"GtkUIManager\" id=\"uimgr1\"/>"
314 const gchar buffer2[] =
316 " <object class=\"GtkUIManager\" id=\"uimgr1\">"
318 " <object class=\"GtkActionGroup\" id=\"ag1\">"
320 " <object class=\"GtkAction\" id=\"file\">"
321 " <property name=\"label\">_File</property>"
323 " <accelerator key=\"n\" modifiers=\"GDK_CONTROL_MASK\"/>"
328 " <menubar name=\"menubar1\">"
329 " <menu action=\"file\">"
334 " <object class=\"GtkWindow\" id=\"window1\">"
336 " <object class=\"GtkMenuBar\" id=\"menubar1\" constructor=\"uimgr1\"/>"
341 builder = builder_new_from_string (buffer, -1, NULL);
343 uimgr = gtk_builder_get_object (builder, "uimgr1");
344 g_assert (GTK_IS_UI_MANAGER (uimgr));
345 g_object_unref (builder);
347 builder = builder_new_from_string (buffer2, -1, NULL);
349 menubar = gtk_builder_get_object (builder, "menubar1");
350 g_assert (GTK_IS_MENU_BAR (menubar));
352 children = gtk_container_get_children (GTK_CONTAINER (menubar));
353 menu = children->data;
354 g_assert (GTK_IS_MENU_ITEM (menu));
355 g_assert (strcmp (GTK_WIDGET (menu)->name, "file") == 0);
356 g_list_free (children);
358 label = G_OBJECT (GTK_BIN (menu)->child);
359 g_assert (GTK_IS_LABEL (label));
360 g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0);
362 window = gtk_builder_get_object (builder, "window1");
363 gtk_widget_destroy (GTK_WIDGET (window));
364 g_object_unref (builder);
371 const gchar buffer1[] = "<interface/>";
372 const gchar buffer2[] = "<interface domain=\"domain\"/>";
375 builder = builder_new_from_string (buffer1, -1, NULL);
376 domain = gtk_builder_get_translation_domain (builder);
377 g_assert (domain == NULL);
378 g_object_unref (builder);
380 builder = builder_new_from_string (buffer1, -1, "domain-1");
381 domain = gtk_builder_get_translation_domain (builder);
383 g_assert (strcmp (domain, "domain-1") == 0);
384 g_object_unref (builder);
386 builder = builder_new_from_string (buffer2, -1, NULL);
387 domain = gtk_builder_get_translation_domain (builder);
388 g_assert (domain == NULL);
389 g_object_unref (builder);
394 test_translation (void)
397 const gchar buffer[] =
399 " <object class=\"GtkWindow\" id=\"window1\">"
401 " <object class=\"GtkLabel\" id=\"label\">"
402 " <property name=\"label\" translatable=\"yes\">File</property>"
407 GtkLabel *window, *label;
409 setlocale (LC_ALL, "sv_SE");
410 textdomain ("builder");
411 bindtextdomain ("builder", "tests");
413 builder = builder_new_from_string (buffer, -1, NULL);
414 label = GTK_LABEL (gtk_builder_get_object (builder, "label"));
415 g_assert (strcmp (gtk_label_get_text (label), "Arkiv") == 0);
417 window = gtk_builder_get_object (builder, "window1");
418 gtk_widget_destroy (GTK_WIDGET (window));
419 g_object_unref (builder);
424 test_sizegroup (void)
426 GtkBuilder * builder;
427 const gchar buffer1[] =
428 "<interface domain=\"test\">"
429 " <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
430 " <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
432 " <widget name=\"radio1\"/>"
433 " <widget name=\"radio2\"/>"
436 " <object class=\"GtkWindow\" id=\"window1\">"
438 " <object class=\"GtkVBox\" id=\"vbox1\">"
440 " <object class=\"GtkRadioButton\" id=\"radio1\"/>"
443 " <object class=\"GtkRadioButton\" id=\"radio2\"/>"
449 const gchar buffer2[] =
450 "<interface domain=\"test\">"
451 " <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
452 " <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
457 const gchar buffer3[] =
458 "<interface domain=\"test\">"
459 " <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
460 " <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
462 " <widget name=\"radio1\"/>"
463 " <widget name=\"radio2\"/>"
466 " <object class=\"GtkSizeGroup\" id=\"sizegroup2\">"
467 " <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
469 " <widget name=\"radio1\"/>"
470 " <widget name=\"radio2\"/>"
473 " <object class=\"GtkWindow\" id=\"window1\">"
475 " <object class=\"GtkVBox\" id=\"vbox1\">"
477 " <object class=\"GtkRadioButton\" id=\"radio1\"/>"
480 " <object class=\"GtkRadioButton\" id=\"radio2\"/>"
489 builder = builder_new_from_string (buffer1, -1, NULL);
490 sizegroup = gtk_builder_get_object (builder, "sizegroup1");
491 widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
492 g_assert (g_slist_length (widgets) == 2);
493 g_slist_free (widgets);
494 g_object_unref (builder);
496 builder = builder_new_from_string (buffer2, -1, NULL);
497 sizegroup = gtk_builder_get_object (builder, "sizegroup1");
498 widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
499 g_assert (g_slist_length (widgets) == 0);
500 g_slist_free (widgets);
501 g_object_unref (builder);
503 builder = builder_new_from_string (buffer3, -1, NULL);
504 sizegroup = gtk_builder_get_object (builder, "sizegroup1");
505 widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
506 g_assert (g_slist_length (widgets) == 2);
507 g_slist_free (widgets);
508 sizegroup = gtk_builder_get_object (builder, "sizegroup2");
509 widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
510 g_assert (g_slist_length (widgets) == 2);
511 g_slist_free (widgets);
516 window = gtk_builder_get_object (builder, "window1");
517 gtk_widget_destroy (GTK_WIDGET (window));
520 g_object_unref (builder);
524 test_list_store (void)
526 const gchar buffer1[] =
528 " <object class=\"GtkListStore\" id=\"liststore1\">"
530 " <column type=\"gchararray\"/>"
531 " <column type=\"guint\"/>"
535 const char buffer2[] =
537 " <object class=\"GtkListStore\" id=\"liststore1\">"
539 " <column type=\"gchararray\"/>"
540 " <column type=\"gchararray\"/>"
541 " <column type=\"gint\"/>"
545 " <col id=\"0\" translatable=\"yes\">John</col>"
546 " <col id=\"1\" context=\"foo\">Doe</col>"
547 " <col id=\"2\" comment=\"foobar\">25</col>"
550 " <col id=\"0\">Johan</col>"
551 " <col id=\"1\">Dole</col>"
552 " <col id=\"2\">50</col>"
557 const char buffer3[] =
559 " <object class=\"GtkListStore\" id=\"liststore1\">"
561 " <column type=\"gchararray\"/>"
562 " <column type=\"gchararray\"/>"
563 " <column type=\"gint\"/>"
567 " <col id=\"1\" context=\"foo\">Doe</col>"
568 " <col id=\"0\" translatable=\"yes\">John</col>"
569 " <col id=\"2\" comment=\"foobar\">25</col>"
572 " <col id=\"2\">50</col>"
573 " <col id=\"1\">Dole</col>"
574 " <col id=\"0\">Johan</col>"
577 " <col id=\"2\">19</col>"
585 gchar *surname, *lastname;
588 builder = builder_new_from_string (buffer1, -1, NULL);
589 store = gtk_builder_get_object (builder, "liststore1");
590 g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 2);
591 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
592 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_UINT);
593 g_object_unref (builder);
595 builder = builder_new_from_string (buffer2, -1, NULL);
596 store = gtk_builder_get_object (builder, "liststore1");
597 g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 3);
598 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
599 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_STRING);
600 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2) == G_TYPE_INT);
602 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter) == TRUE);
603 gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
608 g_assert (surname != NULL);
609 g_assert (strcmp (surname, "John") == 0);
611 g_assert (lastname != NULL);
612 g_assert (strcmp (lastname, "Doe") == 0);
614 g_assert (age == 25);
615 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE);
617 gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
622 g_assert (surname != NULL);
623 g_assert (strcmp (surname, "Johan") == 0);
625 g_assert (lastname != NULL);
626 g_assert (strcmp (lastname, "Dole") == 0);
628 g_assert (age == 50);
629 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == FALSE);
631 g_object_unref (builder);
633 builder = builder_new_from_string (buffer3, -1, NULL);
634 store = gtk_builder_get_object (builder, "liststore1");
635 g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 3);
636 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
637 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_STRING);
638 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2) == G_TYPE_INT);
640 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter) == TRUE);
641 gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
646 g_assert (surname != NULL);
647 g_assert (strcmp (surname, "John") == 0);
649 g_assert (lastname != NULL);
650 g_assert (strcmp (lastname, "Doe") == 0);
652 g_assert (age == 25);
653 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE);
655 gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
660 g_assert (surname != NULL);
661 g_assert (strcmp (surname, "Johan") == 0);
663 g_assert (lastname != NULL);
664 g_assert (strcmp (lastname, "Dole") == 0);
666 g_assert (age == 50);
667 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE);
669 gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
674 g_assert (surname == NULL);
675 g_assert (lastname == NULL);
676 g_assert (age == 19);
677 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == FALSE);
679 g_object_unref (builder);
683 test_tree_store (void)
685 const gchar buffer[] =
686 "<interface domain=\"test\">"
687 " <object class=\"GtkTreeStore\" id=\"treestore1\">"
689 " <column type=\"gchararray\"/>"
690 " <column type=\"guint\"/>"
697 builder = builder_new_from_string (buffer, -1, NULL);
698 store = gtk_builder_get_object (builder, "treestore1");
699 g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 2);
700 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
701 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_UINT);
703 g_object_unref (builder);
709 const gchar buffer[] =
711 " <object class=\"GtkAction\" id=\"action\"/>"
712 " <object class=\"GtkActionGroup\" id=\"actiongroup\"/>"
713 " <object class=\"GtkAlignment\" id=\"alignment\"/>"
714 " <object class=\"GtkArrow\" id=\"arrow\"/>"
715 " <object class=\"GtkButton\" id=\"button\"/>"
716 " <object class=\"GtkCheckButton\" id=\"checkbutton\"/>"
717 " <object class=\"GtkDialog\" id=\"dialog\"/>"
718 " <object class=\"GtkDrawingArea\" id=\"drawingarea\"/>"
719 " <object class=\"GtkEventBox\" id=\"eventbox\"/>"
720 " <object class=\"GtkEntry\" id=\"entry\"/>"
721 " <object class=\"GtkFontButton\" id=\"fontbutton\"/>"
722 " <object class=\"GtkHButtonBox\" id=\"hbuttonbox\"/>"
723 " <object class=\"GtkHBox\" id=\"hbox\"/>"
724 " <object class=\"GtkHPaned\" id=\"hpaned\"/>"
725 " <object class=\"GtkHRuler\" id=\"hruler\"/>"
726 " <object class=\"GtkHScale\" id=\"hscale\"/>"
727 " <object class=\"GtkHScrollbar\" id=\"hscrollbar\"/>"
728 " <object class=\"GtkHSeparator\" id=\"hseparator\"/>"
729 " <object class=\"GtkImage\" id=\"image\"/>"
730 " <object class=\"GtkLabel\" id=\"label\"/>"
731 " <object class=\"GtkListStore\" id=\"liststore\"/>"
732 " <object class=\"GtkMenuBar\" id=\"menubar\"/>"
733 " <object class=\"GtkNotebook\" id=\"notebook\"/>"
734 " <object class=\"GtkProgressBar\" id=\"progressbar\"/>"
735 " <object class=\"GtkRadioButton\" id=\"radiobutton\"/>"
736 " <object class=\"GtkSizeGroup\" id=\"sizegroup\"/>"
737 " <object class=\"GtkScrolledWindow\" id=\"scrolledwindow\"/>"
738 " <object class=\"GtkSpinButton\" id=\"spinbutton\"/>"
739 " <object class=\"GtkStatusbar\" id=\"statusbar\"/>"
740 " <object class=\"GtkTextView\" id=\"textview\"/>"
741 " <object class=\"GtkToggleAction\" id=\"toggleaction\"/>"
742 " <object class=\"GtkToggleButton\" id=\"togglebutton\"/>"
743 " <object class=\"GtkToolbar\" id=\"toolbar\"/>"
744 " <object class=\"GtkTreeStore\" id=\"treestore\"/>"
745 " <object class=\"GtkTreeView\" id=\"treeview\"/>"
746 " <object class=\"GtkTable\" id=\"table\"/>"
747 " <object class=\"GtkVBox\" id=\"vbox\"/>"
748 " <object class=\"GtkVButtonBox\" id=\"vbuttonbox\"/>"
749 " <object class=\"GtkVScrollbar\" id=\"vscrollbar\"/>"
750 " <object class=\"GtkVSeparator\" id=\"vseparator\"/>"
751 " <object class=\"GtkViewport\" id=\"viewport\"/>"
752 " <object class=\"GtkVRuler\" id=\"vruler\"/>"
753 " <object class=\"GtkVPaned\" id=\"vpaned\"/>"
754 " <object class=\"GtkVScale\" id=\"vscale\"/>"
755 " <object class=\"GtkWindow\" id=\"window\"/>"
756 " <object class=\"GtkUIManager\" id=\"uimanager\"/>"
758 const gchar buffer2[] =
760 " <object type-func=\"gtk_window_get_type\" id=\"window\"/>"
762 const gchar buffer3[] =
764 " <object type-func=\"xxx_invalid_get_type_function\" id=\"window\"/>"
770 builder = builder_new_from_string (buffer, -1, NULL);
771 gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "dialog")));
772 gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "window")));
773 g_object_unref (builder);
775 builder = builder_new_from_string (buffer2, -1, NULL);
776 window = gtk_builder_get_object (builder, "window");
777 g_assert (GTK_IS_WINDOW (window));
778 gtk_widget_destroy (GTK_WIDGET (window));
779 g_object_unref (builder);
782 builder = gtk_builder_new ();
783 gtk_builder_add_from_string (builder, buffer3, -1, &error);
784 g_assert (g_error_matches (error,
786 GTK_BUILDER_ERROR_INVALID_TYPE_FUNCTION));
787 g_error_free (error);
788 g_object_unref (builder);
792 test_spin_button (void)
795 const gchar buffer[] =
797 "<object class=\"GtkAdjustment\" id=\"adjustment1\">"
798 "<property name=\"lower\">0</property>"
799 "<property name=\"upper\">10</property>"
800 "<property name=\"step-increment\">2</property>"
801 "<property name=\"page-increment\">3</property>"
802 "<property name=\"page-size\">0</property>"
803 "<property name=\"value\">1</property>"
805 "<object class=\"GtkSpinButton\" id=\"spinbutton1\">"
806 "<property name=\"visible\">True</property>"
807 "<property name=\"adjustment\">adjustment1</property>"
811 GtkAdjustment *adjustment;
814 builder = builder_new_from_string (buffer, -1, NULL);
815 obj = gtk_builder_get_object (builder, "spinbutton1");
816 g_assert (GTK_IS_SPIN_BUTTON (obj));
817 adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (obj));
818 g_assert (GTK_IS_ADJUSTMENT (adjustment));
819 g_object_get (adjustment, "value", &value, NULL);
820 g_assert (value == 1);
821 g_object_get (adjustment, "lower", &value, NULL);
822 g_assert (value == 0);
823 g_object_get (adjustment, "upper", &value, NULL);
824 g_assert (value == 10);
825 g_object_get (adjustment, "step-increment", &value, NULL);
826 g_assert (value == 2);
827 g_object_get (adjustment, "page-increment", &value, NULL);
828 g_assert (value == 3);
829 g_object_get (adjustment, "page-size", &value, NULL);
830 g_assert (value == 0);
832 g_object_unref (builder);
839 const gchar buffer[] =
841 " <object class=\"GtkNotebook\" id=\"notebook1\">"
843 " <object class=\"GtkLabel\" id=\"label1\">"
844 " <property name=\"label\">label1</property>"
847 " <child type=\"tab\">"
848 " <object class=\"GtkLabel\" id=\"tablabel1\">"
849 " <property name=\"label\">tab_label1</property>"
853 " <object class=\"GtkLabel\" id=\"label2\">"
854 " <property name=\"label\">label2</property>"
857 " <child type=\"tab\">"
858 " <object class=\"GtkLabel\" id=\"tablabel2\">"
859 " <property name=\"label\">tab_label2</property>"
867 builder = builder_new_from_string (buffer, -1, NULL);
868 notebook = gtk_builder_get_object (builder, "notebook1");
869 g_assert (notebook != NULL);
870 g_assert (gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)) == 2);
872 label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 0);
873 g_assert (GTK_IS_LABEL (label));
874 g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "label1") == 0);
875 label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), label);
876 g_assert (GTK_IS_LABEL (label));
877 g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "tab_label1") == 0);
879 label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 1);
880 g_assert (GTK_IS_LABEL (label));
881 g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "label2") == 0);
882 label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), label);
883 g_assert (GTK_IS_LABEL (label));
884 g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "tab_label2") == 0);
886 g_object_unref (builder);
890 test_construct_only_property (void)
893 const gchar buffer[] =
895 " <object class=\"GtkWindow\" id=\"window1\">"
896 " <property name=\"type\">GTK_WINDOW_POPUP</property>"
899 const gchar buffer2[] =
901 " <object class=\"GtkTextTagTable\" id=\"tagtable1\"/>"
902 " <object class=\"GtkTextBuffer\" id=\"textbuffer1\">"
903 " <property name=\"tag-table\">tagtable1</property>"
906 GObject *widget, *tagtable, *textbuffer;
909 builder = builder_new_from_string (buffer, -1, NULL);
910 widget = gtk_builder_get_object (builder, "window1");
911 g_object_get (widget, "type", &type, NULL);
912 g_assert (type == GTK_WINDOW_POPUP);
914 gtk_widget_destroy (GTK_WIDGET (widget));
915 g_object_unref (builder);
917 builder = builder_new_from_string (buffer2, -1, NULL);
918 textbuffer = gtk_builder_get_object (builder, "textbuffer1");
919 g_assert (textbuffer != NULL);
920 g_object_get (textbuffer, "tag-table", &tagtable, NULL);
921 g_assert (tagtable == gtk_builder_get_object (builder, "tagtable1"));
922 g_object_unref (tagtable);
923 g_object_unref (builder);
927 test_object_properties (void)
930 const gchar buffer[] =
932 " <object class=\"GtkWindow\" id=\"window1\">"
934 " <object class=\"GtkVBox\" id=\"vbox\">"
935 " <property name=\"border-width\">10</property>"
937 " <object class=\"GtkLabel\" id=\"label1\">"
938 " <property name=\"mnemonic-widget\">spinbutton1</property>"
942 " <object class=\"GtkSpinButton\" id=\"spinbutton1\"/>"
948 const gchar buffer2[] =
950 " <object class=\"GtkWindow\" id=\"window2\"/>"
952 GObject *label, *spinbutton, *window;
954 builder = builder_new_from_string (buffer, -1, NULL);
955 label = gtk_builder_get_object (builder, "label1");
956 g_assert (label != NULL);
957 spinbutton = gtk_builder_get_object (builder, "spinbutton1");
958 g_assert (spinbutton != NULL);
959 g_assert (spinbutton == (GObject*)gtk_label_get_mnemonic_widget (GTK_LABEL (label)));
961 gtk_builder_add_from_string (builder, buffer2, -1, NULL);
962 window = gtk_builder_get_object (builder, "window2");
963 g_assert (window != NULL);
964 gtk_widget_destroy (GTK_WIDGET (window));
966 g_object_unref (builder);
972 GtkBuilder * builder;
974 const gchar buffer1[] =
976 " <object class=\"GtkWindow\" id=\"window1\">"
978 " <object class=\"GtkButton\" id=\"button1\">"
979 " <property name=\"label\">Hello</property>"
984 const gchar buffer2[] =
986 " <object class=\"GtkDialog\" id=\"dialog1\">"
987 " <child internal-child=\"vbox\">"
988 " <object class=\"GtkVBox\" id=\"dialog1-vbox\">"
989 " <property name=\"border-width\">10</property>"
990 " <child internal-child=\"action_area\">"
991 " <object class=\"GtkHButtonBox\" id=\"dialog1-action_area\">"
992 " <property name=\"border-width\">20</property>"
1000 GObject *window, *button;
1001 GObject *dialog, *vbox, *action_area;
1003 builder = builder_new_from_string (buffer1, -1, NULL);
1004 window = gtk_builder_get_object (builder, "window1");
1005 g_assert (window != NULL);
1006 g_assert (GTK_IS_WINDOW (window));
1008 button = gtk_builder_get_object (builder, "button1");
1009 g_assert (button != NULL);
1010 g_assert (GTK_IS_BUTTON (button));
1011 g_assert (GTK_WIDGET(button)->parent != NULL);
1012 g_assert (strcmp (gtk_buildable_get_name (GTK_BUILDABLE (GTK_WIDGET (button)->parent)), "window1") == 0);
1014 gtk_widget_destroy (GTK_WIDGET (window));
1015 g_object_unref (builder);
1017 builder = builder_new_from_string (buffer2, -1, NULL);
1018 dialog = gtk_builder_get_object (builder, "dialog1");
1019 g_assert (dialog != NULL);
1020 g_assert (GTK_IS_DIALOG (dialog));
1021 children = gtk_container_get_children (GTK_CONTAINER (dialog));
1022 g_assert (g_list_length (children) == 1);
1023 g_list_free (children);
1025 vbox = gtk_builder_get_object (builder, "dialog1-vbox");
1026 g_assert (vbox != NULL);
1027 g_assert (GTK_IS_VBOX (vbox));
1028 g_assert (strcmp (gtk_buildable_get_name (GTK_BUILDABLE (GTK_WIDGET (vbox)->parent)), "dialog1") == 0);
1029 g_assert (GTK_CONTAINER (vbox)->border_width == 10);
1030 g_assert (strcmp (gtk_buildable_get_name (GTK_BUILDABLE (GTK_DIALOG (dialog)->vbox)), "dialog1-vbox") == 0);
1032 action_area = gtk_builder_get_object (builder, "dialog1-action_area");
1033 g_assert (action_area != NULL);
1034 g_assert (GTK_IS_HBUTTON_BOX (action_area));
1035 g_assert (GTK_WIDGET (action_area)->parent != NULL);
1036 g_assert (GTK_CONTAINER (action_area)->border_width == 20);
1037 g_assert (GTK_DIALOG (dialog)->action_area != NULL);
1038 g_assert (gtk_buildable_get_name (GTK_BUILDABLE (GTK_DIALOG (dialog)->action_area)) != NULL);
1039 g_assert (strcmp (gtk_buildable_get_name (GTK_BUILDABLE (GTK_DIALOG (dialog)->action_area)), "dialog1-action_area") == 0);
1040 gtk_widget_destroy (GTK_WIDGET (dialog));
1041 g_object_unref (builder);
1045 test_child_properties (void)
1047 GtkBuilder * builder;
1048 const gchar buffer1[] =
1050 " <object class=\"GtkVBox\" id=\"vbox1\">"
1052 " <object class=\"GtkLabel\" id=\"label1\"/>"
1054 " <property name=\"pack-type\">start</property>"
1058 " <object class=\"GtkLabel\" id=\"label2\"/>"
1060 " <property name=\"pack-type\">end</property>"
1066 GObject *label, *vbox;
1067 GtkPackType pack_type;
1069 builder = builder_new_from_string (buffer1, -1, NULL);
1070 vbox = gtk_builder_get_object (builder, "vbox1");
1071 g_assert (GTK_IS_VBOX (vbox));
1073 label = gtk_builder_get_object (builder, "label1");
1074 g_assert (GTK_IS_LABEL (label));
1075 gtk_container_child_get (GTK_CONTAINER (vbox),
1080 g_assert (pack_type == GTK_PACK_START);
1082 label = gtk_builder_get_object (builder, "label2");
1083 g_assert (GTK_IS_LABEL (label));
1084 gtk_container_child_get (GTK_CONTAINER (vbox),
1089 g_assert (pack_type == GTK_PACK_END);
1091 g_object_unref (builder);
1095 test_treeview_column (void)
1097 GtkBuilder *builder;
1098 const gchar buffer[] =
1100 "<object class=\"GtkListStore\" id=\"liststore1\">"
1102 " <column type=\"gchararray\"/>"
1103 " <column type=\"guint\"/>"
1107 " <col id=\"0\">John</col>"
1108 " <col id=\"1\">25</col>"
1112 "<object class=\"GtkWindow\" id=\"window1\">"
1114 " <object class=\"GtkTreeView\" id=\"treeview1\">"
1115 " <property name=\"visible\">True</property>"
1116 " <property name=\"model\">liststore1</property>"
1118 " <object class=\"GtkTreeViewColumn\" id=\"column1\">"
1119 " <property name=\"title\">Test</property>"
1121 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1123 " <attribute name=\"text\">1</attribute>"
1129 " <object class=\"GtkTreeViewColumn\" id=\"column2\">"
1130 " <property name=\"title\">Number</property>"
1132 " <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
1134 " <attribute name=\"text\">0</attribute>"
1143 GObject *window, *treeview;
1144 GtkTreeViewColumn *column;
1149 builder = builder_new_from_string (buffer, -1, NULL);
1150 treeview = gtk_builder_get_object (builder, "treeview1");
1151 g_assert (treeview);
1152 g_assert (GTK_IS_TREE_VIEW (treeview));
1153 column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), 0);
1154 g_assert (GTK_IS_TREE_VIEW_COLUMN (column));
1155 g_assert (strcmp (gtk_tree_view_column_get_title (column), "Test") == 0);
1157 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
1158 g_assert (g_list_length (renderers) == 1);
1159 renderer = g_list_nth_data (renderers, 0);
1160 g_assert (renderer);
1161 g_assert (GTK_IS_CELL_RENDERER_TEXT (renderer));
1162 g_list_free (renderers);
1164 gtk_widget_realize (GTK_WIDGET (treeview));
1166 renderer = gtk_builder_get_object (builder, "renderer1");
1167 g_object_get (renderer, "text", &text, NULL);
1169 g_assert (strcmp (text, "25") == 0);
1172 renderer = gtk_builder_get_object (builder, "renderer2");
1173 g_object_get (renderer, "text", &text, NULL);
1175 g_assert (strcmp (text, "John") == 0);
1178 gtk_widget_unrealize (GTK_WIDGET (treeview));
1180 window = gtk_builder_get_object (builder, "window1");
1181 gtk_widget_destroy (GTK_WIDGET (window));
1183 g_object_unref (builder);
1187 test_icon_view (void)
1189 GtkBuilder *builder;
1190 const gchar buffer[] =
1192 " <object class=\"GtkListStore\" id=\"liststore1\">"
1194 " <column type=\"gchararray\"/>"
1195 " <column type=\"GdkPixbuf\"/>"
1199 " <col id=\"0\">test</col>"
1203 " <object class=\"GtkWindow\" id=\"window1\">"
1205 " <object class=\"GtkIconView\" id=\"iconview1\">"
1206 " <property name=\"model\">liststore1</property>"
1207 " <property name=\"text-column\">0</property>"
1208 " <property name=\"pixbuf-column\">1</property>"
1209 " <property name=\"visible\">True</property>"
1211 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1213 " <attribute name=\"text\">0</attribute>"
1220 GObject *window, *iconview, *renderer;
1223 builder = builder_new_from_string (buffer, -1, NULL);
1224 iconview = gtk_builder_get_object (builder, "iconview1");
1225 g_assert (iconview);
1226 g_assert (GTK_IS_ICON_VIEW (iconview));
1228 gtk_widget_realize (GTK_WIDGET (iconview));
1230 renderer = gtk_builder_get_object (builder, "renderer1");
1231 g_object_get (renderer, "text", &text, NULL);
1233 g_assert (strcmp (text, "test") == 0);
1236 window = gtk_builder_get_object (builder, "window1");
1237 gtk_widget_destroy (GTK_WIDGET (window));
1238 g_object_unref (builder);
1242 test_combo_box (void)
1244 GtkBuilder *builder;
1245 const gchar buffer[] =
1247 " <object class=\"GtkListStore\" id=\"liststore1\">"
1249 " <column type=\"guint\"/>"
1250 " <column type=\"gchararray\"/>"
1254 " <col id=\"0\">1</col>"
1255 " <col id=\"1\">Foo</col>"
1258 " <col id=\"0\">2</col>"
1259 " <col id=\"1\">Bar</col>"
1263 " <object class=\"GtkWindow\" id=\"window1\">"
1265 " <object class=\"GtkComboBox\" id=\"combobox1\">"
1266 " <property name=\"model\">liststore1</property>"
1267 " <property name=\"visible\">True</property>"
1269 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1271 " <attribute name=\"text\">0</attribute>"
1275 " <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
1277 " <attribute name=\"text\">1</attribute>"
1284 GObject *window, *combobox, *renderer;
1287 builder = builder_new_from_string (buffer, -1, NULL);
1288 combobox = gtk_builder_get_object (builder, "combobox1");
1289 g_assert (combobox);
1290 gtk_widget_realize (GTK_WIDGET (combobox));
1292 renderer = gtk_builder_get_object (builder, "renderer2");
1293 g_assert (renderer);
1294 g_object_get (renderer, "text", &text, NULL);
1296 g_assert (strcmp (text, "Bar") == 0);
1299 renderer = gtk_builder_get_object (builder, "renderer1");
1300 g_assert (renderer);
1301 g_object_get (renderer, "text", &text, NULL);
1303 g_assert (strcmp (text, "2") == 0);
1306 window = gtk_builder_get_object (builder, "window1");
1307 gtk_widget_destroy (GTK_WIDGET (window));
1309 g_object_unref (builder);
1313 test_combo_box_entry (void)
1315 GtkBuilder *builder;
1316 const gchar buffer[] =
1318 " <object class=\"GtkListStore\" id=\"liststore1\">"
1320 " <column type=\"guint\"/>"
1321 " <column type=\"gchararray\"/>"
1325 " <col id=\"0\">1</col>"
1326 " <col id=\"1\">Foo</col>"
1329 " <col id=\"0\">2</col>"
1330 " <col id=\"1\">Bar</col>"
1334 " <object class=\"GtkWindow\" id=\"window1\">"
1336 " <object class=\"GtkComboBoxEntry\" id=\"comboboxentry1\">"
1337 " <property name=\"model\">liststore1</property>"
1338 " <property name=\"visible\">True</property>"
1340 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1342 " <attribute name=\"text\">0</attribute>"
1346 " <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
1348 " <attribute name=\"text\">1</attribute>"
1355 GObject *window, *combobox, *renderer;
1358 builder = builder_new_from_string (buffer, -1, NULL);
1359 combobox = gtk_builder_get_object (builder, "comboboxentry1");
1360 g_assert (combobox);
1362 renderer = gtk_builder_get_object (builder, "renderer2");
1363 g_assert (renderer);
1364 g_object_get (renderer, "text", &text, NULL);
1366 g_assert (strcmp (text, "Bar") == 0);
1369 renderer = gtk_builder_get_object (builder, "renderer1");
1370 g_assert (renderer);
1371 g_object_get (renderer, "text", &text, NULL);
1373 g_assert (strcmp (text, "2") == 0);
1376 window = gtk_builder_get_object (builder, "window1");
1377 gtk_widget_destroy (GTK_WIDGET (window));
1379 g_object_unref (builder);
1383 test_cell_view (void)
1385 GtkBuilder *builder;
1386 const gchar *buffer =
1388 " <object class=\"GtkListStore\" id=\"liststore1\">"
1390 " <column type=\"gchararray\"/>"
1394 " <col id=\"0\">test</col>"
1398 " <object class=\"GtkWindow\" id=\"window1\">"
1400 " <object class=\"GtkCellView\" id=\"cellview1\">"
1401 " <property name=\"visible\">True</property>"
1402 " <property name=\"model\">liststore1</property>"
1403 " <accelerator key=\"f\" modifiers=\"GDK_CONTROL_MASK\" signal=\"grab_focus\"/>"
1405 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1407 " <attribute name=\"text\">0</attribute>"
1415 GObject *model, *window;
1421 builder = builder_new_from_string (buffer, -1, NULL);
1422 cellview = gtk_builder_get_object (builder, "cellview1");
1424 g_assert (cellview);
1425 g_assert (GTK_IS_CELL_VIEW (cellview));
1426 g_object_get (cellview, "model", &model, NULL);
1428 g_assert (GTK_IS_TREE_MODEL (model));
1429 g_object_unref (model);
1430 path = gtk_tree_path_new_first ();
1431 gtk_cell_view_set_displayed_row (GTK_CELL_VIEW (cellview), path);
1433 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (cellview));
1434 g_assert (renderers);
1435 g_assert (g_list_length (renderers) == 1);
1437 gtk_widget_realize (GTK_WIDGET (cellview));
1439 renderer = g_list_nth_data (renderers, 0);
1440 g_list_free (renderers);
1441 g_assert (renderer);
1442 g_object_get (renderer, "text", &text, NULL);
1443 g_assert (strcmp (text, "test") == 0);
1445 gtk_tree_path_free (path);
1447 window = gtk_builder_get_object (builder, "window1");
1448 gtk_widget_destroy (GTK_WIDGET (window));
1450 g_object_unref (builder);
1456 GtkBuilder * builder;
1457 const gchar buffer1[] =
1459 " <object class=\"GtkDialog\" id=\"dialog1\">"
1460 " <child internal-child=\"vbox\">"
1461 " <object class=\"GtkVBox\" id=\"dialog1-vbox\">"
1462 " <child internal-child=\"action_area\">"
1463 " <object class=\"GtkHButtonBox\" id=\"dialog1-action_area\">"
1465 " <object class=\"GtkButton\" id=\"button_cancel\"/>"
1468 " <object class=\"GtkButton\" id=\"button_ok\"/>"
1475 " <action-widget response=\"3\">button_ok</action-widget>"
1476 " <action-widget response=\"-5\">button_cancel</action-widget>"
1477 " </action-widgets>"
1483 GObject *button_cancel;
1485 builder = builder_new_from_string (buffer1, -1, NULL);
1486 dialog1 = gtk_builder_get_object (builder, "dialog1");
1487 button_ok = gtk_builder_get_object (builder, "button_ok");
1488 g_assert (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_ok)) == 3);
1489 button_cancel = gtk_builder_get_object (builder, "button_cancel");
1490 g_assert (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_cancel)) == -5);
1492 gtk_widget_destroy (GTK_WIDGET (dialog1));
1493 g_object_unref (builder);
1497 test_message_dialog (void)
1499 GtkBuilder * builder;
1500 const gchar buffer1[] =
1502 " <object class=\"GtkMessageDialog\" id=\"dialog1\">"
1503 " <child internal-child=\"message_area\">"
1504 " <object class=\"GtkVBox\" id=\"dialog-message-area\">"
1506 " <object class=\"GtkExpander\" id=\"expander\"/>"
1516 builder = builder_new_from_string (buffer1, -1, NULL);
1517 dialog1 = gtk_builder_get_object (builder, "dialog1");
1518 expander = gtk_builder_get_object (builder, "expander");
1519 g_assert (GTK_IS_EXPANDER (expander));
1520 g_assert (gtk_widget_get_parent (GTK_WIDGET (expander)) == gtk_message_dialog_get_message_area (GTK_MESSAGE_DIALOG (dialog1)));
1522 gtk_widget_destroy (GTK_WIDGET (dialog1));
1523 g_object_unref (builder);
1527 test_accelerators (void)
1529 GtkBuilder *builder;
1530 const gchar *buffer =
1532 " <object class=\"GtkWindow\" id=\"window1\">"
1534 " <object class=\"GtkButton\" id=\"button1\">"
1535 " <accelerator key=\"q\" modifiers=\"GDK_CONTROL_MASK\" signal=\"clicked\"/>"
1540 const gchar *buffer2 =
1542 " <object class=\"GtkWindow\" id=\"window1\">"
1544 " <object class=\"GtkTreeView\" id=\"treeview1\">"
1545 " <signal name=\"cursor-changed\" handler=\"gtk_main_quit\"/>"
1546 " <accelerator key=\"f\" modifiers=\"GDK_CONTROL_MASK\" signal=\"grab_focus\"/>"
1552 GSList *accel_groups;
1553 GObject *accel_group;
1555 builder = builder_new_from_string (buffer, -1, NULL);
1556 window1 = gtk_builder_get_object (builder, "window1");
1558 g_assert (GTK_IS_WINDOW (window1));
1560 accel_groups = gtk_accel_groups_from_object (window1);
1561 g_assert (g_slist_length (accel_groups) == 1);
1562 accel_group = g_slist_nth_data (accel_groups, 0);
1563 g_assert (accel_group);
1565 gtk_widget_destroy (GTK_WIDGET (window1));
1566 g_object_unref (builder);
1568 builder = builder_new_from_string (buffer2, -1, NULL);
1569 window1 = gtk_builder_get_object (builder, "window1");
1571 g_assert (GTK_IS_WINDOW (window1));
1573 accel_groups = gtk_accel_groups_from_object (window1);
1574 g_assert (g_slist_length (accel_groups) == 1);
1575 accel_group = g_slist_nth_data (accel_groups, 0);
1576 g_assert (accel_group);
1578 gtk_widget_destroy (GTK_WIDGET (window1));
1579 g_object_unref (builder);
1585 const gchar *buffer =
1587 " <object class=\"GtkWindow\" id=\"window1\">"
1589 " <object class=\"GtkButton\" id=\"button1\">"
1590 " <property name=\"can-focus\">True</property>"
1591 " <property name=\"has-focus\">True</property>"
1596 const gchar *buffer2 =
1598 " <object class=\"GtkWindow\" id=\"window1\">"
1600 " <object class=\"GtkButton\" id=\"button1\">"
1601 " <property name=\"can-default\">True</property>"
1602 " <property name=\"has-default\">True</property>"
1607 const gchar *buffer3 =
1609 " <object class=\"GtkWindow\" id=\"window1\">"
1611 " <object class=\"GtkVBox\" id=\"vbox1\">"
1613 " <object class=\"GtkLabel\" id=\"label1\">"
1614 " <child internal-child=\"accessible\">"
1615 " <object class=\"AtkObject\" id=\"a11y-label1\">"
1616 " <property name=\"AtkObject::accessible-name\">A Label</property>"
1620 " <relation target=\"button1\" type=\"label-for\"/>"
1625 " <object class=\"GtkButton\" id=\"button1\">"
1627 " <action action_name=\"click\" description=\"Sliff\"/>"
1628 " <action action_name=\"clack\" translatable=\"yes\">Sniff</action>"
1636 GtkBuilder *builder;
1637 GObject *window1, *button1, *label1;
1638 AtkObject *accessible;
1639 AtkRelationSet *relation_set;
1640 AtkRelation *relation;
1643 builder = builder_new_from_string (buffer, -1, NULL);
1644 button1 = gtk_builder_get_object (builder, "button1");
1647 g_assert (gtk_widget_has_focus (GTK_WIDGET (button1)));
1649 window1 = gtk_builder_get_object (builder, "window1");
1650 gtk_widget_destroy (GTK_WIDGET (window1));
1652 g_object_unref (builder);
1654 builder = builder_new_from_string (buffer2, -1, NULL);
1655 button1 = gtk_builder_get_object (builder, "button1");
1657 g_assert (gtk_widget_get_receives_default (GTK_WIDGET (button1)));
1659 g_object_unref (builder);
1661 builder = builder_new_from_string (buffer3, -1, NULL);
1663 window1 = gtk_builder_get_object (builder, "window1");
1664 label1 = gtk_builder_get_object (builder, "label1");
1666 accessible = gtk_widget_get_accessible (GTK_WIDGET (label1));
1667 relation_set = atk_object_ref_relation_set (accessible);
1668 g_return_if_fail (atk_relation_set_get_n_relations (relation_set) == 1);
1669 relation = atk_relation_set_get_relation (relation_set, 0);
1670 g_return_if_fail (relation != NULL);
1671 g_return_if_fail (ATK_IS_RELATION (relation));
1672 g_return_if_fail (atk_relation_get_relation_type (relation) != ATK_RELATION_LABELLED_BY);
1673 g_object_unref (relation_set);
1675 g_object_get (G_OBJECT (accessible), "accessible-name", &name, NULL);
1676 g_return_if_fail (strcmp (name, "A Label") == 0);
1679 gtk_widget_destroy (GTK_WIDGET (window1));
1680 g_object_unref (builder);
1686 const gchar *buffer1 =
1688 " <object class=\"GtkWindow\" id=\"window1\">"
1689 " <property name=\"title\"></property>"
1692 const gchar *buffer2 =
1694 " <object class=\"GtkWindow\" id=\"window1\">"
1697 GtkBuilder *builder;
1701 builder = builder_new_from_string (buffer1, -1, NULL);
1702 window1 = gtk_builder_get_object (builder, "window1");
1703 g_object_get (window1, "title", &title, NULL);
1704 g_assert (strcmp (title, "") == 0);
1706 gtk_widget_destroy (GTK_WIDGET (window1));
1707 g_object_unref (builder);
1709 builder = builder_new_from_string (buffer2, -1, NULL);
1710 window1 = gtk_builder_get_object (builder, "window1");
1711 gtk_widget_destroy (GTK_WIDGET (window1));
1712 g_object_unref (builder);
1716 test_value_from_string (void)
1718 GValue value = { 0 };
1719 GError *error = NULL;
1720 GtkBuilder *builder;
1722 builder = gtk_builder_new ();
1724 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_STRING, "test", &value, &error));
1725 g_assert (G_VALUE_HOLDS_STRING (&value));
1726 g_assert (strcmp (g_value_get_string (&value), "test") == 0);
1727 g_value_unset (&value);
1729 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "true", &value, &error));
1730 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1731 g_assert (g_value_get_boolean (&value) == TRUE);
1732 g_value_unset (&value);
1734 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "false", &value, &error));
1735 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1736 g_assert (g_value_get_boolean (&value) == FALSE);
1737 g_value_unset (&value);
1739 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yes", &value, &error));
1740 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1741 g_assert (g_value_get_boolean (&value) == TRUE);
1742 g_value_unset (&value);
1744 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "no", &value, &error));
1745 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1746 g_assert (g_value_get_boolean (&value) == FALSE);
1747 g_value_unset (&value);
1749 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "0", &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, "1", &value, &error));
1755 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1756 g_assert (g_value_get_boolean (&value) == TRUE);
1757 g_value_unset (&value);
1759 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "tRuE", &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, "blaurgh", &value, &error) == FALSE);
1765 g_value_unset (&value);
1766 g_assert (g_error_matches (error,
1768 GTK_BUILDER_ERROR_INVALID_VALUE));
1769 g_error_free (error);
1772 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yess", &value, &error) == FALSE);
1773 g_value_unset (&value);
1774 g_assert (g_error_matches (error,
1776 GTK_BUILDER_ERROR_INVALID_VALUE));
1777 g_error_free (error);
1780 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "trueee", &value, &error) == FALSE);
1781 g_value_unset (&value);
1782 g_assert (g_error_matches (error,
1784 GTK_BUILDER_ERROR_INVALID_VALUE));
1785 g_error_free (error);
1788 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "", &value, &error) == FALSE);
1789 g_value_unset (&value);
1790 g_assert (g_error_matches (error,
1792 GTK_BUILDER_ERROR_INVALID_VALUE));
1793 g_error_free (error);
1796 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "12345", &value, &error));
1797 g_assert (G_VALUE_HOLDS_INT (&value));
1798 g_assert (g_value_get_int (&value) == 12345);
1799 g_value_unset (&value);
1801 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_LONG, "9912345", &value, &error));
1802 g_assert (G_VALUE_HOLDS_LONG (&value));
1803 g_assert (g_value_get_long (&value) == 9912345);
1804 g_value_unset (&value);
1806 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_UINT, "2345", &value, &error));
1807 g_assert (G_VALUE_HOLDS_UINT (&value));
1808 g_assert (g_value_get_uint (&value) == 2345);
1809 g_value_unset (&value);
1811 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "1.454", &value, &error));
1812 g_assert (G_VALUE_HOLDS_FLOAT (&value));
1813 g_assert (fabs (g_value_get_float (&value) - 1.454) < 0.00001);
1814 g_value_unset (&value);
1816 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "abc", &value, &error) == FALSE);
1817 g_value_unset (&value);
1818 g_assert (g_error_matches (error,
1820 GTK_BUILDER_ERROR_INVALID_VALUE));
1821 g_error_free (error);
1824 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "/-+,abc", &value, &error) == FALSE);
1825 g_value_unset (&value);
1826 g_assert (g_error_matches (error,
1828 GTK_BUILDER_ERROR_INVALID_VALUE));
1829 g_error_free (error);
1832 g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "toplevel", &value, &error) == TRUE);
1833 g_assert (G_VALUE_HOLDS_ENUM (&value));
1834 g_assert (g_value_get_enum (&value) == GTK_WINDOW_TOPLEVEL);
1835 g_value_unset (&value);
1837 g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "sliff", &value, &error) == FALSE);
1838 g_value_unset (&value);
1839 g_assert (g_error_matches (error,
1841 GTK_BUILDER_ERROR_INVALID_VALUE));
1842 g_error_free (error);
1845 g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WIDGET_FLAGS, "mapped", &value, &error) == TRUE);
1846 g_assert (G_VALUE_HOLDS_FLAGS (&value));
1847 g_assert (g_value_get_flags (&value) == GTK_MAPPED);
1848 g_value_unset (&value);
1850 g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WIDGET_FLAGS, "GTK_VISIBLE | GTK_REALIZED", &value, &error) == TRUE);
1851 g_assert (G_VALUE_HOLDS_FLAGS (&value));
1852 g_assert (g_value_get_flags (&value) == (GTK_VISIBLE | GTK_REALIZED));
1853 g_value_unset (&value);
1855 g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "foobar", &value, &error) == FALSE);
1856 g_value_unset (&value);
1857 g_assert (g_error_matches (error,
1859 GTK_BUILDER_ERROR_INVALID_VALUE));
1860 g_error_free (error);
1863 g_object_unref (builder);
1866 static gboolean model_freed = FALSE;
1869 model_weakref (gpointer data,
1876 test_reference_counting (void)
1878 GtkBuilder *builder;
1879 const gchar buffer1[] =
1881 " <object class=\"GtkListStore\" id=\"liststore1\"/>"
1882 " <object class=\"GtkListStore\" id=\"liststore2\"/>"
1883 " <object class=\"GtkWindow\" id=\"window1\">"
1885 " <object class=\"GtkTreeView\" id=\"treeview1\">"
1886 " <property name=\"model\">liststore1</property>"
1891 const gchar buffer2[] =
1893 " <object class=\"GtkVBox\" id=\"vbox1\">"
1895 " <object class=\"GtkLabel\" id=\"label1\"/>"
1897 " <property name=\"pack-type\">start</property>"
1902 GObject *window, *treeview, *model;
1904 builder = builder_new_from_string (buffer1, -1, NULL);
1905 window = gtk_builder_get_object (builder, "window1");
1906 treeview = gtk_builder_get_object (builder, "treeview1");
1907 model = gtk_builder_get_object (builder, "liststore1");
1908 g_object_unref (builder);
1910 g_object_weak_ref (model, (GWeakNotify)model_weakref, NULL);
1912 g_assert (model_freed == FALSE);
1913 gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), NULL);
1914 g_assert (model_freed == TRUE);
1916 gtk_widget_destroy (GTK_WIDGET (window));
1918 builder = builder_new_from_string (buffer2, -1, NULL);
1919 g_object_unref (builder);
1923 test_icon_factory (void)
1925 GtkBuilder *builder;
1926 const gchar buffer1[] =
1928 " <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
1930 " <source stock-id=\"apple-red\" filename=\"apple-red.png\"/>"
1934 const gchar buffer2[] =
1936 " <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
1938 " <source stock-id=\"sliff\" direction=\"rtl\" state=\"active\""
1939 " size=\"menu\" filename=\"sloff.png\"/>"
1940 " <source stock-id=\"sliff\" direction=\"ltr\" state=\"selected\""
1941 " size=\"dnd\" filename=\"slurf.png\"/>"
1946 const gchar buffer3[] =
1948 " <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
1952 const gchar buffer4[] =
1954 " <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
1960 const gchar buffer5[] =
1962 " <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
1968 GError *error = NULL;
1971 GtkIconSet *icon_set;
1972 GtkIconSource *icon_source;
1975 builder = builder_new_from_string (buffer1, -1, NULL);
1976 factory = gtk_builder_get_object (builder, "iconfactory1");
1977 g_assert (factory != NULL);
1979 icon_set = gtk_icon_factory_lookup (GTK_ICON_FACTORY (factory), "apple-red");
1980 g_assert (icon_set != NULL);
1981 gtk_icon_factory_add_default (GTK_ICON_FACTORY (factory));
1982 image = gtk_image_new_from_stock ("apple-red", GTK_ICON_SIZE_BUTTON);
1983 g_assert (image != NULL);
1984 g_object_ref_sink (image);
1985 g_object_unref (image);
1987 g_object_unref (builder);
1989 builder = builder_new_from_string (buffer2, -1, NULL);
1990 factory = gtk_builder_get_object (builder, "iconfactory1");
1991 g_assert (factory != NULL);
1993 icon_set = gtk_icon_factory_lookup (GTK_ICON_FACTORY (factory), "sliff");
1994 g_assert (icon_set != NULL);
1995 g_assert (g_slist_length (icon_set->sources) == 2);
1997 icon_source = icon_set->sources->data;
1998 g_assert (gtk_icon_source_get_direction (icon_source) == GTK_TEXT_DIR_RTL);
1999 g_assert (gtk_icon_source_get_state (icon_source) == GTK_STATE_ACTIVE);
2000 g_assert (gtk_icon_source_get_size (icon_source) == GTK_ICON_SIZE_MENU);
2001 g_assert (g_str_has_suffix (gtk_icon_source_get_filename (icon_source), "sloff.png"));
2003 icon_source = icon_set->sources->next->data;
2004 g_assert (gtk_icon_source_get_direction (icon_source) == GTK_TEXT_DIR_LTR);
2005 g_assert (gtk_icon_source_get_state (icon_source) == GTK_STATE_SELECTED);
2006 g_assert (gtk_icon_source_get_size (icon_source) == GTK_ICON_SIZE_DND);
2007 g_assert (g_str_has_suffix (gtk_icon_source_get_filename (icon_source), "slurf.png"));
2009 g_object_unref (builder);
2013 gtk_builder_add_from_string (builder, buffer3, -1, &error);
2014 g_assert (g_error_matches (error,
2016 GTK_BUILDER_ERROR_INVALID_TAG));
2017 g_error_free (error);
2020 gtk_builder_add_from_string (builder, buffer4, -1, &error);
2021 g_assert (g_error_matches (error,
2023 GTK_BUILDER_ERROR_INVALID_TAG));
2024 g_error_free (error);
2027 gtk_builder_add_from_string (builder, buffer5, -1, &error);
2028 g_assert (g_error_matches (error,
2030 GTK_BUILDER_ERROR_INVALID_ATTRIBUTE));
2031 g_error_free (error);
2038 gboolean foreground;
2046 filter_pango_attrs (PangoAttribute *attr,
2049 FoundAttrs *found = (FoundAttrs *)data;
2051 if (attr->klass->type == PANGO_ATTR_WEIGHT)
2052 found->weight = TRUE;
2053 else if (attr->klass->type == PANGO_ATTR_FOREGROUND)
2054 found->foreground = TRUE;
2055 else if (attr->klass->type == PANGO_ATTR_UNDERLINE)
2056 found->underline = TRUE;
2057 /* Make sure optional start/end properties are working */
2058 else if (attr->klass->type == PANGO_ATTR_SIZE &&
2059 attr->start_index == 5 &&
2060 attr->end_index == 10)
2062 else if (attr->klass->type == PANGO_ATTR_FONT_DESC)
2063 found->font_desc = TRUE;
2064 else if (attr->klass->type == PANGO_ATTR_LANGUAGE)
2065 found->language = TRUE;
2071 test_pango_attributes (void)
2073 GtkBuilder *builder;
2074 FoundAttrs found = { 0, };
2075 const gchar buffer[] =
2077 " <object class=\"GtkLabel\" id=\"label1\">"
2079 " <attribute name=\"weight\" value=\"PANGO_WEIGHT_BOLD\"/>"
2080 " <attribute name=\"foreground\" value=\"DarkSlateGray\"/>"
2081 " <attribute name=\"underline\" value=\"True\"/>"
2082 " <attribute name=\"size\" value=\"4\" start=\"5\" end=\"10\"/>"
2083 " <attribute name=\"font-desc\" value=\"Sans Italic 22\"/>"
2084 " <attribute name=\"language\" value=\"pt_BR\"/>"
2088 const gchar err_buffer1[] =
2090 " <object class=\"GtkLabel\" id=\"label1\">"
2092 " <attribute name=\"weight\"/>"
2096 const gchar err_buffer2[] =
2098 " <object class=\"GtkLabel\" id=\"label1\">"
2100 " <attribute name=\"weight\" value=\"PANGO_WEIGHT_BOLD\" unrecognized=\"True\"/>"
2106 GError *error = NULL;
2107 PangoAttrList *attrs, *filtered;
2109 /* Test attributes are set */
2110 builder = builder_new_from_string (buffer, -1, NULL);
2111 label = gtk_builder_get_object (builder, "label1");
2112 g_assert (label != NULL);
2114 attrs = gtk_label_get_attributes (GTK_LABEL (label));
2115 g_assert (attrs != NULL);
2117 filtered = pango_attr_list_filter (attrs, filter_pango_attrs, &found);
2118 g_assert (filtered);
2119 pango_attr_list_unref (filtered);
2121 g_assert (found.weight);
2122 g_assert (found.foreground);
2123 g_assert (found.underline);
2124 g_assert (found.size);
2125 g_assert (found.language);
2126 g_assert (found.font_desc);
2128 g_object_unref (builder);
2130 /* Test errors are set */
2131 builder = gtk_builder_new ();
2132 gtk_builder_add_from_string (builder, err_buffer1, -1, &error);
2133 label = gtk_builder_get_object (builder, "label1");
2134 g_assert (g_error_matches (error,
2136 GTK_BUILDER_ERROR_MISSING_ATTRIBUTE));
2137 g_object_unref (builder);
2138 g_error_free (error);
2141 builder = gtk_builder_new ();
2142 gtk_builder_add_from_string (builder, err_buffer2, -1, &error);
2143 label = gtk_builder_get_object (builder, "label1");
2145 g_assert (g_error_matches (error,
2147 GTK_BUILDER_ERROR_INVALID_ATTRIBUTE));
2148 g_object_unref (builder);
2149 g_error_free (error);
2153 test_requires (void)
2155 GtkBuilder *builder;
2156 GError *error = NULL;
2158 const gchar buffer_fmt[] =
2160 " <requires lib=\"gtk+\" version=\"%d.%d\"/>"
2163 buffer = g_strdup_printf (buffer_fmt, GTK_MAJOR_VERSION, GTK_MINOR_VERSION + 1);
2164 builder = gtk_builder_new ();
2165 gtk_builder_add_from_string (builder, buffer, -1, &error);
2166 g_assert (g_error_matches (error,
2168 GTK_BUILDER_ERROR_VERSION_MISMATCH));
2169 g_object_unref (builder);
2170 g_error_free (error);
2175 test_add_objects (void)
2177 GtkBuilder *builder;
2181 GtkUIManager *manager;
2183 GObject *menu, *label;
2185 gchar *objects[2] = {"mainbox", NULL};
2186 gchar *objects2[3] = {"mainbox", "window2", NULL};
2187 gchar *objects3[3] = {"uimgr1", "menubar1"};
2188 gchar *objects4[2] = {"uimgr1", NULL};
2189 const gchar buffer[] =
2191 " <object class=\"GtkWindow\" id=\"window\">"
2193 " <object class=\"GtkVBox\" id=\"mainbox\">"
2194 " <property name=\"visible\">True</property>"
2196 " <object class=\"GtkLabel\" id=\"label1\">"
2197 " <property name=\"visible\">True</property>"
2198 " <property name=\"label\" translatable=\"no\">first label</property>"
2202 " <object class=\"GtkLabel\" id=\"label2\">"
2203 " <property name=\"visible\">True</property>"
2204 " <property name=\"label\" translatable=\"no\">second label</property>"
2207 " <property name=\"position\">1</property>"
2213 " <object class=\"GtkWindow\" id=\"window2\">"
2215 " <object class=\"GtkLabel\" id=\"label3\">"
2216 " <property name=\"label\" translatable=\"no\">second label</property>"
2221 const gchar buffer2[] =
2223 " <object class=\"GtkUIManager\" id=\"uimgr1\">"
2225 " <object class=\"GtkActionGroup\" id=\"ag1\">"
2227 " <object class=\"GtkAction\" id=\"file\">"
2228 " <property name=\"label\">_File</property>"
2230 " <accelerator key=\"n\" modifiers=\"GDK_CONTROL_MASK\"/>"
2235 " <menubar name=\"menubar1\">"
2236 " <menu action=\"file\">"
2241 " <object class=\"GtkWindow\" id=\"window1\">"
2243 " <object class=\"GtkMenuBar\" id=\"menubar1\" constructor=\"uimgr1\"/>"
2249 builder = gtk_builder_new ();
2250 ret = gtk_builder_add_objects_from_string (builder, buffer, -1, objects, &error);
2252 g_assert (error == NULL);
2253 obj = gtk_builder_get_object (builder, "window");
2254 g_assert (obj == NULL);
2255 obj = gtk_builder_get_object (builder, "window2");
2256 g_assert (obj == NULL);
2257 obj = gtk_builder_get_object (builder, "mainbox");
2258 g_assert (GTK_IS_WIDGET (obj));
2259 g_object_unref (builder);
2262 builder = gtk_builder_new ();
2263 ret = gtk_builder_add_objects_from_string (builder, buffer, -1, objects2, &error);
2265 g_assert (error == NULL);
2266 obj = gtk_builder_get_object (builder, "window");
2267 g_assert (obj == NULL);
2268 obj = gtk_builder_get_object (builder, "window2");
2269 g_assert (GTK_IS_WINDOW (obj));
2270 gtk_widget_destroy (GTK_WIDGET (obj));
2271 obj = gtk_builder_get_object (builder, "mainbox");
2272 g_assert (GTK_IS_WIDGET (obj));
2273 g_object_unref (builder);
2275 /* test cherry picking a ui manager and menubar that depends on it */
2277 builder = gtk_builder_new ();
2278 ret = gtk_builder_add_objects_from_string (builder, buffer2, -1, objects3, &error);
2280 obj = gtk_builder_get_object (builder, "uimgr1");
2281 g_assert (GTK_IS_UI_MANAGER (obj));
2282 obj = gtk_builder_get_object (builder, "file");
2283 g_assert (GTK_IS_ACTION (obj));
2284 obj = gtk_builder_get_object (builder, "menubar1");
2285 g_assert (GTK_IS_MENU_BAR (obj));
2286 menubar = GTK_WIDGET (obj);
2288 children = gtk_container_get_children (GTK_CONTAINER (menubar));
2289 menu = children->data;
2290 g_assert (menu != NULL);
2291 g_assert (GTK_IS_MENU_ITEM (menu));
2292 g_assert (strcmp (GTK_WIDGET (menu)->name, "file") == 0);
2293 g_list_free (children);
2295 label = G_OBJECT (GTK_BIN (menu)->child);
2296 g_assert (label != NULL);
2297 g_assert (GTK_IS_LABEL (label));
2298 g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0);
2300 g_object_unref (builder);
2302 /* test cherry picking just the ui manager */
2304 builder = gtk_builder_new ();
2305 ret = gtk_builder_add_objects_from_string (builder, buffer2, -1, objects4, &error);
2307 obj = gtk_builder_get_object (builder, "uimgr1");
2308 g_assert (GTK_IS_UI_MANAGER (obj));
2309 manager = GTK_UI_MANAGER (obj);
2310 obj = gtk_builder_get_object (builder, "file");
2311 g_assert (GTK_IS_ACTION (obj));
2312 menubar = gtk_ui_manager_get_widget (manager, "/menubar1");
2313 g_assert (GTK_IS_MENU_BAR (menubar));
2315 children = gtk_container_get_children (GTK_CONTAINER (menubar));
2316 menu = children->data;
2317 g_assert (menu != NULL);
2318 g_assert (GTK_IS_MENU_ITEM (menu));
2319 g_assert (strcmp (GTK_WIDGET (menu)->name, "file") == 0);
2320 g_list_free (children);
2322 label = G_OBJECT (GTK_BIN (menu)->child);
2323 g_assert (label != NULL);
2324 g_assert (GTK_IS_LABEL (label));
2325 g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0);
2327 g_object_unref (builder);
2331 get_parent_menubar (GtkWidget *menuitem)
2333 GtkMenuShell *menu_shell = (GtkMenuShell *)menuitem->parent;
2334 GtkWidget *attach = NULL;
2336 g_assert (GTK_IS_MENU_SHELL (menu_shell));
2338 while (menu_shell && !GTK_IS_MENU_BAR (menu_shell))
2340 if (GTK_IS_MENU (menu_shell) &&
2341 (attach = gtk_menu_get_attach_widget (GTK_MENU (menu_shell))) != NULL)
2342 menu_shell = (GtkMenuShell *)attach->parent;
2347 return menu_shell ? GTK_WIDGET (menu_shell) : NULL;
2353 const gchar *buffer =
2355 " <object class=\"GtkWindow\" id=\"window1\">"
2357 " <group name=\"accelgroup1\"/>"
2360 " <object class=\"GtkVBox\" id=\"vbox1\">"
2361 " <property name=\"visible\">True</property>"
2362 " <property name=\"orientation\">vertical</property>"
2364 " <object class=\"GtkMenuBar\" id=\"menubar1\">"
2365 " <property name=\"visible\">True</property>"
2367 " <object class=\"GtkMenuItem\" id=\"menuitem1\">"
2368 " <property name=\"visible\">True</property>"
2369 " <property name=\"label\" translatable=\"yes\">_File</property>"
2370 " <property name=\"use_underline\">True</property>"
2371 " <child type=\"submenu\">"
2372 " <object class=\"GtkMenu\" id=\"menu1\">"
2373 " <property name=\"visible\">True</property>"
2375 " <object class=\"GtkImageMenuItem\" id=\"imagemenuitem1\">"
2376 " <property name=\"label\">gtk-new</property>"
2377 " <property name=\"visible\">True</property>"
2378 " <property name=\"use_stock\">True</property>"
2379 " <property name=\"accel_group\">accelgroup1</property>"
2391 "<object class=\"GtkAccelGroup\" id=\"accelgroup1\"/>"
2394 const gchar *buffer1 =
2396 " <object class=\"GtkWindow\" id=\"window1\">"
2398 " <group name=\"accelgroup1\"/>"
2401 " <object class=\"GtkVBox\" id=\"vbox1\">"
2402 " <property name=\"visible\">True</property>"
2403 " <property name=\"orientation\">vertical</property>"
2405 " <object class=\"GtkMenuBar\" id=\"menubar1\">"
2406 " <property name=\"visible\">True</property>"
2408 " <object class=\"GtkImageMenuItem\" id=\"imagemenuitem1\">"
2409 " <property name=\"visible\">True</property>"
2411 " <object class=\"GtkLabel\" id=\"custom1\">"
2412 " <property name=\"visible\">True</property>"
2413 " <property name=\"label\">a label</property>"
2423 "<object class=\"GtkAccelGroup\" id=\"accelgroup1\"/>"
2425 GtkBuilder *builder;
2426 GtkWidget *window, *item;
2427 GtkAccelGroup *accel_group;
2428 GtkWidget *item_accel_label, *sample_accel_label, *sample_menu_item, *custom;
2430 /* Check that the item has the correct accel label string set
2432 builder = builder_new_from_string (buffer, -1, NULL);
2433 window = (GtkWidget *)gtk_builder_get_object (builder, "window1");
2434 item = (GtkWidget *)gtk_builder_get_object (builder, "imagemenuitem1");
2435 accel_group = (GtkAccelGroup *)gtk_builder_get_object (builder, "accelgroup1");
2437 gtk_widget_show_all (window);
2439 sample_menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
2441 g_assert (GTK_BIN (sample_menu_item)->child);
2442 g_assert (GTK_IS_ACCEL_LABEL (GTK_BIN (sample_menu_item)->child));
2443 sample_accel_label = GTK_WIDGET (GTK_BIN (sample_menu_item)->child);
2444 gtk_widget_show (sample_accel_label);
2446 g_assert (GTK_BIN (item)->child);
2447 g_assert (GTK_IS_ACCEL_LABEL (GTK_BIN (item)->child));
2448 item_accel_label = GTK_WIDGET (GTK_BIN (item)->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 (custom->parent == 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))
2507 g_print ("Running dialog %s.\n",
2508 gtk_widget_get_name (GTK_WIDGET (obj)));
2509 response = gtk_dialog_run (GTK_DIALOG (obj));
2511 else if (GTK_IS_WINDOW (obj))
2513 g_signal_connect (obj, "destroy", G_CALLBACK (gtk_main_quit), NULL);
2514 g_print ("Showing %s.\n",
2515 gtk_widget_get_name (GTK_WIDGET (obj)));
2516 gtk_widget_show_all (GTK_WIDGET (obj));
2522 g_object_unref (builder);
2527 test_message_area (void)
2529 GtkBuilder *builder;
2531 GObject *obj, *obj1;
2532 const gchar buffer[] =
2534 " <object class=\"GtkInfoBar\" id=\"infobar1\">"
2535 " <child internal-child=\"content_area\">"
2536 " <object class=\"GtkHBox\" id=\"contentarea1\">"
2538 " <object class=\"GtkLabel\" id=\"content\">"
2539 " <property name=\"label\" translatable=\"yes\">Message</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>"
2561 builder = builder_new_from_string (buffer, -1, NULL);
2562 g_assert (error == NULL);
2563 obj = gtk_builder_get_object (builder, "infobar1");
2564 g_assert (GTK_IS_INFO_BAR (obj));
2565 obj1 = gtk_builder_get_object (builder, "content");
2566 g_assert (GTK_IS_LABEL (obj1));
2567 g_assert (gtk_widget_get_parent (gtk_widget_get_parent (GTK_WIDGET (obj1))) == GTK_WIDGET (obj));
2569 obj1 = gtk_builder_get_object (builder, "button_ok");
2570 g_assert (GTK_IS_BUTTON (obj1));
2571 g_assert (gtk_widget_get_parent (gtk_widget_get_parent (GTK_WIDGET (obj1))) == GTK_WIDGET (obj));
2573 g_object_unref (builder);
2577 main (int argc, char **argv)
2579 /* initialize test program */
2580 gtk_test_init (&argc, &argv);
2584 test_file (argv[1]);
2588 g_test_add_func ("/Builder/Parser", test_parser);
2589 g_test_add_func ("/Builder/Types", test_types);
2590 g_test_add_func ("/Builder/Construct-Only Properties", test_construct_only_property);
2591 g_test_add_func ("/Builder/Children", test_children);
2592 g_test_add_func ("/Builder/Child Properties", test_child_properties);
2593 g_test_add_func ("/Builder/Object Properties", test_object_properties);
2594 g_test_add_func ("/Builder/Notebook", test_notebook);
2595 g_test_add_func ("/Builder/Domain", test_domain);
2596 g_test_add_func ("/Builder/Signal Autoconnect", test_connect_signals);
2597 g_test_add_func ("/Builder/UIManager Simple", test_uimanager_simple);
2598 g_test_add_func ("/Builder/Spin Button", test_spin_button);
2599 g_test_add_func ("/Builder/SizeGroup", test_sizegroup);
2600 g_test_add_func ("/Builder/ListStore", test_list_store);
2601 g_test_add_func ("/Builder/TreeStore", test_tree_store);
2602 g_test_add_func ("/Builder/TreeView Column", test_treeview_column);
2603 g_test_add_func ("/Builder/IconView", test_icon_view);
2604 g_test_add_func ("/Builder/ComboBox", test_combo_box);
2605 g_test_add_func ("/Builder/ComboBox Entry", test_combo_box_entry);
2606 g_test_add_func ("/Builder/CellView", test_cell_view);
2607 g_test_add_func ("/Builder/Dialog", test_dialog);
2608 g_test_add_func ("/Builder/Accelerators", test_accelerators);
2609 g_test_add_func ("/Builder/Widget", test_widget);
2610 g_test_add_func ("/Builder/Value From String", test_value_from_string);
2611 g_test_add_func ("/Builder/Reference Counting", test_reference_counting);
2612 g_test_add_func ("/Builder/Window", test_window);
2613 g_test_add_func ("/Builder/IconFactory", test_icon_factory);
2614 g_test_add_func ("/Builder/PangoAttributes", test_pango_attributes);
2615 g_test_add_func ("/Builder/Requires", test_requires);
2616 g_test_add_func ("/Builder/AddObjects", test_add_objects);
2617 g_test_add_func ("/Builder/Menus", test_menus);
2618 g_test_add_func ("/Builder/MessageArea", test_message_area);
2619 g_test_add_func ("/Builder/MessageDialog", test_message_dialog);
2621 return g_test_run();