/* 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 #include static GtkBuilder * builder_new_from_string (const gchar *buffer, gsize length, 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; } gboolean test_parser (void) { GtkBuilder *builder; GError *error; builder = gtk_builder_new (); error = NULL; gtk_builder_add_from_string (builder, "", -1, &error); g_assert (error != NULL); g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE); g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_UNHANDLED_TAG, FALSE); g_error_free (error); error = NULL; gtk_builder_add_from_string (builder, "", -1, &error); g_assert (error != NULL); g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE); g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_ATTRIBUTE, FALSE); g_error_free (error); error = NULL; gtk_builder_add_from_string (builder, "", -1, &error); g_assert (error != NULL); g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE); g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_TAG, FALSE); g_error_free (error); error = NULL; gtk_builder_add_from_string (builder, "", -1, &error); g_assert (error != NULL); g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE); g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_TAG, FALSE); g_error_free (error); error = NULL; gtk_builder_add_from_string (builder, "", -1, &error); g_assert (error != NULL); g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE); g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_MISSING_PROPERTY_VALUE, FALSE); g_error_free (error); g_object_unref (builder); return TRUE; } int normal; int after; int object; int object_after; void signal_normal (GtkWindow *window, GParamSpec spec) { g_assert (GTK_IS_WINDOW (window)); g_assert (normal == 0); g_assert (after == 0); normal++; } void signal_after (GtkWindow *window, GParamSpec spec) { g_assert (GTK_IS_WINDOW (window)); g_assert (normal == 1); g_assert (after == 0); after++; } void signal_object (GtkButton *button, GParamSpec spec) { g_assert (GTK_IS_BUTTON (button)); g_assert (object == 0); g_assert (object_after == 0); object++; } void 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 signal_first (GtkButton *button, GParamSpec spec) { g_assert (normal == 0); normal = 10; } void signal_second (GtkButton *button, GParamSpec spec) { g_assert (normal == 10); normal = 20; } void signal_extra (GtkButton *button, GParamSpec spec) { g_assert (normal == 20); normal = 30; } void signal_extra2 (GtkButton *button, GParamSpec spec) { g_assert (normal == 30); normal = 40; } gboolean test_connect_signals (void) { GtkBuilder *builder; GObject *window; const gchar buffer[] = "" " " " " " " " " " " " " " " ""; const gchar buffer_order[] = "" " " " " " " " " ""; const gchar buffer_extra[] = "" " " " " " " ""; const gchar buffer_extra2[] = "" " " " " " " ""; 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_return_val_if_fail (normal == 1, FALSE); g_return_val_if_fail (after == 1, FALSE); g_return_val_if_fail (object == 1, FALSE); g_return_val_if_fail (object_after == 1, FALSE); 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); return TRUE; } gboolean 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_return_val_if_fail (uimgr != NULL, FALSE); g_return_val_if_fail (GTK_IS_UI_MANAGER (uimgr), FALSE); g_object_unref (builder); builder = builder_new_from_string (buffer2, -1, NULL); menubar = gtk_builder_get_object (builder, "menubar1"); g_return_val_if_fail (menubar != NULL, FALSE); g_return_val_if_fail (GTK_IS_MENU_BAR (menubar), FALSE); children = gtk_container_get_children (GTK_CONTAINER (menubar)); menu = children->data; g_return_val_if_fail (menu != NULL, FALSE); g_return_val_if_fail (GTK_IS_MENU_ITEM (menu), FALSE); g_return_val_if_fail (strcmp (GTK_WIDGET (menu)->name, "file") == 0, FALSE); g_list_free (children); label = G_OBJECT (GTK_BIN (menu)->child); g_return_val_if_fail (label != NULL, FALSE); g_return_val_if_fail (GTK_IS_LABEL (label), FALSE); g_return_val_if_fail (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0, FALSE); window = gtk_builder_get_object (builder, "window1"); gtk_widget_destroy (GTK_WIDGET (window)); g_object_unref (builder); return TRUE; } gboolean 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); g_assert (strcmp (domain, "domain") == 0); g_object_unref (builder); builder = builder_new_from_string (buffer2, -1, "domain-1"); domain = gtk_builder_get_translation_domain (builder); g_assert (domain); g_assert (strcmp (domain, "domain-1") == 0); g_object_unref (builder); return TRUE; } #if 0 gboolean 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); return TRUE; } #endif gboolean 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_return_val_if_fail (g_slist_length (widgets) == 2, FALSE); 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_return_val_if_fail (g_slist_length (widgets) == 0, FALSE); 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_return_val_if_fail (g_slist_length (widgets) == 2, FALSE); g_slist_free (widgets); sizegroup = gtk_builder_get_object (builder, "sizegroup2"); widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup)); g_return_val_if_fail (g_slist_length (widgets) == 2, FALSE); 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); return TRUE; } gboolean test_list_store (void) { const gchar buffer1[] = "" " " " " " " " " " " " " ""; const char buffer2[] = "" " " " " " " " " " " " " " " " " " John" " Doe" " 25" " " " " " Johan" " Dole" " 50" " " " " " " ""; 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_return_val_if_fail (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 2, FALSE); g_return_val_if_fail (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING, FALSE); g_return_val_if_fail (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_UINT, FALSE); g_object_unref (builder); builder = builder_new_from_string (buffer2, -1, NULL); store = gtk_builder_get_object (builder, "liststore1"); g_return_val_if_fail (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 3, FALSE); g_return_val_if_fail (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING, FALSE); g_return_val_if_fail (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_STRING, FALSE); g_return_val_if_fail (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2) == G_TYPE_INT, FALSE); g_return_val_if_fail (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter) == TRUE, FALSE); gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &surname, 1, &lastname, 2, &age, -1); g_assert (surname != NULL); g_return_val_if_fail (strcmp (surname, "John") == 0, FALSE); g_free (surname); g_assert (lastname != NULL); g_return_val_if_fail (strcmp (lastname, "Doe") == 0, FALSE); g_free (lastname); g_return_val_if_fail (age == 25, FALSE); g_return_val_if_fail (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE, FALSE); gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &surname, 1, &lastname, 2, &age, -1); g_assert (surname != NULL); g_return_val_if_fail (strcmp (surname, "Johan") == 0, FALSE); g_free (surname); g_assert (lastname != NULL); g_return_val_if_fail (strcmp (lastname, "Dole") == 0, FALSE); g_free (lastname); g_return_val_if_fail (age == 50, FALSE); g_return_val_if_fail (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == FALSE, FALSE); g_object_unref (builder); return TRUE; } gboolean 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_return_val_if_fail (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 2, FALSE); g_return_val_if_fail (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING, FALSE); g_return_val_if_fail (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_UINT, FALSE); g_object_unref (builder); return TRUE; } gboolean 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 (window != NULL); 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 (error != NULL); g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE); g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_TYPE_FUNCTION, FALSE); g_error_free (error); g_object_unref (builder); return TRUE; } gboolean test_spin_button (void) { GtkBuilder *builder; const gchar buffer[] = "" "" "0" "10" "2" "3" "5" "1" "" "" "True" "adjustment1" "" ""; GObject *object; GtkAdjustment *adjustment; gdouble value; builder = builder_new_from_string (buffer, -1, NULL); object = gtk_builder_get_object (builder, "spinbutton1"); g_assert (GTK_IS_SPIN_BUTTON (object)); adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (object)); g_assert (GTK_IS_ADJUSTMENT (adjustment)); g_object_get (adjustment, "value", &value, NULL); g_return_val_if_fail (value == 1, FALSE); g_object_get (adjustment, "lower", &value, NULL); g_return_val_if_fail (value == 0, FALSE); g_object_get (adjustment, "upper", &value, NULL); g_return_val_if_fail (value == 10, FALSE); g_object_get (adjustment, "step-increment", &value, NULL); g_return_val_if_fail (value == 2, FALSE); g_object_get (adjustment, "page-increment", &value, NULL); g_return_val_if_fail (value == 3, FALSE); g_object_get (adjustment, "page-size", &value, NULL); g_return_val_if_fail (value == 5, FALSE); g_object_unref (builder); return TRUE; } gboolean 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_return_val_if_fail (gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)) == 2, FALSE); label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 0); g_return_val_if_fail (GTK_IS_LABEL (label), FALSE); g_return_val_if_fail (strcmp (gtk_label_get_label (GTK_LABEL (label)), "label1") == 0, FALSE); label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), label); g_return_val_if_fail (GTK_IS_LABEL (label), FALSE); g_return_val_if_fail (strcmp (gtk_label_get_label (GTK_LABEL (label)), "tab_label1") == 0, FALSE); label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 1); g_return_val_if_fail (GTK_IS_LABEL (label), FALSE); g_return_val_if_fail (strcmp (gtk_label_get_label (GTK_LABEL (label)), "label2") == 0, FALSE); label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), label); g_return_val_if_fail (GTK_IS_LABEL (label), FALSE); g_return_val_if_fail (strcmp (gtk_label_get_label (GTK_LABEL (label)), "tab_label2") == 0, FALSE); g_object_unref (builder); return TRUE; } gboolean 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_return_val_if_fail (type == GTK_WINDOW_POPUP, FALSE); 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_return_val_if_fail (textbuffer != NULL, FALSE); g_object_get (textbuffer, "tag-table", &tagtable, NULL); g_return_val_if_fail (tagtable == gtk_builder_get_object (builder, "tagtable1"), FALSE); g_object_unref (tagtable); g_object_unref (builder); return TRUE; } gboolean test_object_properties (void) { GtkBuilder *builder; const gchar buffer[] = "" " " " " " " " 10" " " " " " spinbutton1" " " " " " " " " " " " " " " " " ""; GObject *label, *spinbutton; builder = builder_new_from_string (buffer, -1, NULL); label = gtk_builder_get_object (builder, "label1"); g_return_val_if_fail (label != NULL, FALSE); spinbutton = gtk_builder_get_object (builder, "spinbutton1"); g_return_val_if_fail (spinbutton != NULL, FALSE); g_return_val_if_fail (spinbutton == (GObject*)gtk_label_get_mnemonic_widget (GTK_LABEL (label)), FALSE); g_object_unref (builder); return TRUE; } gboolean 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_return_val_if_fail (window != NULL, FALSE); g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE); button = gtk_builder_get_object (builder, "button1"); g_return_val_if_fail (button != NULL, FALSE); g_return_val_if_fail (GTK_IS_BUTTON (button), FALSE); g_return_val_if_fail (strcmp (GTK_WIDGET (GTK_WIDGET (button)->parent)->name, "window1") == 0, FALSE); 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_return_val_if_fail (dialog != NULL, FALSE); g_return_val_if_fail (GTK_IS_DIALOG (dialog), FALSE); children = gtk_container_get_children (GTK_CONTAINER (dialog)); g_return_val_if_fail (g_list_length (children) == 1, FALSE); g_list_free (children); vbox = gtk_builder_get_object (builder, "dialog1-vbox"); g_return_val_if_fail (vbox != NULL, FALSE); g_return_val_if_fail (GTK_IS_VBOX (vbox), FALSE); g_return_val_if_fail (GTK_WIDGET (vbox)->parent != NULL, FALSE); g_return_val_if_fail (strcmp (GTK_WIDGET (GTK_WIDGET (vbox)->parent)->name, "dialog1") == 0, FALSE); g_return_val_if_fail (GTK_CONTAINER (vbox)->border_width == 10, FALSE); g_return_val_if_fail (strcmp (GTK_WIDGET (GTK_DIALOG (dialog)->vbox)->name, "dialog1-vbox") == 0, FALSE); action_area = gtk_builder_get_object (builder, "dialog1-action_area"); g_return_val_if_fail (action_area != NULL, FALSE); g_return_val_if_fail (GTK_IS_HBUTTON_BOX (action_area), FALSE); g_return_val_if_fail (GTK_WIDGET (action_area)->parent != NULL, FALSE); g_return_val_if_fail (GTK_CONTAINER (action_area)->border_width == 20, FALSE); g_return_val_if_fail (GTK_DIALOG (dialog)->action_area != NULL, FALSE); g_return_val_if_fail (GTK_WIDGET (GTK_DIALOG (dialog)->action_area)->name != NULL, FALSE); g_return_val_if_fail (strcmp (GTK_WIDGET (GTK_DIALOG (dialog)->action_area)->name, "dialog1-action_area") == 0, FALSE); gtk_widget_destroy (GTK_WIDGET (dialog)); g_object_unref (builder); return TRUE; } gboolean 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_return_val_if_fail (GTK_IS_VBOX (vbox), FALSE); label = gtk_builder_get_object (builder, "label1"); g_return_val_if_fail (GTK_IS_LABEL (label), FALSE); gtk_container_child_get (GTK_CONTAINER (vbox), GTK_WIDGET (label), "pack-type", &pack_type, NULL); g_return_val_if_fail (pack_type == GTK_PACK_START, FALSE); label = gtk_builder_get_object (builder, "label2"); g_return_val_if_fail (GTK_IS_LABEL (label), FALSE); gtk_container_child_get (GTK_CONTAINER (vbox), GTK_WIDGET (label), "pack-type", &pack_type, NULL); g_return_val_if_fail (pack_type == GTK_PACK_END, FALSE); g_object_unref (builder); return TRUE; } gboolean 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_return_val_if_fail (treeview, FALSE); g_return_val_if_fail (GTK_IS_TREE_VIEW (treeview), FALSE); column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), 0); g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (column), FALSE); g_return_val_if_fail (strcmp (gtk_tree_view_column_get_title (column), "Test") == 0, FALSE); renderers = gtk_tree_view_column_get_cell_renderers (column); g_return_val_if_fail (g_list_length (renderers) == 1, FALSE); renderer = g_list_nth_data (renderers, 0); g_return_val_if_fail (renderer, FALSE); g_return_val_if_fail (GTK_IS_CELL_RENDERER_TEXT (renderer), FALSE); 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_return_val_if_fail (strcmp (text, "25") == 0, FALSE); g_free (text); renderer = gtk_builder_get_object (builder, "renderer2"); g_object_get (renderer, "text", &text, NULL); g_assert (text); g_return_val_if_fail (strcmp (text, "John") == 0, FALSE); 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); return TRUE; } gboolean 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_return_val_if_fail (iconview, FALSE); g_return_val_if_fail (GTK_IS_ICON_VIEW (iconview), FALSE); gtk_widget_realize (GTK_WIDGET (iconview)); renderer = gtk_builder_get_object (builder, "renderer1"); g_object_get (renderer, "text", &text, NULL); g_assert (text); g_return_val_if_fail (strcmp (text, "test") == 0, FALSE); g_free (text); window = gtk_builder_get_object (builder, "window1"); gtk_widget_destroy (GTK_WIDGET (window)); g_object_unref (builder); return TRUE; } gboolean 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_return_val_if_fail (combobox, FALSE); 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_return_val_if_fail (strcmp (text, "Bar") == 0, FALSE); g_free (text); renderer = gtk_builder_get_object (builder, "renderer1"); g_assert (renderer); g_object_get (renderer, "text", &text, NULL); g_assert (text); g_return_val_if_fail (strcmp (text, "2") == 0, FALSE); g_free (text); window = gtk_builder_get_object (builder, "window1"); gtk_widget_destroy (GTK_WIDGET (window)); g_object_unref (builder); return TRUE; } gboolean 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_return_val_if_fail (combobox, FALSE); renderer = gtk_builder_get_object (builder, "renderer2"); g_assert (renderer); g_object_get (renderer, "text", &text, NULL); g_assert (text); g_return_val_if_fail (strcmp (text, "Bar") == 0, FALSE); g_free (text); renderer = gtk_builder_get_object (builder, "renderer1"); g_assert (renderer); g_object_get (renderer, "text", &text, NULL); g_assert (text); g_return_val_if_fail (strcmp (text, "2") == 0, FALSE); g_free (text); window = gtk_builder_get_object (builder, "window1"); gtk_widget_destroy (GTK_WIDGET (window)); g_object_unref (builder); return TRUE; } gboolean test_cell_view (void) { GtkBuilder *builder; 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_return_val_if_fail (GTK_IS_CELL_VIEW (cellview), FALSE); g_object_get (cellview, "model", &model, NULL); g_assert (model); g_return_val_if_fail (GTK_IS_TREE_MODEL (model), FALSE); 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_return_val_if_fail (g_list_length (renderers) == 1, FALSE); 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_return_val_if_fail (strcmp (text, "test") == 0, FALSE); 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); return TRUE; } gboolean 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_return_val_if_fail (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_ok)) == 3, FALSE); button_cancel = gtk_builder_get_object (builder, "button_cancel"); g_return_val_if_fail (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_cancel)) == -5, FALSE); gtk_widget_destroy (GTK_WIDGET (dialog1)); g_object_unref (builder); return TRUE; } gboolean test_accelerators (void) { GtkBuilder *builder; gchar *buffer = "" " " " " " " " " " " " " " " ""; 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_return_val_if_fail (g_slist_length (accel_groups) == 1, FALSE); 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_return_val_if_fail (g_slist_length (accel_groups) == 1, FALSE); accel_group = g_slist_nth_data (accel_groups, 0); g_assert (accel_group); gtk_widget_destroy (GTK_WIDGET (window1)); g_object_unref (builder); return TRUE; } gboolean test_widget (void) { gchar *buffer = "" " " " " " " " True" " True" " " " " " " ""; gchar *buffer2 = "" " " " " " " " True" " True" " " " " " " ""; GtkBuilder *builder; GObject *window1, *button1; builder = builder_new_from_string (buffer, -1, NULL); button1 = gtk_builder_get_object (builder, "button1"); #if 0 g_return_val_if_fail (GTK_WIDGET_HAS_FOCUS (GTK_WIDGET (button1)), FALSE); #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_return_val_if_fail (GTK_WIDGET_RECEIVES_DEFAULT (GTK_WIDGET (button1)), FALSE); window1 = gtk_builder_get_object (builder, "window1"); gtk_widget_destroy (GTK_WIDGET (window1)); g_object_unref (builder); return TRUE; } static gboolean test_value_from_string (void) { GValue value = { 0 }; GError *error = NULL; GtkBuilder *builder; builder = gtk_builder_new (); g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_STRING, "test", &value, &error), FALSE); g_return_val_if_fail (G_VALUE_HOLDS_STRING (&value), FALSE); g_return_val_if_fail (strcmp (g_value_get_string (&value), "test") == 0, FALSE); g_value_unset (&value); g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "true", &value, &error), FALSE); g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (&value), FALSE); g_return_val_if_fail (g_value_get_boolean (&value) == TRUE, FALSE); g_value_unset (&value); g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "false", &value, &error), FALSE); g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (&value), FALSE); g_return_val_if_fail (g_value_get_boolean (&value) == FALSE, FALSE); g_value_unset (&value); g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yes", &value, &error), FALSE); g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (&value), FALSE); g_return_val_if_fail (g_value_get_boolean (&value) == TRUE, FALSE); g_value_unset (&value); g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "no", &value, &error), FALSE); g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (&value), FALSE); g_return_val_if_fail (g_value_get_boolean (&value) == FALSE, FALSE); g_value_unset (&value); g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "0", &value, &error), FALSE); g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (&value), FALSE); g_return_val_if_fail (g_value_get_boolean (&value) == FALSE, FALSE); g_value_unset (&value); g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "1", &value, &error), FALSE); g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (&value), FALSE); g_return_val_if_fail (g_value_get_boolean (&value) == TRUE, FALSE); g_value_unset (&value); g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "tRuE", &value, &error), FALSE); g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (&value), FALSE); g_return_val_if_fail (g_value_get_boolean (&value) == TRUE, FALSE); g_value_unset (&value); g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "blaurgh", &value, &error) == FALSE, FALSE); g_return_val_if_fail (error != NULL, FALSE); g_value_unset (&value); g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE); g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_VALUE, FALSE); g_error_free (error); error = NULL; g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yess", &value, &error) == FALSE, FALSE); g_value_unset (&value); g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE); g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_VALUE, FALSE); g_error_free (error); error = NULL; g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "trueee", &value, &error) == FALSE, FALSE); g_value_unset (&value); g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE); g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_VALUE, FALSE); g_error_free (error); error = NULL; g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "", &value, &error) == FALSE, FALSE); g_value_unset (&value); g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE); g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_VALUE, FALSE); g_error_free (error); error = NULL; g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "12345", &value, &error), FALSE); g_return_val_if_fail (G_VALUE_HOLDS_INT (&value), FALSE); g_return_val_if_fail (g_value_get_int (&value) == 12345, FALSE); g_value_unset (&value); g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_LONG, "9912345", &value, &error), FALSE); g_return_val_if_fail (G_VALUE_HOLDS_LONG (&value), FALSE); g_return_val_if_fail (g_value_get_long (&value) == 9912345, FALSE); g_value_unset (&value); g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_UINT, "2345", &value, &error), FALSE); g_return_val_if_fail (G_VALUE_HOLDS_UINT (&value), FALSE); g_return_val_if_fail (g_value_get_uint (&value) == 2345, FALSE); g_value_unset (&value); g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "1.454", &value, &error), FALSE); g_return_val_if_fail (G_VALUE_HOLDS_FLOAT (&value), FALSE); g_return_val_if_fail (fabs (g_value_get_float (&value) - 1.454) < 0.00001, FALSE); g_value_unset (&value); g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "abc", &value, &error) == FALSE, FALSE); g_value_unset (&value); g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE); g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_VALUE, FALSE); g_error_free (error); error = NULL; g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "/-+,abc", &value, &error) == FALSE, FALSE); g_value_unset (&value); g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE); g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_VALUE, FALSE); g_error_free (error); error = NULL; g_return_val_if_fail (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "toplevel", &value, &error) == TRUE, FALSE); g_return_val_if_fail (G_VALUE_HOLDS_ENUM (&value), FALSE); g_return_val_if_fail (g_value_get_enum (&value) == GTK_WINDOW_TOPLEVEL, FALSE); g_value_unset (&value); g_return_val_if_fail (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "sliff", &value, &error) == FALSE, FALSE); g_value_unset (&value); g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE); g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_VALUE, FALSE); g_error_free (error); error = NULL; g_return_val_if_fail (gtk_builder_value_from_string_type (builder, GTK_TYPE_WIDGET_FLAGS, "mapped", &value, &error) == TRUE, FALSE); g_return_val_if_fail (G_VALUE_HOLDS_FLAGS (&value), FALSE); g_return_val_if_fail (g_value_get_flags (&value) == GTK_MAPPED, FALSE); g_value_unset (&value); g_return_val_if_fail (gtk_builder_value_from_string_type (builder, GTK_TYPE_WIDGET_FLAGS, "GTK_VISIBLE | GTK_REALIZED", &value, &error) == TRUE, FALSE); g_return_val_if_fail (G_VALUE_HOLDS_FLAGS (&value), FALSE); g_return_val_if_fail (g_value_get_flags (&value) == (GTK_VISIBLE | GTK_REALIZED), FALSE); g_value_unset (&value); g_return_val_if_fail (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "foobar", &value, &error) == FALSE, FALSE); g_value_unset (&value); g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE); g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_VALUE, FALSE); g_error_free (error); error = NULL; g_object_unref (builder); return TRUE; } gboolean model_freed = FALSE; static void model_weakref (gpointer data, GObject *model) { model_freed = TRUE; } static gboolean 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); return TRUE; } int main (int argc, char **argv) { gtk_init (&argc, &argv); g_print ("Testing parser\n"); if (!test_parser ()) g_error ("test_parser failed"); g_print ("Testing types\n"); if (!test_types ()) g_error ("test_types failed"); g_print ("Testing construct-only property\n"); if (!test_construct_only_property ()) g_error ("test_construct_only_property failed"); g_print ("Testing children\n"); if (!test_children ()) g_error ("test_children failed"); g_print ("Testing child properties\n"); if (!test_child_properties ()) g_error ("test_child_properties failed"); g_print ("Testing object properties\n"); if (!test_object_properties ()) g_error ("test_object_properties failed"); g_print ("Testing notebook\n"); if (!test_notebook ()) g_error ("test_notebook failed"); g_print ("Testing domain\n"); if (!test_domain ()) g_error ("test_domain failed"); g_print ("Testing signal autoconnect\n"); if (!test_connect_signals ()) g_error ("test_connect_signals failed"); g_print ("Testing uimanager simple\n"); if (!test_uimanager_simple ()) g_error ("test_uimanager_simple failed"); g_print ("Testing spin button\n"); if (!test_spin_button ()) g_error ("test_spin_button failed"); g_print ("Testing sizegroup\n"); if (!test_sizegroup ()) g_error ("test_sizegroup failed"); g_print ("Testing list store\n"); if (!test_list_store ()) g_error ("test_list_store failed"); g_print ("Testing tree store\n"); if (!test_tree_store ()) g_error ("test_tree_store failed"); g_print ("Testing treeview column\n"); if (!test_treeview_column ()) g_error ("test_treeview_column failed"); g_print ("Testing iconview\n"); if (!test_icon_view ()) g_error ("test_icon_view failed"); g_print ("Testing combobox\n"); if (!test_combo_box ()) g_error ("test_combo_box failed"); g_print ("Testing combobox entry\n"); if (!test_combo_box_entry ()) g_error ("test_combo_box_entry failed"); g_print ("Testing cell view\n"); if (!test_cell_view ()) g_error ("test_cell_view failed"); g_print ("Testing dialog\n"); if (!test_dialog ()) g_error ("test_dialog failed"); g_print ("Testing accelerators\n"); if (!test_accelerators ()) g_error ("test_accelerators failed"); g_print ("Testing widget\n"); if (!test_widget ()) g_error ("test_widget failed"); g_print ("Testing value from string\n"); if (!test_value_from_string ()) g_error ("test_value_from_string failed"); g_print ("Testing reference counting\n"); if (!test_reference_counting ()) g_error ("test_reference_counting failed"); return 0; }