diff options
-rw-r--r-- | testsuite/gtk/Makefile.am | 15 | ||||
-rw-r--r-- | testsuite/gtk/builderparser.c | 143 | ||||
-rw-r--r-- | testsuite/gtk/ui/test1.expected | 2 | ||||
-rw-r--r-- | testsuite/gtk/ui/test1.ui | 5 | ||||
-rw-r--r-- | testsuite/gtk/ui/test2.expected | 2 | ||||
-rw-r--r-- | testsuite/gtk/ui/test2.ui | 5 | ||||
-rw-r--r-- | testsuite/gtk/ui/test3.expected | 2 | ||||
-rw-r--r-- | testsuite/gtk/ui/test3.ui | 5 | ||||
-rw-r--r-- | testsuite/gtk/ui/test4.expected | 2 | ||||
-rw-r--r-- | testsuite/gtk/ui/test4.ui | 5 |
10 files changed, 185 insertions, 1 deletions
diff --git a/testsuite/gtk/Makefile.am b/testsuite/gtk/Makefile.am index 52aacfa1ab..728c37946e 100644 --- a/testsuite/gtk/Makefile.am +++ b/testsuite/gtk/Makefile.am @@ -34,6 +34,7 @@ TEST_PROGS += \ adjustment \ bitmask \ builder \ + builderparser \ cellarea \ check-icon-names \ clipboard \ @@ -161,10 +162,22 @@ test_icontheme = \ icons2/index.theme \ $(NULL) +test_ui = \ + ui/test1.ui \ + ui/test1.expected \ + ui/test2.ui \ + ui/test2.expected \ + ui/test3.ui \ + ui/test3.expected \ + ui/test4.ui \ + ui/test4.expected \ + $(NULL) + EXTRA_DIST += \ file-chooser-test-dir/empty \ file-chooser-test-dir/text.txt \ $(test_icontheme) \ + $(test_ui) \ $(NULL) GTK_GSETTINGS_SCHEMAS = \ @@ -186,7 +199,7 @@ all-am: gschemas.compiled if BUILDOPT_INSTALL_TESTS insttestdir = $(libexecdir)/installed-tests/$(PACKAGE) insttest_PROGRAMS = $(TEST_PROGS) -nobase_insttest_DATA = $(test_icontheme) +nobase_insttest_DATA = $(test_icontheme) $(test_ui) %.test: %$(EXEEXT) Makefile $(AM_V_GEN) (echo '[Test]' > $@.tmp; \ diff --git a/testsuite/gtk/builderparser.c b/testsuite/gtk/builderparser.c new file mode 100644 index 0000000000..4aba4db17a --- /dev/null +++ b/testsuite/gtk/builderparser.c @@ -0,0 +1,143 @@ +/* + * builderparser.c: Test GtkBuilder parser + * + * Copyright (C) 2014 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include <string.h> +#include <gtk/gtk.h> + +static void +test_file (const gchar *filename, GString *string) +{ + gchar *contents; + gsize length; + GError *error = NULL; + gboolean ret; + GtkBuilder *builder; + + if (!g_file_get_contents (filename, &contents, &length, &error)) + { + fprintf (stderr, "%s\n", error->message); + g_error_free (error); + return; + } + + builder = gtk_builder_new (); + ret = gtk_builder_add_from_string (builder, contents, length, &error); + g_free (contents); + + if (ret) + { + g_assert_no_error (error); + g_string_append_printf (string, "SUCCESS\n"); + } + else + { + g_string_append_printf (string, "ERROR: %s %d\n%s\n", + g_quark_to_string (error->domain), + error->code, + error->message); + g_error_free (error); + } + + g_object_unref (builder); +} + +static gchar * +get_expected_filename (const gchar *filename) +{ + gchar *f, *p, *expected; + + f = g_strdup (filename); + p = strstr (f, ".ui"); + if (p) + *p = 0; + expected = g_strconcat (f, ".expected", NULL); + + g_free (f); + + return expected; +} + +static void +test_parse (gconstpointer d) +{ + const gchar *filename = d; + gchar *expected_file; + gchar *expected; + GError *error = NULL; + GString *string; + + expected_file = get_expected_filename (filename); + + string = g_string_sized_new (0); + + test_file (filename, string); + + g_file_get_contents (expected_file, &expected, NULL, &error); + g_assert_no_error (error); + g_assert_cmpstr (string->str, ==, expected); + g_free (expected); + + g_string_free (string, TRUE); + + g_free (expected_file); +} + +int +main (int argc, char *argv[]) +{ + GDir *dir; + GError *error = NULL; + const gchar *name; + gchar *path; + + gtk_test_init (&argc, &argv, NULL); + + /* allow to easily generate expected output for new test cases */ + if (argc > 1) + { + GString *string; + + string = g_string_sized_new (0); + test_file (argv[1], string); + g_print ("%s", string->str); + + return 0; + } + + path = g_test_build_filename (G_TEST_DIST, "ui", NULL); + dir = g_dir_open (path, 0, &error); + g_free (path); + g_assert_no_error (error); + while ((name = g_dir_read_name (dir)) != NULL) + { + if (!g_str_has_suffix (name, ".ui")) + continue; + + path = g_strdup_printf ("/builder/parse/%s", name); + g_test_add_data_func_full (path, g_test_build_filename (G_TEST_DIST, "ui", name, NULL), + test_parse, g_free); + g_free (path); + } + g_dir_close (dir); + + return g_test_run (); +} + diff --git a/testsuite/gtk/ui/test1.expected b/testsuite/gtk/ui/test1.expected new file mode 100644 index 0000000000..dcfceaea70 --- /dev/null +++ b/testsuite/gtk/ui/test1.expected @@ -0,0 +1,2 @@ +ERROR: gtk-builder-error-quark 1 +Unhandled tag: <style> diff --git a/testsuite/gtk/ui/test1.ui b/testsuite/gtk/ui/test1.ui new file mode 100644 index 0000000000..f73c5c727e --- /dev/null +++ b/testsuite/gtk/ui/test1.ui @@ -0,0 +1,5 @@ +<interface> + <object class="GtkWindow"> + </object> + <style></style> +</interface> diff --git a/testsuite/gtk/ui/test2.expected b/testsuite/gtk/ui/test2.expected new file mode 100644 index 0000000000..871e994750 --- /dev/null +++ b/testsuite/gtk/ui/test2.expected @@ -0,0 +1,2 @@ +ERROR: gtk-builder-error-quark 3 +<input>:3:1 'get-type' is not a valid attribute of <object> diff --git a/testsuite/gtk/ui/test2.ui b/testsuite/gtk/ui/test2.ui new file mode 100644 index 0000000000..9665d40df0 --- /dev/null +++ b/testsuite/gtk/ui/test2.ui @@ -0,0 +1,5 @@ +<interface> + <object get-type="gtk_window_get_type"> + <object class="GtkBox"/> + </object> +</interface> diff --git a/testsuite/gtk/ui/test3.expected b/testsuite/gtk/ui/test3.expected new file mode 100644 index 0000000000..22701d3451 --- /dev/null +++ b/testsuite/gtk/ui/test3.expected @@ -0,0 +1,2 @@ +ERROR: g-markup-error-quark 6 +element 'class' requires attribute 'name' diff --git a/testsuite/gtk/ui/test3.ui b/testsuite/gtk/ui/test3.ui new file mode 100644 index 0000000000..04732b3725 --- /dev/null +++ b/testsuite/gtk/ui/test3.ui @@ -0,0 +1,5 @@ +<interface> + <object class="GtkWindow"> + <style><class>name</class></style> + </object> +</interface> diff --git a/testsuite/gtk/ui/test4.expected b/testsuite/gtk/ui/test4.expected new file mode 100644 index 0000000000..45d5b67492 --- /dev/null +++ b/testsuite/gtk/ui/test4.expected @@ -0,0 +1,2 @@ +ERROR: gtk-builder-error-quark 1 +Unhandled tag: <random> diff --git a/testsuite/gtk/ui/test4.ui b/testsuite/gtk/ui/test4.ui new file mode 100644 index 0000000000..aa0bfaf244 --- /dev/null +++ b/testsuite/gtk/ui/test4.ui @@ -0,0 +1,5 @@ +<interface> + <object class="GtkBox"> + <property name="orientation"><random></random></property> + </object> +</interface> |