/* buildertest.c * Copyright (C) 2006-2007 Async Open Source * Authors: Johan Dahlin * Henrique Romano * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include /* Copied from gtkiconfactory.c; keep in sync! */ struct _GtkIconSet { guint ref_count; GSList *sources; GSList *cache; guint cache_size; guint cache_serial; }; static GtkBuilder * builder_new_from_string (const gchar *buffer, gsize length, const gchar *domain) { GtkBuilder *builder; builder = gtk_builder_new (); if (domain) gtk_builder_set_translation_domain (builder, domain); gtk_builder_add_from_string (builder, buffer, length, NULL); return builder; } static void test_parser (void) { GtkBuilder *builder; GError *error; builder = gtk_builder_new (); error = NULL; gtk_builder_add_from_string (builder, "", -1, &error); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_UNHANDLED_TAG)); g_error_free (error); error = NULL; gtk_builder_add_from_string (builder, "", -1, &error); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_ATTRIBUTE)); g_error_free (error); error = NULL; gtk_builder_add_from_string (builder, "", -1, &error); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_TAG)); g_error_free (error); error = NULL; gtk_builder_add_from_string (builder, "", -1, &error); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_TAG)); g_error_free (error); error = NULL; gtk_builder_add_from_string (builder, "", -1, &error); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE)); g_error_free (error); error = NULL; gtk_builder_add_from_string (builder, "", -1, &error); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE)); g_error_free (error); error = NULL; gtk_builder_add_from_string (builder, "", -1, &error); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE)); g_error_free (error); g_object_unref (builder); } static int normal = 0; static int after = 0; static int object = 0; static int object_after = 0; void /* exported for GtkBuilder */ signal_normal (GtkWindow *window, GParamSpec spec) { g_assert (GTK_IS_WINDOW (window)); g_assert (normal == 0); g_assert (after == 0); normal++; } void /* exported for GtkBuilder */ signal_after (GtkWindow *window, GParamSpec spec) { g_assert (GTK_IS_WINDOW (window)); g_assert (normal == 1); g_assert (after == 0); after++; } void /* exported for GtkBuilder */ signal_object (GtkButton *button, GParamSpec spec) { g_assert (GTK_IS_BUTTON (button)); g_assert (object == 0); g_assert (object_after == 0); object++; } void /* exported for GtkBuilder */ signal_object_after (GtkButton *button, GParamSpec spec) { g_assert (GTK_IS_BUTTON (button)); g_assert (object == 1); g_assert (object_after == 0); object_after++; } void /* exported for GtkBuilder */ signal_first (GtkButton *button, GParamSpec spec) { g_assert (normal == 0); normal = 10; } void /* exported for GtkBuilder */ signal_second (GtkButton *button, GParamSpec spec) { g_assert (normal == 10); normal = 20; } void /* exported for GtkBuilder */ signal_extra (GtkButton *button, GParamSpec spec) { g_assert (normal == 20); normal = 30; } void /* exported for GtkBuilder */ signal_extra2 (GtkButton *button, GParamSpec spec) { g_assert (normal == 30); normal = 40; } static void test_connect_signals (void) { GtkBuilder *builder; GObject *window; const gchar buffer[] = "" " " " " " " " " " " " " " " ""; const gchar buffer_order[] = "" " " " " " " " " ""; const gchar buffer_extra[] = "" " " " " " " ""; const gchar buffer_extra2[] = "" " " " " " " ""; const gchar buffer_after_child[] = "" " " " " " " " " " " " " ""; builder = builder_new_from_string (buffer, -1, NULL); gtk_builder_connect_signals (builder, NULL); window = gtk_builder_get_object (builder, "window1"); gtk_window_set_title (GTK_WINDOW (window), "test"); g_assert_cmpint (normal, ==, 1); g_assert_cmpint (after, ==, 1); g_assert_cmpint (object, ==, 1); g_assert_cmpint (object_after, ==, 1); gtk_widget_destroy (GTK_WIDGET (window)); g_object_unref (builder); builder = builder_new_from_string (buffer_order, -1, NULL); gtk_builder_connect_signals (builder, NULL); window = gtk_builder_get_object (builder, "window1"); normal = 0; gtk_window_set_title (GTK_WINDOW (window), "test"); g_assert (normal == 20); gtk_widget_destroy (GTK_WIDGET (window)); gtk_builder_add_from_string (builder, buffer_extra, strlen (buffer_extra), NULL); gtk_builder_add_from_string (builder, buffer_extra2, strlen (buffer_extra2), NULL); gtk_builder_connect_signals (builder, NULL); window = gtk_builder_get_object (builder, "window2"); gtk_window_set_title (GTK_WINDOW (window), "test"); g_assert (normal == 30); gtk_widget_destroy (GTK_WIDGET (window)); window = gtk_builder_get_object (builder, "window3"); gtk_window_set_title (GTK_WINDOW (window), "test"); g_assert (normal == 40); gtk_widget_destroy (GTK_WIDGET (window)); g_object_unref (builder); /* new test, reset globals */ after = 0; normal = 0; builder = builder_new_from_string (buffer_after_child, -1, NULL); window = gtk_builder_get_object (builder, "window1"); gtk_builder_connect_signals (builder, NULL); gtk_window_set_title (GTK_WINDOW (window), "test"); g_assert (normal == 1); gtk_widget_destroy (GTK_WIDGET (window)); g_object_unref (builder); } static void test_uimanager_simple (void) { GtkBuilder *builder; GObject *window, *uimgr, *menubar; GObject *menu, *label; GList *children; const gchar buffer[] = "" " " ""; const gchar buffer2[] = "" " " " " " " " " " " " _File" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""; builder = builder_new_from_string (buffer, -1, NULL); uimgr = gtk_builder_get_object (builder, "uimgr1"); g_assert (GTK_IS_UI_MANAGER (uimgr)); g_object_unref (builder); builder = builder_new_from_string (buffer2, -1, NULL); menubar = gtk_builder_get_object (builder, "menubar1"); g_assert (GTK_IS_MENU_BAR (menubar)); children = gtk_container_get_children (GTK_CONTAINER (menubar)); menu = children->data; g_assert (GTK_IS_MENU_ITEM (menu)); g_assert (strcmp (GTK_WIDGET (menu)->name, "file") == 0); g_list_free (children); label = G_OBJECT (GTK_BIN (menu)->child); g_assert (GTK_IS_LABEL (label)); g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0); window = gtk_builder_get_object (builder, "window1"); gtk_widget_destroy (GTK_WIDGET (window)); g_object_unref (builder); } static void test_domain (void) { GtkBuilder *builder; const gchar buffer1[] = ""; const gchar buffer2[] = ""; const gchar *domain; builder = builder_new_from_string (buffer1, -1, NULL); domain = gtk_builder_get_translation_domain (builder); g_assert (domain == NULL); g_object_unref (builder); builder = builder_new_from_string (buffer1, -1, "domain-1"); domain = gtk_builder_get_translation_domain (builder); g_assert (domain); g_assert (strcmp (domain, "domain-1") == 0); g_object_unref (builder); builder = builder_new_from_string (buffer2, -1, NULL); domain = gtk_builder_get_translation_domain (builder); g_assert (domain == NULL); g_object_unref (builder); } #if 0 static void test_translation (void) { GtkBuilder *builder; const gchar buffer[] = "" " " " " " " " File" " " " " " " ""; GtkLabel *window, *label; setlocale (LC_ALL, "sv_SE"); textdomain ("builder"); bindtextdomain ("builder", "tests"); builder = builder_new_from_string (buffer, -1, NULL); label = GTK_LABEL (gtk_builder_get_object (builder, "label")); g_assert (strcmp (gtk_label_get_text (label), "Arkiv") == 0); window = gtk_builder_get_object (builder, "window1"); gtk_widget_destroy (GTK_WIDGET (window)); g_object_unref (builder); } #endif static void test_sizegroup (void) { GtkBuilder * builder; const gchar buffer1[] = "" " " " GTK_SIZE_GROUP_HORIZONTAL" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""; const gchar buffer2[] = "" " " " GTK_SIZE_GROUP_HORIZONTAL" " " " " " " ""; const gchar buffer3[] = "" " " " GTK_SIZE_GROUP_HORIZONTAL" " " " " " " " " " " " " " GTK_SIZE_GROUP_HORIZONTAL" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""; GObject *sizegroup; GSList *widgets; builder = builder_new_from_string (buffer1, -1, NULL); sizegroup = gtk_builder_get_object (builder, "sizegroup1"); widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup)); g_assert (g_slist_length (widgets) == 2); g_slist_free (widgets); g_object_unref (builder); builder = builder_new_from_string (buffer2, -1, NULL); sizegroup = gtk_builder_get_object (builder, "sizegroup1"); widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup)); g_assert (g_slist_length (widgets) == 0); g_slist_free (widgets); g_object_unref (builder); builder = builder_new_from_string (buffer3, -1, NULL); sizegroup = gtk_builder_get_object (builder, "sizegroup1"); widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup)); g_assert (g_slist_length (widgets) == 2); g_slist_free (widgets); sizegroup = gtk_builder_get_object (builder, "sizegroup2"); widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup)); g_assert (g_slist_length (widgets) == 2); g_slist_free (widgets); #if 0 { GObject *window; window = gtk_builder_get_object (builder, "window1"); gtk_widget_destroy (GTK_WIDGET (window)); } #endif g_object_unref (builder); } static void test_list_store (void) { const gchar buffer1[] = "" " " " " " " " " " " " " ""; const char buffer2[] = "" " " " " " " " " " " " " " " " " " John" " Doe" " 25" " " " " " Johan" " Dole" " 50" " " " " " " ""; const char buffer3[] = "" " " " " " " " " " " " " " " " " " Doe" " John" " 25" " " " " " 50" " Dole" " Johan" " " " " " 19" " " " " " " ""; GtkBuilder *builder; GObject *store; GtkTreeIter iter; gchar *surname, *lastname; int age; builder = builder_new_from_string (buffer1, -1, NULL); store = gtk_builder_get_object (builder, "liststore1"); g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 2); g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING); g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_UINT); g_object_unref (builder); builder = builder_new_from_string (buffer2, -1, NULL); store = gtk_builder_get_object (builder, "liststore1"); g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 3); g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING); g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_STRING); g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2) == G_TYPE_INT); g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter) == TRUE); gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &surname, 1, &lastname, 2, &age, -1); g_assert (surname != NULL); g_assert (strcmp (surname, "John") == 0); g_free (surname); g_assert (lastname != NULL); g_assert (strcmp (lastname, "Doe") == 0); g_free (lastname); g_assert (age == 25); g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE); gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &surname, 1, &lastname, 2, &age, -1); g_assert (surname != NULL); g_assert (strcmp (surname, "Johan") == 0); g_free (surname); g_assert (lastname != NULL); g_assert (strcmp (lastname, "Dole") == 0); g_free (lastname); g_assert (age == 50); g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == FALSE); g_object_unref (builder); builder = builder_new_from_string (buffer3, -1, NULL); store = gtk_builder_get_object (builder, "liststore1"); g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 3); g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING); g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_STRING); g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2) == G_TYPE_INT); g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter) == TRUE); gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &surname, 1, &lastname, 2, &age, -1); g_assert (surname != NULL); g_assert (strcmp (surname, "John") == 0); g_free (surname); g_assert (lastname != NULL); g_assert (strcmp (lastname, "Doe") == 0); g_free (lastname); g_assert (age == 25); g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE); gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &surname, 1, &lastname, 2, &age, -1); g_assert (surname != NULL); g_assert (strcmp (surname, "Johan") == 0); g_free (surname); g_assert (lastname != NULL); g_assert (strcmp (lastname, "Dole") == 0); g_free (lastname); g_assert (age == 50); g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE); gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &surname, 1, &lastname, 2, &age, -1); g_assert (surname == NULL); g_assert (lastname == NULL); g_assert (age == 19); g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == FALSE); g_object_unref (builder); } static void test_tree_store (void) { const gchar buffer[] = "" " " " " " " " " " " " " ""; GtkBuilder *builder; GObject *store; builder = builder_new_from_string (buffer, -1, NULL); store = gtk_builder_get_object (builder, "treestore1"); g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 2); g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING); g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_UINT); g_object_unref (builder); } static void test_types (void) { const gchar buffer[] = "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""; const gchar buffer2[] = "" " " ""; const gchar buffer3[] = "" " " ""; GtkBuilder *builder; GObject *window; GError *error; builder = builder_new_from_string (buffer, -1, NULL); gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "dialog"))); gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "window"))); g_object_unref (builder); builder = builder_new_from_string (buffer2, -1, NULL); window = gtk_builder_get_object (builder, "window"); g_assert (GTK_IS_WINDOW (window)); gtk_widget_destroy (GTK_WIDGET (window)); g_object_unref (builder); error = NULL; builder = gtk_builder_new (); gtk_builder_add_from_string (builder, buffer3, -1, &error); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_TYPE_FUNCTION)); g_error_free (error); g_object_unref (builder); } static void test_spin_button (void) { GtkBuilder *builder; const gchar buffer[] = "" "" "0" "10" "2" "3" "5" "1" "" "" "True" "adjustment1" "" ""; GObject *obj; GtkAdjustment *adjustment; gdouble value; builder = builder_new_from_string (buffer, -1, NULL); obj = gtk_builder_get_object (builder, "spinbutton1"); g_assert (GTK_IS_SPIN_BUTTON (obj)); adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (obj)); g_assert (GTK_IS_ADJUSTMENT (adjustment)); g_object_get (adjustment, "value", &value, NULL); g_assert (value == 1); g_object_get (adjustment, "lower", &value, NULL); g_assert (value == 0); g_object_get (adjustment, "upper", &value, NULL); g_assert (value == 10); g_object_get (adjustment, "step-increment", &value, NULL); g_assert (value == 2); g_object_get (adjustment, "page-increment", &value, NULL); g_assert (value == 3); g_object_get (adjustment, "page-size", &value, NULL); g_assert (value == 5); g_object_unref (builder); } static void test_notebook (void) { GtkBuilder *builder; const gchar buffer[] = "" " " " " " " " label1" " " " " " " " " " tab_label1" " " " " " " " " " label2" " " " " " " " " " tab_label2" " " " " " " ""; GObject *notebook; GtkWidget *label; builder = builder_new_from_string (buffer, -1, NULL); notebook = gtk_builder_get_object (builder, "notebook1"); g_assert (notebook != NULL); g_assert (gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)) == 2); label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 0); g_assert (GTK_IS_LABEL (label)); g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "label1") == 0); label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), label); g_assert (GTK_IS_LABEL (label)); g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "tab_label1") == 0); label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 1); g_assert (GTK_IS_LABEL (label)); g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "label2") == 0); label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), label); g_assert (GTK_IS_LABEL (label)); g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "tab_label2") == 0); g_object_unref (builder); } static void test_construct_only_property (void) { GtkBuilder *builder; const gchar buffer[] = "" " " " GTK_WINDOW_POPUP" " " ""; const gchar buffer2[] = "" " " " " " tagtable1" " " ""; GObject *widget, *tagtable, *textbuffer; GtkWindowType type; builder = builder_new_from_string (buffer, -1, NULL); widget = gtk_builder_get_object (builder, "window1"); g_object_get (widget, "type", &type, NULL); g_assert (type == GTK_WINDOW_POPUP); gtk_widget_destroy (GTK_WIDGET (widget)); g_object_unref (builder); builder = builder_new_from_string (buffer2, -1, NULL); textbuffer = gtk_builder_get_object (builder, "textbuffer1"); g_assert (textbuffer != NULL); g_object_get (textbuffer, "tag-table", &tagtable, NULL); g_assert (tagtable == gtk_builder_get_object (builder, "tagtable1")); g_object_unref (tagtable); g_object_unref (builder); } static void test_object_properties (void) { GtkBuilder *builder; const gchar buffer[] = "" " " " " " " " 10" " " " " " spinbutton1" " " " " " " " " " " " " " " " " ""; const gchar buffer2[] = "" " " ""; GObject *label, *spinbutton, *window; builder = builder_new_from_string (buffer, -1, NULL); label = gtk_builder_get_object (builder, "label1"); g_assert (label != NULL); spinbutton = gtk_builder_get_object (builder, "spinbutton1"); g_assert (spinbutton != NULL); g_assert (spinbutton == (GObject*)gtk_label_get_mnemonic_widget (GTK_LABEL (label))); gtk_builder_add_from_string (builder, buffer2, -1, NULL); window = gtk_builder_get_object (builder, "window2"); g_assert (window != NULL); gtk_widget_destroy (GTK_WIDGET (window)); g_object_unref (builder); } static void test_children (void) { GtkBuilder * builder; GList *children; const gchar buffer1[] = "" " " " " " " " Hello" " " " " " " ""; const gchar buffer2[] = "" " " " " " " " 10" " " " " " 20" " " " " " " " " " " ""; GObject *window, *button; GObject *dialog, *vbox, *action_area; builder = builder_new_from_string (buffer1, -1, NULL); window = gtk_builder_get_object (builder, "window1"); g_assert (window != NULL); g_assert (GTK_IS_WINDOW (window)); button = gtk_builder_get_object (builder, "button1"); g_assert (button != NULL); g_assert (GTK_IS_BUTTON (button)); g_assert (strcmp (GTK_WIDGET (GTK_WIDGET (button)->parent)->name, "window1") == 0); gtk_widget_destroy (GTK_WIDGET (window)); g_object_unref (builder); builder = builder_new_from_string (buffer2, -1, NULL); dialog = gtk_builder_get_object (builder, "dialog1"); g_assert (dialog != NULL); g_assert (GTK_IS_DIALOG (dialog)); children = gtk_container_get_children (GTK_CONTAINER (dialog)); g_assert (g_list_length (children) == 1); g_list_free (children); vbox = gtk_builder_get_object (builder, "dialog1-vbox"); g_assert (vbox != NULL); g_assert (GTK_IS_VBOX (vbox)); g_assert (GTK_WIDGET (vbox)->parent != NULL); g_assert (strcmp (GTK_WIDGET (GTK_WIDGET (vbox)->parent)->name, "dialog1") == 0); g_assert (GTK_CONTAINER (vbox)->border_width == 10); g_assert (strcmp (GTK_WIDGET (GTK_DIALOG (dialog)->vbox)->name, "dialog1-vbox") == 0); action_area = gtk_builder_get_object (builder, "dialog1-action_area"); g_assert (action_area != NULL); g_assert (GTK_IS_HBUTTON_BOX (action_area)); g_assert (GTK_WIDGET (action_area)->parent != NULL); g_assert (GTK_CONTAINER (action_area)->border_width == 20); g_assert (GTK_DIALOG (dialog)->action_area != NULL); g_assert (GTK_WIDGET (GTK_DIALOG (dialog)->action_area)->name != NULL); g_assert (strcmp (GTK_WIDGET (GTK_DIALOG (dialog)->action_area)->name, "dialog1-action_area") == 0); gtk_widget_destroy (GTK_WIDGET (dialog)); g_object_unref (builder); } static void test_child_properties (void) { GtkBuilder * builder; const gchar buffer1[] = "" " " " " " " " " " start" " " " " " " " " " " " end" " " " " " " ""; GObject *label, *vbox; GtkPackType pack_type; builder = builder_new_from_string (buffer1, -1, NULL); vbox = gtk_builder_get_object (builder, "vbox1"); g_assert (GTK_IS_VBOX (vbox)); label = gtk_builder_get_object (builder, "label1"); g_assert (GTK_IS_LABEL (label)); gtk_container_child_get (GTK_CONTAINER (vbox), GTK_WIDGET (label), "pack-type", &pack_type, NULL); g_assert (pack_type == GTK_PACK_START); label = gtk_builder_get_object (builder, "label2"); g_assert (GTK_IS_LABEL (label)); gtk_container_child_get (GTK_CONTAINER (vbox), GTK_WIDGET (label), "pack-type", &pack_type, NULL); g_assert (pack_type == GTK_PACK_END); g_object_unref (builder); } static void test_treeview_column (void) { GtkBuilder *builder; const gchar buffer[] = "" "" " " " " " " " " " " " " " John" " 25" " " " " "" "" " " " " " True" " liststore1" " " " " " Test" " " " " " " " 1" " " " " " " " " " " " " " Number" " " " " " " " 0" " " " " " " " " " " " " "" ""; GObject *window, *treeview; GtkTreeViewColumn *column; GList *renderers; GObject *renderer; gchar *text; builder = builder_new_from_string (buffer, -1, NULL); treeview = gtk_builder_get_object (builder, "treeview1"); g_assert (treeview); g_assert (GTK_IS_TREE_VIEW (treeview)); column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), 0); g_assert (GTK_IS_TREE_VIEW_COLUMN (column)); g_assert (strcmp (gtk_tree_view_column_get_title (column), "Test") == 0); renderers = gtk_tree_view_column_get_cell_renderers (column); g_assert (g_list_length (renderers) == 1); renderer = g_list_nth_data (renderers, 0); g_assert (renderer); g_assert (GTK_IS_CELL_RENDERER_TEXT (renderer)); g_list_free (renderers); gtk_widget_realize (GTK_WIDGET (treeview)); renderer = gtk_builder_get_object (builder, "renderer1"); g_object_get (renderer, "text", &text, NULL); g_assert (text); g_assert (strcmp (text, "25") == 0); g_free (text); renderer = gtk_builder_get_object (builder, "renderer2"); g_object_get (renderer, "text", &text, NULL); g_assert (text); g_assert (strcmp (text, "John") == 0); g_free (text); gtk_widget_unrealize (GTK_WIDGET (treeview)); window = gtk_builder_get_object (builder, "window1"); gtk_widget_destroy (GTK_WIDGET (window)); g_object_unref (builder); } static void test_icon_view (void) { GtkBuilder *builder; const gchar buffer[] = "" " " " " " " " " " " " " " " " test" " " " " " " " " " " " " " liststore1" " 0" " 1" " True" " " " " " " " 0" " " " " " " " " " " ""; GObject *window, *iconview, *renderer; gchar *text; builder = builder_new_from_string (buffer, -1, NULL); iconview = gtk_builder_get_object (builder, "iconview1"); g_assert (iconview); g_assert (GTK_IS_ICON_VIEW (iconview)); gtk_widget_realize (GTK_WIDGET (iconview)); renderer = gtk_builder_get_object (builder, "renderer1"); g_object_get (renderer, "text", &text, NULL); g_assert (text); g_assert (strcmp (text, "test") == 0); g_free (text); window = gtk_builder_get_object (builder, "window1"); gtk_widget_destroy (GTK_WIDGET (window)); g_object_unref (builder); } static void test_combo_box (void) { GtkBuilder *builder; const gchar buffer[] = "" " " " " " " " " " " " " " " " 1" " Foo" " " " " " 2" " Bar" " " " " " " " " " " " " " liststore1" " True" " " " " " " " 0" " " " " " " " " " " " 1" " " " " " " " " " " ""; GObject *window, *combobox, *renderer; gchar *text; builder = builder_new_from_string (buffer, -1, NULL); combobox = gtk_builder_get_object (builder, "combobox1"); g_assert (combobox); gtk_widget_realize (GTK_WIDGET (combobox)); renderer = gtk_builder_get_object (builder, "renderer2"); g_assert (renderer); g_object_get (renderer, "text", &text, NULL); g_assert (text); g_assert (strcmp (text, "Bar") == 0); g_free (text); renderer = gtk_builder_get_object (builder, "renderer1"); g_assert (renderer); g_object_get (renderer, "text", &text, NULL); g_assert (text); g_assert (strcmp (text, "2") == 0); g_free (text); window = gtk_builder_get_object (builder, "window1"); gtk_widget_destroy (GTK_WIDGET (window)); g_object_unref (builder); } static void test_combo_box_entry (void) { GtkBuilder *builder; const gchar buffer[] = "" " " " " " " " " " " " " " " " 1" " Foo" " " " " " 2" " Bar" " " " " " " " " " " " " " liststore1" " True" " " " " " " " 0" " " " " " " " " " " " 1" " " " " " " " " " " ""; GObject *window, *combobox, *renderer; gchar *text; builder = builder_new_from_string (buffer, -1, NULL); combobox = gtk_builder_get_object (builder, "comboboxentry1"); g_assert (combobox); renderer = gtk_builder_get_object (builder, "renderer2"); g_assert (renderer); g_object_get (renderer, "text", &text, NULL); g_assert (text); g_assert (strcmp (text, "Bar") == 0); g_free (text); renderer = gtk_builder_get_object (builder, "renderer1"); g_assert (renderer); g_object_get (renderer, "text", &text, NULL); g_assert (text); g_assert (strcmp (text, "2") == 0); g_free (text); window = gtk_builder_get_object (builder, "window1"); gtk_widget_destroy (GTK_WIDGET (window)); g_object_unref (builder); } static void test_cell_view (void) { GtkBuilder *builder; const gchar *buffer = "" " " " " " " " " " " " " " test" " " " " " " " " " " " " " True" " liststore1" " " " " " " " " " 0" " " " " " " " " " " ""; GObject *cellview; GObject *model, *window; GtkTreePath *path; GList *renderers; GObject *renderer; gchar *text; builder = builder_new_from_string (buffer, -1, NULL); cellview = gtk_builder_get_object (builder, "cellview1"); g_assert (builder); g_assert (cellview); g_assert (GTK_IS_CELL_VIEW (cellview)); g_object_get (cellview, "model", &model, NULL); g_assert (model); g_assert (GTK_IS_TREE_MODEL (model)); g_object_unref (model); path = gtk_tree_path_new_first (); gtk_cell_view_set_displayed_row (GTK_CELL_VIEW (cellview), path); renderers = gtk_cell_view_get_cell_renderers (GTK_CELL_VIEW (cellview)); g_assert (renderers); g_assert (g_list_length (renderers) == 1); gtk_widget_realize (GTK_WIDGET (cellview)); renderer = g_list_nth_data (renderers, 0); g_list_free (renderers); g_assert (renderer); g_object_get (renderer, "text", &text, NULL); g_assert (strcmp (text, "test") == 0); g_free (text); gtk_tree_path_free (path); window = gtk_builder_get_object (builder, "window1"); gtk_widget_destroy (GTK_WIDGET (window)); g_object_unref (builder); } static void test_dialog (void) { GtkBuilder * builder; const gchar buffer1[] = "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " button_ok" " button_cancel" " " " " ""; GObject *dialog1; GObject *button_ok; GObject *button_cancel; builder = builder_new_from_string (buffer1, -1, NULL); dialog1 = gtk_builder_get_object (builder, "dialog1"); button_ok = gtk_builder_get_object (builder, "button_ok"); g_assert (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_ok)) == 3); button_cancel = gtk_builder_get_object (builder, "button_cancel"); g_assert (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_cancel)) == -5); gtk_widget_destroy (GTK_WIDGET (dialog1)); g_object_unref (builder); } static void test_accelerators (void) { GtkBuilder *builder; const gchar *buffer = "" " " " " " " " " " " " " " " ""; const gchar *buffer2 = "" " " " " " " " " " " " " " " " " ""; GObject *window1; GSList *accel_groups; GObject *accel_group; builder = builder_new_from_string (buffer, -1, NULL); window1 = gtk_builder_get_object (builder, "window1"); g_assert (window1); g_assert (GTK_IS_WINDOW (window1)); accel_groups = gtk_accel_groups_from_object (window1); g_assert (g_slist_length (accel_groups) == 1); accel_group = g_slist_nth_data (accel_groups, 0); g_assert (accel_group); gtk_widget_destroy (GTK_WIDGET (window1)); g_object_unref (builder); builder = builder_new_from_string (buffer2, -1, NULL); window1 = gtk_builder_get_object (builder, "window1"); g_assert (window1); g_assert (GTK_IS_WINDOW (window1)); accel_groups = gtk_accel_groups_from_object (window1); g_assert (g_slist_length (accel_groups) == 1); accel_group = g_slist_nth_data (accel_groups, 0); g_assert (accel_group); gtk_widget_destroy (GTK_WIDGET (window1)); g_object_unref (builder); } static void test_widget (void) { const gchar *buffer = "" " " " " " " " True" " True" " " " " " " ""; const gchar *buffer2 = "" " " " " " " " True" " True" " " " " " " ""; const gchar *buffer3 = "" " " " " " " " " " " " " " " " A Label" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""; GtkBuilder *builder; GObject *window1, *button1, *label1; AtkObject *accessible; AtkRelationSet *relation_set; AtkRelation *relation; char *name; builder = builder_new_from_string (buffer, -1, NULL); button1 = gtk_builder_get_object (builder, "button1"); #if 0 g_assert (GTK_WIDGET_HAS_FOCUS (GTK_WIDGET (button1))); #endif window1 = gtk_builder_get_object (builder, "window1"); gtk_widget_destroy (GTK_WIDGET (window1)); g_object_unref (builder); builder = builder_new_from_string (buffer2, -1, NULL); button1 = gtk_builder_get_object (builder, "button1"); g_assert (GTK_WIDGET_RECEIVES_DEFAULT (GTK_WIDGET (button1))); g_object_unref (builder); builder = builder_new_from_string (buffer3, -1, NULL); window1 = gtk_builder_get_object (builder, "window1"); label1 = gtk_builder_get_object (builder, "label1"); accessible = gtk_widget_get_accessible (GTK_WIDGET (label1)); relation_set = atk_object_ref_relation_set (accessible); g_return_if_fail (atk_relation_set_get_n_relations (relation_set) == 1); relation = atk_relation_set_get_relation (relation_set, 0); g_return_if_fail (relation != NULL); g_return_if_fail (ATK_IS_RELATION (relation)); g_return_if_fail (atk_relation_get_relation_type (relation) != ATK_RELATION_LABELLED_BY); g_object_unref (relation_set); g_object_get (G_OBJECT (accessible), "accessible-name", &name, NULL); g_return_if_fail (strcmp (name, "A Label") == 0); g_free (name); gtk_widget_destroy (GTK_WIDGET (window1)); g_object_unref (builder); } static void test_window (void) { const gchar *buffer1 = "" " " " " " " ""; const gchar *buffer2 = "" " " " " ""; GtkBuilder *builder; GObject *window1; gchar *title; builder = builder_new_from_string (buffer1, -1, NULL); window1 = gtk_builder_get_object (builder, "window1"); g_object_get (window1, "title", &title, NULL); g_assert (strcmp (title, "") == 0); g_free (title); gtk_widget_destroy (GTK_WIDGET (window1)); g_object_unref (builder); builder = builder_new_from_string (buffer2, -1, NULL); window1 = gtk_builder_get_object (builder, "window1"); gtk_widget_destroy (GTK_WIDGET (window1)); g_object_unref (builder); } static void test_value_from_string (void) { GValue value = { 0 }; GError *error = NULL; GtkBuilder *builder; builder = gtk_builder_new (); g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_STRING, "test", &value, &error)); g_assert (G_VALUE_HOLDS_STRING (&value)); g_assert (strcmp (g_value_get_string (&value), "test") == 0); g_value_unset (&value); g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "true", &value, &error)); g_assert (G_VALUE_HOLDS_BOOLEAN (&value)); g_assert (g_value_get_boolean (&value) == TRUE); g_value_unset (&value); g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "false", &value, &error)); g_assert (G_VALUE_HOLDS_BOOLEAN (&value)); g_assert (g_value_get_boolean (&value) == FALSE); g_value_unset (&value); g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yes", &value, &error)); g_assert (G_VALUE_HOLDS_BOOLEAN (&value)); g_assert (g_value_get_boolean (&value) == TRUE); g_value_unset (&value); g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "no", &value, &error)); g_assert (G_VALUE_HOLDS_BOOLEAN (&value)); g_assert (g_value_get_boolean (&value) == FALSE); g_value_unset (&value); g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "0", &value, &error)); g_assert (G_VALUE_HOLDS_BOOLEAN (&value)); g_assert (g_value_get_boolean (&value) == FALSE); g_value_unset (&value); g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "1", &value, &error)); g_assert (G_VALUE_HOLDS_BOOLEAN (&value)); g_assert (g_value_get_boolean (&value) == TRUE); g_value_unset (&value); g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "tRuE", &value, &error)); g_assert (G_VALUE_HOLDS_BOOLEAN (&value)); g_assert (g_value_get_boolean (&value) == TRUE); g_value_unset (&value); g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "blaurgh", &value, &error) == FALSE); g_value_unset (&value); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE)); g_error_free (error); error = NULL; g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yess", &value, &error) == FALSE); g_value_unset (&value); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE)); g_error_free (error); error = NULL; g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "trueee", &value, &error) == FALSE); g_value_unset (&value); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE)); g_error_free (error); error = NULL; g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "", &value, &error) == FALSE); g_value_unset (&value); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE)); g_error_free (error); error = NULL; g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "12345", &value, &error)); g_assert (G_VALUE_HOLDS_INT (&value)); g_assert (g_value_get_int (&value) == 12345); g_value_unset (&value); g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_LONG, "9912345", &value, &error)); g_assert (G_VALUE_HOLDS_LONG (&value)); g_assert (g_value_get_long (&value) == 9912345); g_value_unset (&value); g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_UINT, "2345", &value, &error)); g_assert (G_VALUE_HOLDS_UINT (&value)); g_assert (g_value_get_uint (&value) == 2345); g_value_unset (&value); g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "1.454", &value, &error)); g_assert (G_VALUE_HOLDS_FLOAT (&value)); g_assert (fabs (g_value_get_float (&value) - 1.454) < 0.00001); g_value_unset (&value); g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "abc", &value, &error) == FALSE); g_value_unset (&value); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE)); g_error_free (error); error = NULL; g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "/-+,abc", &value, &error) == FALSE); g_value_unset (&value); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE)); g_error_free (error); error = NULL; g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "toplevel", &value, &error) == TRUE); g_assert (G_VALUE_HOLDS_ENUM (&value)); g_assert (g_value_get_enum (&value) == GTK_WINDOW_TOPLEVEL); g_value_unset (&value); g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "sliff", &value, &error) == FALSE); g_value_unset (&value); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE)); g_error_free (error); error = NULL; g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WIDGET_FLAGS, "mapped", &value, &error) == TRUE); g_assert (G_VALUE_HOLDS_FLAGS (&value)); g_assert (g_value_get_flags (&value) == GTK_MAPPED); g_value_unset (&value); g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WIDGET_FLAGS, "GTK_VISIBLE | GTK_REALIZED", &value, &error) == TRUE); g_assert (G_VALUE_HOLDS_FLAGS (&value)); g_assert (g_value_get_flags (&value) == (GTK_VISIBLE | GTK_REALIZED)); g_value_unset (&value); g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "foobar", &value, &error) == FALSE); g_value_unset (&value); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE)); g_error_free (error); error = NULL; g_object_unref (builder); } static gboolean model_freed = FALSE; static void model_weakref (gpointer data, GObject *model) { model_freed = TRUE; } static void test_reference_counting (void) { GtkBuilder *builder; const gchar buffer1[] = "" " " " " " " " " " " " liststore1" " " " " " " ""; const gchar buffer2[] = "" " " " " " " " " " start" " " " " " " ""; GObject *window, *treeview, *model; builder = builder_new_from_string (buffer1, -1, NULL); window = gtk_builder_get_object (builder, "window1"); treeview = gtk_builder_get_object (builder, "treeview1"); model = gtk_builder_get_object (builder, "liststore1"); g_object_unref (builder); g_object_weak_ref (model, (GWeakNotify)model_weakref, NULL); g_assert (model_freed == FALSE); gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), NULL); g_assert (model_freed == TRUE); gtk_widget_destroy (GTK_WIDGET (window)); builder = builder_new_from_string (buffer2, -1, NULL); g_object_unref (builder); } static void test_icon_factory (void) { GtkBuilder *builder; const gchar buffer1[] = "" " " " " " " " " " " ""; const gchar buffer2[] = "" " " " " " " " " " " " " ""; #if 0 const gchar buffer3[] = "" " " " " " " ""; const gchar buffer4[] = "" " " " " " " " " " " ""; const gchar buffer5[] = "" " " " " " " " " " " ""; GError *error = NULL; #endif GObject *factory; GtkIconSet *icon_set; GtkIconSource *icon_source; GtkWidget *image; builder = builder_new_from_string (buffer1, -1, NULL); factory = gtk_builder_get_object (builder, "iconfactory1"); g_assert (factory != NULL); icon_set = gtk_icon_factory_lookup (GTK_ICON_FACTORY (factory), "apple-red"); g_assert (icon_set != NULL); gtk_icon_factory_add_default (GTK_ICON_FACTORY (factory)); image = gtk_image_new_from_stock ("apple-red", GTK_ICON_SIZE_BUTTON); g_assert (image != NULL); g_object_unref (builder); builder = builder_new_from_string (buffer2, -1, NULL); factory = gtk_builder_get_object (builder, "iconfactory1"); g_assert (factory != NULL); icon_set = gtk_icon_factory_lookup (GTK_ICON_FACTORY (factory), "sliff"); g_assert (icon_set != NULL); g_assert (g_slist_length (icon_set->sources) == 2); icon_source = icon_set->sources->data; g_assert (gtk_icon_source_get_direction (icon_source) == GTK_TEXT_DIR_RTL); g_assert (gtk_icon_source_get_state (icon_source) == GTK_STATE_ACTIVE); g_assert (gtk_icon_source_get_size (icon_source) == GTK_ICON_SIZE_MENU); g_assert (g_str_has_suffix (gtk_icon_source_get_filename (icon_source), "sloff.png")); icon_source = icon_set->sources->next->data; g_assert (gtk_icon_source_get_direction (icon_source) == GTK_TEXT_DIR_LTR); g_assert (gtk_icon_source_get_state (icon_source) == GTK_STATE_SELECTED); g_assert (gtk_icon_source_get_size (icon_source) == GTK_ICON_SIZE_DND); g_assert (g_str_has_suffix (gtk_icon_source_get_filename (icon_source), "slurf.png")); g_object_unref (builder); #if 0 error = NULL; gtk_builder_add_from_string (builder, buffer3, -1, &error); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_TAG)); g_error_free (error); error = NULL; gtk_builder_add_from_string (builder, buffer4, -1, &error); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_TAG)); g_error_free (error); error = NULL; gtk_builder_add_from_string (builder, buffer5, -1, &error); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_ATTRIBUTE)); g_error_free (error); #endif } typedef struct { gboolean weight; gboolean foreground; gboolean underline; gboolean size; gboolean font_desc; gboolean language; } FoundAttrs; static gboolean filter_pango_attrs (PangoAttribute *attr, gpointer data) { FoundAttrs *found = (FoundAttrs *)data; if (attr->klass->type == PANGO_ATTR_WEIGHT) found->weight = TRUE; else if (attr->klass->type == PANGO_ATTR_FOREGROUND) found->foreground = TRUE; else if (attr->klass->type == PANGO_ATTR_UNDERLINE) found->underline = TRUE; /* Make sure optional start/end properties are working */ else if (attr->klass->type == PANGO_ATTR_SIZE && attr->start_index == 5 && attr->end_index == 10) found->size = TRUE; else if (attr->klass->type == PANGO_ATTR_FONT_DESC) found->font_desc = TRUE; else if (attr->klass->type == PANGO_ATTR_LANGUAGE) found->language = TRUE; return TRUE; } static void test_pango_attributes (void) { GtkBuilder *builder; FoundAttrs found = { 0, }; const gchar buffer[] = "" " " " " " " " " " " " " " " " " " " " " ""; const gchar err_buffer1[] = "" " " " " " " " " " " ""; const gchar err_buffer2[] = "" " " " " " " " " " " ""; GObject *label; GError *error = NULL; PangoAttrList *attrs, *filtered; /* Test attributes are set */ builder = builder_new_from_string (buffer, -1, NULL); label = gtk_builder_get_object (builder, "label1"); g_assert (label != NULL); attrs = gtk_label_get_attributes (GTK_LABEL (label)); g_assert (attrs != NULL); filtered = pango_attr_list_filter (attrs, filter_pango_attrs, &found); g_assert (filtered); pango_attr_list_unref (filtered); g_assert (found.weight); g_assert (found.foreground); g_assert (found.underline); g_assert (found.size); g_assert (found.language); g_assert (found.font_desc); g_object_unref (builder); /* Test errors are set */ builder = gtk_builder_new (); gtk_builder_add_from_string (builder, err_buffer1, -1, &error); label = gtk_builder_get_object (builder, "label1"); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_MISSING_ATTRIBUTE)); g_object_unref (builder); g_error_free (error); error = NULL; builder = gtk_builder_new (); gtk_builder_add_from_string (builder, err_buffer2, -1, &error); label = gtk_builder_get_object (builder, "label1"); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_ATTRIBUTE)); g_object_unref (builder); g_error_free (error); } static void test_requires (void) { GtkBuilder *builder; GError *error = NULL; gchar *buffer; const gchar buffer_fmt[] = "" " " ""; buffer = g_strdup_printf (buffer_fmt, GTK_MAJOR_VERSION, GTK_MINOR_VERSION + 1); builder = gtk_builder_new (); gtk_builder_add_from_string (builder, buffer, -1, &error); g_assert (g_error_matches (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_VERSION_MISMATCH)); g_object_unref (builder); g_error_free (error); } static void test_add_objects (void) { GtkBuilder *builder; GError *error; gint ret; GObject *obj; GtkUIManager *manager; GtkWidget *menubar; GObject *menu, *label; GList *children; gchar *objects[2] = {"mainbox", NULL}; gchar *objects2[3] = {"mainbox", "window2", NULL}; gchar *objects3[3] = {"uimgr1", "menubar1"}; gchar *objects4[2] = {"uimgr1", NULL}; const gchar buffer[] = "" " " " " " " " True" " " " " " True" " first label" " " " " " " " " " True" " second label" " " " " " 1" " " " " " " " " " " " " " " " " " second label" " " " " " " ""; const gchar buffer2[] = "" " " " " " " " " " " " _File" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""; error = NULL; builder = gtk_builder_new (); ret = gtk_builder_add_objects_from_string (builder, buffer, -1, objects, &error); g_assert (ret); g_assert (error == NULL); obj = gtk_builder_get_object (builder, "window"); g_assert (obj == NULL); obj = gtk_builder_get_object (builder, "window2"); g_assert (obj == NULL); obj = gtk_builder_get_object (builder, "mainbox"); g_assert (GTK_IS_WIDGET (obj)); g_object_unref (builder); error = NULL; builder = gtk_builder_new (); ret = gtk_builder_add_objects_from_string (builder, buffer, -1, objects2, &error); g_assert (ret); g_assert (error == NULL); obj = gtk_builder_get_object (builder, "window"); g_assert (obj == NULL); obj = gtk_builder_get_object (builder, "window2"); g_assert (GTK_IS_WINDOW (obj)); gtk_widget_destroy (GTK_WIDGET (obj)); obj = gtk_builder_get_object (builder, "mainbox"); g_assert (GTK_IS_WIDGET (obj)); g_object_unref (builder); /* test cherry picking a ui manager and menubar that depends on it */ error = NULL; builder = gtk_builder_new (); ret = gtk_builder_add_objects_from_string (builder, buffer2, -1, objects3, &error); g_assert (ret); obj = gtk_builder_get_object (builder, "uimgr1"); g_assert (GTK_IS_UI_MANAGER (obj)); obj = gtk_builder_get_object (builder, "file"); g_assert (GTK_IS_ACTION (obj)); obj = gtk_builder_get_object (builder, "menubar1"); g_assert (GTK_IS_MENU_BAR (obj)); menubar = GTK_WIDGET (obj); children = gtk_container_get_children (GTK_CONTAINER (menubar)); menu = children->data; g_assert (menu != NULL); g_assert (GTK_IS_MENU_ITEM (menu)); g_assert (strcmp (GTK_WIDGET (menu)->name, "file") == 0); g_list_free (children); label = G_OBJECT (GTK_BIN (menu)->child); g_assert (label != NULL); g_assert (GTK_IS_LABEL (label)); g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0); g_object_unref (builder); /* test cherry picking just the ui manager */ error = NULL; builder = gtk_builder_new (); ret = gtk_builder_add_objects_from_string (builder, buffer2, -1, objects4, &error); g_assert (ret); obj = gtk_builder_get_object (builder, "uimgr1"); g_assert (GTK_IS_UI_MANAGER (obj)); manager = GTK_UI_MANAGER (obj); obj = gtk_builder_get_object (builder, "file"); g_assert (GTK_IS_ACTION (obj)); menubar = gtk_ui_manager_get_widget (manager, "/menubar1"); g_assert (GTK_IS_MENU_BAR (menubar)); children = gtk_container_get_children (GTK_CONTAINER (menubar)); menu = children->data; g_assert (menu != NULL); g_assert (GTK_IS_MENU_ITEM (menu)); g_assert (strcmp (GTK_WIDGET (menu)->name, "file") == 0); g_list_free (children); label = G_OBJECT (GTK_BIN (menu)->child); g_assert (label != NULL); g_assert (GTK_IS_LABEL (label)); g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0); g_object_unref (builder); } static GtkWidget * get_parent_menubar (GtkWidget *menuitem) { GtkMenuShell *menu_shell = (GtkMenuShell *)menuitem->parent; GtkWidget *attach = NULL; g_assert (GTK_IS_MENU_SHELL (menu_shell)); while (menu_shell && !GTK_IS_MENU_BAR (menu_shell)) { if (GTK_IS_MENU (menu_shell) && (attach = gtk_menu_get_attach_widget (GTK_MENU (menu_shell))) != NULL) menu_shell = (GtkMenuShell *)attach->parent; else menu_shell = NULL; } return menu_shell ? GTK_WIDGET (menu_shell) : NULL; } static void test_menus (void) { const gchar *buffer = "" " " " " " " " " " " " " " True" " vertical" " " " " " True" " " " " " True" " _File" " True" " " " " " True" " " " " " gtk-new" " True" " True" " accelgroup1" " " " " " " " " " " " " " " " " " " " " " " "" ""; const gchar *buffer1 = "" " " " " " " " " " " " " " True" " vertical" " " " " " True" " " " " " True" " " " " " True" " a label" " " " " " " " " " " " " " " " " " " "" ""; GtkBuilder *builder; GtkWidget *window, *item; GtkAccelGroup *accel_group; GtkWidget *item_accel_label, *sample_accel_label, *sample_menu_item, *custom; /* Check that the item has the correct accel label string set */ builder = builder_new_from_string (buffer, -1, NULL); window = (GtkWidget *)gtk_builder_get_object (builder, "window1"); item = (GtkWidget *)gtk_builder_get_object (builder, "imagemenuitem1"); accel_group = (GtkAccelGroup *)gtk_builder_get_object (builder, "accelgroup1"); gtk_widget_show_all (window); sample_menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group); g_assert (GTK_BIN (sample_menu_item)->child); g_assert (GTK_IS_ACCEL_LABEL (GTK_BIN (sample_menu_item)->child)); sample_accel_label = GTK_WIDGET (GTK_BIN (sample_menu_item)->child); gtk_widget_show (sample_accel_label); g_assert (GTK_BIN (item)->child); g_assert (GTK_IS_ACCEL_LABEL (GTK_BIN (item)->child)); item_accel_label = GTK_WIDGET (GTK_BIN (item)->child); gtk_accel_label_refetch (GTK_ACCEL_LABEL (sample_accel_label)); gtk_accel_label_refetch (GTK_ACCEL_LABEL (item_accel_label)); g_assert (GTK_ACCEL_LABEL (sample_accel_label)->accel_string != NULL); g_assert (GTK_ACCEL_LABEL (item_accel_label)->accel_string != NULL); g_assert (strcmp (GTK_ACCEL_LABEL (item_accel_label)->accel_string, GTK_ACCEL_LABEL (sample_accel_label)->accel_string) == 0); /* Check the menu hierarchy worked here */ g_assert (get_parent_menubar (item)); gtk_widget_destroy (GTK_WIDGET (window)); gtk_widget_destroy (sample_menu_item); g_object_unref (builder); /* Check that we can add alien children to menu items via normal * GtkContainer apis. */ builder = builder_new_from_string (buffer1, -1, NULL); window = (GtkWidget *)gtk_builder_get_object (builder, "window1"); item = (GtkWidget *)gtk_builder_get_object (builder, "imagemenuitem1"); custom = (GtkWidget *)gtk_builder_get_object (builder, "custom1"); g_assert (custom->parent == item); gtk_widget_destroy (GTK_WIDGET (window)); g_object_unref (builder); } static void test_file (const gchar *filename) { GtkBuilder *builder; GError *error = NULL; GSList *l, *objects; builder = gtk_builder_new (); if (!gtk_builder_add_from_file (builder, filename, &error)) { g_error ("%s", error->message); g_error_free (error); return; } objects = gtk_builder_get_objects (builder); for (l = objects; l; l = l->next) { GObject *obj = (GObject*)l->data; if (GTK_IS_DIALOG (obj)) { int response; g_print ("Running dialog %s.\n", gtk_widget_get_name (GTK_WIDGET (obj))); response = gtk_dialog_run (GTK_DIALOG (obj)); } else if (GTK_IS_WINDOW (obj)) { g_signal_connect (obj, "destroy", G_CALLBACK (gtk_main_quit), NULL); g_print ("Showing %s.\n", gtk_widget_get_name (GTK_WIDGET (obj))); gtk_widget_show_all (GTK_WIDGET (obj)); } } gtk_main (); g_object_unref (builder); builder = NULL; } int main (int argc, char **argv) { /* initialize test program */ gtk_test_init (&argc, &argv); if (argc > 1) { test_file (argv[1]); return 0; } g_test_add_func ("/Builder/Parser", test_parser); g_test_add_func ("/Builder/Types", test_types); g_test_add_func ("/Builder/Construct-Only Properties", test_construct_only_property); g_test_add_func ("/Builder/Children", test_children); g_test_add_func ("/Builder/Child Properties", test_child_properties); g_test_add_func ("/Builder/Object Properties", test_object_properties); g_test_add_func ("/Builder/Notebook", test_notebook); g_test_add_func ("/Builder/Domain", test_domain); g_test_add_func ("/Builder/Signal Autoconnect", test_connect_signals); g_test_add_func ("/Builder/UIManager Simple", test_uimanager_simple); g_test_add_func ("/Builder/Spin Button", test_spin_button); g_test_add_func ("/Builder/SizeGroup", test_sizegroup); g_test_add_func ("/Builder/ListStore", test_list_store); g_test_add_func ("/Builder/TreeStore", test_tree_store); g_test_add_func ("/Builder/TreeView Column", test_treeview_column); g_test_add_func ("/Builder/IconView", test_icon_view); g_test_add_func ("/Builder/ComboBox", test_combo_box); g_test_add_func ("/Builder/ComboBox Entry", test_combo_box_entry); g_test_add_func ("/Builder/CellView", test_cell_view); g_test_add_func ("/Builder/Dialog", test_dialog); g_test_add_func ("/Builder/Accelerators", test_accelerators); g_test_add_func ("/Builder/Widget", test_widget); g_test_add_func ("/Builder/Value From String", test_value_from_string); g_test_add_func ("/Builder/Reference Counting", test_reference_counting); g_test_add_func ("/Builder/Window", test_window); g_test_add_func ("/Builder/IconFactory", test_icon_factory); g_test_add_func ("/Builder/PangoAttributes", test_pango_attributes); g_test_add_func ("/Builder/Requires", test_requires); g_test_add_func ("/Builder/AddObjects", test_add_objects); g_test_add_func ("/Builder/Menus", test_menus); return g_test_run(); }