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,
47 builder = gtk_builder_new ();
49 gtk_builder_set_translation_domain (builder, domain);
50 gtk_builder_add_from_string (builder, buffer, length, NULL);
60 builder = gtk_builder_new ();
63 gtk_builder_add_from_string (builder, "<xxx/>", -1, &error);
64 g_assert (error != NULL);
65 g_assert (error->domain == GTK_BUILDER_ERROR);
66 g_assert (error->code == GTK_BUILDER_ERROR_UNHANDLED_TAG);
70 gtk_builder_add_from_string (builder, "<interface invalid=\"X\"/>", -1, &error);
71 g_assert (error != NULL);
72 g_assert (error->domain == GTK_BUILDER_ERROR);
73 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_ATTRIBUTE);
77 gtk_builder_add_from_string (builder, "<interface><child/></interface>", -1, &error);
78 g_assert (error != NULL);
79 g_assert (error->domain == GTK_BUILDER_ERROR);
80 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_TAG);
84 gtk_builder_add_from_string (builder, "<interface><object class=\"GtkVBox\" id=\"a\"><object class=\"GtkHBox\" id=\"b\"/></object></interface>", -1, &error);
85 g_assert (error != NULL);
86 g_assert (error->domain == GTK_BUILDER_ERROR);
87 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_TAG);
91 gtk_builder_add_from_string (builder, "<interface><object class=\"Unknown\" id=\"a\"></object></interface>", -1, &error);
92 g_assert (error != NULL);
93 g_assert (error->domain == GTK_BUILDER_ERROR);
94 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
98 gtk_builder_add_from_string (builder, "<interface><object class=\"GtkWidget\" id=\"a\" constructor=\"none\"></object></interface>", -1, &error);
99 g_assert (error != NULL);
100 g_assert (error->domain == GTK_BUILDER_ERROR);
101 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
102 g_error_free (error);
105 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);
106 g_assert (error != NULL);
107 g_assert (error->domain == GTK_BUILDER_ERROR);
108 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
109 g_error_free (error);
111 g_object_unref (builder);
114 static int normal = 0;
115 static int after = 0;
116 static int object = 0;
117 static int object_after = 0;
119 void // exported for GtkBuilder
120 signal_normal (GtkWindow *window, GParamSpec spec)
122 g_assert (GTK_IS_WINDOW (window));
123 g_assert (normal == 0);
124 g_assert (after == 0);
129 void // exported for GtkBuilder
130 signal_after (GtkWindow *window, GParamSpec spec)
132 g_assert (GTK_IS_WINDOW (window));
133 g_assert (normal == 1);
134 g_assert (after == 0);
139 void // exported for GtkBuilder
140 signal_object (GtkButton *button, GParamSpec spec)
142 g_assert (GTK_IS_BUTTON (button));
143 g_assert (object == 0);
144 g_assert (object_after == 0);
149 void // exported for GtkBuilder
150 signal_object_after (GtkButton *button, GParamSpec spec)
152 g_assert (GTK_IS_BUTTON (button));
153 g_assert (object == 1);
154 g_assert (object_after == 0);
159 void // exported for GtkBuilder
160 signal_first (GtkButton *button, GParamSpec spec)
162 g_assert (normal == 0);
166 void // exported for GtkBuilder
167 signal_second (GtkButton *button, GParamSpec spec)
169 g_assert (normal == 10);
173 void // exported for GtkBuilder
174 signal_extra (GtkButton *button, GParamSpec spec)
176 g_assert (normal == 20);
180 void // exported for GtkBuilder
181 signal_extra2 (GtkButton *button, GParamSpec spec)
183 g_assert (normal == 30);
188 test_connect_signals (void)
192 const gchar buffer[] =
194 " <object class=\"GtkButton\" id=\"button\"/>"
195 " <object class=\"GtkWindow\" id=\"window1\">"
196 " <signal name=\"notify::title\" handler=\"signal_normal\"/>"
197 " <signal name=\"notify::title\" handler=\"signal_after\" after=\"yes\"/>"
198 " <signal name=\"notify::title\" handler=\"signal_object\""
199 " object=\"button\"/>"
200 " <signal name=\"notify::title\" handler=\"signal_object_after\""
201 " object=\"button\" after=\"yes\"/>"
204 const gchar buffer_order[] =
206 " <object class=\"GtkWindow\" id=\"window1\">"
207 " <signal name=\"notify::title\" handler=\"signal_first\"/>"
208 " <signal name=\"notify::title\" handler=\"signal_second\"/>"
211 const gchar buffer_extra[] =
213 " <object class=\"GtkWindow\" id=\"window2\">"
214 " <signal name=\"notify::title\" handler=\"signal_extra\"/>"
217 const gchar buffer_extra2[] =
219 " <object class=\"GtkWindow\" id=\"window3\">"
220 " <signal name=\"notify::title\" handler=\"signal_extra2\"/>"
223 const gchar buffer_after_child[] =
225 " <object class=\"GtkWindow\" id=\"window1\">"
227 " <object class=\"GtkButton\" id=\"button1\"/>"
229 " <signal name=\"notify::title\" handler=\"signal_normal\"/>"
233 builder = builder_new_from_string (buffer, -1, NULL);
234 gtk_builder_connect_signals (builder, NULL);
236 window = gtk_builder_get_object (builder, "window1");
237 gtk_window_set_title (GTK_WINDOW (window), "test");
239 g_assert_cmpint (normal, ==, 1);
240 g_assert_cmpint (after, ==, 1);
241 g_assert_cmpint (object, ==, 1);
242 g_assert_cmpint (object_after, ==, 1);
244 gtk_widget_destroy (GTK_WIDGET (window));
245 g_object_unref (builder);
247 builder = builder_new_from_string (buffer_order, -1, NULL);
248 gtk_builder_connect_signals (builder, NULL);
249 window = gtk_builder_get_object (builder, "window1");
251 gtk_window_set_title (GTK_WINDOW (window), "test");
252 g_assert (normal == 20);
254 gtk_widget_destroy (GTK_WIDGET (window));
256 gtk_builder_add_from_string (builder, buffer_extra,
257 strlen (buffer_extra), NULL);
258 gtk_builder_add_from_string (builder, buffer_extra2,
259 strlen (buffer_extra2), NULL);
260 gtk_builder_connect_signals (builder, NULL);
261 window = gtk_builder_get_object (builder, "window2");
262 gtk_window_set_title (GTK_WINDOW (window), "test");
263 g_assert (normal == 30);
265 gtk_widget_destroy (GTK_WIDGET (window));
266 window = gtk_builder_get_object (builder, "window3");
267 gtk_window_set_title (GTK_WINDOW (window), "test");
268 g_assert (normal == 40);
269 gtk_widget_destroy (GTK_WIDGET (window));
271 g_object_unref (builder);
273 /* new test, reset globals */
277 builder = builder_new_from_string (buffer_after_child, -1, NULL);
278 window = gtk_builder_get_object (builder, "window1");
279 gtk_builder_connect_signals (builder, NULL);
280 gtk_window_set_title (GTK_WINDOW (window), "test");
282 g_assert (normal == 1);
283 gtk_widget_destroy (GTK_WIDGET (window));
284 g_object_unref (builder);
288 test_uimanager_simple (void)
291 GObject *window, *uimgr, *menubar;
292 GObject *menu, *label;
294 const gchar buffer[] =
296 " <object class=\"GtkUIManager\" id=\"uimgr1\"/>"
299 const gchar buffer2[] =
301 " <object class=\"GtkUIManager\" id=\"uimgr1\">"
303 " <object class=\"GtkActionGroup\" id=\"ag1\">"
305 " <object class=\"GtkAction\" id=\"file\">"
306 " <property name=\"label\">_File</property>"
308 " <accelerator key=\"n\" modifiers=\"GDK_CONTROL_MASK\"/>"
313 " <menubar name=\"menubar1\">"
314 " <menu action=\"file\">"
319 " <object class=\"GtkWindow\" id=\"window1\">"
321 " <object class=\"GtkMenuBar\" id=\"menubar1\" constructor=\"uimgr1\"/>"
326 builder = builder_new_from_string (buffer, -1, NULL);
328 uimgr = gtk_builder_get_object (builder, "uimgr1");
329 g_assert (uimgr != NULL);
330 g_assert (GTK_IS_UI_MANAGER (uimgr));
331 g_object_unref (builder);
333 builder = builder_new_from_string (buffer2, -1, NULL);
335 menubar = gtk_builder_get_object (builder, "menubar1");
336 g_assert (menubar != NULL);
337 g_assert (GTK_IS_MENU_BAR (menubar));
339 children = gtk_container_get_children (GTK_CONTAINER (menubar));
340 menu = children->data;
341 g_assert (menu != NULL);
342 g_assert (GTK_IS_MENU_ITEM (menu));
343 g_assert (strcmp (GTK_WIDGET (menu)->name, "file") == 0);
344 g_list_free (children);
346 label = G_OBJECT (GTK_BIN (menu)->child);
347 g_assert (label != NULL);
348 g_assert (GTK_IS_LABEL (label));
349 g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0);
351 window = gtk_builder_get_object (builder, "window1");
352 gtk_widget_destroy (GTK_WIDGET (window));
353 g_object_unref (builder);
360 const gchar buffer1[] = "<interface/>";
361 const gchar buffer2[] = "<interface domain=\"domain\"/>";
364 builder = builder_new_from_string (buffer1, -1, NULL);
365 domain = gtk_builder_get_translation_domain (builder);
366 g_assert (domain == NULL);
367 g_object_unref (builder);
369 builder = builder_new_from_string (buffer1, -1, "domain-1");
370 domain = gtk_builder_get_translation_domain (builder);
372 g_assert (strcmp (domain, "domain-1") == 0);
373 g_object_unref (builder);
375 builder = builder_new_from_string (buffer2, -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 (buffer2, -1, "domain-1");
381 domain = gtk_builder_get_translation_domain (builder);
383 g_assert (strcmp (domain, "domain-1") == 0);
384 g_object_unref (builder);
389 test_translation (void)
392 const gchar buffer[] =
394 " <object class=\"GtkWindow\" id=\"window1\">"
396 " <object class=\"GtkLabel\" id=\"label\">"
397 " <property name=\"label\" translatable=\"yes\">File</property>"
402 GtkLabel *window, *label;
404 setlocale (LC_ALL, "sv_SE");
405 textdomain ("builder");
406 bindtextdomain ("builder", "tests");
408 builder = builder_new_from_string (buffer, -1, NULL);
409 label = GTK_LABEL (gtk_builder_get_object (builder, "label"));
410 g_assert (strcmp (gtk_label_get_text (label), "Arkiv") == 0);
412 window = gtk_builder_get_object (builder, "window1");
413 gtk_widget_destroy (GTK_WIDGET (window));
414 g_object_unref (builder);
419 test_sizegroup (void)
421 GtkBuilder * builder;
422 const gchar buffer1[] =
423 "<interface domain=\"test\">"
424 " <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
425 " <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
427 " <widget name=\"radio1\"/>"
428 " <widget name=\"radio2\"/>"
431 " <object class=\"GtkWindow\" id=\"window1\">"
433 " <object class=\"GtkVBox\" id=\"vbox1\">"
435 " <object class=\"GtkRadioButton\" id=\"radio1\"/>"
438 " <object class=\"GtkRadioButton\" id=\"radio2\"/>"
444 const gchar buffer2[] =
445 "<interface domain=\"test\">"
446 " <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
447 " <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
452 const gchar buffer3[] =
453 "<interface domain=\"test\">"
454 " <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
455 " <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
457 " <widget name=\"radio1\"/>"
458 " <widget name=\"radio2\"/>"
461 " <object class=\"GtkSizeGroup\" id=\"sizegroup2\">"
462 " <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
464 " <widget name=\"radio1\"/>"
465 " <widget name=\"radio2\"/>"
468 " <object class=\"GtkWindow\" id=\"window1\">"
470 " <object class=\"GtkVBox\" id=\"vbox1\">"
472 " <object class=\"GtkRadioButton\" id=\"radio1\"/>"
475 " <object class=\"GtkRadioButton\" id=\"radio2\"/>"
484 builder = builder_new_from_string (buffer1, -1, NULL);
485 sizegroup = gtk_builder_get_object (builder, "sizegroup1");
486 widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
487 g_assert (g_slist_length (widgets) == 2);
488 g_slist_free (widgets);
489 g_object_unref (builder);
491 builder = builder_new_from_string (buffer2, -1, NULL);
492 sizegroup = gtk_builder_get_object (builder, "sizegroup1");
493 widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
494 g_assert (g_slist_length (widgets) == 0);
495 g_slist_free (widgets);
496 g_object_unref (builder);
498 builder = builder_new_from_string (buffer3, -1, NULL);
499 sizegroup = gtk_builder_get_object (builder, "sizegroup1");
500 widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
501 g_assert (g_slist_length (widgets) == 2);
502 g_slist_free (widgets);
503 sizegroup = gtk_builder_get_object (builder, "sizegroup2");
504 widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
505 g_assert (g_slist_length (widgets) == 2);
506 g_slist_free (widgets);
511 window = gtk_builder_get_object (builder, "window1");
512 gtk_widget_destroy (GTK_WIDGET (window));
515 g_object_unref (builder);
519 test_list_store (void)
521 const gchar buffer1[] =
523 " <object class=\"GtkListStore\" id=\"liststore1\">"
525 " <column type=\"gchararray\"/>"
526 " <column type=\"guint\"/>"
530 const char buffer2[] =
532 " <object class=\"GtkListStore\" id=\"liststore1\">"
534 " <column type=\"gchararray\"/>"
535 " <column type=\"gchararray\"/>"
536 " <column type=\"gint\"/>"
540 " <col id=\"0\" translatable=\"yes\">John</col>"
541 " <col id=\"1\" context=\"foo\">Doe</col>"
542 " <col id=\"2\" comment=\"foobar\">25</col>"
545 " <col id=\"0\">Johan</col>"
546 " <col id=\"1\">Dole</col>"
547 " <col id=\"2\">50</col>"
552 const char buffer3[] =
554 " <object class=\"GtkListStore\" id=\"liststore1\">"
556 " <column type=\"gchararray\"/>"
557 " <column type=\"gchararray\"/>"
558 " <column type=\"gint\"/>"
562 " <col id=\"1\" context=\"foo\">Doe</col>"
563 " <col id=\"0\" translatable=\"yes\">John</col>"
564 " <col id=\"2\" comment=\"foobar\">25</col>"
567 " <col id=\"2\">50</col>"
568 " <col id=\"1\">Dole</col>"
569 " <col id=\"0\">Johan</col>"
572 " <col id=\"2\">19</col>"
580 gchar *surname, *lastname;
583 builder = builder_new_from_string (buffer1, -1, NULL);
584 store = gtk_builder_get_object (builder, "liststore1");
585 g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 2);
586 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
587 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_UINT);
588 g_object_unref (builder);
590 builder = builder_new_from_string (buffer2, -1, NULL);
591 store = gtk_builder_get_object (builder, "liststore1");
592 g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 3);
593 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
594 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_STRING);
595 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2) == G_TYPE_INT);
597 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter) == TRUE);
598 gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
603 g_assert (surname != NULL);
604 g_assert (strcmp (surname, "John") == 0);
606 g_assert (lastname != NULL);
607 g_assert (strcmp (lastname, "Doe") == 0);
609 g_assert (age == 25);
610 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE);
612 gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
617 g_assert (surname != NULL);
618 g_assert (strcmp (surname, "Johan") == 0);
620 g_assert (lastname != NULL);
621 g_assert (strcmp (lastname, "Dole") == 0);
623 g_assert (age == 50);
624 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == FALSE);
626 g_object_unref (builder);
628 builder = builder_new_from_string (buffer3, -1, NULL);
629 store = gtk_builder_get_object (builder, "liststore1");
630 g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 3);
631 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
632 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_STRING);
633 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2) == G_TYPE_INT);
635 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter) == TRUE);
636 gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
641 g_assert (surname != NULL);
642 g_assert (strcmp (surname, "John") == 0);
644 g_assert (lastname != NULL);
645 g_assert (strcmp (lastname, "Doe") == 0);
647 g_assert (age == 25);
648 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE);
650 gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
655 g_assert (surname != NULL);
656 g_assert (strcmp (surname, "Johan") == 0);
658 g_assert (lastname != NULL);
659 g_assert (strcmp (lastname, "Dole") == 0);
661 g_assert (age == 50);
662 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE);
664 gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
669 g_assert (surname == NULL);
670 g_assert (lastname == NULL);
671 g_assert (age == 19);
672 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == FALSE);
674 g_object_unref (builder);
678 test_tree_store (void)
680 const gchar buffer[] =
681 "<interface domain=\"test\">"
682 " <object class=\"GtkTreeStore\" id=\"treestore1\">"
684 " <column type=\"gchararray\"/>"
685 " <column type=\"guint\"/>"
692 builder = builder_new_from_string (buffer, -1, NULL);
693 store = gtk_builder_get_object (builder, "treestore1");
694 g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 2);
695 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
696 g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_UINT);
698 g_object_unref (builder);
704 const gchar buffer[] =
706 " <object class=\"GtkAction\" id=\"action\"/>"
707 " <object class=\"GtkActionGroup\" id=\"actiongroup\"/>"
708 " <object class=\"GtkAlignment\" id=\"alignment\"/>"
709 " <object class=\"GtkArrow\" id=\"arrow\"/>"
710 " <object class=\"GtkButton\" id=\"button\"/>"
711 " <object class=\"GtkCheckButton\" id=\"checkbutton\"/>"
712 " <object class=\"GtkDialog\" id=\"dialog\"/>"
713 " <object class=\"GtkDrawingArea\" id=\"drawingarea\"/>"
714 " <object class=\"GtkEventBox\" id=\"eventbox\"/>"
715 " <object class=\"GtkEntry\" id=\"entry\"/>"
716 " <object class=\"GtkFontButton\" id=\"fontbutton\"/>"
717 " <object class=\"GtkHButtonBox\" id=\"hbuttonbox\"/>"
718 " <object class=\"GtkHBox\" id=\"hbox\"/>"
719 " <object class=\"GtkHPaned\" id=\"hpaned\"/>"
720 " <object class=\"GtkHRuler\" id=\"hruler\"/>"
721 " <object class=\"GtkHScale\" id=\"hscale\"/>"
722 " <object class=\"GtkHScrollbar\" id=\"hscrollbar\"/>"
723 " <object class=\"GtkHSeparator\" id=\"hseparator\"/>"
724 " <object class=\"GtkImage\" id=\"image\"/>"
725 " <object class=\"GtkLabel\" id=\"label\"/>"
726 " <object class=\"GtkListStore\" id=\"liststore\"/>"
727 " <object class=\"GtkMenuBar\" id=\"menubar\"/>"
728 " <object class=\"GtkNotebook\" id=\"notebook\"/>"
729 " <object class=\"GtkProgressBar\" id=\"progressbar\"/>"
730 " <object class=\"GtkRadioButton\" id=\"radiobutton\"/>"
731 " <object class=\"GtkSizeGroup\" id=\"sizegroup\"/>"
732 " <object class=\"GtkScrolledWindow\" id=\"scrolledwindow\"/>"
733 " <object class=\"GtkSpinButton\" id=\"spinbutton\"/>"
734 " <object class=\"GtkStatusbar\" id=\"statusbar\"/>"
735 " <object class=\"GtkTextView\" id=\"textview\"/>"
736 " <object class=\"GtkToggleAction\" id=\"toggleaction\"/>"
737 " <object class=\"GtkToggleButton\" id=\"togglebutton\"/>"
738 " <object class=\"GtkToolbar\" id=\"toolbar\"/>"
739 " <object class=\"GtkTreeStore\" id=\"treestore\"/>"
740 " <object class=\"GtkTreeView\" id=\"treeview\"/>"
741 " <object class=\"GtkTable\" id=\"table\"/>"
742 " <object class=\"GtkVBox\" id=\"vbox\"/>"
743 " <object class=\"GtkVButtonBox\" id=\"vbuttonbox\"/>"
744 " <object class=\"GtkVScrollbar\" id=\"vscrollbar\"/>"
745 " <object class=\"GtkVSeparator\" id=\"vseparator\"/>"
746 " <object class=\"GtkViewport\" id=\"viewport\"/>"
747 " <object class=\"GtkVRuler\" id=\"vruler\"/>"
748 " <object class=\"GtkVPaned\" id=\"vpaned\"/>"
749 " <object class=\"GtkVScale\" id=\"vscale\"/>"
750 " <object class=\"GtkWindow\" id=\"window\"/>"
751 " <object class=\"GtkUIManager\" id=\"uimanager\"/>"
753 const gchar buffer2[] =
755 " <object type-func=\"gtk_window_get_type\" id=\"window\"/>"
757 const gchar buffer3[] =
759 " <object type-func=\"xxx_invalid_get_type_function\" id=\"window\"/>"
765 builder = builder_new_from_string (buffer, -1, NULL);
766 gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "dialog")));
767 gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "window")));
768 g_object_unref (builder);
770 builder = builder_new_from_string (buffer2, -1, NULL);
771 window = gtk_builder_get_object (builder, "window");
772 g_assert (window != NULL);
773 g_assert (GTK_IS_WINDOW (window));
774 gtk_widget_destroy (GTK_WIDGET (window));
775 g_object_unref (builder);
778 builder = gtk_builder_new ();
779 gtk_builder_add_from_string (builder, buffer3, -1, &error);
780 g_assert (error != NULL);
781 g_assert (error->domain == GTK_BUILDER_ERROR);
782 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_TYPE_FUNCTION);
783 g_error_free (error);
784 g_object_unref (builder);
788 test_spin_button (void)
791 const gchar buffer[] =
793 "<object class=\"GtkAdjustment\" id=\"adjustment1\">"
794 "<property name=\"lower\">0</property>"
795 "<property name=\"upper\">10</property>"
796 "<property name=\"step-increment\">2</property>"
797 "<property name=\"page-increment\">3</property>"
798 "<property name=\"page-size\">5</property>"
799 "<property name=\"value\">1</property>"
801 "<object class=\"GtkSpinButton\" id=\"spinbutton1\">"
802 "<property name=\"visible\">True</property>"
803 "<property name=\"adjustment\">adjustment1</property>"
807 GtkAdjustment *adjustment;
810 builder = builder_new_from_string (buffer, -1, NULL);
811 object = gtk_builder_get_object (builder, "spinbutton1");
812 g_assert (GTK_IS_SPIN_BUTTON (object));
813 adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (object));
814 g_assert (GTK_IS_ADJUSTMENT (adjustment));
815 g_object_get (adjustment, "value", &value, NULL);
816 g_assert (value == 1);
817 g_object_get (adjustment, "lower", &value, NULL);
818 g_assert (value == 0);
819 g_object_get (adjustment, "upper", &value, NULL);
820 g_assert (value == 10);
821 g_object_get (adjustment, "step-increment", &value, NULL);
822 g_assert (value == 2);
823 g_object_get (adjustment, "page-increment", &value, NULL);
824 g_assert (value == 3);
825 g_object_get (adjustment, "page-size", &value, NULL);
826 g_assert (value == 5);
828 g_object_unref (builder);
835 const gchar buffer[] =
837 " <object class=\"GtkNotebook\" id=\"notebook1\">"
839 " <object class=\"GtkLabel\" id=\"label1\">"
840 " <property name=\"label\">label1</property>"
843 " <child type=\"tab\">"
844 " <object class=\"GtkLabel\" id=\"tablabel1\">"
845 " <property name=\"label\">tab_label1</property>"
849 " <object class=\"GtkLabel\" id=\"label2\">"
850 " <property name=\"label\">label2</property>"
853 " <child type=\"tab\">"
854 " <object class=\"GtkLabel\" id=\"tablabel2\">"
855 " <property name=\"label\">tab_label2</property>"
863 builder = builder_new_from_string (buffer, -1, NULL);
864 notebook = gtk_builder_get_object (builder, "notebook1");
865 g_assert (notebook != NULL);
866 g_assert (gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)) == 2);
868 label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 0);
869 g_assert (GTK_IS_LABEL (label));
870 g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "label1") == 0);
871 label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), label);
872 g_assert (GTK_IS_LABEL (label));
873 g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "tab_label1") == 0);
875 label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 1);
876 g_assert (GTK_IS_LABEL (label));
877 g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "label2") == 0);
878 label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), label);
879 g_assert (GTK_IS_LABEL (label));
880 g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "tab_label2") == 0);
882 g_object_unref (builder);
886 test_construct_only_property (void)
889 const gchar buffer[] =
891 " <object class=\"GtkWindow\" id=\"window1\">"
892 " <property name=\"type\">GTK_WINDOW_POPUP</property>"
895 const gchar buffer2[] =
897 " <object class=\"GtkTextTagTable\" id=\"tagtable1\"/>"
898 " <object class=\"GtkTextBuffer\" id=\"textbuffer1\">"
899 " <property name=\"tag-table\">tagtable1</property>"
902 GObject *widget, *tagtable, *textbuffer;
905 builder = builder_new_from_string (buffer, -1, NULL);
906 widget = gtk_builder_get_object (builder, "window1");
907 g_object_get (widget, "type", &type, NULL);
908 g_assert (type == GTK_WINDOW_POPUP);
910 gtk_widget_destroy (GTK_WIDGET (widget));
911 g_object_unref (builder);
913 builder = builder_new_from_string (buffer2, -1, NULL);
914 textbuffer = gtk_builder_get_object (builder, "textbuffer1");
915 g_assert (textbuffer != NULL);
916 g_object_get (textbuffer, "tag-table", &tagtable, NULL);
917 g_assert (tagtable == gtk_builder_get_object (builder, "tagtable1"));
918 g_object_unref (tagtable);
919 g_object_unref (builder);
923 test_object_properties (void)
926 const gchar buffer[] =
928 " <object class=\"GtkWindow\" id=\"window1\">"
930 " <object class=\"GtkVBox\" id=\"vbox\">"
931 " <property name=\"border-width\">10</property>"
933 " <object class=\"GtkLabel\" id=\"label1\">"
934 " <property name=\"mnemonic-widget\">spinbutton1</property>"
938 " <object class=\"GtkSpinButton\" id=\"spinbutton1\"/>"
944 const gchar buffer2[] =
946 " <object class=\"GtkWindow\" id=\"window2\"/>"
948 GObject *label, *spinbutton, *window;
950 builder = builder_new_from_string (buffer, -1, NULL);
951 label = gtk_builder_get_object (builder, "label1");
952 g_assert (label != NULL);
953 spinbutton = gtk_builder_get_object (builder, "spinbutton1");
954 g_assert (spinbutton != NULL);
955 g_assert (spinbutton == (GObject*)gtk_label_get_mnemonic_widget (GTK_LABEL (label)));
957 gtk_builder_add_from_string (builder, buffer2, -1, NULL);
958 window = gtk_builder_get_object (builder, "window2");
959 g_assert (window != NULL);
960 gtk_widget_destroy (GTK_WIDGET (window));
962 g_object_unref (builder);
968 GtkBuilder * builder;
970 const gchar buffer1[] =
972 " <object class=\"GtkWindow\" id=\"window1\">"
974 " <object class=\"GtkButton\" id=\"button1\">"
975 " <property name=\"label\">Hello</property>"
980 const gchar buffer2[] =
982 " <object class=\"GtkDialog\" id=\"dialog1\">"
983 " <child internal-child=\"vbox\">"
984 " <object class=\"GtkVBox\" id=\"dialog1-vbox\">"
985 " <property name=\"border-width\">10</property>"
986 " <child internal-child=\"action_area\">"
987 " <object class=\"GtkHButtonBox\" id=\"dialog1-action_area\">"
988 " <property name=\"border-width\">20</property>"
996 GObject *window, *button;
997 GObject *dialog, *vbox, *action_area;
999 builder = builder_new_from_string (buffer1, -1, NULL);
1000 window = gtk_builder_get_object (builder, "window1");
1001 g_assert (window != NULL);
1002 g_assert (GTK_IS_WINDOW (window));
1004 button = gtk_builder_get_object (builder, "button1");
1005 g_assert (button != NULL);
1006 g_assert (GTK_IS_BUTTON (button));
1007 g_assert (strcmp (GTK_WIDGET (GTK_WIDGET (button)->parent)->name, "window1") == 0);
1009 gtk_widget_destroy (GTK_WIDGET (window));
1010 g_object_unref (builder);
1012 builder = builder_new_from_string (buffer2, -1, NULL);
1013 dialog = gtk_builder_get_object (builder, "dialog1");
1014 g_assert (dialog != NULL);
1015 g_assert (GTK_IS_DIALOG (dialog));
1016 children = gtk_container_get_children (GTK_CONTAINER (dialog));
1017 g_assert (g_list_length (children) == 1);
1018 g_list_free (children);
1020 vbox = gtk_builder_get_object (builder, "dialog1-vbox");
1021 g_assert (vbox != NULL);
1022 g_assert (GTK_IS_VBOX (vbox));
1023 g_assert (GTK_WIDGET (vbox)->parent != NULL);
1024 g_assert (strcmp (GTK_WIDGET (GTK_WIDGET (vbox)->parent)->name, "dialog1") == 0);
1025 g_assert (GTK_CONTAINER (vbox)->border_width == 10);
1026 g_assert (strcmp (GTK_WIDGET (GTK_DIALOG (dialog)->vbox)->name, "dialog1-vbox") == 0);
1028 action_area = gtk_builder_get_object (builder, "dialog1-action_area");
1029 g_assert (action_area != NULL);
1030 g_assert (GTK_IS_HBUTTON_BOX (action_area));
1031 g_assert (GTK_WIDGET (action_area)->parent != NULL);
1032 g_assert (GTK_CONTAINER (action_area)->border_width == 20);
1033 g_assert (GTK_DIALOG (dialog)->action_area != NULL);
1034 g_assert (GTK_WIDGET (GTK_DIALOG (dialog)->action_area)->name != NULL);
1035 g_assert (strcmp (GTK_WIDGET (GTK_DIALOG (dialog)->action_area)->name, "dialog1-action_area") == 0);
1036 gtk_widget_destroy (GTK_WIDGET (dialog));
1037 g_object_unref (builder);
1041 test_child_properties (void)
1043 GtkBuilder * builder;
1044 const gchar buffer1[] =
1046 " <object class=\"GtkVBox\" id=\"vbox1\">"
1048 " <object class=\"GtkLabel\" id=\"label1\"/>"
1050 " <property name=\"pack-type\">start</property>"
1054 " <object class=\"GtkLabel\" id=\"label2\"/>"
1056 " <property name=\"pack-type\">end</property>"
1062 GObject *label, *vbox;
1063 GtkPackType pack_type;
1065 builder = builder_new_from_string (buffer1, -1, NULL);
1066 vbox = gtk_builder_get_object (builder, "vbox1");
1067 g_assert (GTK_IS_VBOX (vbox));
1069 label = gtk_builder_get_object (builder, "label1");
1070 g_assert (GTK_IS_LABEL (label));
1071 gtk_container_child_get (GTK_CONTAINER (vbox),
1076 g_assert (pack_type == GTK_PACK_START);
1078 label = gtk_builder_get_object (builder, "label2");
1079 g_assert (GTK_IS_LABEL (label));
1080 gtk_container_child_get (GTK_CONTAINER (vbox),
1085 g_assert (pack_type == GTK_PACK_END);
1087 g_object_unref (builder);
1091 test_treeview_column (void)
1093 GtkBuilder *builder;
1094 const gchar buffer[] =
1096 "<object class=\"GtkListStore\" id=\"liststore1\">"
1098 " <column type=\"gchararray\"/>"
1099 " <column type=\"guint\"/>"
1103 " <col id=\"0\">John</col>"
1104 " <col id=\"1\">25</col>"
1108 "<object class=\"GtkWindow\" id=\"window1\">"
1110 " <object class=\"GtkTreeView\" id=\"treeview1\">"
1111 " <property name=\"visible\">True</property>"
1112 " <property name=\"model\">liststore1</property>"
1114 " <object class=\"GtkTreeViewColumn\" id=\"column1\">"
1115 " <property name=\"title\">Test</property>"
1117 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1119 " <attribute name=\"text\">1</attribute>"
1125 " <object class=\"GtkTreeViewColumn\" id=\"column2\">"
1126 " <property name=\"title\">Number</property>"
1128 " <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
1130 " <attribute name=\"text\">0</attribute>"
1139 GObject *window, *treeview;
1140 GtkTreeViewColumn *column;
1145 builder = builder_new_from_string (buffer, -1, NULL);
1146 treeview = gtk_builder_get_object (builder, "treeview1");
1147 g_assert (treeview);
1148 g_assert (GTK_IS_TREE_VIEW (treeview));
1149 column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), 0);
1150 g_assert (GTK_IS_TREE_VIEW_COLUMN (column));
1151 g_assert (strcmp (gtk_tree_view_column_get_title (column), "Test") == 0);
1153 renderers = gtk_tree_view_column_get_cell_renderers (column);
1154 g_assert (g_list_length (renderers) == 1);
1155 renderer = g_list_nth_data (renderers, 0);
1156 g_assert (renderer);
1157 g_assert (GTK_IS_CELL_RENDERER_TEXT (renderer));
1158 g_list_free (renderers);
1160 gtk_widget_realize (GTK_WIDGET (treeview));
1162 renderer = gtk_builder_get_object (builder, "renderer1");
1163 g_object_get (renderer, "text", &text, NULL);
1165 g_assert (strcmp (text, "25") == 0);
1168 renderer = gtk_builder_get_object (builder, "renderer2");
1169 g_object_get (renderer, "text", &text, NULL);
1171 g_assert (strcmp (text, "John") == 0);
1174 gtk_widget_unrealize (GTK_WIDGET (treeview));
1176 window = gtk_builder_get_object (builder, "window1");
1177 gtk_widget_destroy (GTK_WIDGET (window));
1179 g_object_unref (builder);
1183 test_icon_view (void)
1185 GtkBuilder *builder;
1186 const gchar buffer[] =
1188 " <object class=\"GtkListStore\" id=\"liststore1\">"
1190 " <column type=\"gchararray\"/>"
1191 " <column type=\"GdkPixbuf\"/>"
1195 " <col id=\"0\">test</col>"
1199 " <object class=\"GtkWindow\" id=\"window1\">"
1201 " <object class=\"GtkIconView\" id=\"iconview1\">"
1202 " <property name=\"model\">liststore1</property>"
1203 " <property name=\"text-column\">0</property>"
1204 " <property name=\"pixbuf-column\">1</property>"
1205 " <property name=\"visible\">True</property>"
1207 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1209 " <attribute name=\"text\">0</attribute>"
1216 GObject *window, *iconview, *renderer;
1219 builder = builder_new_from_string (buffer, -1, NULL);
1220 iconview = gtk_builder_get_object (builder, "iconview1");
1221 g_assert (iconview);
1222 g_assert (GTK_IS_ICON_VIEW (iconview));
1224 gtk_widget_realize (GTK_WIDGET (iconview));
1226 renderer = gtk_builder_get_object (builder, "renderer1");
1227 g_object_get (renderer, "text", &text, NULL);
1229 g_assert (strcmp (text, "test") == 0);
1232 window = gtk_builder_get_object (builder, "window1");
1233 gtk_widget_destroy (GTK_WIDGET (window));
1234 g_object_unref (builder);
1238 test_combo_box (void)
1240 GtkBuilder *builder;
1241 const gchar buffer[] =
1243 " <object class=\"GtkListStore\" id=\"liststore1\">"
1245 " <column type=\"guint\"/>"
1246 " <column type=\"gchararray\"/>"
1250 " <col id=\"0\">1</col>"
1251 " <col id=\"1\">Foo</col>"
1254 " <col id=\"0\">2</col>"
1255 " <col id=\"1\">Bar</col>"
1259 " <object class=\"GtkWindow\" id=\"window1\">"
1261 " <object class=\"GtkComboBox\" id=\"combobox1\">"
1262 " <property name=\"model\">liststore1</property>"
1263 " <property name=\"visible\">True</property>"
1265 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1267 " <attribute name=\"text\">0</attribute>"
1271 " <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
1273 " <attribute name=\"text\">1</attribute>"
1280 GObject *window, *combobox, *renderer;
1283 builder = builder_new_from_string (buffer, -1, NULL);
1284 combobox = gtk_builder_get_object (builder, "combobox1");
1285 g_assert (combobox);
1286 gtk_widget_realize (GTK_WIDGET (combobox));
1288 renderer = gtk_builder_get_object (builder, "renderer2");
1289 g_assert (renderer);
1290 g_object_get (renderer, "text", &text, NULL);
1292 g_assert (strcmp (text, "Bar") == 0);
1295 renderer = gtk_builder_get_object (builder, "renderer1");
1296 g_assert (renderer);
1297 g_object_get (renderer, "text", &text, NULL);
1299 g_assert (strcmp (text, "2") == 0);
1302 window = gtk_builder_get_object (builder, "window1");
1303 gtk_widget_destroy (GTK_WIDGET (window));
1305 g_object_unref (builder);
1309 test_combo_box_entry (void)
1311 GtkBuilder *builder;
1312 const gchar buffer[] =
1314 " <object class=\"GtkListStore\" id=\"liststore1\">"
1316 " <column type=\"guint\"/>"
1317 " <column type=\"gchararray\"/>"
1321 " <col id=\"0\">1</col>"
1322 " <col id=\"1\">Foo</col>"
1325 " <col id=\"0\">2</col>"
1326 " <col id=\"1\">Bar</col>"
1330 " <object class=\"GtkWindow\" id=\"window1\">"
1332 " <object class=\"GtkComboBoxEntry\" id=\"comboboxentry1\">"
1333 " <property name=\"model\">liststore1</property>"
1334 " <property name=\"visible\">True</property>"
1336 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1338 " <attribute name=\"text\">0</attribute>"
1342 " <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
1344 " <attribute name=\"text\">1</attribute>"
1351 GObject *window, *combobox, *renderer;
1354 builder = builder_new_from_string (buffer, -1, NULL);
1355 combobox = gtk_builder_get_object (builder, "comboboxentry1");
1356 g_assert (combobox);
1358 renderer = gtk_builder_get_object (builder, "renderer2");
1359 g_assert (renderer);
1360 g_object_get (renderer, "text", &text, NULL);
1362 g_assert (strcmp (text, "Bar") == 0);
1365 renderer = gtk_builder_get_object (builder, "renderer1");
1366 g_assert (renderer);
1367 g_object_get (renderer, "text", &text, NULL);
1369 g_assert (strcmp (text, "2") == 0);
1372 window = gtk_builder_get_object (builder, "window1");
1373 gtk_widget_destroy (GTK_WIDGET (window));
1375 g_object_unref (builder);
1379 test_cell_view (void)
1381 GtkBuilder *builder;
1384 " <object class=\"GtkListStore\" id=\"liststore1\">"
1386 " <column type=\"gchararray\"/>"
1390 " <col id=\"0\">test</col>"
1394 " <object class=\"GtkWindow\" id=\"window1\">"
1396 " <object class=\"GtkCellView\" id=\"cellview1\">"
1397 " <property name=\"visible\">True</property>"
1398 " <property name=\"model\">liststore1</property>"
1399 " <accelerator key=\"f\" modifiers=\"GDK_CONTROL_MASK\" signal=\"grab_focus\"/>"
1401 " <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1403 " <attribute name=\"text\">0</attribute>"
1411 GObject *model, *window;
1417 builder = builder_new_from_string (buffer, -1, NULL);
1418 cellview = gtk_builder_get_object (builder, "cellview1");
1420 g_assert (cellview);
1421 g_assert (GTK_IS_CELL_VIEW (cellview));
1422 g_object_get (cellview, "model", &model, NULL);
1424 g_assert (GTK_IS_TREE_MODEL (model));
1425 g_object_unref (model);
1426 path = gtk_tree_path_new_first ();
1427 gtk_cell_view_set_displayed_row (GTK_CELL_VIEW (cellview), path);
1429 renderers = gtk_cell_view_get_cell_renderers (GTK_CELL_VIEW (cellview));
1430 g_assert (renderers);
1431 g_assert (g_list_length (renderers) == 1);
1433 gtk_widget_realize (GTK_WIDGET (cellview));
1435 renderer = g_list_nth_data (renderers, 0);
1436 g_list_free (renderers);
1437 g_assert (renderer);
1438 g_object_get (renderer, "text", &text, NULL);
1439 g_assert (strcmp (text, "test") == 0);
1441 gtk_tree_path_free (path);
1443 window = gtk_builder_get_object (builder, "window1");
1444 gtk_widget_destroy (GTK_WIDGET (window));
1446 g_object_unref (builder);
1452 GtkBuilder * builder;
1453 const gchar buffer1[] =
1455 " <object class=\"GtkDialog\" id=\"dialog1\">"
1456 " <child internal-child=\"vbox\">"
1457 " <object class=\"GtkVBox\" id=\"dialog1-vbox\">"
1458 " <child internal-child=\"action_area\">"
1459 " <object class=\"GtkHButtonBox\" id=\"dialog1-action_area\">"
1461 " <object class=\"GtkButton\" id=\"button_cancel\"/>"
1464 " <object class=\"GtkButton\" id=\"button_ok\"/>"
1471 " <action-widget response=\"3\">button_ok</action-widget>"
1472 " <action-widget response=\"-5\">button_cancel</action-widget>"
1473 " </action-widgets>"
1479 GObject *button_cancel;
1481 builder = builder_new_from_string (buffer1, -1, NULL);
1482 dialog1 = gtk_builder_get_object (builder, "dialog1");
1483 button_ok = gtk_builder_get_object (builder, "button_ok");
1484 g_assert (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_ok)) == 3);
1485 button_cancel = gtk_builder_get_object (builder, "button_cancel");
1486 g_assert (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_cancel)) == -5);
1488 gtk_widget_destroy (GTK_WIDGET (dialog1));
1489 g_object_unref (builder);
1493 test_accelerators (void)
1495 GtkBuilder *builder;
1498 " <object class=\"GtkWindow\" id=\"window1\">"
1500 " <object class=\"GtkButton\" id=\"button1\">"
1501 " <accelerator key=\"q\" modifiers=\"GDK_CONTROL_MASK\" signal=\"clicked\"/>"
1508 " <object class=\"GtkWindow\" id=\"window1\">"
1510 " <object class=\"GtkTreeView\" id=\"treeview1\">"
1511 " <signal name=\"cursor-changed\" handler=\"gtk_main_quit\"/>"
1512 " <accelerator key=\"f\" modifiers=\"GDK_CONTROL_MASK\" signal=\"grab_focus\"/>"
1518 GSList *accel_groups;
1519 GObject *accel_group;
1521 builder = builder_new_from_string (buffer, -1, NULL);
1522 window1 = gtk_builder_get_object (builder, "window1");
1524 g_assert (GTK_IS_WINDOW (window1));
1526 accel_groups = gtk_accel_groups_from_object (window1);
1527 g_assert (g_slist_length (accel_groups) == 1);
1528 accel_group = g_slist_nth_data (accel_groups, 0);
1529 g_assert (accel_group);
1531 gtk_widget_destroy (GTK_WIDGET (window1));
1532 g_object_unref (builder);
1534 builder = builder_new_from_string (buffer2, -1, NULL);
1535 window1 = gtk_builder_get_object (builder, "window1");
1537 g_assert (GTK_IS_WINDOW (window1));
1539 accel_groups = gtk_accel_groups_from_object (window1);
1540 g_assert (g_slist_length (accel_groups) == 1);
1541 accel_group = g_slist_nth_data (accel_groups, 0);
1542 g_assert (accel_group);
1544 gtk_widget_destroy (GTK_WIDGET (window1));
1545 g_object_unref (builder);
1553 " <object class=\"GtkWindow\" id=\"window1\">"
1555 " <object class=\"GtkButton\" id=\"button1\">"
1556 " <property name=\"can-focus\">True</property>"
1557 " <property name=\"has-focus\">True</property>"
1564 " <object class=\"GtkWindow\" id=\"window1\">"
1566 " <object class=\"GtkButton\" id=\"button1\">"
1567 " <property name=\"can-default\">True</property>"
1568 " <property name=\"has-default\">True</property>"
1575 " <object class=\"GtkWindow\" id=\"window1\">"
1577 " <object class=\"GtkVBox\" id=\"vbox1\">"
1579 " <object class=\"GtkLabel\" id=\"label1\">"
1580 " <child internal-child=\"accessible\">"
1581 " <object class=\"AtkObject\" id=\"a11y-label1\">"
1582 " <property name=\"AtkObject::accessible-name\">A Label</property>"
1586 " <relation target=\"button1\" type=\"label-for\"/>"
1591 " <object class=\"GtkButton\" id=\"button1\">"
1593 " <action action_name=\"click\" description=\"Sliff\"/>"
1601 GtkBuilder *builder;
1602 GObject *window1, *button1, *label1;
1603 AtkObject *accessible;
1604 AtkRelationSet *relation_set;
1605 AtkRelation *relation;
1608 builder = builder_new_from_string (buffer, -1, NULL);
1609 button1 = gtk_builder_get_object (builder, "button1");
1612 g_assert (GTK_WIDGET_HAS_FOCUS (GTK_WIDGET (button1)));
1614 window1 = gtk_builder_get_object (builder, "window1");
1615 gtk_widget_destroy (GTK_WIDGET (window1));
1617 g_object_unref (builder);
1619 builder = builder_new_from_string (buffer2, -1, NULL);
1620 button1 = gtk_builder_get_object (builder, "button1");
1622 g_assert (GTK_WIDGET_RECEIVES_DEFAULT (GTK_WIDGET (button1)));
1624 g_object_unref (builder);
1626 builder = builder_new_from_string (buffer3, -1, NULL);
1628 window1 = gtk_builder_get_object (builder, "window1");
1629 label1 = gtk_builder_get_object (builder, "label1");
1631 accessible = gtk_widget_get_accessible (GTK_WIDGET (label1));
1632 relation_set = atk_object_ref_relation_set (accessible);
1633 g_return_if_fail (atk_relation_set_get_n_relations (relation_set) == 1);
1634 relation = atk_relation_set_get_relation (relation_set, 0);
1635 g_return_if_fail (relation != NULL);
1636 g_return_if_fail (ATK_IS_RELATION (relation));
1637 g_return_if_fail (atk_relation_get_relation_type (relation) != ATK_RELATION_LABELLED_BY);
1638 g_object_unref (relation_set);
1640 g_object_get (G_OBJECT (accessible), "accessible-name", &name, NULL);
1641 g_return_if_fail (strcmp (name, "A Label") == 0);
1644 gtk_widget_destroy (GTK_WIDGET (window1));
1645 g_object_unref (builder);
1653 " <object class=\"GtkWindow\" id=\"window1\">"
1654 " <property name=\"title\"></property>"
1659 " <object class=\"GtkWindow\" id=\"window1\">"
1662 GtkBuilder *builder;
1666 builder = builder_new_from_string (buffer1, -1, NULL);
1667 window1 = gtk_builder_get_object (builder, "window1");
1668 g_object_get (window1, "title", &title, NULL);
1669 g_assert (strcmp (title, "") == 0);
1671 gtk_widget_destroy (GTK_WIDGET (window1));
1672 g_object_unref (builder);
1674 builder = builder_new_from_string (buffer2, -1, NULL);
1675 window1 = gtk_builder_get_object (builder, "window1");
1676 gtk_widget_destroy (GTK_WIDGET (window1));
1677 g_object_unref (builder);
1681 test_value_from_string (void)
1683 GValue value = { 0 };
1684 GError *error = NULL;
1685 GtkBuilder *builder;
1687 builder = gtk_builder_new ();
1689 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_STRING, "test", &value, &error));
1690 g_assert (G_VALUE_HOLDS_STRING (&value));
1691 g_assert (strcmp (g_value_get_string (&value), "test") == 0);
1692 g_value_unset (&value);
1694 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "true", &value, &error));
1695 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1696 g_assert (g_value_get_boolean (&value) == TRUE);
1697 g_value_unset (&value);
1699 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "false", &value, &error));
1700 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1701 g_assert (g_value_get_boolean (&value) == FALSE);
1702 g_value_unset (&value);
1704 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yes", &value, &error));
1705 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1706 g_assert (g_value_get_boolean (&value) == TRUE);
1707 g_value_unset (&value);
1709 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "no", &value, &error));
1710 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1711 g_assert (g_value_get_boolean (&value) == FALSE);
1712 g_value_unset (&value);
1714 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "0", &value, &error));
1715 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1716 g_assert (g_value_get_boolean (&value) == FALSE);
1717 g_value_unset (&value);
1719 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "1", &value, &error));
1720 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1721 g_assert (g_value_get_boolean (&value) == TRUE);
1722 g_value_unset (&value);
1724 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "tRuE", &value, &error));
1725 g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
1726 g_assert (g_value_get_boolean (&value) == TRUE);
1727 g_value_unset (&value);
1729 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "blaurgh", &value, &error) == FALSE);
1730 g_assert (error != NULL);
1731 g_value_unset (&value);
1732 g_assert (error->domain == GTK_BUILDER_ERROR);
1733 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
1734 g_error_free (error);
1737 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yess", &value, &error) == FALSE);
1738 g_value_unset (&value);
1739 g_assert (error->domain == GTK_BUILDER_ERROR);
1740 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
1741 g_error_free (error);
1744 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "trueee", &value, &error) == FALSE);
1745 g_value_unset (&value);
1746 g_assert (error->domain == GTK_BUILDER_ERROR);
1747 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
1748 g_error_free (error);
1751 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "", &value, &error) == FALSE);
1752 g_value_unset (&value);
1753 g_assert (error->domain == GTK_BUILDER_ERROR);
1754 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
1755 g_error_free (error);
1758 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "12345", &value, &error));
1759 g_assert (G_VALUE_HOLDS_INT (&value));
1760 g_assert (g_value_get_int (&value) == 12345);
1761 g_value_unset (&value);
1763 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_LONG, "9912345", &value, &error));
1764 g_assert (G_VALUE_HOLDS_LONG (&value));
1765 g_assert (g_value_get_long (&value) == 9912345);
1766 g_value_unset (&value);
1768 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_UINT, "2345", &value, &error));
1769 g_assert (G_VALUE_HOLDS_UINT (&value));
1770 g_assert (g_value_get_uint (&value) == 2345);
1771 g_value_unset (&value);
1773 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "1.454", &value, &error));
1774 g_assert (G_VALUE_HOLDS_FLOAT (&value));
1775 g_assert (fabs (g_value_get_float (&value) - 1.454) < 0.00001);
1776 g_value_unset (&value);
1778 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "abc", &value, &error) == FALSE);
1779 g_value_unset (&value);
1780 g_assert (error->domain == GTK_BUILDER_ERROR);
1781 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
1782 g_error_free (error);
1785 g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "/-+,abc", &value, &error) == FALSE);
1786 g_value_unset (&value);
1787 g_assert (error->domain == GTK_BUILDER_ERROR);
1788 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
1789 g_error_free (error);
1792 g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "toplevel", &value, &error) == TRUE);
1793 g_assert (G_VALUE_HOLDS_ENUM (&value));
1794 g_assert (g_value_get_enum (&value) == GTK_WINDOW_TOPLEVEL);
1795 g_value_unset (&value);
1797 g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "sliff", &value, &error) == FALSE);
1798 g_value_unset (&value);
1799 g_assert (error->domain == GTK_BUILDER_ERROR);
1800 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
1801 g_error_free (error);
1804 g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WIDGET_FLAGS, "mapped", &value, &error) == TRUE);
1805 g_assert (G_VALUE_HOLDS_FLAGS (&value));
1806 g_assert (g_value_get_flags (&value) == GTK_MAPPED);
1807 g_value_unset (&value);
1809 g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WIDGET_FLAGS, "GTK_VISIBLE | GTK_REALIZED", &value, &error) == TRUE);
1810 g_assert (G_VALUE_HOLDS_FLAGS (&value));
1811 g_assert (g_value_get_flags (&value) == (GTK_VISIBLE | GTK_REALIZED));
1812 g_value_unset (&value);
1814 g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "foobar", &value, &error) == FALSE);
1815 g_value_unset (&value);
1816 g_assert (error->domain == GTK_BUILDER_ERROR);
1817 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
1818 g_error_free (error);
1821 g_object_unref (builder);
1824 static gboolean model_freed = FALSE;
1827 model_weakref (gpointer data,
1834 test_reference_counting (void)
1836 GtkBuilder *builder;
1837 const gchar buffer1[] =
1839 " <object class=\"GtkListStore\" id=\"liststore1\"/>"
1840 " <object class=\"GtkListStore\" id=\"liststore2\"/>"
1841 " <object class=\"GtkWindow\" id=\"window1\">"
1843 " <object class=\"GtkTreeView\" id=\"treeview1\">"
1844 " <property name=\"model\">liststore1</property>"
1849 const gchar buffer2[] =
1851 " <object class=\"GtkVBox\" id=\"vbox1\">"
1853 " <object class=\"GtkLabel\" id=\"label1\"/>"
1855 " <property name=\"pack-type\">start</property>"
1860 GObject *window, *treeview, *model;
1862 builder = builder_new_from_string (buffer1, -1, NULL);
1863 window = gtk_builder_get_object (builder, "window1");
1864 treeview = gtk_builder_get_object (builder, "treeview1");
1865 model = gtk_builder_get_object (builder, "liststore1");
1866 g_object_unref (builder);
1868 g_object_weak_ref (model, (GWeakNotify)model_weakref, NULL);
1870 g_assert (model_freed == FALSE);
1871 gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), NULL);
1872 g_assert (model_freed == TRUE);
1874 gtk_widget_destroy (GTK_WIDGET (window));
1876 builder = builder_new_from_string (buffer2, -1, NULL);
1877 g_object_unref (builder);
1881 test_icon_factory (void)
1883 GtkBuilder *builder;
1884 const gchar buffer1[] =
1886 " <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
1888 " <source stock-id=\"apple-red\" filename=\"apple-red.png\"/>"
1892 const gchar buffer2[] =
1894 " <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
1896 " <source stock-id=\"sliff\" direction=\"rtl\" state=\"active\""
1897 " size=\"menu\" filename=\"sloff.png\"/>"
1898 " <source stock-id=\"sliff\" direction=\"ltr\" state=\"selected\""
1899 " size=\"dnd\" filename=\"slurf.png\"/>"
1904 const gchar buffer3[] =
1906 " <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
1910 const gchar buffer4[] =
1912 " <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
1918 const gchar buffer5[] =
1920 " <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
1926 GError *error = NULL;
1929 GtkIconSet *icon_set;
1930 GtkIconSource *icon_source;
1933 builder = builder_new_from_string (buffer1, -1, NULL);
1934 factory = gtk_builder_get_object (builder, "iconfactory1");
1935 g_assert (factory != NULL);
1937 icon_set = gtk_icon_factory_lookup (GTK_ICON_FACTORY (factory), "apple-red");
1938 g_assert (icon_set != NULL);
1939 gtk_icon_factory_add_default (GTK_ICON_FACTORY (factory));
1940 image = gtk_image_new_from_stock ("apple-red", GTK_ICON_SIZE_BUTTON);
1941 g_assert (image != NULL);
1943 g_object_unref (builder);
1945 builder = builder_new_from_string (buffer2, -1, NULL);
1946 factory = gtk_builder_get_object (builder, "iconfactory1");
1947 g_assert (factory != NULL);
1949 icon_set = gtk_icon_factory_lookup (GTK_ICON_FACTORY (factory), "sliff");
1950 g_assert (icon_set != NULL);
1951 g_assert (g_slist_length (icon_set->sources) == 2);
1953 icon_source = icon_set->sources->data;
1954 g_assert (gtk_icon_source_get_direction (icon_source) == GTK_TEXT_DIR_RTL);
1955 g_assert (gtk_icon_source_get_state (icon_source) == GTK_STATE_ACTIVE);
1956 g_assert (gtk_icon_source_get_size (icon_source) == GTK_ICON_SIZE_MENU);
1957 g_assert (g_str_has_suffix (gtk_icon_source_get_filename (icon_source), "sloff.png"));
1959 icon_source = icon_set->sources->next->data;
1960 g_assert (gtk_icon_source_get_direction (icon_source) == GTK_TEXT_DIR_LTR);
1961 g_assert (gtk_icon_source_get_state (icon_source) == GTK_STATE_SELECTED);
1962 g_assert (gtk_icon_source_get_size (icon_source) == GTK_ICON_SIZE_DND);
1963 g_assert (g_str_has_suffix (gtk_icon_source_get_filename (icon_source), "slurf.png"));
1965 g_object_unref (builder);
1969 gtk_builder_add_from_string (builder, buffer3, -1, &error);
1970 g_assert (error != NULL);
1971 g_assert (error->domain == GTK_BUILDER_ERROR);
1972 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_TAG);
1973 g_error_free (error);
1976 gtk_builder_add_from_string (builder, buffer4, -1, &error);
1977 g_assert (error != NULL);
1978 g_assert (error->domain == GTK_BUILDER_ERROR);
1979 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_TAG);
1980 g_error_free (error);
1983 gtk_builder_add_from_string (builder, buffer5, -1, &error);
1984 g_assert (error != NULL);
1985 g_assert (error->domain == GTK_BUILDER_ERROR);
1986 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_ATTRIBUTE);
1987 g_error_free (error);
1994 gboolean foreground;
2002 filter_pango_attrs (PangoAttribute *attr,
2005 FoundAttrs *found = (FoundAttrs *)data;
2007 if (attr->klass->type == PANGO_ATTR_WEIGHT)
2008 found->weight = TRUE;
2009 else if (attr->klass->type == PANGO_ATTR_FOREGROUND)
2010 found->foreground = TRUE;
2011 else if (attr->klass->type == PANGO_ATTR_UNDERLINE)
2012 found->underline = TRUE;
2013 /* Make sure optional start/end properties are working */
2014 else if (attr->klass->type == PANGO_ATTR_SIZE &&
2015 attr->start_index == 5 &&
2016 attr->end_index == 10)
2018 else if (attr->klass->type == PANGO_ATTR_FONT_DESC)
2019 found->font_desc = TRUE;
2020 else if (attr->klass->type == PANGO_ATTR_LANGUAGE)
2021 found->language = TRUE;
2027 test_pango_attributes (void)
2029 GtkBuilder *builder;
2030 FoundAttrs found = { 0, };
2031 const gchar buffer[] =
2033 " <object class=\"GtkLabel\" id=\"label1\">"
2035 " <attribute name=\"weight\" value=\"PANGO_WEIGHT_BOLD\"/>"
2036 " <attribute name=\"foreground\" value=\"DarkSlateGray\"/>"
2037 " <attribute name=\"underline\" value=\"True\"/>"
2038 " <attribute name=\"size\" value=\"4\" start=\"5\" end=\"10\"/>"
2039 " <attribute name=\"font-desc\" value=\"Sans Italic 22\"/>"
2040 " <attribute name=\"language\" value=\"pt_BR\"/>"
2044 const gchar err_buffer1[] =
2046 " <object class=\"GtkLabel\" id=\"label1\">"
2048 " <attribute name=\"weight\"/>"
2052 const gchar err_buffer2[] =
2054 " <object class=\"GtkLabel\" id=\"label1\">"
2056 " <attribute name=\"weight\" value=\"PANGO_WEIGHT_BOLD\" unrecognized=\"True\"/>"
2062 GError *error = NULL;
2063 PangoAttrList *attrs, *filtered;
2065 /* Test attributes are set */
2066 builder = builder_new_from_string (buffer, -1, NULL);
2067 label = gtk_builder_get_object (builder, "label1");
2068 g_assert (label != NULL);
2070 attrs = gtk_label_get_attributes (GTK_LABEL (label));
2071 g_assert (attrs != NULL);
2073 filtered = pango_attr_list_filter (attrs, filter_pango_attrs, &found);
2074 g_assert (filtered);
2075 pango_attr_list_unref (filtered);
2077 g_assert (found.weight);
2078 g_assert (found.foreground);
2079 g_assert (found.underline);
2080 g_assert (found.size);
2081 g_assert (found.language);
2082 g_assert (found.font_desc);
2084 g_object_unref (builder);
2086 /* Test errors are set */
2087 builder = gtk_builder_new ();
2088 gtk_builder_add_from_string (builder, err_buffer1, -1, &error);
2089 label = gtk_builder_get_object (builder, "label1");
2091 g_assert (error->domain == GTK_BUILDER_ERROR);
2092 g_assert (error->code == GTK_BUILDER_ERROR_MISSING_ATTRIBUTE);
2093 g_object_unref (builder);
2094 g_error_free (error);
2097 builder = gtk_builder_new ();
2098 gtk_builder_add_from_string (builder, err_buffer2, -1, &error);
2099 label = gtk_builder_get_object (builder, "label1");
2102 g_assert (error->domain == GTK_BUILDER_ERROR);
2103 g_assert (error->code == GTK_BUILDER_ERROR_INVALID_ATTRIBUTE);
2104 g_object_unref (builder);
2105 g_error_free (error);
2109 test_requires (void)
2111 GtkBuilder *builder;
2112 GError *error = NULL;
2114 const gchar buffer_fmt[] =
2116 " <requires lib=\"gtk+\" version=\"%d.%d\"/>"
2119 buffer = g_strdup_printf (buffer_fmt, GTK_MAJOR_VERSION, GTK_MINOR_VERSION + 1);
2120 builder = gtk_builder_new ();
2121 gtk_builder_add_from_string (builder, buffer, -1, &error);
2123 g_assert (error->domain == GTK_BUILDER_ERROR);
2124 g_assert (error->code == GTK_BUILDER_ERROR_VERSION_MISMATCH);
2125 g_object_unref (builder);
2126 g_error_free (error);
2130 test_add_objects (void)
2132 GtkBuilder *builder;
2136 GtkUIManager *manager;
2138 GObject *menu, *label;
2140 gchar *objects[2] = {"mainbox", NULL};
2141 gchar *objects2[3] = {"mainbox", "window2", NULL};
2142 gchar *objects3[3] = {"uimgr1", "menubar1"};
2143 gchar *objects4[2] = {"uimgr1", NULL};
2144 const gchar buffer[] =
2146 " <object class=\"GtkWindow\" id=\"window\">"
2148 " <object class=\"GtkVBox\" id=\"mainbox\">"
2149 " <property name=\"visible\">True</property>"
2151 " <object class=\"GtkLabel\" id=\"label1\">"
2152 " <property name=\"visible\">True</property>"
2153 " <property name=\"label\" translatable=\"no\">first label</property>"
2157 " <object class=\"GtkLabel\" id=\"label2\">"
2158 " <property name=\"visible\">True</property>"
2159 " <property name=\"label\" translatable=\"no\">second label</property>"
2162 " <property name=\"position\">1</property>"
2168 " <object class=\"GtkWindow\" id=\"window2\">"
2170 " <object class=\"GtkLabel\" id=\"label1\">"
2171 " <property name=\"label\" translatable=\"no\">second label</property>"
2176 const gchar buffer2[] =
2178 " <object class=\"GtkUIManager\" id=\"uimgr1\">"
2180 " <object class=\"GtkActionGroup\" id=\"ag1\">"
2182 " <object class=\"GtkAction\" id=\"file\">"
2183 " <property name=\"label\">_File</property>"
2185 " <accelerator key=\"n\" modifiers=\"GDK_CONTROL_MASK\"/>"
2190 " <menubar name=\"menubar1\">"
2191 " <menu action=\"file\">"
2196 " <object class=\"GtkWindow\" id=\"window1\">"
2198 " <object class=\"GtkMenuBar\" id=\"menubar1\" constructor=\"uimgr1\"/>"
2204 builder = gtk_builder_new ();
2205 ret = gtk_builder_add_objects_from_string (builder, buffer, -1, objects, &error);
2207 g_assert (error == NULL);
2208 obj = gtk_builder_get_object (builder, "window");
2209 g_assert (obj == NULL);
2210 obj = gtk_builder_get_object (builder, "window2");
2211 g_assert (obj == NULL);
2212 obj = gtk_builder_get_object (builder, "mainbox");
2213 g_assert (GTK_IS_WIDGET (obj));
2214 g_object_unref (builder);
2217 builder = gtk_builder_new ();
2218 ret = gtk_builder_add_objects_from_string (builder, buffer, -1, objects2, &error);
2220 g_assert (error == NULL);
2221 obj = gtk_builder_get_object (builder, "window");
2222 g_assert (obj == NULL);
2223 obj = gtk_builder_get_object (builder, "window2");
2224 g_assert (GTK_IS_WINDOW (obj));
2225 gtk_widget_destroy (GTK_WIDGET (obj));
2226 obj = gtk_builder_get_object (builder, "mainbox");
2227 g_assert (GTK_IS_WIDGET (obj));
2228 g_object_unref (builder);
2230 /* test cherry picking a ui manager and menubar that depends on it */
2232 builder = gtk_builder_new ();
2233 ret = gtk_builder_add_objects_from_string (builder, buffer2, -1, objects3, &error);
2235 obj = gtk_builder_get_object (builder, "uimgr1");
2236 g_assert (GTK_IS_UI_MANAGER (obj));
2237 obj = gtk_builder_get_object (builder, "file");
2238 g_assert (GTK_IS_ACTION (obj));
2239 obj = gtk_builder_get_object (builder, "menubar1");
2240 g_assert (GTK_IS_MENU_BAR (obj));
2241 menubar = GTK_WIDGET (obj);
2243 children = gtk_container_get_children (GTK_CONTAINER (menubar));
2244 menu = children->data;
2245 g_assert (menu != NULL);
2246 g_assert (GTK_IS_MENU_ITEM (menu));
2247 g_assert (strcmp (GTK_WIDGET (menu)->name, "file") == 0);
2248 g_list_free (children);
2250 label = G_OBJECT (GTK_BIN (menu)->child);
2251 g_assert (label != NULL);
2252 g_assert (GTK_IS_LABEL (label));
2253 g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0);
2255 g_object_unref (builder);
2257 /* test cherry picking just the ui manager */
2259 builder = gtk_builder_new ();
2260 ret = gtk_builder_add_objects_from_string (builder, buffer2, -1, objects4, &error);
2262 obj = gtk_builder_get_object (builder, "uimgr1");
2263 g_assert (GTK_IS_UI_MANAGER (obj));
2264 manager = GTK_UI_MANAGER (obj);
2265 obj = gtk_builder_get_object (builder, "file");
2266 g_assert (GTK_IS_ACTION (obj));
2267 menubar = gtk_ui_manager_get_widget (manager, "/menubar1");
2268 g_assert (GTK_IS_MENU_BAR (menubar));
2270 children = gtk_container_get_children (GTK_CONTAINER (menubar));
2271 menu = children->data;
2272 g_assert (menu != NULL);
2273 g_assert (GTK_IS_MENU_ITEM (menu));
2274 g_assert (strcmp (GTK_WIDGET (menu)->name, "file") == 0);
2275 g_list_free (children);
2277 label = G_OBJECT (GTK_BIN (menu)->child);
2278 g_assert (label != NULL);
2279 g_assert (GTK_IS_LABEL (label));
2280 g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0);
2282 g_object_unref (builder);
2286 get_parent_menubar (GtkWidget *menuitem)
2288 GtkMenuShell *menu_shell = (GtkMenuShell *)menuitem->parent;
2289 GtkWidget *attach = NULL;
2291 g_assert (GTK_IS_MENU_SHELL (menu_shell));
2293 while (menu_shell && !GTK_IS_MENU_BAR (menu_shell))
2295 if (GTK_IS_MENU (menu_shell) &&
2296 (attach = gtk_menu_get_attach_widget (GTK_MENU (menu_shell))) != NULL)
2297 menu_shell = (GtkMenuShell *)attach->parent;
2302 return menu_shell ? GTK_WIDGET (menu_shell) : NULL;
2310 " <object class=\"GtkWindow\" id=\"window1\">"
2312 " <group name=\"accelgroup1\"/>"
2315 " <object class=\"GtkVBox\" id=\"vbox1\">"
2316 " <property name=\"visible\">True</property>"
2317 " <property name=\"orientation\">vertical</property>"
2319 " <object class=\"GtkMenuBar\" id=\"menubar1\">"
2320 " <property name=\"visible\">True</property>"
2322 " <object class=\"GtkMenuItem\" id=\"menuitem1\">"
2323 " <property name=\"visible\">True</property>"
2324 " <property name=\"label\" translatable=\"yes\">_File</property>"
2325 " <property name=\"use_underline\">True</property>"
2326 " <child type=\"submenu\">"
2327 " <object class=\"GtkMenu\" id=\"menu1\">"
2328 " <property name=\"visible\">True</property>"
2330 " <object class=\"GtkImageMenuItem\" id=\"imagemenuitem1\">"
2331 " <property name=\"label\">gtk-new</property>"
2332 " <property name=\"visible\">True</property>"
2333 " <property name=\"use_stock\">True</property>"
2334 " <property name=\"accel_group\">accelgroup1</property>"
2346 "<object class=\"GtkAccelGroup\" id=\"accelgroup1\"/>"
2351 " <object class=\"GtkWindow\" id=\"window1\">"
2353 " <group name=\"accelgroup1\"/>"
2356 " <object class=\"GtkVBox\" id=\"vbox1\">"
2357 " <property name=\"visible\">True</property>"
2358 " <property name=\"orientation\">vertical</property>"
2360 " <object class=\"GtkMenuBar\" id=\"menubar1\">"
2361 " <property name=\"visible\">True</property>"
2363 " <object class=\"GtkImageMenuItem\" id=\"imagemenuitem1\">"
2364 " <property name=\"visible\">True</property>"
2366 " <object class=\"GtkLabel\" id=\"custom1\">"
2367 " <property name=\"visible\">True</property>"
2368 " <property name=\"label\">a label</property>"
2378 "<object class=\"GtkAccelGroup\" id=\"accelgroup1\"/>"
2380 GtkBuilder *builder;
2381 GtkWidget *window, *item;
2382 GtkAccelGroup *accel_group;
2383 GtkWidget *item_accel_label, *sample_accel_label, *sample_menu_item, *custom;
2385 /* Check that the item has the correct accel label string set
2387 builder = builder_new_from_string (buffer, -1, NULL);
2388 window = (GtkWidget *)gtk_builder_get_object (builder, "window1");
2389 item = (GtkWidget *)gtk_builder_get_object (builder, "imagemenuitem1");
2390 accel_group = (GtkAccelGroup *)gtk_builder_get_object (builder, "accelgroup1");
2392 gtk_widget_show_all (window);
2394 sample_menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
2396 g_assert (GTK_BIN (sample_menu_item)->child);
2397 g_assert (GTK_IS_ACCEL_LABEL (GTK_BIN (sample_menu_item)->child));
2398 sample_accel_label = GTK_WIDGET (GTK_BIN (sample_menu_item)->child);
2399 gtk_widget_show (sample_accel_label);
2401 g_assert (GTK_BIN (item)->child);
2402 g_assert (GTK_IS_ACCEL_LABEL (GTK_BIN (item)->child));
2403 item_accel_label = GTK_WIDGET (GTK_BIN (item)->child);
2405 gtk_accel_label_refetch (GTK_ACCEL_LABEL (sample_accel_label));
2406 gtk_accel_label_refetch (GTK_ACCEL_LABEL (item_accel_label));
2408 g_assert (GTK_ACCEL_LABEL (sample_accel_label)->accel_string != NULL);
2409 g_assert (GTK_ACCEL_LABEL (item_accel_label)->accel_string != NULL);
2410 g_assert (strcmp (GTK_ACCEL_LABEL (item_accel_label)->accel_string,
2411 GTK_ACCEL_LABEL (sample_accel_label)->accel_string) == 0);
2413 /* Check the menu hierarchy worked here */
2414 g_assert (get_parent_menubar (item));
2416 gtk_widget_destroy (GTK_WIDGET (window));
2417 gtk_widget_destroy (sample_menu_item);
2418 g_object_unref (builder);
2421 /* Check that we can add alien children to menu items via normal
2422 * GtkContainer apis.
2424 builder = builder_new_from_string (buffer1, -1, NULL);
2425 window = (GtkWidget *)gtk_builder_get_object (builder, "window1");
2426 item = (GtkWidget *)gtk_builder_get_object (builder, "imagemenuitem1");
2427 custom = (GtkWidget *)gtk_builder_get_object (builder, "custom1");
2429 g_assert (custom->parent == item);
2431 gtk_widget_destroy (GTK_WIDGET (window));
2432 g_object_unref (builder);
2438 test_file (const gchar *filename)
2440 GtkBuilder *builder;
2441 GError *error = NULL;
2442 GSList *l, *objects;
2444 builder = gtk_builder_new ();
2446 if (!gtk_builder_add_from_file (builder, filename, &error))
2448 g_error ("%s", error->message);
2449 g_error_free (error);
2453 objects = gtk_builder_get_objects (builder);
2454 for (l = objects; l; l = l->next)
2456 GObject *obj = (GObject*)l->data;
2458 if (GTK_IS_DIALOG (obj))
2462 g_print ("Running dialog %s.\n",
2463 gtk_widget_get_name (GTK_WIDGET (obj)));
2464 response = gtk_dialog_run (GTK_DIALOG (obj));
2466 else if (GTK_IS_WINDOW (obj))
2468 g_signal_connect (obj, "destroy", G_CALLBACK (gtk_main_quit), NULL);
2469 g_print ("Showing %s.\n",
2470 gtk_widget_get_name (GTK_WIDGET (obj)));
2471 gtk_widget_show_all (GTK_WIDGET (obj));
2477 g_object_unref (builder);
2482 main (int argc, char **argv)
2484 /* initialize test program */
2485 gtk_test_init (&argc, &argv);
2489 test_file (argv[1]);
2493 g_test_add_func ("/Builder/Parser", test_parser);
2494 g_test_add_func ("/Builder/Types", test_types);
2495 g_test_add_func ("/Builder/Construct-Only Properties", test_construct_only_property);
2496 g_test_add_func ("/Builder/Children", test_children);
2497 g_test_add_func ("/Builder/Child Properties", test_child_properties);
2498 g_test_add_func ("/Builder/Object Properties", test_object_properties);
2499 g_test_add_func ("/Builder/Notebook", test_notebook);
2500 g_test_add_func ("/Builder/Domain", test_domain);
2501 g_test_add_func ("/Builder/Signal Autoconnect", test_connect_signals);
2502 g_test_add_func ("/Builder/UIManager Simple", test_uimanager_simple);
2503 g_test_add_func ("/Builder/Spin Button", test_spin_button);
2504 g_test_add_func ("/Builder/SizeGroup", test_sizegroup);
2505 g_test_add_func ("/Builder/ListStore", test_list_store);
2506 g_test_add_func ("/Builder/TreeStore", test_tree_store);
2507 g_test_add_func ("/Builder/TreeView Column", test_treeview_column);
2508 g_test_add_func ("/Builder/IconView", test_icon_view);
2509 g_test_add_func ("/Builder/ComboBox", test_combo_box);
2510 g_test_add_func ("/Builder/ComboBox Entry", test_combo_box_entry);
2511 g_test_add_func ("/Builder/CellView", test_cell_view);
2512 g_test_add_func ("/Builder/Dialog", test_dialog);
2513 g_test_add_func ("/Builder/Accelerators", test_accelerators);
2514 g_test_add_func ("/Builder/Widget", test_widget);
2515 g_test_add_func ("/Builder/Value From String", test_value_from_string);
2516 g_test_add_func ("/Builder/Reference Counting", test_reference_counting);
2517 g_test_add_func ("/Builder/Window", test_window);
2518 g_test_add_func ("/Builder/IconFactory", test_icon_factory);
2519 g_test_add_func ("/Builder/PangoAttributes", test_pango_attributes);
2520 g_test_add_func ("/Builder/Requires", test_requires);
2521 g_test_add_func ("/Builder/AddObjects", test_add_objects);
2522 g_test_add_func ("/Builder/Menus", test_menus);
2524 return g_test_run();