]> Pileus Git - ~andy/gtk/blob - tests/buildertest.c
Move type-func to <object> instead of <child>, add a test to make sure
[~andy/gtk] / tests / buildertest.c
1 /* buildertest.c
2  * Copyright (C) 2006-2007 Async Open Source
3  * Authors: Johan Dahlin
4  *          Henrique Romano
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  */
21
22 #include <string.h>
23 #include <libintl.h>
24 #include <locale.h>
25 #include <math.h>
26
27 #include <gtk/gtk.h>
28 #include <gdk/gdkkeysyms.h>
29 #include <gtk/gtkprintjob.h>
30
31 static GtkBuilder *
32 builder_new_from_string (const gchar *buffer,
33                          gsize length,
34                          gchar *domain)
35 {
36   GtkBuilder *builder;
37   builder = gtk_builder_new ();
38   if (domain)
39     gtk_builder_set_translation_domain (builder, domain);
40   gtk_builder_add_from_string (builder, buffer, length, NULL);
41   return builder;
42 }
43
44 gboolean test_parser (void)
45 {
46   GtkBuilder *builder;
47   GError *error;
48   
49   builder = gtk_builder_new ();
50
51   error = NULL;
52   gtk_builder_add_from_string (builder, "<xxx/>", -1, &error);
53   g_assert (error != NULL);
54   g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE);
55   g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_UNHANDLED_TAG, FALSE);
56     g_error_free (error);
57   
58   error = NULL;
59   gtk_builder_add_from_string (builder, "<interface invalid=\"X\"/>", -1, &error);
60   g_assert (error != NULL);
61   g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE);
62   g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_ATTRIBUTE, FALSE);
63   g_error_free (error);
64
65   error = NULL;
66   gtk_builder_add_from_string (builder, "<interface><child/></interface>", -1, &error);
67   g_assert (error != NULL);
68   g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE);
69   g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_TAG, FALSE);
70   g_error_free (error);
71
72   error = NULL;
73   gtk_builder_add_from_string (builder, "<interface><object class=\"GtkVBox\" id=\"a\"><object class=\"GtkHBox\" id=\"b\"/></object></interface>", -1, &error);
74   g_assert (error != NULL);
75   g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE);
76   g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_TAG, FALSE);
77   g_error_free (error);
78
79   error = NULL;
80   gtk_builder_add_from_string (builder, "<interface><object class=\"GtkWindow\" id=\"a\"><property name=\"type\"/></object></interface>", -1, &error);
81   g_assert (error != NULL);
82   g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE);
83   g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_MISSING_PROPERTY_VALUE, FALSE);
84   g_error_free (error);
85
86   g_object_unref (builder);
87   
88   return TRUE;
89 }
90
91 int normal;
92 int after;
93 int object;
94 int object_after;
95
96 void
97 signal_normal (GtkWindow *window, GParamSpec spec)
98 {
99   g_assert (GTK_IS_WINDOW (window));
100   g_assert (normal == 0);
101   g_assert (after == 0);
102
103   normal++;
104 }
105                     
106 void
107 signal_after (GtkWindow *window, GParamSpec spec)
108 {
109   g_assert (GTK_IS_WINDOW (window));
110   g_assert (normal == 1);
111   g_assert (after == 0);
112   
113   after++;
114 }
115
116 void
117 signal_object (GtkButton *button, GParamSpec spec)
118 {
119   g_assert (GTK_IS_BUTTON (button));
120   g_assert (object == 0);
121   g_assert (object_after == 0);
122
123   object++;
124 }
125
126 void
127 signal_object_after (GtkButton *button, GParamSpec spec)
128 {
129   g_assert (GTK_IS_BUTTON (button));
130   g_assert (object == 1);
131   g_assert (object_after == 0);
132
133   object_after++;
134 }
135
136 void
137 signal_first (GtkButton *button, GParamSpec spec)
138 {
139   g_assert (normal == 0);
140   normal = 10;
141 }
142
143 void
144 signal_second (GtkButton *button, GParamSpec spec)
145 {
146   g_assert (normal == 10);
147   normal = 20;
148 }
149
150 void
151 signal_extra (GtkButton *button, GParamSpec spec)
152 {
153   g_assert (normal == 20);
154   normal = 30;
155 }
156
157 void
158 signal_extra2 (GtkButton *button, GParamSpec spec)
159 {
160   g_assert (normal == 30);
161   normal = 40;
162 }
163
164 gboolean test_connect_signals (void)
165 {
166   GtkBuilder *builder;
167   GObject *window;
168   const gchar buffer[] =
169     "<interface>"
170     "  <object class=\"GtkButton\" id=\"button\"/>"
171     "  <object class=\"GtkWindow\" id=\"window1\">"
172     "    <signal name=\"notify::title\" handler=\"signal_normal\"/>"
173     "    <signal name=\"notify::title\" handler=\"signal_after\" after=\"yes\"/>"
174     "    <signal name=\"notify::title\" handler=\"signal_object\""
175     "            object=\"button\"/>"
176     "    <signal name=\"notify::title\" handler=\"signal_object_after\""
177     "            object=\"button\" after=\"yes\"/>"
178     "  </object>"
179     "</interface>";
180   const gchar buffer_order[] =
181     "<interface>"
182     "  <object class=\"GtkWindow\" id=\"window1\">"
183     "    <signal name=\"notify::title\" handler=\"signal_first\"/>"
184     "    <signal name=\"notify::title\" handler=\"signal_second\"/>"
185     "  </object>"
186     "</interface>";
187   const gchar buffer_extra[] =
188     "<interface>"
189     "  <object class=\"GtkWindow\" id=\"window2\">"
190     "    <signal name=\"notify::title\" handler=\"signal_extra\"/>"
191     "  </object>"
192     "</interface>";
193   const gchar buffer_extra2[] =
194     "<interface>"
195     "  <object class=\"GtkWindow\" id=\"window3\">"
196     "    <signal name=\"notify::title\" handler=\"signal_extra2\"/>"
197     "  </object>"
198     "</interface>";
199
200   builder = builder_new_from_string (buffer, -1, NULL);
201   gtk_builder_connect_signals (builder, NULL);
202
203   window = gtk_builder_get_object (builder, "window1");
204   gtk_window_set_title (GTK_WINDOW (window), "test");
205
206   g_return_val_if_fail (normal == 1, FALSE);
207   g_return_val_if_fail (after == 1, FALSE);
208   g_return_val_if_fail (object == 1, FALSE);
209   g_return_val_if_fail (object_after == 1, FALSE);
210   gtk_widget_destroy (GTK_WIDGET (window));
211   g_object_unref (builder);
212   
213   builder = builder_new_from_string (buffer_order, -1, NULL);
214   gtk_builder_connect_signals (builder, NULL);
215   window = gtk_builder_get_object (builder, "window1");
216   normal = 0;
217   gtk_window_set_title (GTK_WINDOW (window), "test");
218   g_assert (normal == 20);
219
220   gtk_widget_destroy (GTK_WIDGET (window));
221
222   gtk_builder_add_from_string (builder, buffer_extra,
223                                strlen (buffer_extra), NULL);
224   gtk_builder_add_from_string (builder, buffer_extra2,
225                                strlen (buffer_extra2), NULL);
226   gtk_builder_connect_signals (builder, NULL);
227   window = gtk_builder_get_object (builder, "window2");
228   gtk_window_set_title (GTK_WINDOW (window), "test");
229   g_assert (normal == 30);
230
231   gtk_widget_destroy (GTK_WIDGET (window));
232   window = gtk_builder_get_object (builder, "window3");
233   gtk_window_set_title (GTK_WINDOW (window), "test");
234   g_assert (normal == 40);
235   gtk_widget_destroy (GTK_WIDGET (window));
236   
237   g_object_unref (builder);
238
239   return TRUE;
240 }
241
242 gboolean test_uimanager_simple (void)
243 {
244   GtkBuilder *builder;
245   GObject *window, *uimgr, *menubar;
246   GObject *menu, *label;
247   GList *children;
248   const gchar buffer[] =
249     "<interface>"
250     "  <object class=\"GtkUIManager\" id=\"uimgr1\"/>"
251     "</interface>";
252     
253   const gchar buffer2[] =
254     "<interface>"
255     "  <object class=\"GtkUIManager\" id=\"uimgr1\">"
256     "    <child>"
257     "      <object class=\"GtkActionGroup\" id=\"ag1\">"
258     "        <child>"
259     "          <object class=\"GtkAction\" id=\"file\">"
260     "            <property name=\"label\">_File</property>"
261     "          </object>"
262     "        </child>"
263     "      </object>"
264     "    </child>"
265     "    <ui>"
266     "      <menubar name=\"menubar1\">"
267     "        <menu action=\"file\">"
268     "        </menu>"
269     "      </menubar>"
270     "    </ui>"
271     "  </object>"
272     "  <object class=\"GtkWindow\" id=\"window1\">"
273     "    <child>"
274     "      <object class=\"GtkMenuBar\" id=\"menubar1\" constructor=\"uimgr1\"/>"
275     "    </child>"
276     "  </object>"
277     "</interface>";
278
279   builder = builder_new_from_string (buffer, -1, NULL);
280
281   uimgr = gtk_builder_get_object (builder, "uimgr1");
282   g_return_val_if_fail (uimgr != NULL, FALSE);
283   g_return_val_if_fail (GTK_IS_UI_MANAGER (uimgr), FALSE);
284   g_object_unref (builder);
285   
286   builder = builder_new_from_string (buffer2, -1, NULL);
287
288   menubar = gtk_builder_get_object (builder, "menubar1");
289   g_return_val_if_fail (menubar != NULL, FALSE);
290   g_return_val_if_fail (GTK_IS_MENU_BAR (menubar), FALSE);
291
292   children = gtk_container_get_children (GTK_CONTAINER (menubar));
293   menu = children->data;
294   g_return_val_if_fail (menu != NULL, FALSE);
295   g_return_val_if_fail (GTK_IS_MENU_ITEM (menu), FALSE);
296   g_return_val_if_fail (strcmp (GTK_WIDGET (menu)->name, "file") == 0, FALSE);
297   g_list_free (children);
298   
299   label = G_OBJECT (GTK_BIN (menu)->child);
300   g_return_val_if_fail (label != NULL, FALSE);
301   g_return_val_if_fail (GTK_IS_LABEL (label), FALSE);
302   g_return_val_if_fail
303     (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0, FALSE);
304
305   window = gtk_builder_get_object (builder, "window1");
306   gtk_widget_destroy (GTK_WIDGET (window));
307   g_object_unref (builder);
308   
309   return TRUE;
310 }
311
312 gboolean test_domain (void)
313 {
314   GtkBuilder *builder;
315   const gchar buffer1[] = "<interface/>";
316   const gchar buffer2[] = "<interface domain=\"domain\"/>";
317   const gchar *domain;
318   
319   builder = builder_new_from_string (buffer1, -1, NULL);
320   domain = gtk_builder_get_translation_domain (builder);
321   g_assert (domain == NULL);
322   g_object_unref (builder);
323   
324   builder = builder_new_from_string (buffer1, -1, "domain-1");
325   domain = gtk_builder_get_translation_domain (builder);
326   g_assert (domain);
327   g_assert (strcmp (domain, "domain-1") == 0);
328   g_object_unref (builder);
329   
330   builder = builder_new_from_string (buffer2, -1, NULL);
331   domain = gtk_builder_get_translation_domain (builder);
332   g_assert (domain);
333   g_assert (strcmp (domain, "domain") == 0);
334   g_object_unref (builder);
335   
336   builder = builder_new_from_string (buffer2, -1, "domain-1");
337   domain = gtk_builder_get_translation_domain (builder);
338   g_assert (domain);
339   g_assert (strcmp (domain, "domain-1") == 0);
340   g_object_unref (builder);
341
342   return TRUE;
343 }
344
345 #if 0
346 gboolean test_translation (void)
347 {
348   GtkBuilder *builder;
349   const gchar buffer[] =
350     "<interface>"
351     "  <object class=\"GtkWindow\" id=\"window1\">"
352     "    <child>"
353     "      <object class=\"GtkLabel\" id=\"label\">"
354     "        <property name=\"label\" translatable=\"yes\">File</property>"
355     "      </object>"
356     "    </child>"
357     "  </object>"
358     "</interface>";
359   GtkLabel *window, *label;
360
361   setlocale (LC_ALL, "sv_SE");
362   textdomain ("builder");
363   bindtextdomain ("builder", "tests");
364
365   builder = builder_new_from_string (buffer, -1, NULL);
366   label = GTK_LABEL (gtk_builder_get_object (builder, "label"));
367   g_assert (strcmp (gtk_label_get_text (label), "Arkiv") == 0);
368
369   window = gtk_builder_get_object (builder, "window1");
370   gtk_widget_destroy (GTK_WIDGET (window));
371   g_object_unref (builder);
372   
373   return TRUE;
374 }
375 #endif
376
377 gboolean test_sizegroup (void)
378 {
379   GtkBuilder * builder;
380   const gchar buffer1[] =
381     "<interface domain=\"test\">"
382     "  <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
383     "    <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
384     "    <widgets>"
385     "      <widget name=\"radio1\"/>"
386     "      <widget name=\"radio2\"/>"
387     "    </widgets>"
388     "  </object>"
389     "  <object class=\"GtkWindow\" id=\"window1\">"
390     "    <child>"
391     "      <object class=\"GtkVBox\" id=\"vbox1\">"
392     "        <child>"
393     "          <object class=\"GtkRadioButton\" id=\"radio1\"/>"
394     "        </child>"
395     "        <child>"
396     "          <object class=\"GtkRadioButton\" id=\"radio2\"/>"
397     "        </child>"
398     "      </object>"
399     "    </child>"
400     "  </object>"
401     "</interface>";
402   const gchar buffer2[] =
403     "<interface domain=\"test\">"
404     "  <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
405     "    <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
406     "    <widgets>"
407     "    </widgets>"
408     "   </object>"
409     "</interface>";
410   const gchar buffer3[] =
411     "<interface domain=\"test\">"
412     "  <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
413     "    <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
414     "    <widgets>"
415     "      <widget name=\"radio1\"/>"
416     "      <widget name=\"radio2\"/>"
417     "    </widgets>"
418     "  </object>"
419     "  <object class=\"GtkSizeGroup\" id=\"sizegroup2\">"
420     "    <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
421     "    <widgets>"
422     "      <widget name=\"radio1\"/>"
423     "      <widget name=\"radio2\"/>"
424     "    </widgets>"
425     "  </object>"
426     "  <object class=\"GtkWindow\" id=\"window1\">"
427     "    <child>"
428     "      <object class=\"GtkVBox\" id=\"vbox1\">"
429     "        <child>"
430     "          <object class=\"GtkRadioButton\" id=\"radio1\"/>"
431     "        </child>"
432     "        <child>"
433     "          <object class=\"GtkRadioButton\" id=\"radio2\"/>"
434     "        </child>"
435     "      </object>"
436     "    </child>"
437     "  </object>"
438     "</interface>";
439   GObject *sizegroup;
440   GSList *widgets;
441
442   builder = builder_new_from_string (buffer1, -1, NULL);
443   sizegroup = gtk_builder_get_object (builder, "sizegroup1");
444   widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
445   g_return_val_if_fail (g_slist_length (widgets) == 2, FALSE);
446   g_slist_free (widgets);
447   g_object_unref (builder);
448
449   builder = builder_new_from_string (buffer2, -1, NULL);
450   sizegroup = gtk_builder_get_object (builder, "sizegroup1");
451   widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
452   g_return_val_if_fail (g_slist_length (widgets) == 0, FALSE);
453   g_slist_free (widgets);
454   g_object_unref (builder);
455
456   builder = builder_new_from_string (buffer3, -1, NULL);
457   sizegroup = gtk_builder_get_object (builder, "sizegroup1");
458   widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
459   g_return_val_if_fail (g_slist_length (widgets) == 2, FALSE);
460   g_slist_free (widgets);
461   sizegroup = gtk_builder_get_object (builder, "sizegroup2");
462   widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
463   g_return_val_if_fail (g_slist_length (widgets) == 2, FALSE);
464   g_slist_free (widgets);
465
466 #if 0
467   {
468     GObject *window;
469     window = gtk_builder_get_object (builder, "window1");
470     gtk_widget_destroy (GTK_WIDGET (window));
471   }
472 #endif  
473   g_object_unref (builder);
474
475   return TRUE;
476 }
477
478 gboolean test_list_store (void)
479 {
480   const gchar buffer1[] =
481     "<interface>"
482     "  <object class=\"GtkListStore\" id=\"liststore1\">"
483     "    <columns>"
484     "      <column type=\"gchararray\"/>"
485     "      <column type=\"guint\"/>"
486     "    </columns>"
487     "  </object>"
488     "</interface>";
489   const char buffer2[] = 
490     "<interface>"
491     "  <object class=\"GtkListStore\" id=\"liststore1\">"
492     "    <columns>"
493     "      <column type=\"gchararray\"/>"
494     "      <column type=\"gchararray\"/>"
495     "      <column type=\"gint\"/>"
496     "    </columns>"
497     "    <data>"
498     "      <row>"
499     "        <col id=\"0\">John</col>"
500     "        <col id=\"1\">Doe</col>"
501     "        <col id=\"2\">25</col>"
502     "      </row>"
503     "      <row>"
504     "        <col id=\"0\">Johan</col>"
505     "        <col id=\"1\">Dole</col>"
506     "        <col id=\"2\">50</col>"
507     "      </row>"
508     "    </data>"
509     "  </object>"
510     "</interface>";
511   GtkBuilder *builder;
512   GObject *store;
513   GtkTreeIter iter;
514   gchar *surname, *lastname;
515   int age;
516   
517   builder = builder_new_from_string (buffer1, -1, NULL);
518   store = gtk_builder_get_object (builder, "liststore1");
519   g_return_val_if_fail (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 2, FALSE);
520   g_return_val_if_fail (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING, FALSE);
521   g_return_val_if_fail (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_UINT, FALSE);
522   g_object_unref (builder);
523   
524   builder = builder_new_from_string (buffer2, -1, NULL);
525   store = gtk_builder_get_object (builder, "liststore1");
526   g_return_val_if_fail (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 3, FALSE);
527   g_return_val_if_fail (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING, FALSE);
528   g_return_val_if_fail (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_STRING, FALSE);
529   g_return_val_if_fail (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2) == G_TYPE_INT, FALSE);
530   
531   g_return_val_if_fail (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter) == TRUE, FALSE);
532   gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
533                       0, &surname,
534                       1, &lastname,
535                       2, &age,
536                       -1);
537   g_assert (surname != NULL);
538   g_return_val_if_fail (strcmp (surname, "John") == 0, FALSE);
539   g_free (surname);
540   g_assert (lastname != NULL);
541   g_return_val_if_fail (strcmp (lastname, "Doe") == 0, FALSE);
542   g_free (lastname);
543   g_return_val_if_fail (age == 25, FALSE);
544   g_return_val_if_fail (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE, FALSE);
545   
546   gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
547                       0, &surname,
548                       1, &lastname,
549                       2, &age,
550                       -1);
551   g_assert (surname != NULL);
552   g_return_val_if_fail (strcmp (surname, "Johan") == 0, FALSE);
553   g_free (surname);
554   g_assert (lastname != NULL);
555   g_return_val_if_fail (strcmp (lastname, "Dole") == 0, FALSE);
556   g_free (lastname);
557   g_return_val_if_fail (age == 50, FALSE);
558   g_return_val_if_fail (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == FALSE, FALSE);
559   
560   g_object_unref (builder);
561
562   return TRUE;
563 }
564
565 gboolean test_tree_store (void)
566 {
567   const gchar buffer[] =
568     "<interface domain=\"test\">"
569     "  <object class=\"GtkTreeStore\" id=\"treestore1\">"
570     "    <columns>"
571     "      <column type=\"gchararray\"/>"
572     "      <column type=\"guint\"/>"
573     "    </columns>"
574     "  </object>"
575     "</interface>";
576   GtkBuilder *builder;
577   GObject *store;
578   
579   builder = builder_new_from_string (buffer, -1, NULL);
580   store = gtk_builder_get_object (builder, "treestore1");
581   g_return_val_if_fail (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 2, FALSE);
582   g_return_val_if_fail (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING, FALSE);
583   g_return_val_if_fail (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_UINT, FALSE);
584   
585   g_object_unref (builder);
586
587   return TRUE;
588 }
589
590 gboolean test_types (void)
591 {
592   const gchar buffer[] = 
593     "<interface>"
594     "  <object class=\"GtkAction\" id=\"action\"/>"
595     "  <object class=\"GtkActionGroup\" id=\"actiongroup\"/>"
596     "  <object class=\"GtkAlignment\" id=\"alignment\"/>"
597     "  <object class=\"GtkArrow\" id=\"arrow\"/>"
598     "  <object class=\"GtkButton\" id=\"button\"/>"
599     "  <object class=\"GtkCheckButton\" id=\"checkbutton\"/>"
600     "  <object class=\"GtkDialog\" id=\"dialog\"/>"
601     "  <object class=\"GtkDrawingArea\" id=\"drawingarea\"/>"
602     "  <object class=\"GtkEventBox\" id=\"eventbox\"/>"
603     "  <object class=\"GtkEntry\" id=\"entry\"/>"
604     "  <object class=\"GtkFontButton\" id=\"fontbutton\"/>"
605     "  <object class=\"GtkHButtonBox\" id=\"hbuttonbox\"/>"
606     "  <object class=\"GtkHBox\" id=\"hbox\"/>"
607     "  <object class=\"GtkHPaned\" id=\"hpaned\"/>"
608     "  <object class=\"GtkHRuler\" id=\"hruler\"/>"
609     "  <object class=\"GtkHScale\" id=\"hscale\"/>"
610     "  <object class=\"GtkHScrollbar\" id=\"hscrollbar\"/>"
611     "  <object class=\"GtkHSeparator\" id=\"hseparator\"/>"
612     "  <object class=\"GtkImage\" id=\"image\"/>"
613     "  <object class=\"GtkLabel\" id=\"label\"/>"
614     "  <object class=\"GtkListStore\" id=\"liststore\"/>"
615     "  <object class=\"GtkMenuBar\" id=\"menubar\"/>"
616     "  <object class=\"GtkNotebook\" id=\"notebook\"/>"
617     "  <object class=\"GtkProgressBar\" id=\"progressbar\"/>"
618     "  <object class=\"GtkRadioButton\" id=\"radiobutton\"/>"
619     "  <object class=\"GtkSizeGroup\" id=\"sizegroup\"/>"
620     "  <object class=\"GtkScrolledWindow\" id=\"scrolledwindow\"/>"
621     "  <object class=\"GtkSpinButton\" id=\"spinbutton\"/>"
622     "  <object class=\"GtkStatusbar\" id=\"statusbar\"/>"
623     "  <object class=\"GtkTextView\" id=\"textview\"/>"
624     "  <object class=\"GtkToggleAction\" id=\"toggleaction\"/>"
625     "  <object class=\"GtkToggleButton\" id=\"togglebutton\"/>"
626     "  <object class=\"GtkToolbar\" id=\"toolbar\"/>"
627     "  <object class=\"GtkTreeStore\" id=\"treestore\"/>"
628     "  <object class=\"GtkTreeView\" id=\"treeview\"/>"
629     "  <object class=\"GtkTable\" id=\"table\"/>"
630     "  <object class=\"GtkVBox\" id=\"vbox\"/>"
631     "  <object class=\"GtkVButtonBox\" id=\"vbuttonbox\"/>"
632     "  <object class=\"GtkVScrollbar\" id=\"vscrollbar\"/>"
633     "  <object class=\"GtkVSeparator\" id=\"vseparator\"/>"
634     "  <object class=\"GtkViewport\" id=\"viewport\"/>"
635     "  <object class=\"GtkVRuler\" id=\"vruler\"/>"
636     "  <object class=\"GtkVPaned\" id=\"vpaned\"/>"
637     "  <object class=\"GtkVScale\" id=\"vscale\"/>"
638     "  <object class=\"GtkWindow\" id=\"window\"/>"
639     "  <object class=\"GtkUIManager\" id=\"uimanager\"/>"
640     "</interface>";
641   const gchar buffer2[] = 
642     "<interface>"
643     "  <object type-func=\"gtk_window_get_type\" id=\"window\"/>"
644     "</interface>";
645   const gchar buffer3[] = 
646     "<interface>"
647     "  <object type-func=\"xxx_invalid_get_type_function\" id=\"window\"/>"
648     "</interface>";
649   GtkBuilder *builder;
650   GObject *window;
651   GError *error;
652
653   builder = builder_new_from_string (buffer, -1, NULL);
654   gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "dialog")));
655   gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "window")));
656   g_object_unref (builder);
657
658   builder = builder_new_from_string (buffer2, -1, NULL);
659   window = gtk_builder_get_object (builder, "window");
660   g_assert (window != NULL);
661   g_assert (GTK_IS_WINDOW (window));
662   gtk_widget_destroy (GTK_WIDGET (window));
663   g_object_unref (builder);
664   
665   error = NULL;
666   builder = gtk_builder_new ();
667   gtk_builder_add_from_string (builder, buffer3, -1, &error);
668   g_assert (error != NULL);
669   g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE);
670   g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_TYPE_FUNCTION, FALSE);
671   g_error_free (error);
672   g_object_unref (builder);
673
674   return TRUE;
675 }
676
677 gboolean test_spin_button (void)
678 {
679   GtkBuilder *builder;
680   const gchar buffer[] =
681     "<interface>"
682     "<object class=\"GtkAdjustment\" id=\"adjustment1\">"
683     "<property name=\"lower\">0</property>"
684     "<property name=\"upper\">10</property>"
685     "<property name=\"step-increment\">2</property>"
686     "<property name=\"page-increment\">3</property>"
687     "<property name=\"page-size\">5</property>"
688     "<property name=\"value\">1</property>"
689     "</object>"
690     "<object class=\"GtkSpinButton\" id=\"spinbutton1\">"
691     "<property name=\"visible\">True</property>"
692     "<property name=\"adjustment\">adjustment1</property>"
693     "</object>"
694     "</interface>";
695   GObject *object;
696   GtkAdjustment *adjustment;
697   gdouble value;
698   
699   builder = builder_new_from_string (buffer, -1, NULL);
700   object = gtk_builder_get_object (builder, "spinbutton1");
701   g_assert (GTK_IS_SPIN_BUTTON (object));
702   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (object));
703   g_assert (GTK_IS_ADJUSTMENT (adjustment));
704   g_object_get (adjustment, "value", &value, NULL);
705   g_return_val_if_fail (value == 1, FALSE);
706   g_object_get (adjustment, "lower", &value, NULL);
707   g_return_val_if_fail (value == 0, FALSE);
708   g_object_get (adjustment, "upper", &value, NULL);
709   g_return_val_if_fail (value == 10, FALSE);
710   g_object_get (adjustment, "step-increment", &value, NULL);
711   g_return_val_if_fail (value == 2, FALSE);
712   g_object_get (adjustment, "page-increment", &value, NULL);
713   g_return_val_if_fail (value == 3, FALSE);
714   g_object_get (adjustment, "page-size", &value, NULL);
715   g_return_val_if_fail (value == 5, FALSE);
716   
717   g_object_unref (builder);
718   return TRUE;
719 }
720
721 gboolean test_notebook (void)
722 {
723   GtkBuilder *builder;
724   const gchar buffer[] =
725     "<interface>"
726     "  <object class=\"GtkNotebook\" id=\"notebook1\">"
727     "    <child>"
728     "      <object class=\"GtkLabel\" id=\"label1\">"
729     "        <property name=\"label\">label1</property>"
730     "      </object>"
731     "    </child>"
732     "    <child type=\"tab\">"
733     "      <object class=\"GtkLabel\" id=\"tablabel1\">"
734     "        <property name=\"label\">tab_label1</property>"
735     "      </object>"
736     "    </child>"
737     "    <child>"
738     "      <object class=\"GtkLabel\" id=\"label2\">"
739     "        <property name=\"label\">label2</property>"
740     "      </object>"
741     "    </child>"
742     "    <child type=\"tab\">"
743     "      <object class=\"GtkLabel\" id=\"tablabel2\">"
744     "        <property name=\"label\">tab_label2</property>"
745     "      </object>"
746     "    </child>"
747     "  </object>"
748     "</interface>";
749   GObject *notebook;
750   GtkWidget *label;
751
752   builder = builder_new_from_string (buffer, -1, NULL);
753   notebook = gtk_builder_get_object (builder, "notebook1");
754   g_assert (notebook != NULL);
755   g_return_val_if_fail (gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)) == 2,
756                         FALSE);
757
758   label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 0);
759   g_return_val_if_fail (GTK_IS_LABEL (label), FALSE);
760   g_return_val_if_fail (strcmp (gtk_label_get_label (GTK_LABEL (label)),
761                                 "label1") == 0, FALSE);
762   label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), label);
763   g_return_val_if_fail (GTK_IS_LABEL (label), FALSE);
764   g_return_val_if_fail (strcmp (gtk_label_get_label (GTK_LABEL (label)),
765                                 "tab_label1") == 0, FALSE);
766
767   label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 1);
768   g_return_val_if_fail (GTK_IS_LABEL (label), FALSE);
769   g_return_val_if_fail (strcmp (gtk_label_get_label (GTK_LABEL (label)),
770                                 "label2") == 0, FALSE);
771   label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), label);
772   g_return_val_if_fail (GTK_IS_LABEL (label), FALSE);
773   g_return_val_if_fail (strcmp (gtk_label_get_label (GTK_LABEL (label)),
774                                 "tab_label2") == 0, FALSE);
775
776   g_object_unref (builder);
777   return TRUE;
778 }
779
780 gboolean test_construct_only_property (void)
781 {
782   GtkBuilder *builder;
783   const gchar buffer[] =
784     "<interface>"
785     "  <object class=\"GtkWindow\" id=\"window1\">"
786     "    <property name=\"type\">GTK_WINDOW_POPUP</property>"
787     "  </object>"
788     "</interface>";
789   const gchar buffer2[] =
790     "<interface>"
791     "  <object class=\"GtkTextTagTable\" id=\"tagtable1\"/>"
792     "  <object class=\"GtkTextBuffer\" id=\"textbuffer1\">"
793     "    <property name=\"tag-table\">tagtable1</property>"
794     "  </object>"
795     "</interface>";
796   GObject *widget, *tagtable, *textbuffer;
797   GtkWindowType type;
798   
799   builder = builder_new_from_string (buffer, -1, NULL);
800   widget = gtk_builder_get_object (builder, "window1");
801   g_object_get (widget, "type", &type, NULL);
802   g_return_val_if_fail (type == GTK_WINDOW_POPUP, FALSE);
803
804   gtk_widget_destroy (GTK_WIDGET (widget));
805   g_object_unref (builder);
806
807   builder = builder_new_from_string (buffer2, -1, NULL);
808   textbuffer = gtk_builder_get_object (builder, "textbuffer1");
809   g_return_val_if_fail (textbuffer != NULL, FALSE);
810   g_object_get (textbuffer, "tag-table", &tagtable, NULL);
811   g_return_val_if_fail (tagtable == gtk_builder_get_object (builder, "tagtable1"), FALSE);
812   g_object_unref (tagtable);
813   g_object_unref (builder);
814
815   return TRUE;
816 }
817
818 gboolean test_object_properties (void)
819 {
820   GtkBuilder *builder;
821   const gchar buffer[] =
822     "<interface>"
823     "  <object class=\"GtkWindow\" id=\"window1\">"
824     "    <child>"
825     "      <object class=\"GtkVBox\" id=\"vbox\">"
826     "        <property name=\"border-width\">10</property>"
827     "        <child>"
828     "          <object class=\"GtkLabel\" id=\"label1\">"
829     "            <property name=\"mnemonic-widget\">spinbutton1</property>"
830     "          </object>"
831     "        </child>"
832     "        <child>"
833     "          <object class=\"GtkSpinButton\" id=\"spinbutton1\"/>"
834     "        </child>"
835     "      </object>"
836     "    </child>"
837     "  </object>"
838     "</interface>";
839   GObject *label, *spinbutton;
840   
841   builder = builder_new_from_string (buffer, -1, NULL);
842   label = gtk_builder_get_object (builder, "label1");
843   g_return_val_if_fail (label != NULL, FALSE);
844   spinbutton = gtk_builder_get_object (builder, "spinbutton1");
845   g_return_val_if_fail (spinbutton != NULL, FALSE);
846   g_return_val_if_fail (spinbutton == (GObject*)gtk_label_get_mnemonic_widget (GTK_LABEL (label)), FALSE);
847   
848   g_object_unref (builder);
849
850   return TRUE;
851 }
852
853 gboolean test_children (void)
854 {
855   GtkBuilder * builder;
856   GList *children;
857   const gchar buffer1[] =
858     "<interface>"
859     "  <object class=\"GtkWindow\" id=\"window1\">"
860     "    <child>"
861     "      <object class=\"GtkButton\" id=\"button1\">"
862     "        <property name=\"label\">Hello</property>"
863     "      </object>"
864     "    </child>"
865     "  </object>"
866     "</interface>";
867   const gchar buffer2[] =
868     "<interface>"
869     "  <object class=\"GtkDialog\" id=\"dialog1\">"
870     "    <child internal-child=\"vbox\">"
871     "      <object class=\"GtkVBox\" id=\"dialog1-vbox\">"
872     "        <property name=\"border-width\">10</property>"
873     "          <child internal-child=\"action_area\">"
874     "            <object class=\"GtkHButtonBox\" id=\"dialog1-action_area\">"
875     "              <property name=\"border-width\">20</property>"
876     "            </object>"
877     "          </child>"
878     "      </object>"
879     "    </child>"
880     "  </object>"
881     "</interface>";
882
883   GObject *window, *button;
884   GObject *dialog, *vbox, *action_area;
885   
886   builder = builder_new_from_string (buffer1, -1, NULL);
887   window = gtk_builder_get_object (builder, "window1");
888   g_return_val_if_fail (window != NULL, FALSE);
889   g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
890
891   button = gtk_builder_get_object (builder, "button1");
892   g_return_val_if_fail (button != NULL, FALSE);
893   g_return_val_if_fail (GTK_IS_BUTTON (button), FALSE);
894   g_return_val_if_fail (strcmp (GTK_WIDGET (GTK_WIDGET (button)->parent)->name, "window1") == 0, FALSE);
895
896   gtk_widget_destroy (GTK_WIDGET (window));
897   g_object_unref (builder);
898   
899   builder = builder_new_from_string (buffer2, -1, NULL);
900   dialog = gtk_builder_get_object (builder, "dialog1");
901   g_return_val_if_fail (dialog != NULL, FALSE);
902   g_return_val_if_fail (GTK_IS_DIALOG (dialog), FALSE);
903   children = gtk_container_get_children (GTK_CONTAINER (dialog));
904   g_return_val_if_fail (g_list_length (children) == 1, FALSE);
905   g_list_free (children);
906   
907   vbox = gtk_builder_get_object (builder, "dialog1-vbox");
908   g_return_val_if_fail (vbox != NULL, FALSE);
909   g_return_val_if_fail (GTK_IS_VBOX (vbox), FALSE);
910   g_return_val_if_fail (GTK_WIDGET (vbox)->parent != NULL, FALSE);
911   g_return_val_if_fail (strcmp (GTK_WIDGET (GTK_WIDGET (vbox)->parent)->name, "dialog1") == 0, FALSE);
912   g_return_val_if_fail (GTK_CONTAINER (vbox)->border_width == 10, FALSE);
913   g_return_val_if_fail (strcmp (GTK_WIDGET (GTK_DIALOG (dialog)->vbox)->name,
914                                 "dialog1-vbox") == 0, FALSE);
915
916   action_area = gtk_builder_get_object (builder, "dialog1-action_area");
917   g_return_val_if_fail (action_area != NULL, FALSE);
918   g_return_val_if_fail (GTK_IS_HBUTTON_BOX (action_area), FALSE);
919   g_return_val_if_fail (GTK_WIDGET (action_area)->parent != NULL, FALSE);
920   g_return_val_if_fail (GTK_CONTAINER (action_area)->border_width == 20, FALSE);
921   g_return_val_if_fail (GTK_DIALOG (dialog)->action_area != NULL, FALSE);
922   g_return_val_if_fail (GTK_WIDGET (GTK_DIALOG (dialog)->action_area)->name != NULL, FALSE);
923   g_return_val_if_fail (strcmp (GTK_WIDGET (GTK_DIALOG (dialog)->action_area)->name,
924                                 "dialog1-action_area") == 0, FALSE);
925   gtk_widget_destroy (GTK_WIDGET (dialog));
926   g_object_unref (builder);
927   
928   return TRUE;
929 }
930
931 gboolean test_child_properties (void)
932 {
933   GtkBuilder * builder;
934   const gchar buffer1[] =
935     "<interface>"
936     "  <object class=\"GtkVBox\" id=\"vbox1\">"
937     "    <child>"
938     "      <object class=\"GtkLabel\" id=\"label1\"/>"
939     "      <packing>"
940     "        <property name=\"pack-type\">start</property>"
941     "      </packing>"
942     "    </child>"
943     "    <child>"
944     "      <object class=\"GtkLabel\" id=\"label2\"/>"
945     "      <packing>"
946     "        <property name=\"pack-type\">end</property>"
947     "      </packing>"
948     "    </child>"
949     "  </object>"
950     "</interface>";
951
952   GObject *label, *vbox;
953   GtkPackType pack_type;
954   
955   builder = builder_new_from_string (buffer1, -1, NULL);
956   vbox = gtk_builder_get_object (builder, "vbox1");
957   g_return_val_if_fail (GTK_IS_VBOX (vbox), FALSE);
958
959   label = gtk_builder_get_object (builder, "label1");
960   g_return_val_if_fail (GTK_IS_LABEL (label), FALSE);
961   gtk_container_child_get (GTK_CONTAINER (vbox),
962                            GTK_WIDGET (label),
963                            "pack-type",
964                            &pack_type,
965                            NULL);
966   g_return_val_if_fail (pack_type == GTK_PACK_START, FALSE);
967   
968   label = gtk_builder_get_object (builder, "label2");
969   g_return_val_if_fail (GTK_IS_LABEL (label), FALSE);
970   gtk_container_child_get (GTK_CONTAINER (vbox),
971                            GTK_WIDGET (label),
972                            "pack-type",
973                            &pack_type,
974                            NULL);
975   g_return_val_if_fail (pack_type == GTK_PACK_END, FALSE);
976
977   g_object_unref (builder);
978   
979   return TRUE;
980 }
981
982 gboolean test_treeview_column (void)
983 {
984   GtkBuilder *builder;
985   const gchar buffer[] =
986     "<interface>"
987     "<object class=\"GtkListStore\" id=\"liststore1\">"
988     "  <columns>"
989     "    <column type=\"gchararray\"/>"
990     "    <column type=\"guint\"/>"
991     "  </columns>"
992     "  <data>"
993     "    <row>"
994     "      <col id=\"0\">John</col>"
995     "      <col id=\"1\">25</col>"
996     "    </row>"
997     "  </data>"
998     "</object>"
999     "<object class=\"GtkWindow\" id=\"window1\">"
1000     "  <child>"
1001     "    <object class=\"GtkTreeView\" id=\"treeview1\">"
1002     "      <property name=\"visible\">True</property>"
1003     "      <property name=\"model\">liststore1</property>"
1004     "      <child>"
1005     "        <object class=\"GtkTreeViewColumn\" id=\"column1\">"
1006     "          <property name=\"title\">Test</property>"
1007     "          <child>"
1008     "            <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1009     "            <attributes>"
1010     "              <attribute name=\"text\">1</attribute>"
1011     "            </attributes>"
1012     "          </child>"
1013     "        </object>"
1014     "      </child>"
1015     "      <child>"
1016     "        <object class=\"GtkTreeViewColumn\" id=\"column2\">"
1017     "          <property name=\"title\">Number</property>"
1018     "          <child>"
1019     "            <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
1020     "            <attributes>"
1021     "              <attribute name=\"text\">0</attribute>"
1022     "            </attributes>"
1023     "          </child>"
1024     "        </object>"
1025     "      </child>"
1026     "    </object>"
1027     "  </child>"
1028     "</object>"
1029     "</interface>";
1030   GObject *window, *treeview;
1031   GtkTreeViewColumn *column;
1032   GList *renderers;
1033   GObject *renderer;
1034   gchar *text;
1035
1036   builder = builder_new_from_string (buffer, -1, NULL);
1037   treeview = gtk_builder_get_object (builder, "treeview1");
1038   g_return_val_if_fail (treeview, FALSE);
1039   g_return_val_if_fail (GTK_IS_TREE_VIEW (treeview), FALSE);
1040   column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), 0);
1041   g_return_val_if_fail (strcmp (gtk_tree_view_column_get_title (column),
1042                                 "Test") == 0, FALSE);
1043
1044   renderers = gtk_tree_view_column_get_cell_renderers (column);
1045   g_return_val_if_fail (g_list_length (renderers) == 1, FALSE);
1046   renderer = g_list_nth_data (renderers, 0);
1047   g_return_val_if_fail (renderer, FALSE);
1048   g_return_val_if_fail (GTK_IS_CELL_RENDERER_TEXT (renderer), FALSE);
1049   g_list_free (renderers);
1050
1051   gtk_widget_realize (GTK_WIDGET (treeview));
1052
1053   renderer = gtk_builder_get_object (builder, "renderer1");
1054   g_object_get (renderer, "text", &text, NULL);
1055   g_assert (text);
1056   g_return_val_if_fail (strcmp (text, "25") == 0, FALSE);
1057   g_free (text);
1058   
1059   renderer = gtk_builder_get_object (builder, "renderer2");
1060   g_object_get (renderer, "text", &text, NULL);
1061   g_assert (text);
1062   g_return_val_if_fail (strcmp (text, "John") == 0, FALSE);
1063   g_free (text);
1064
1065   gtk_widget_unrealize (GTK_WIDGET (treeview));
1066
1067   window = gtk_builder_get_object (builder, "window1");
1068   gtk_widget_destroy (GTK_WIDGET (window));
1069   
1070   g_object_unref (builder);
1071   return TRUE;
1072 }
1073
1074 gboolean test_icon_view (void)
1075 {
1076   GtkBuilder *builder;
1077   const gchar buffer[] =
1078     "<interface>"
1079     "  <object class=\"GtkListStore\" id=\"liststore1\">"
1080     "    <columns>"
1081     "      <column type=\"gchararray\"/>"
1082     "      <column type=\"GdkPixbuf\"/>"
1083     "    </columns>"
1084     "    <data>"
1085     "      <row>"
1086     "        <col id=\"0\">test</col>"
1087     "      </row>"
1088     "    </data>"
1089     "  </object>"
1090     "  <object class=\"GtkWindow\" id=\"window1\">"
1091     "    <child>"
1092     "      <object class=\"GtkIconView\" id=\"iconview1\">"
1093     "        <property name=\"model\">liststore1</property>"
1094     "        <property name=\"text-column\">0</property>"
1095     "        <property name=\"pixbuf-column\">1</property>"
1096     "        <property name=\"visible\">True</property>"
1097     "        <child>"
1098     "          <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1099     "          <attributes>"
1100     "            <attribute name=\"text\">0</attribute>"
1101     "          </attributes>"
1102     "        </child>"
1103     "      </object>"
1104     "    </child>"
1105     "  </object>"
1106     "</interface>";
1107   GObject *window, *iconview, *renderer;
1108   gchar *text;
1109   
1110   builder = builder_new_from_string (buffer, -1, NULL);
1111   iconview = gtk_builder_get_object (builder, "iconview1");
1112   g_return_val_if_fail (iconview, FALSE);
1113   g_return_val_if_fail (GTK_IS_ICON_VIEW (iconview), FALSE);
1114
1115   gtk_widget_realize (GTK_WIDGET (iconview));
1116
1117   renderer = gtk_builder_get_object (builder, "renderer1");
1118   g_object_get (renderer, "text", &text, NULL);
1119   g_assert (text);
1120   g_return_val_if_fail (strcmp (text, "test") == 0, FALSE);
1121   g_free (text);
1122     
1123   window = gtk_builder_get_object (builder, "window1");
1124   gtk_widget_destroy (GTK_WIDGET (window));
1125   g_object_unref (builder);
1126   return TRUE;
1127 }
1128
1129 gboolean test_combo_box (void)
1130 {
1131   GtkBuilder *builder;
1132   const gchar buffer[] =
1133     "<interface>"
1134     "  <object class=\"GtkListStore\" id=\"liststore1\">"
1135     "    <columns>"
1136     "      <column type=\"guint\"/>"
1137     "      <column type=\"gchararray\"/>"
1138     "    </columns>"
1139     "    <data>"
1140     "      <row>"
1141     "        <col id=\"0\">1</col>"
1142     "        <col id=\"1\">Foo</col>"
1143     "      </row>"
1144     "      <row>"
1145     "        <col id=\"0\">2</col>"
1146     "        <col id=\"1\">Bar</col>"
1147     "      </row>"
1148     "    </data>"
1149     "  </object>"
1150     "  <object class=\"GtkWindow\" id=\"window1\">"
1151     "    <child>"
1152     "      <object class=\"GtkComboBox\" id=\"combobox1\">"
1153     "        <property name=\"model\">liststore1</property>"
1154     "        <property name=\"visible\">True</property>"
1155     "        <child>"
1156     "          <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1157     "            <attributes>"
1158     "              <attribute name=\"text\">0</attribute>"
1159     "            </attributes>"
1160     "        </child>"
1161     "        <child>"
1162     "          <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
1163     "            <attributes>"
1164     "              <attribute name=\"text\">1</attribute>"
1165     "            </attributes>"
1166     "        </child>"
1167     "      </object>"
1168     "    </child>"
1169     "  </object>"
1170     "</interface>";
1171   GObject *window, *combobox, *renderer;
1172   gchar *text;
1173
1174   builder = builder_new_from_string (buffer, -1, NULL);
1175   combobox = gtk_builder_get_object (builder, "combobox1");
1176   g_return_val_if_fail (combobox, FALSE);
1177   gtk_widget_realize (GTK_WIDGET (combobox));
1178
1179   renderer = gtk_builder_get_object (builder, "renderer2");
1180   g_assert (renderer);
1181   g_object_get (renderer, "text", &text, NULL);
1182   g_assert (text);
1183   g_return_val_if_fail (strcmp (text, "Bar") == 0, FALSE);
1184   g_free (text);
1185
1186   renderer = gtk_builder_get_object (builder, "renderer1");
1187   g_assert (renderer);
1188   g_object_get (renderer, "text", &text, NULL);
1189   g_assert (text);
1190   g_return_val_if_fail (strcmp (text, "2") == 0, FALSE);
1191   g_free (text);
1192
1193   window = gtk_builder_get_object (builder, "window1");
1194   gtk_widget_destroy (GTK_WIDGET (window));
1195
1196   g_object_unref (builder);
1197   return TRUE;
1198 }
1199
1200 gboolean test_combo_box_entry (void)
1201 {
1202   GtkBuilder *builder;
1203   const gchar buffer[] =
1204     "<interface>"
1205     "  <object class=\"GtkListStore\" id=\"liststore1\">"
1206     "    <columns>"
1207     "      <column type=\"guint\"/>"
1208     "      <column type=\"gchararray\"/>"
1209     "    </columns>"
1210     "    <data>"
1211     "      <row>"
1212     "        <col id=\"0\">1</col>"
1213     "        <col id=\"1\">Foo</col>"
1214     "      </row>"
1215     "      <row>"
1216     "        <col id=\"0\">2</col>"
1217     "        <col id=\"1\">Bar</col>"
1218     "      </row>"
1219     "    </data>"
1220     "  </object>"
1221     "  <object class=\"GtkWindow\" id=\"window1\">"
1222     "    <child>"
1223     "      <object class=\"GtkComboBoxEntry\" id=\"comboboxentry1\">"
1224     "        <property name=\"model\">liststore1</property>"
1225     "        <property name=\"visible\">True</property>"
1226     "        <child>"
1227     "          <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1228     "            <attributes>"
1229     "              <attribute name=\"text\">0</attribute>"
1230     "            </attributes>"
1231     "        </child>"
1232     "        <child>"
1233     "          <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
1234     "            <attributes>"
1235     "              <attribute name=\"text\">1</attribute>"
1236     "            </attributes>"
1237     "        </child>"
1238     "      </object>"
1239     "    </child>"
1240     "  </object>"
1241     "</interface>";
1242   GObject *window, *combobox, *renderer;
1243   gchar *text;
1244
1245   builder = builder_new_from_string (buffer, -1, NULL);
1246   combobox = gtk_builder_get_object (builder, "comboboxentry1");
1247   g_return_val_if_fail (combobox, FALSE);
1248
1249   renderer = gtk_builder_get_object (builder, "renderer2");
1250   g_assert (renderer);
1251   g_object_get (renderer, "text", &text, NULL);
1252   g_assert (text);
1253   g_return_val_if_fail (strcmp (text, "Bar") == 0, FALSE);
1254   g_free (text);
1255
1256   renderer = gtk_builder_get_object (builder, "renderer1");
1257   g_assert (renderer);
1258   g_object_get (renderer, "text", &text, NULL);
1259   g_assert (text);
1260   g_return_val_if_fail (strcmp (text, "2") == 0, FALSE);
1261   g_free (text);
1262
1263   window = gtk_builder_get_object (builder, "window1");
1264   gtk_widget_destroy (GTK_WIDGET (window));
1265
1266   g_object_unref (builder);
1267   return TRUE;
1268 }
1269
1270 gboolean test_cell_view (void)
1271 {
1272   GtkBuilder *builder;
1273   gchar *buffer =
1274     "<interface>"
1275     "  <object class=\"GtkListStore\" id=\"liststore1\">"
1276     "    <columns>"
1277     "      <column type=\"gchararray\"/>"
1278     "    </columns>"
1279     "    <data>"
1280     "      <row>"
1281     "        <col id=\"0\">test</col>"
1282     "      </row>"
1283     "    </data>"
1284     "  </object>"
1285     "  <object class=\"GtkWindow\" id=\"window1\">"
1286     "    <child>"
1287     "      <object class=\"GtkCellView\" id=\"cellview1\">"
1288     "        <property name=\"visible\">True</property>"
1289     "        <property name=\"model\">liststore1</property>"
1290     "        <child>"
1291     "          <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
1292     "          <attributes>"
1293     "            <attribute name=\"text\">0</attribute>"
1294     "          </attributes>"
1295     "        </child>"
1296     "      </object>"
1297     "    </child>"
1298     "  </object>"
1299     "</interface>";
1300   GObject *cellview;
1301   GObject *model, *window;
1302   GtkTreePath *path;
1303   GList *renderers;
1304   GObject *renderer;
1305   gchar *text;
1306   
1307   builder = builder_new_from_string (buffer, -1, NULL);
1308   cellview = gtk_builder_get_object (builder, "cellview1");
1309   g_assert (builder);
1310   g_assert (cellview);
1311   g_return_val_if_fail (GTK_IS_CELL_VIEW (cellview), FALSE);
1312   g_object_get (cellview, "model", &model, NULL);
1313   g_assert (model);
1314   g_return_val_if_fail (GTK_IS_TREE_MODEL (model), FALSE);
1315   g_object_unref (model);
1316   path = gtk_tree_path_new_first ();
1317   gtk_cell_view_set_displayed_row (GTK_CELL_VIEW (cellview), path);
1318   
1319   renderers = gtk_cell_view_get_cell_renderers (GTK_CELL_VIEW (cellview));
1320   g_assert (renderers);
1321   g_return_val_if_fail (g_list_length (renderers) == 1, FALSE);
1322   
1323   gtk_widget_realize (GTK_WIDGET (cellview));
1324
1325   renderer = g_list_nth_data (renderers, 0);
1326   g_list_free (renderers);
1327   g_assert (renderer);
1328   g_object_get (renderer, "text", &text, NULL);
1329   g_return_val_if_fail (strcmp (text, "test") == 0, FALSE);
1330   g_free (text);
1331   gtk_tree_path_free (path);
1332
1333   window = gtk_builder_get_object (builder, "window1");
1334   gtk_widget_destroy (GTK_WIDGET (window));
1335   
1336   g_object_unref (builder);
1337   return TRUE;
1338 }
1339
1340 gboolean test_dialog (void)
1341 {
1342   GtkBuilder * builder;
1343   const gchar buffer1[] =
1344     "<interface>"
1345     "  <object class=\"GtkDialog\" id=\"dialog1\">"
1346     "    <child internal-child=\"vbox\">"
1347     "      <object class=\"GtkVBox\" id=\"dialog1-vbox\">"
1348     "          <child internal-child=\"action_area\">"
1349     "            <object class=\"GtkHButtonBox\" id=\"dialog1-action_area\">"
1350     "              <child>"
1351     "                <object class=\"GtkButton\" id=\"button_cancel\"/>"
1352     "              </child>"
1353     "              <child>"
1354     "                <object class=\"GtkButton\" id=\"button_ok\"/>"
1355     "              </child>"
1356     "            </object>"
1357     "          </child>"
1358     "      </object>"
1359     "    </child>"
1360     "    <action-widgets>"
1361     "      <action-widget response=\"3\">button_ok</action-widget>"
1362     "      <action-widget response=\"-5\">button_cancel</action-widget>"
1363     "    </action-widgets>"
1364     "  </object>"
1365     "</interface>";
1366
1367   GObject *dialog1;
1368   GObject *button_ok;
1369   GObject *button_cancel;
1370   
1371   builder = builder_new_from_string (buffer1, -1, NULL);
1372   dialog1 = gtk_builder_get_object (builder, "dialog1");
1373   button_ok = gtk_builder_get_object (builder, "button_ok");
1374   g_return_val_if_fail (gtk_dialog_get_response_for_widget
1375                         (GTK_DIALOG (dialog1),
1376                          GTK_WIDGET (button_ok)) == 3, FALSE);
1377   button_cancel = gtk_builder_get_object (builder, "button_cancel");
1378   g_return_val_if_fail (gtk_dialog_get_response_for_widget
1379                         (GTK_DIALOG (dialog1),
1380                          GTK_WIDGET (button_cancel)) == -5, FALSE);
1381   
1382   gtk_widget_destroy (GTK_WIDGET (dialog1));
1383   g_object_unref (builder);
1384   
1385   return TRUE;
1386 }
1387
1388 gboolean test_accelerators (void)
1389 {
1390   GtkBuilder *builder;
1391   gchar *buffer =
1392     "<interface>"
1393     "  <object class=\"GtkWindow\" id=\"window1\">"
1394     "    <child>"
1395     "      <object class=\"GtkButton\" id=\"button1\">"
1396     "        <accelerator key=\"q\" modifiers=\"GDK_CONTROL_MASK\" signal=\"clicked\"/>"
1397     "      </object>"
1398     "    </child>"
1399     "  </object>"
1400     "</interface>";
1401   gchar *buffer2 =
1402     "<interface>"
1403     "  <object class=\"GtkWindow\" id=\"window1\">"
1404     "    <child>"
1405     "      <object class=\"GtkTreeView\" id=\"treeview1\">"
1406     "        <signal name=\"cursor-changed\" handler=\"gtk_main_quit\"/>"
1407     "        <accelerator key=\"f\" modifiers=\"GDK_CONTROL_MASK\" signal=\"grab_focus\"/>"
1408     "      </object>"
1409     "    </child>"
1410     "  </object>"
1411     "</interface>";
1412   GObject *window1;
1413   GSList *accel_groups;
1414   GObject *accel_group;
1415   
1416   builder = builder_new_from_string (buffer, -1, NULL);
1417   window1 = gtk_builder_get_object (builder, "window1");
1418   g_assert (window1);
1419   g_assert (GTK_IS_WINDOW (window1));
1420
1421   accel_groups = gtk_accel_groups_from_object (window1);
1422   g_return_val_if_fail (g_slist_length (accel_groups) == 1, FALSE);
1423   accel_group = g_slist_nth_data (accel_groups, 0);
1424   g_assert (accel_group);
1425
1426   gtk_widget_destroy (GTK_WIDGET (window1));
1427   g_object_unref (builder);
1428
1429   builder = builder_new_from_string (buffer2, -1, NULL);
1430   window1 = gtk_builder_get_object (builder, "window1");
1431   g_assert (window1);
1432   g_assert (GTK_IS_WINDOW (window1));
1433
1434   accel_groups = gtk_accel_groups_from_object (window1);
1435   g_return_val_if_fail (g_slist_length (accel_groups) == 1, FALSE);
1436   accel_group = g_slist_nth_data (accel_groups, 0);
1437   g_assert (accel_group);
1438
1439   gtk_widget_destroy (GTK_WIDGET (window1));
1440   g_object_unref (builder);
1441   return TRUE;
1442 }
1443
1444 gboolean test_widget (void)
1445 {
1446   gchar *buffer =
1447     "<interface>"
1448     "  <object class=\"GtkWindow\" id=\"window1\">"
1449     "    <child>"
1450     "      <object class=\"GtkButton\" id=\"button1\">"
1451     "         <property name=\"can-focus\">True</property>"
1452     "         <property name=\"has-focus\">True</property>"
1453     "      </object>"
1454     "    </child>"
1455     "  </object>"
1456    "</interface>";
1457   gchar *buffer2 =
1458     "<interface>"
1459     "  <object class=\"GtkWindow\" id=\"window1\">"
1460     "    <child>"
1461     "      <object class=\"GtkButton\" id=\"button1\">"
1462     "         <property name=\"can-default\">True</property>"
1463     "         <property name=\"has-default\">True</property>"
1464     "      </object>"
1465     "    </child>"
1466     "  </object>"
1467    "</interface>";
1468   GtkBuilder *builder;
1469   GObject *window1, *button1;
1470   
1471   builder = builder_new_from_string (buffer, -1, NULL);
1472   button1 = gtk_builder_get_object (builder, "button1");
1473
1474 #if 0
1475   g_return_val_if_fail (GTK_WIDGET_HAS_FOCUS (GTK_WIDGET (button1)), FALSE);
1476 #endif
1477   window1 = gtk_builder_get_object (builder, "window1");
1478   gtk_widget_destroy (GTK_WIDGET (window1));
1479   
1480   g_object_unref (builder);
1481   
1482   builder = builder_new_from_string (buffer2, -1, NULL);
1483   button1 = gtk_builder_get_object (builder, "button1");
1484
1485   g_return_val_if_fail (GTK_WIDGET_RECEIVES_DEFAULT (GTK_WIDGET (button1)), FALSE);
1486   
1487   window1 = gtk_builder_get_object (builder, "window1");
1488   gtk_widget_destroy (GTK_WIDGET (window1));
1489   g_object_unref (builder);
1490   return TRUE;
1491 }
1492
1493 static gboolean
1494 test_value_from_string (void)
1495 {
1496   GValue value = { 0 };
1497   GError *error = NULL;
1498   GtkBuilder *builder;
1499
1500   builder = gtk_builder_new ();
1501   
1502   g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_STRING, "test", &value, &error), FALSE);
1503   g_return_val_if_fail (G_VALUE_HOLDS_STRING (&value), FALSE);
1504   g_return_val_if_fail (strcmp (g_value_get_string (&value), "test") == 0, FALSE);
1505   g_value_unset (&value);
1506
1507   g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "true", &value, &error), FALSE);
1508   g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (&value), FALSE);
1509   g_return_val_if_fail (g_value_get_boolean (&value) == TRUE, FALSE);
1510   g_value_unset (&value);
1511
1512   g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "false", &value, &error), FALSE);
1513   g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (&value), FALSE);
1514   g_return_val_if_fail (g_value_get_boolean (&value) == FALSE, FALSE);
1515   g_value_unset (&value);
1516
1517   g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yes", &value, &error), FALSE);
1518   g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (&value), FALSE);
1519   g_return_val_if_fail (g_value_get_boolean (&value) == TRUE, FALSE);
1520   g_value_unset (&value);
1521
1522   g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "no", &value, &error), FALSE);
1523   g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (&value), FALSE);
1524   g_return_val_if_fail (g_value_get_boolean (&value) == FALSE, FALSE);
1525   g_value_unset (&value);
1526
1527   g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "0", &value, &error), FALSE);
1528   g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (&value), FALSE);
1529   g_return_val_if_fail (g_value_get_boolean (&value) == FALSE, FALSE);
1530   g_value_unset (&value);
1531
1532   g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "1", &value, &error), FALSE);
1533   g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (&value), FALSE);
1534   g_return_val_if_fail (g_value_get_boolean (&value) == TRUE, FALSE);
1535   g_value_unset (&value);
1536
1537   g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "tRuE", &value, &error), FALSE);
1538   g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (&value), FALSE);
1539   g_return_val_if_fail (g_value_get_boolean (&value) == TRUE, FALSE);
1540   g_value_unset (&value);
1541   
1542   g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "blaurgh", &value, &error) == FALSE, FALSE);
1543   g_return_val_if_fail (error != NULL, FALSE);
1544   g_value_unset (&value);
1545   g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE);
1546   g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_VALUE, FALSE);
1547   g_error_free (error);
1548   error = NULL;
1549
1550   g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yess", &value, &error) == FALSE, FALSE);
1551   g_value_unset (&value);
1552   g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE);
1553   g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_VALUE, FALSE);
1554   g_error_free (error);
1555   error = NULL;
1556   
1557   g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "trueee", &value, &error) == FALSE, FALSE);
1558   g_value_unset (&value);
1559   g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE);
1560   g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_VALUE, FALSE);
1561   g_error_free (error);
1562   error = NULL;
1563   
1564   g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "", &value, &error) == FALSE, FALSE);
1565   g_value_unset (&value);
1566   g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE);
1567   g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_VALUE, FALSE);
1568   g_error_free (error);
1569   error = NULL;
1570   
1571   g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "12345", &value, &error), FALSE);
1572   g_return_val_if_fail (G_VALUE_HOLDS_INT (&value), FALSE);
1573   g_return_val_if_fail (g_value_get_int (&value) == 12345, FALSE);
1574   g_value_unset (&value);
1575
1576   g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_LONG, "9912345", &value, &error), FALSE);
1577   g_return_val_if_fail (G_VALUE_HOLDS_LONG (&value), FALSE);
1578   g_return_val_if_fail (g_value_get_long (&value) == 9912345, FALSE);
1579   g_value_unset (&value);
1580
1581   g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_UINT, "2345", &value, &error), FALSE);
1582   g_return_val_if_fail (G_VALUE_HOLDS_UINT (&value), FALSE);
1583   g_return_val_if_fail (g_value_get_uint (&value) == 2345, FALSE);
1584   g_value_unset (&value);
1585
1586   g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "1.454", &value, &error), FALSE);
1587   g_return_val_if_fail (G_VALUE_HOLDS_FLOAT (&value), FALSE);
1588   g_return_val_if_fail (fabs (g_value_get_float (&value) - 1.454) < 0.00001, FALSE);
1589   g_value_unset (&value);
1590
1591   g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "abc", &value, &error) == FALSE, FALSE);
1592   g_value_unset (&value);
1593   g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE);
1594   g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_VALUE, FALSE);
1595   g_error_free (error);
1596   error = NULL;
1597
1598   g_return_val_if_fail (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "/-+,abc", &value, &error) == FALSE, FALSE);
1599   g_value_unset (&value);
1600   g_return_val_if_fail (error->domain == GTK_BUILDER_ERROR, FALSE);
1601   g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_VALUE, FALSE);
1602   g_error_free (error);
1603   error = NULL;
1604
1605   g_object_unref (builder);
1606   
1607   return TRUE;
1608 }
1609
1610 gboolean model_freed = FALSE;
1611
1612 static void model_weakref (gpointer data, GObject *model)
1613 {
1614   model_freed = TRUE;
1615 }
1616
1617 static gboolean
1618 test_reference_counting (void)
1619 {
1620   GtkBuilder *builder;
1621   const gchar buffer1[] =
1622     "<interface>"
1623     "  <object class=\"GtkListStore\" id=\"liststore1\"/>"
1624     "  <object class=\"GtkListStore\" id=\"liststore2\"/>"
1625     "  <object class=\"GtkWindow\" id=\"window1\">"
1626     "    <child>"
1627     "      <object class=\"GtkTreeView\" id=\"treeview1\">"
1628     "        <property name=\"model\">liststore1</property>"
1629     "      </object>"
1630     "    </child>"
1631     "  </object>"
1632     "</interface>";
1633   const gchar buffer2[] =
1634     "<interface>"
1635     "  <object class=\"GtkVBox\" id=\"vbox1\">"
1636     "    <child>"
1637     "      <object class=\"GtkLabel\" id=\"label1\"/>"
1638     "      <packing>"
1639     "        <property name=\"pack-type\">start</property>"
1640     "      </packing>"
1641     "    </child>"
1642     "  </object>"
1643     "</interface>";
1644   GObject *window, *treeview, *model;
1645   
1646   builder = builder_new_from_string (buffer1, -1, NULL);
1647   window = gtk_builder_get_object (builder, "window1");
1648   treeview = gtk_builder_get_object (builder, "treeview1");
1649   model = gtk_builder_get_object (builder, "liststore1");
1650   g_object_unref (builder);
1651
1652   g_object_weak_ref (model, (GWeakNotify)model_weakref, NULL);
1653
1654   g_assert (model_freed == FALSE);
1655   gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), NULL);
1656   g_assert (model_freed == TRUE);
1657   
1658   gtk_widget_destroy (GTK_WIDGET (window));
1659
1660   builder = builder_new_from_string (buffer2, -1, NULL);
1661   g_object_unref (builder);
1662   
1663   return TRUE;
1664 }
1665
1666 int
1667 main (int argc, char **argv)
1668 {
1669   gtk_init (&argc, &argv);
1670   
1671   g_print ("Testing parser\n");
1672   if (!test_parser ())
1673     g_error ("test_parser failed");
1674
1675   g_print ("Testing types\n");
1676   if (!test_types ())
1677     g_error ("test_types failed");
1678
1679   g_print ("Testing construct-only property\n");
1680   if (!test_construct_only_property ())
1681     g_error ("test_construct_only_property failed");
1682   
1683   g_print ("Testing children\n");
1684   if (!test_children ())
1685     g_error ("test_children failed");
1686
1687   g_print ("Testing child properties\n");
1688   if (!test_child_properties ())
1689     g_error ("test_child_properties failed");
1690
1691   g_print ("Testing object properties\n");
1692   if (!test_object_properties ())
1693     g_error ("test_object_properties failed");
1694
1695   g_print ("Testing notebook\n");
1696   if (!test_notebook ())
1697     g_error ("test_notebook failed");
1698
1699   g_print ("Testing domain\n");
1700   if (!test_domain ())
1701     g_error ("test_domain failed");
1702
1703   g_print ("Testing signal autoconnect\n");
1704   if (!test_connect_signals ())
1705     g_error ("test_connect_signals failed");
1706
1707   g_print ("Testing uimanager simple\n");
1708   if (!test_uimanager_simple ())
1709     g_error ("test_uimanager_simple failed");
1710
1711   g_print ("Testing spin button\n");
1712   if (!test_spin_button ())
1713     g_error ("test_spin_button failed");
1714
1715   g_print ("Testing sizegroup\n");
1716   if (!test_sizegroup ())
1717     g_error ("test_sizegroup failed");
1718   
1719   g_print ("Testing list store\n");
1720   if (!test_list_store ())
1721     g_error ("test_list_store failed");
1722   
1723   g_print ("Testing tree store\n");
1724   if (!test_tree_store ())
1725     g_error ("test_tree_store failed");
1726
1727   g_print ("Testing treeview column\n");
1728   if (!test_treeview_column ())
1729     g_error ("test_treeview_column failed");
1730
1731   g_print ("Testing iconview\n");
1732   if (!test_icon_view ())
1733     g_error ("test_icon_view failed");
1734
1735   g_print ("Testing combobox\n");
1736   if (!test_combo_box ())
1737     g_error ("test_combo_box failed");
1738
1739   g_print ("Testing combobox entry\n");
1740   if (!test_combo_box_entry ())
1741     g_error ("test_combo_box_entry failed");
1742
1743   g_print ("Testing cell view\n");
1744   if (!test_cell_view ())
1745     g_error ("test_cell_view failed");
1746   
1747   g_print ("Testing dialog\n");
1748   if (!test_dialog ())
1749     g_error ("test_dialog failed");
1750
1751   g_print ("Testing accelerators\n");
1752   if (!test_accelerators ())
1753     g_error ("test_accelerators failed");
1754
1755   g_print ("Testing widget\n");
1756   if (!test_widget ())
1757     g_error ("test_widget failed");
1758
1759   g_print ("Testing value from string\n");
1760   if (!test_value_from_string ())
1761     g_error ("test_value_from_string failed");
1762
1763   g_print ("Testing reference counting\n");
1764   if (!test_reference_counting ())
1765     g_error ("test_reference_counting failed");
1766
1767   return 0;
1768 }