]> Pileus Git - ~andy/gtk/blobdiff - gtk/tests/builder.c
tests: add a test for GtkLevelBar GtkBuildable implementation
[~andy/gtk] / gtk / tests / builder.c
index e9dab5c11fc1062973b82cd150e37ff1af0384dc..563d422b216cc5a628bf9bdc420a5a2b64395a68 100644 (file)
@@ -14,9 +14,7 @@
  * 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.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 #include <string.h>
@@ -116,6 +114,13 @@ test_parser (void)
                              GTK_BUILDER_ERROR_INVALID_VALUE));
   g_error_free (error);
 
+  error = NULL;
+  gtk_builder_add_from_string (builder, "<interface><object class=\"GtkButton\" id=\"a\"></object><object class=\"GtkButton\" id=\"a\"/></object></interface>", -1, &error);
+  g_assert (g_error_matches (error,
+                             GTK_BUILDER_ERROR,
+                             GTK_BUILDER_ERROR_DUPLICATE_ID));
+  g_error_free (error);
+
   g_object_unref (builder);
 }
 
@@ -345,10 +350,10 @@ test_uimanager_simple (void)
   children = gtk_container_get_children (GTK_CONTAINER (menubar));
   menu = children->data;
   g_assert (GTK_IS_MENU_ITEM (menu));
-  g_assert (strcmp (GTK_WIDGET (menu)->name, "file") == 0);
+  g_assert (strcmp (gtk_widget_get_name (GTK_WIDGET (menu)), "file") == 0);
   g_list_free (children);
   
-  label = G_OBJECT (GTK_BIN (menu)->child);
+  label = G_OBJECT (gtk_bin_get_child (GTK_BIN (menu)));
   g_assert (GTK_IS_LABEL (label));
   g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0);
 
@@ -715,7 +720,6 @@ test_types (void)
     "  <object class=\"GtkHButtonBox\" id=\"hbuttonbox\"/>"
     "  <object class=\"GtkHBox\" id=\"hbox\"/>"
     "  <object class=\"GtkHPaned\" id=\"hpaned\"/>"
-    "  <object class=\"GtkHRuler\" id=\"hruler\"/>"
     "  <object class=\"GtkHScale\" id=\"hscale\"/>"
     "  <object class=\"GtkHScrollbar\" id=\"hscrollbar\"/>"
     "  <object class=\"GtkHSeparator\" id=\"hseparator\"/>"
@@ -742,7 +746,6 @@ test_types (void)
     "  <object class=\"GtkVScrollbar\" id=\"vscrollbar\"/>"
     "  <object class=\"GtkVSeparator\" id=\"vseparator\"/>"
     "  <object class=\"GtkViewport\" id=\"viewport\"/>"
-    "  <object class=\"GtkVRuler\" id=\"vruler\"/>"
     "  <object class=\"GtkVPaned\" id=\"vpaned\"/>"
     "  <object class=\"GtkVScale\" id=\"vscale\"/>"
     "  <object class=\"GtkWindow\" id=\"window\"/>"
@@ -792,7 +795,7 @@ test_spin_button (void)
     "<property name=\"upper\">10</property>"
     "<property name=\"step-increment\">2</property>"
     "<property name=\"page-increment\">3</property>"
-    "<property name=\"page-size\">5</property>"
+    "<property name=\"page-size\">0</property>"
     "<property name=\"value\">1</property>"
     "</object>"
     "<object class=\"GtkSpinButton\" id=\"spinbutton1\">"
@@ -820,7 +823,7 @@ test_spin_button (void)
   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_assert (value == 0);
   
   g_object_unref (builder);
 }
@@ -963,6 +966,7 @@ static void
 test_children (void)
 {
   GtkBuilder * builder;
+  GtkWidget *content_area, *dialog_action_area;
   GList *children;
   const gchar buffer1[] =
     "<interface>"
@@ -1001,7 +1005,8 @@ test_children (void)
   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);
+  g_assert (gtk_widget_get_parent (GTK_WIDGET(button)) != NULL);
+  g_assert (strcmp (gtk_buildable_get_name (GTK_BUILDABLE (gtk_widget_get_parent (GTK_WIDGET (button)))), "window1") == 0);
 
   gtk_widget_destroy (GTK_WIDGET (window));
   g_object_unref (builder);
@@ -1015,21 +1020,24 @@ test_children (void)
   g_list_free (children);
   
   vbox = gtk_builder_get_object (builder, "dialog1-vbox");
+  content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
   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);
+  g_assert (GTK_IS_BOX (vbox));
+  g_assert (gtk_orientable_get_orientation (GTK_ORIENTABLE (vbox)) == GTK_ORIENTATION_VERTICAL);
+  g_assert (strcmp (gtk_buildable_get_name (GTK_BUILDABLE (gtk_widget_get_parent (GTK_WIDGET (vbox)))), "dialog1") == 0);
+  g_assert (gtk_container_get_border_width (GTK_CONTAINER (vbox)) == 10);
+  g_assert (strcmp (gtk_buildable_get_name (GTK_BUILDABLE (content_area)), "dialog1-vbox") == 0);
 
   action_area = gtk_builder_get_object (builder, "dialog1-action_area");
+  dialog_action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog));
   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);
+  g_assert (GTK_IS_BUTTON_BOX (action_area));
+  g_assert (gtk_orientable_get_orientation (GTK_ORIENTABLE (action_area)) == GTK_ORIENTATION_HORIZONTAL);
+  g_assert (gtk_widget_get_parent (GTK_WIDGET (action_area)) != NULL);
+  g_assert (gtk_container_get_border_width (GTK_CONTAINER (action_area)) == 20);
+  g_assert (dialog_action_area != NULL);
+  g_assert (gtk_buildable_get_name (GTK_BUILDABLE (action_area)) != NULL);
+  g_assert (strcmp (gtk_buildable_get_name (GTK_BUILDABLE (dialog_action_area)), "dialog1-action_area") == 0);
   gtk_widget_destroy (GTK_WIDGET (dialog));
   g_object_unref (builder);
 }
@@ -1040,7 +1048,7 @@ test_child_properties (void)
   GtkBuilder * builder;
   const gchar buffer1[] =
     "<interface>"
-    "  <object class=\"GtkVBox\" id=\"vbox1\">"
+    "  <object class=\"GtkBox\" id=\"vbox1\">"
     "    <child>"
     "      <object class=\"GtkLabel\" id=\"label1\"/>"
     "      <packing>"
@@ -1061,7 +1069,7 @@ test_child_properties (void)
   
   builder = builder_new_from_string (buffer1, -1, NULL);
   vbox = gtk_builder_get_object (builder, "vbox1");
-  g_assert (GTK_IS_VBOX (vbox));
+  g_assert (GTK_IS_BOX (vbox));
 
   label = gtk_builder_get_object (builder, "label1");
   g_assert (GTK_IS_LABEL (label));
@@ -1147,7 +1155,7 @@ test_treeview_column (void)
   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);
+  renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
   g_assert (g_list_length (renderers) == 1);
   renderer = g_list_nth_data (renderers, 0);
   g_assert (renderer);
@@ -1210,22 +1218,13 @@ test_icon_view (void)
     "    </child>"
     "  </object>"
     "</interface>";
-  GObject *window, *iconview, *renderer;
-  gchar *text;
+  GObject *window, *iconview;
   
   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);
@@ -1302,6 +1301,7 @@ test_combo_box (void)
   g_object_unref (builder);
 }
 
+#if 0
 static void
 test_combo_box_entry (void)
 {
@@ -1326,8 +1326,9 @@ test_combo_box_entry (void)
     "  </object>"
     "  <object class=\"GtkWindow\" id=\"window1\">"
     "    <child>"
-    "      <object class=\"GtkComboBoxEntry\" id=\"comboboxentry1\">"
+    "      <object class=\"GtkComboBox\" id=\"comboboxentry1\">"
     "        <property name=\"model\">liststore1</property>"
+    "        <property name=\"has-entry\">True</property>"
     "        <property name=\"visible\">True</property>"
     "        <child>"
     "          <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
@@ -1371,6 +1372,7 @@ test_combo_box_entry (void)
 
   g_object_unref (builder);
 }
+#endif
 
 static void
 test_cell_view (void)
@@ -1423,7 +1425,7 @@ test_cell_view (void)
   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));
+  renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (cellview));
   g_assert (renderers);
   g_assert (g_list_length (renderers) == 1);
   
@@ -1486,6 +1488,36 @@ test_dialog (void)
   g_object_unref (builder);
 }
 
+static void
+test_message_dialog (void)
+{
+  GtkBuilder * builder;
+  const gchar buffer1[] =
+    "<interface>"
+    "  <object class=\"GtkMessageDialog\" id=\"dialog1\">"
+    "    <child internal-child=\"message_area\">"
+    "      <object class=\"GtkVBox\" id=\"dialog-message-area\">"
+    "        <child>"
+    "          <object class=\"GtkExpander\" id=\"expander\"/>"
+    "        </child>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+
+  GObject *dialog1;
+  GObject *expander;
+
+  builder = builder_new_from_string (buffer1, -1, NULL);
+  dialog1 = gtk_builder_get_object (builder, "dialog1");
+  expander = gtk_builder_get_object (builder, "expander");
+  g_assert (GTK_IS_EXPANDER (expander));
+  g_assert (gtk_widget_get_parent (GTK_WIDGET (expander)) == gtk_message_dialog_get_message_area (GTK_MESSAGE_DIALOG (dialog1)));
+
+  gtk_widget_destroy (GTK_WIDGET (dialog1));
+  g_object_unref (builder);
+}
+
 static void
 test_accelerators (void)
 {
@@ -1607,7 +1639,7 @@ test_widget (void)
   button1 = gtk_builder_get_object (builder, "button1");
 
 #if 0
-  g_assert (GTK_WIDGET_HAS_FOCUS (GTK_WIDGET (button1)));
+  g_assert (gtk_widget_has_focus (GTK_WIDGET (button1)));
 #endif
   window1 = gtk_builder_get_object (builder, "window1");
   gtk_widget_destroy (GTK_WIDGET (window1));
@@ -1617,7 +1649,7 @@ test_widget (void)
   builder = builder_new_from_string (buffer2, -1, NULL);
   button1 = gtk_builder_get_object (builder, "button1");
 
-  g_assert (GTK_WIDGET_RECEIVES_DEFAULT (GTK_WIDGET (button1)));
+  g_assert (gtk_widget_get_receives_default (GTK_WIDGET (button1)));
   
   g_object_unref (builder);
   
@@ -1678,7 +1710,7 @@ test_window (void)
 static void
 test_value_from_string (void)
 {
-  GValue value = { 0 };
+  GValue value = G_VALUE_INIT;
   GError *error = NULL;
   GtkBuilder *builder;
 
@@ -1804,17 +1836,7 @@ test_value_from_string (void)
                              GTK_BUILDER_ERROR_INVALID_VALUE));
   g_error_free (error);
   error = NULL;
-  
-  g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WIDGET_FLAGS, "mapped", &value, &error) == TRUE);
-  g_assert (G_VALUE_HOLDS_FLAGS (&value));
-  g_assert (g_value_get_flags (&value) == GTK_MAPPED);
-  g_value_unset (&value);
 
-  g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WIDGET_FLAGS, "GTK_VISIBLE | GTK_REALIZED", &value, &error) == TRUE);
-  g_assert (G_VALUE_HOLDS_FLAGS (&value));
-  g_assert (g_value_get_flags (&value) == (GTK_VISIBLE | GTK_REALIZED));
-  g_value_unset (&value);
-  
   g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "foobar", &value, &error) == FALSE);
   g_value_unset (&value);
   g_assert (g_error_matches (error,
@@ -1944,6 +1966,8 @@ test_icon_factory (void)
   gtk_icon_factory_add_default (GTK_ICON_FACTORY (factory));
   image = gtk_image_new_from_stock ("apple-red", GTK_ICON_SIZE_BUTTON);
   g_assert (image != NULL);
+  g_object_ref_sink (image);
+  g_object_unref (image);
 
   g_object_unref (builder);
 
@@ -2129,6 +2153,7 @@ test_requires (void)
                              GTK_BUILDER_ERROR_VERSION_MISMATCH));
   g_object_unref (builder);
   g_error_free (error);
+  g_free (buffer);
 }
 
 static void
@@ -2172,7 +2197,7 @@ test_add_objects (void)
     "  </object>"
     "  <object class=\"GtkWindow\" id=\"window2\">"
     "    <child>"
-    "      <object class=\"GtkLabel\" id=\"label1\">"
+    "      <object class=\"GtkLabel\" id=\"label3\">"
     "        <property name=\"label\" translatable=\"no\">second label</property>"
     "      </object>"
     "    </child>"
@@ -2249,10 +2274,10 @@ test_add_objects (void)
   menu = children->data;
   g_assert (menu != NULL);
   g_assert (GTK_IS_MENU_ITEM (menu));
-  g_assert (strcmp (GTK_WIDGET (menu)->name, "file") == 0);
+  g_assert (strcmp (gtk_widget_get_name (GTK_WIDGET (menu)), "file") == 0);
   g_list_free (children);
  
-  label = G_OBJECT (GTK_BIN (menu)->child);
+  label = G_OBJECT (gtk_bin_get_child (GTK_BIN (menu)));
   g_assert (label != NULL);
   g_assert (GTK_IS_LABEL (label));
   g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0);
@@ -2276,10 +2301,10 @@ test_add_objects (void)
   menu = children->data;
   g_assert (menu != NULL);
   g_assert (GTK_IS_MENU_ITEM (menu));
-  g_assert (strcmp (GTK_WIDGET (menu)->name, "file") == 0);
+  g_assert (strcmp (gtk_widget_get_name (GTK_WIDGET (menu)), "file") == 0);
   g_list_free (children);
  
-  label = G_OBJECT (GTK_BIN (menu)->child);
+  label = G_OBJECT (gtk_bin_get_child (GTK_BIN (menu)));
   g_assert (label != NULL);
   g_assert (GTK_IS_LABEL (label));
   g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0);
@@ -2290,16 +2315,18 @@ test_add_objects (void)
 static GtkWidget *
 get_parent_menubar (GtkWidget *menuitem)
 {
-  GtkMenuShell *menu_shell = (GtkMenuShell *)menuitem->parent;
+  GtkMenuShell *menu_shell;
   GtkWidget *attach = NULL;
 
+  menu_shell = GTK_MENU_SHELL (gtk_widget_get_parent (menuitem));
+
   g_assert (GTK_IS_MENU_SHELL (menu_shell));
 
   while (menu_shell && !GTK_IS_MENU_BAR (menu_shell))
     {
       if (GTK_IS_MENU (menu_shell) && 
          (attach = gtk_menu_get_attach_widget (GTK_MENU (menu_shell))) != NULL)
-       menu_shell = (GtkMenuShell *)attach->parent;
+       menu_shell = GTK_MENU_SHELL (gtk_widget_get_parent (attach));
       else
        menu_shell = NULL;
     }
@@ -2383,6 +2410,7 @@ test_menus (void)
     "<object class=\"GtkAccelGroup\" id=\"accelgroup1\"/>"
     "</interface>";
   GtkBuilder *builder;
+  GtkWidget *child;
   GtkWidget *window, *item;
   GtkAccelGroup *accel_group;
   GtkWidget *item_accel_label, *sample_accel_label, *sample_menu_item, *custom;
@@ -2398,22 +2426,24 @@ test_menus (void)
 
   sample_menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
 
-  g_assert (GTK_BIN (sample_menu_item)->child);
-  g_assert (GTK_IS_ACCEL_LABEL (GTK_BIN (sample_menu_item)->child));
-  sample_accel_label = GTK_WIDGET (GTK_BIN (sample_menu_item)->child);
+  child = gtk_bin_get_child (GTK_BIN (sample_menu_item));
+  g_assert (child);
+  g_assert (GTK_IS_ACCEL_LABEL (child));
+  sample_accel_label = child;
   gtk_widget_show (sample_accel_label);
 
-  g_assert (GTK_BIN (item)->child);
-  g_assert (GTK_IS_ACCEL_LABEL (GTK_BIN (item)->child));
-  item_accel_label = GTK_WIDGET (GTK_BIN (item)->child);
+  child = gtk_bin_get_child (GTK_BIN (item));
+  g_assert (child);
+  g_assert (GTK_IS_ACCEL_LABEL (child));
+  item_accel_label = child;
 
   gtk_accel_label_refetch (GTK_ACCEL_LABEL (sample_accel_label));
   gtk_accel_label_refetch (GTK_ACCEL_LABEL (item_accel_label));
 
-  g_assert (GTK_ACCEL_LABEL (sample_accel_label)->accel_string != NULL);
-  g_assert (GTK_ACCEL_LABEL (item_accel_label)->accel_string != NULL);
-  g_assert (strcmp (GTK_ACCEL_LABEL (item_accel_label)->accel_string, 
-                   GTK_ACCEL_LABEL (sample_accel_label)->accel_string) == 0);
+  g_assert (gtk_label_get_text (GTK_LABEL (sample_accel_label)) != NULL);
+  g_assert (gtk_label_get_text (GTK_LABEL (item_accel_label)) != NULL);
+  g_assert (strcmp (gtk_label_get_text (GTK_LABEL (item_accel_label)),
+                   gtk_label_get_text (GTK_LABEL (sample_accel_label))) == 0);
 
   /* Check the menu hierarchy worked here  */
   g_assert (get_parent_menubar (item));
@@ -2431,7 +2461,7 @@ test_menus (void)
   item = (GtkWidget *)gtk_builder_get_object (builder, "imagemenuitem1");
   custom = (GtkWidget *)gtk_builder_get_object (builder, "custom1");
 
-  g_assert (custom->parent == item);
+  g_assert (gtk_widget_get_parent (custom) == item);
 
   gtk_widget_destroy (GTK_WIDGET (window));
   g_object_unref (builder);
@@ -2462,11 +2492,9 @@ test_file (const gchar *filename)
 
       if (GTK_IS_DIALOG (obj))
        {
-         int response;
-
          g_print ("Running dialog %s.\n",
                   gtk_widget_get_name (GTK_WIDGET (obj)));
-         response = gtk_dialog_run (GTK_DIALOG (obj));
+         gtk_dialog_run (GTK_DIALOG (obj));
        }
       else if (GTK_IS_WINDOW (obj))
        {
@@ -2483,6 +2511,200 @@ test_file (const gchar *filename)
   builder = NULL;
 }
 
+static void
+test_message_area (void)
+{
+  GtkBuilder *builder;
+  GObject *obj, *obj1;
+  const gchar buffer[] =
+    "<interface>"
+    "  <object class=\"GtkInfoBar\" id=\"infobar1\">"
+    "    <child internal-child=\"content_area\">"
+    "      <object class=\"GtkHBox\" id=\"contentarea1\">"
+    "        <child>"
+    "          <object class=\"GtkLabel\" id=\"content\">"
+    "            <property name=\"label\" translatable=\"yes\">Message</property>"
+    "          </object>"
+    "          <packing>"
+    "            <property name='expand'>False</property>"
+    "          </packing>"
+    "        </child>"
+    "      </object>"
+    "    </child>"
+    "    <child internal-child=\"action_area\">"
+    "      <object class=\"GtkVButtonBox\" id=\"actionarea1\">"
+    "        <child>"
+    "          <object class=\"GtkButton\" id=\"button_ok\">"
+    "            <property name=\"label\">gtk-ok</property>"
+    "            <property name=\"use-stock\">yes</property>"
+    "          </object>"
+    "        </child>"
+    "      </object>"
+    "    </child>"
+    "    <action-widgets>"
+    "      <action-widget response=\"1\">button_ok</action-widget>"
+    "    </action-widgets>"
+    "  </object>"
+    "</interface>";
+
+  builder = builder_new_from_string (buffer, -1, NULL);
+  obj = gtk_builder_get_object (builder, "infobar1");
+  g_assert (GTK_IS_INFO_BAR (obj));
+  obj1 = gtk_builder_get_object (builder, "content");
+  g_assert (GTK_IS_LABEL (obj1));
+  g_assert (gtk_widget_get_parent (gtk_widget_get_parent (GTK_WIDGET (obj1))) == GTK_WIDGET (obj));
+
+  obj1 = gtk_builder_get_object (builder, "button_ok");
+  g_assert (GTK_IS_BUTTON (obj1));
+  g_assert (gtk_widget_get_parent (gtk_widget_get_parent (GTK_WIDGET (obj1))) == GTK_WIDGET (obj));
+
+  g_object_unref (builder);
+}
+
+static void
+test_gmenu (void)
+{
+  GtkBuilder *builder;
+  GObject *obj, *obj1;
+  const gchar buffer[] =
+    "<interface>"
+    "  <object class=\"GtkWindow\" id=\"window\">"
+    "  </object>"
+    "  <menu id='edit-menu'>"
+    "    <section>"
+    "      <item>"
+    "        <attribute name='label'>Undo</attribute>"
+    "        <attribute name='action'>undo</attribute>"
+    "      </item>"
+    "      <item>"
+    "        <attribute name='label'>Redo</attribute>"
+    "        <attribute name='action'>redo</attribute>"
+    "      </item>"
+    "    </section>"
+    "    <section></section>"
+    "    <section>"
+    "      <attribute name='label'>Copy &amp; Paste</attribute>"
+    "      <item>"
+    "        <attribute name='label'>Cut</attribute>"
+    "        <attribute name='action'>cut</attribute>"
+    "      </item>"
+    "      <item>"
+    "        <attribute name='label'>Copy</attribute>"
+    "        <attribute name='action'>copy</attribute>"
+    "      </item>"
+    "      <item>"
+    "        <attribute name='label'>Paste</attribute>"
+    "        <attribute name='action'>paste</attribute>"
+    "      </item>"
+    "    </section>"
+    "    <item><link name='section' id='blargh'>"
+    "      <item>"
+    "        <attribute name='label'>Bold</attribute>"
+    "        <attribute name='action'>bold</attribute>"
+    "      </item>"
+    "      <submenu>"
+    "        <attribute name='label'>Language</attribute>"
+    "        <item>"
+    "          <attribute name='label'>Latin</attribute>"
+    "          <attribute name='action'>lang</attribute>"
+    "          <attribute name='target'>'latin'</attribute>"
+    "        </item>"
+    "        <item>"
+    "          <attribute name='label'>Greek</attribute>"
+    "          <attribute name='action'>lang</attribute>"
+    "          <attribute name='target'>'greek'</attribute>"
+    "        </item>"
+    "        <item>"
+    "          <attribute name='label'>Urdu</attribute>"
+    "          <attribute name='action'>lang</attribute>"
+    "          <attribute name='target'>'urdu'</attribute>"
+    "        </item>"
+    "      </submenu>"
+    "    </link></item>"
+    "  </menu>"
+    "</interface>";
+
+  builder = builder_new_from_string (buffer, -1, NULL);
+  obj = gtk_builder_get_object (builder, "window");
+  g_assert (GTK_IS_WINDOW (obj));
+  obj1 = gtk_builder_get_object (builder, "edit-menu");
+  g_assert (G_IS_MENU_MODEL (obj1));
+  obj1 = gtk_builder_get_object (builder, "blargh");
+  g_assert (G_IS_MENU_MODEL (obj1));
+  g_object_unref (builder);
+}
+
+static void
+test_level_bar (void)
+{
+  GtkBuilder *builder;
+  GError *error = NULL;
+  GObject *obj, *obj1;
+  const gchar buffer1[] =
+    "<interface>"
+    "  <object class=\"GtkWindow\" id=\"window\">"
+    "    <child>"
+    "      <object class=\"GtkLevelBar\" id=\"levelbar\">"
+    "        <property name=\"value\">4.70</property>"
+    "        <property name=\"min-value\">2</property>"
+    "        <property name=\"max-value\">5</property>"
+    "        <offsets>"
+    "          <offset name=\"low\" value=\"2.25\"/>"
+    "          <offset name=\"custom\" value=\"3\"/>"
+    "          <offset name=\"high\" value=\"3\"/>"
+    "        </offsets>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+  const gchar buffer2[] =
+    "<interface>"
+    "  <object class=\"GtkLevelBar\" id=\"levelbar\">"
+    "    <offsets>"
+    "      <offset name=\"low\" bogus_attr=\"foo\"/>"
+    "    </offsets>"
+    "  </object>"
+    "</interface>";
+  const gchar buffer3[] =
+    "<interface>"
+    "  <object class=\"GtkLevelBar\" id=\"levelbar\">"
+    "    <offsets>"
+    "      <offset name=\"low\" value=\"1\"/>"
+    "    </offsets>"
+    "    <bogus_tag>"
+    "    </bogus_tag>"
+    "  </object>"
+    "</interface>";
+
+  builder = gtk_builder_new ();
+  gtk_builder_add_from_string (builder, buffer1, -1, &error);
+  g_assert (error == NULL);
+
+  obj = gtk_builder_get_object (builder, "window");
+  g_assert (GTK_IS_WINDOW (obj));
+  obj1 = gtk_builder_get_object (builder, "levelbar");
+  g_assert (GTK_IS_LEVEL_BAR (obj1));
+  g_object_unref (builder);
+
+  error = NULL;
+  builder = gtk_builder_new ();
+  gtk_builder_add_from_string (builder, buffer2, -1, &error);
+  g_assert (g_error_matches (error,
+                             GTK_BUILDER_ERROR,
+                             GTK_BUILDER_ERROR_INVALID_ATTRIBUTE));
+  g_error_free (error);
+  g_object_unref (builder);
+
+  error = NULL;
+  builder = gtk_builder_new ();
+  gtk_builder_add_from_string (builder, buffer3, -1, &error);
+  g_assert (g_error_matches (error,
+                             GTK_BUILDER_ERROR,
+                             GTK_BUILDER_ERROR_UNHANDLED_TAG));
+  g_error_free (error);
+  g_object_unref (builder);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -2512,7 +2734,9 @@ main (int argc, char **argv)
   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);
+#if 0
   g_test_add_func ("/Builder/ComboBox Entry", test_combo_box_entry);
+#endif
   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);
@@ -2525,6 +2749,11 @@ main (int argc, char **argv)
   g_test_add_func ("/Builder/Requires", test_requires);
   g_test_add_func ("/Builder/AddObjects", test_add_objects);
   g_test_add_func ("/Builder/Menus", test_menus);
+  g_test_add_func ("/Builder/MessageArea", test_message_area);
+  g_test_add_func ("/Builder/MessageDialog", test_message_dialog);
+  g_test_add_func ("/Builder/GMenu", test_gmenu);
+  g_test_add_func ("/Builder/LevelBar", test_level_bar);
 
   return g_test_run();
 }
+