/* 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; } 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 (error != NULL); g_assert (error->domain == GTK_BUILDER_ERROR); g_assert (error->code == GTK_BUILDER_ERROR_UNHANDLED_TAG); g_error_free (error); error = NULL; gtk_builder_add_from_string (builder, "", -1, &error); g_assert (error != NULL); g_assert (error->domain == GTK_BUILDER_ERROR); g_assert (error->code == GTK_BUILDER_ERROR_INVALID_ATTRIBUTE); g_error_free (error); error = NULL; gtk_builder_add_from_string (builder, "", -1, &error); g_assert (error != NULL); g_assert (error->domain == GTK_BUILDER_ERROR); g_assert (error->code == GTK_BUILDER_ERROR_INVALID_TAG); g_error_free (error); error = NULL; gtk_builder_add_from_string (builder, "", -1, &error); g_assert (error != NULL); g_assert (error->domain == GTK_BUILDER_ERROR); g_assert (error->code == GTK_BUILDER_ERROR_INVALID_TAG); 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 (uimgr != NULL); 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 (menubar != NULL); 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); 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); 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); } #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" " " " " " " ""; 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); } 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 (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_assert (error->domain == GTK_BUILDER_ERROR); g_assert (error->code == 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 *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_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" " " " " " " " " " " " " " " " " ""; GObject *label, *spinbutton; 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))); 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; 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; 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_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) { gchar *buffer = "" " " " " " " " True" " True" " " " " " " ""; gchar *buffer2 = "" " " " " " " " True" " True" " " " " " " ""; gchar *buffer3 = "" " " " " " Contacts" " " " " " " ""; GtkBuilder *builder; GObject *window1, *button1; 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))); window1 = gtk_builder_get_object (builder, "window1"); gtk_widget_destroy (GTK_WIDGET (window1)); g_object_unref (builder); if (g_test_thorough()) { /* this test currently triggers: * "Gtk-WARNING **: is being ignored, see http://bugzilla.gnome.org/show_bug.cgi?id=454653" */ builder = builder_new_from_string (buffer3, -1, NULL); window1 = gtk_builder_get_object (builder, "window1"); gtk_widget_destroy (GTK_WIDGET (window1)); g_object_unref (builder); } } static void test_window (void) { gchar *buffer1 = "" " " " " " " ""; 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_assert (error != NULL); g_value_unset (&value); g_assert (error->domain == GTK_BUILDER_ERROR); g_assert (error->code == 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 (error->domain == GTK_BUILDER_ERROR); g_assert (error->code == 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 (error->domain == GTK_BUILDER_ERROR); g_assert (error->code == 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 (error->domain == GTK_BUILDER_ERROR); g_assert (error->code == 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 (error->domain == GTK_BUILDER_ERROR); g_assert (error->code == 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 (error->domain == GTK_BUILDER_ERROR); g_assert (error->code == 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 (error->domain == GTK_BUILDER_ERROR); g_assert (error->code == 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 (error->domain == GTK_BUILDER_ERROR); g_assert (error->code == 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_file (const gchar *filename) { GtkBuilder *builder; GError *error = NULL; builder = gtk_builder_new (); if (!gtk_builder_add_from_file (builder, filename, &error)) { g_print ("%s\n", error->message); g_error_free (error); } 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); return g_test_run(); }