string_SOURCES = string.c
string_LDADD = $(progs_ldadd) -lm
+TEST_PROGS += markup-parse
+markup_parse_LDADD = $(progs_ldadd)
+
+TEST_PROGS += markup-collect
+markup_collect_LDADD = $(progs_ldadd)
+
+TEST_PROGS += markup-escape
+markup_escape_LDADD = $(progs_ldadd)
+
TEST_PROGS += markup-subparser
markup_subparser_LDADD = $(progs_ldadd)
TEST_PROGS += pattern
pattern_LDADD = $(progs_ldadd)
-TEST_PROGS += markup-escape
-markup_escape_LDADD = $(progs_ldadd)
-
TEST_PROGS += logging
logging_LDADD = $(progs_ldadd)
-TEST_PROGS += markup-collect
-markup_collect_LDADD = $(progs_ldadd)
-
if OS_UNIX
# some testing of gtester funcitonality
4096-random-bytes \
keyfiletest.ini \
bookmarks.xbel
+
+dist_hook:
+ mkdir $(distdir)/markups; \
+ for f in $(srcdir)/markups/*; do \
+ cp $$f $(distdir)/markups; done
--- /dev/null
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <string.h>
+#include <stdio.h>
+#include <glib.h>
+
+#ifndef SRCDIR
+#define SRCDIR "."
+#endif
+
+static int depth = 0;
+static GString *string;
+
+static void
+indent (int extra)
+{
+ int i = 0;
+ while (i < depth)
+ {
+ g_string_append (string, " ");
+ ++i;
+ }
+}
+
+static void
+start_element_handler (GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ gpointer user_data,
+ GError **error)
+{
+ int i;
+
+ indent (0);
+ g_string_append_printf (string, "ELEMENT '%s'\n", element_name);
+
+ i = 0;
+ while (attribute_names[i] != NULL)
+ {
+ indent (1);
+
+ g_string_append_printf (string, "%s=\"%s\"\n",
+ attribute_names[i],
+ attribute_values[i]);
+
+ ++i;
+ }
+
+ ++depth;
+}
+
+static void
+end_element_handler (GMarkupParseContext *context,
+ const gchar *element_name,
+ gpointer user_data,
+ GError **error)
+{
+ --depth;
+ indent (0);
+ g_string_append_printf (string, "END '%s'\n", element_name);
+ }
+
+static void
+text_handler (GMarkupParseContext *context,
+ const gchar *text,
+ gsize text_len,
+ gpointer user_data,
+ GError **error)
+{
+ indent (0);
+ g_string_append_printf (string, "TEXT '%.*s'\n", (int)text_len, text);
+}
+
+
+static void
+passthrough_handler (GMarkupParseContext *context,
+ const gchar *passthrough_text,
+ gsize text_len,
+ gpointer user_data,
+ GError **error)
+{
+ indent (0);
+
+ g_string_append_printf (string, "PASS '%.*s'\n", (int)text_len, passthrough_text);
+}
+
+static void
+error_handler (GMarkupParseContext *context,
+ GError *error,
+ gpointer user_data)
+{
+ g_string_append_printf (string, "ERROR %s\n", error->message);
+}
+
+static const GMarkupParser parser = {
+ start_element_handler,
+ end_element_handler,
+ text_handler,
+ passthrough_handler,
+ error_handler
+};
+
+static const GMarkupParser silent_parser = {
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ error_handler
+};
+
+static int
+test_in_chunks (const gchar *contents,
+ gint length,
+ gint chunk_size)
+{
+ GMarkupParseContext *context;
+ int i = 0;
+
+ context = g_markup_parse_context_new (&silent_parser, 0, NULL, NULL);
+
+ while (i < length)
+ {
+ int this_chunk = MIN (length - i, chunk_size);
+
+ if (!g_markup_parse_context_parse (context,
+ contents + i,
+ this_chunk,
+ NULL))
+ {
+ g_markup_parse_context_free (context);
+ return 1;
+ }
+
+ i += this_chunk;
+ }
+
+ if (!g_markup_parse_context_end_parse (context, NULL))
+ {
+ g_markup_parse_context_free (context);
+ return 1;
+ }
+
+ g_markup_parse_context_free (context);
+
+ return 0;
+}
+
+static int
+test_file (const gchar *filename)
+{
+ gchar *contents;
+ gsize length;
+ GError *error;
+ GMarkupParseContext *context;
+ gint line, col;
+
+ error = NULL;
+ if (!g_file_get_contents (filename,
+ &contents,
+ &length,
+ &error))
+ {
+ fprintf (stderr, "%s\n", error->message);
+ g_error_free (error);
+ return 1;
+ }
+
+ context = g_markup_parse_context_new (&parser, 0, NULL, NULL);
+ g_assert (g_markup_parse_context_get_user_data (context) == NULL);
+ g_markup_parse_context_get_position (context, &line, &col);
+ g_assert (line == 1 && col == 1);
+
+ if (!g_markup_parse_context_parse (context, contents, length, NULL))
+ {
+ g_markup_parse_context_free (context);
+ return 1;
+ }
+
+ if (!g_markup_parse_context_end_parse (context, NULL))
+ {
+ g_markup_parse_context_free (context);
+ return 1;
+ }
+
+ g_markup_parse_context_free (context);
+
+ /* A byte at a time */
+ if (test_in_chunks (contents, length, 1) != 0)
+ return 1;
+
+ /* 2 bytes */
+ if (test_in_chunks (contents, length, 2) != 0)
+ return 1;
+
+ /*5 bytes */
+ if (test_in_chunks (contents, length, 5) != 0)
+ return 1;
+
+ /* 12 bytes */
+ if (test_in_chunks (contents, length, 12) != 0)
+ return 1;
+
+ /* 1024 bytes */
+ if (test_in_chunks (contents, length, 1024) != 0)
+ return 1;
+
+ return 0;
+}
+
+static gchar *
+get_expected_filename (const gchar *filename)
+{
+ gchar *f, *p, *expected;
+
+ f = g_strdup (filename);
+ p = strstr (f, ".gmarkup");
+ *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;
+ gint res;
+
+ depth = 0;
+ string = g_string_sized_new (0);
+
+ res = test_file (filename);
+
+ if (strstr (filename, "valid"))
+ g_assert_cmpint (res, ==, 0);
+ else
+ g_assert_cmpint (res, ==, 1);
+
+ expected_file = get_expected_filename (filename);
+ if (g_file_get_contents (expected_file, &expected, NULL, NULL))
+ {
+ g_assert_cmpstr (string->str, ==, expected);
+ g_free (expected);
+ }
+ g_free (expected_file);
+
+ g_string_free (string, TRUE);
+}
+
+int
+main (int argc, char *argv[])
+{
+ GDir *dir;
+ GError *error;
+ const gchar *name;
+ gchar *path;
+
+ g_test_init (&argc, &argv, NULL);
+
+ /* allow to easily generate expected output for new test cases */
+ if (argc > 1)
+ {
+ string = g_string_sized_new (0);
+ test_file (argv[1]);
+ g_print (string->str);
+ return 0;
+ }
+
+ error = NULL;
+ dir = g_dir_open (SRCDIR "/markups", 0, &error);
+ g_assert_no_error (error);
+ while ((name = g_dir_read_name (dir)) != NULL)
+ {
+ if (strstr (name, "expected"))
+ continue;
+
+ path = g_strdup_printf ("/markup/parse/%s", name);
+ g_test_add_data_func (path, g_build_filename (SRCDIR, "markups", name, NULL), test_parse);
+ g_free (path);
+ }
+ g_dir_close (dir);
+
+ return g_test_run ();
+}
+
--- /dev/null
+ERROR Error on line 1 char 1: Document was empty or contained only whitespace
--- /dev/null
+ELEMENT 'foo'
+ TEXT '
+'
+ERROR Error on line 2 char 8: Element '|foo' was closed, but the currently open element is 'foo'
--- /dev/null
+ELEMENT 'foo'
+ TEXT '
+'
+ ELEMENT 'bar'
+ TEXT '
+'
+ERROR Error on line 3 char 7: Element 'foo' was closed, but the currently open element is 'bar'
--- /dev/null
+ERROR Error on line 1 char 6: Element 'foo' was closed, no element is currently open
--- /dev/null
+ERROR Error on line 1 char 7: Element 'foo|' was closed, no element is currently open
--- /dev/null
+ELEMENT 'foo'
+ TEXT '
+'
+ERROR Error on line 2 char 3: Document ended unexpectedly just after an open angle bracket '<'
--- /dev/null
+ELEMENT 'foo'
+ TEXT '
+'
+ ELEMENT 'bar'
+ TEXT '
+'
+ END 'bar'
+ERROR Error on line 3 char 8: Document ended unexpectedly with elements still open - 'foo' was the last element opened
--- /dev/null
+ELEMENT 'foo'
+ERROR Error on line 1 char 6: Document ended unexpectedly, expected to see a close angle bracket ending the tag <foo/>
--- /dev/null
+ERROR Error on line 1 char 4: Document ended unexpectedly inside an element name
--- /dev/null
+ERROR Error on line 1 char 9: Document ended unexpectedly inside an attribute name
--- /dev/null
+ERROR Error on line 1 char 6: Document ended unexpectedly inside an element-opening tag.
--- /dev/null
+ERROR Error on line 1 char 1: Document must begin with an element (e.g. <book>)
--- /dev/null
+ERROR Error on line 1 char 10: Document ended unexpectedly after the equals sign following an attribute name; no attribute value
--- /dev/null
+ERROR Error on line 1 char 15: Document ended unexpectedly while inside an attribute value
--- /dev/null
+ELEMENT 'foo'
+ERROR Error on line 1 char 6: Document ended unexpectedly with elements still open - 'foo' was the last element opened
--- /dev/null
+ELEMENT 'foo'
+ TEXT '
+'
+ERROR Error on line 2 char 5: Document ended unexpectedly inside an element name
--- /dev/null
+ERROR Error on line 1 char 44: Document ended unexpectedly inside a comment or processing instruction
--- /dev/null
+ERROR Error on line 1 char 32: Document ended unexpectedly inside a comment or processing instruction
--- /dev/null
+ELEMENT 'foo'
+ERROR Error on line 1: Empty entity '&;' seen; valid entities are: & " < > '
--- /dev/null
+ELEMENT 'foo'
+ERROR Error on line 1: Entity name '|' is not known
--- /dev/null
+ELEMENT 'foo'
+ERROR Error on line 1: Entity name 'am|' is not known
--- /dev/null
+ELEMENT 'foo'
+ERROR Error on line 1: Entity name 'bar' is not known
--- /dev/null
+ELEMENT 'foo'
+ERROR Error on line 1: Entity did not end with a semicolon; most likely you used an ampersand character without intending to start an entity - escape ampersand as &
--- /dev/null
+ELEMENT 'foo'
+ERROR Error on line 1: Failed to parse '34592348345343453453455645765736575865767', which should have been a digit inside a character reference (ê for example) - perhaps the digit is too large
--- /dev/null
+ELEMENT 'foo'
+ERROR Error on line 1: Character reference '0' does not encode a permitted character
--- /dev/null
+ELEMENT 'foo'
+ERROR Error on line 1: Failed to parse '', which should have been a digit inside a character reference (ê for example) - perhaps the digit is too large
--- /dev/null
+ELEMENT 'foo'
+ERROR Error on line 1: Character reference did not end with a semicolon; most likely you used an ampersand character without intending to start an entity - escape ampersand as &
--- /dev/null
+ELEMENT 'foo'
+ERROR Error on line 1: Entity did not end with a semicolon; most likely you used an ampersand character without intending to start an entity - escape ampersand as &
--- /dev/null
+ERROR Error on line 1 char 2: ' ' is not a valid character following a '<' character; it may not begin an element name
--- /dev/null
+ELEMENT 'foo'
+ TEXT 'data'
+ERROR Error on line 1 char 11: ' ' is not a valid character following a '<' character; it may not begin an element name
--- /dev/null
+ELEMENT 'foo'
+ TEXT 'data'
+ERROR Error on line 1 char 12: ' ' is not a valid character following the characters '</'; ' ' may not begin an element name
--- /dev/null
+ERROR Error on line 1 char 1: Document must begin with an element (e.g. <book>)
--- /dev/null
+ELEMENT 'bla'
+ERROR Error on line 1: Entity name 'unknownentityname' is not known
--- /dev/null
+ERROR Error on line 2 char 1: '|foo' is not a valid name
--- /dev/null
+ERROR Error on line 2 char 1: 'foo|' is not a valid name: '|'
--- /dev/null
+ERROR Error on line 1 char 15: 'bar}"baz"' is not a valid name: '}'
--- /dev/null
+ELEMENT 'foo'
+END 'foo'
+ERROR Error on line 1 char 6: Odd character '}', expected a '>' character to end the empty-element tag 'foo'
--- /dev/null
+ERROR Error on line 1 char 10: Odd character '{', expected an open quote mark after the equals sign when giving value for attribute 'bar' of element 'foo'
unicode-caseconv \
unicode-encoding
-test_scripts = run-markup-tests.sh run-collate-tests.sh run-bookmark-test.sh run-assert-msg-test.sh
+test_scripts = run-collate-tests.sh run-bookmark-test.sh run-assert-msg-test.sh
-test_script_support_programs = markup-test unicode-collate bookmarkfile-test
+test_script_support_programs = unicode-collate bookmarkfile-test
check_PROGRAMS = $(test_programs) $(test_script_support_programs)
iochannel_test_LDADD = $(progs_ldadd)
list_test_LDADD = $(progs_ldadd)
mainloop_test_LDADD = $(thread_ldadd)
-markup_test_LDADD = $(progs_ldadd)
mapping_test_LDADD = $(progs_ldadd)
module_test_LDADD = $(module_ldadd) $(module_test_exp)
module_test_LDFLAGS = $(G_MODULE_LDFLAGS)
for f in $$files; do \
if test -f $$f; then d=.; else d=$(srcdir); fi; \
cp $$d/$$f $(distdir) || exit 1; done
- mkdir $(distdir)/markups; \
- for f in $(srcdir)/markups/* ; do \
- cp $$f $(distdir)/markups; done
mkdir $(distdir)/collate; \
for f in $(srcdir)/collate/* ; do \
if test -f $$f; then cp $$f $(distdir)/collate; fi; done
+++ /dev/null
-#undef G_DISABLE_ASSERT
-#undef G_LOG_DOMAIN
-
-#include <stdio.h>
-#include <glib.h>
-
-static int depth = 0;
-
-static void
-indent (int extra)
-{
- int i = 0;
- while (i < depth)
- {
- fputs (" ", stdout);
- ++i;
- }
-}
-
-static void
-start_element_handler (GMarkupParseContext *context,
- const gchar *element_name,
- const gchar **attribute_names,
- const gchar **attribute_values,
- gpointer user_data,
- GError **error)
-{
- int i;
-
- indent (0);
- printf ("ELEMENT '%s'\n", element_name);
-
- i = 0;
- while (attribute_names[i] != NULL)
- {
- indent (1);
-
- printf ("%s=\"%s\"\n",
- attribute_names[i],
- attribute_values[i]);
-
- ++i;
- }
-
- ++depth;
-}
-
-static void
-end_element_handler (GMarkupParseContext *context,
- const gchar *element_name,
- gpointer user_data,
- GError **error)
-{
- --depth;
- indent (0);
- printf ("END '%s'\n", element_name);
- }
-
-static void
-text_handler (GMarkupParseContext *context,
- const gchar *text,
- gsize text_len,
- gpointer user_data,
- GError **error)
-{
- indent (0);
- printf ("TEXT '%.*s'\n", (int)text_len, text);
-}
-
-
-static void
-passthrough_handler (GMarkupParseContext *context,
- const gchar *passthrough_text,
- gsize text_len,
- gpointer user_data,
- GError **error)
-{
- indent (0);
-
- printf ("PASS '%.*s'\n", (int)text_len, passthrough_text);
-}
-
-static void
-error_handler (GMarkupParseContext *context,
- GError *error,
- gpointer user_data)
-{
- fprintf (stderr, " %s\n", error->message);
-}
-
-static const GMarkupParser parser = {
- start_element_handler,
- end_element_handler,
- text_handler,
- passthrough_handler,
- error_handler
-};
-
-static const GMarkupParser silent_parser = {
- NULL,
- NULL,
- NULL,
- NULL,
- error_handler
-};
-
-static int
-test_in_chunks (const gchar *contents,
- gint length,
- gint chunk_size)
-{
- GMarkupParseContext *context;
- int i = 0;
-
- context = g_markup_parse_context_new (&silent_parser, 0, NULL, NULL);
-
- while (i < length)
- {
- int this_chunk = MIN (length - i, chunk_size);
-
- if (!g_markup_parse_context_parse (context,
- contents + i,
- this_chunk,
- NULL))
- {
- g_markup_parse_context_free (context);
- return 1;
- }
-
- i += this_chunk;
- }
-
- if (!g_markup_parse_context_end_parse (context, NULL))
- {
- g_markup_parse_context_free (context);
- return 1;
- }
-
- g_markup_parse_context_free (context);
-
- return 0;
-}
-
-static int
-test_file (const gchar *filename)
-{
- gchar *contents;
- gsize length;
- GError *error;
- GMarkupParseContext *context;
-
- error = NULL;
- if (!g_file_get_contents (filename,
- &contents,
- &length,
- &error))
- {
- fprintf (stderr, "%s\n", error->message);
- g_error_free (error);
- return 1;
- }
-
- context = g_markup_parse_context_new (&parser, 0, NULL, NULL);
-
- if (!g_markup_parse_context_parse (context, contents, length, NULL))
- {
- g_markup_parse_context_free (context);
- return 1;
- }
-
- if (!g_markup_parse_context_end_parse (context, NULL))
- {
- g_markup_parse_context_free (context);
- return 1;
- }
-
- g_markup_parse_context_free (context);
-
- /* A byte at a time */
- if (test_in_chunks (contents, length, 1) != 0)
- return 1;
-
- /* 2 bytes */
- if (test_in_chunks (contents, length, 2) != 0)
- return 1;
-
- /*5 bytes */
- if (test_in_chunks (contents, length, 5) != 0)
- return 1;
-
- /* 12 bytes */
- if (test_in_chunks (contents, length, 12) != 0)
- return 1;
-
- /* 1024 bytes */
- if (test_in_chunks (contents, length, 1024) != 0)
- return 1;
-
- return 0;
-}
-
-int
-main (int argc,
- char *argv[])
-{
- if (argc > 1)
- return test_file (argv[1]);
- else
- {
- fprintf (stderr, "Give a markup file on the command line\n");
- return 1;
- }
-}
-
+++ /dev/null
-#! /bin/sh
-
-fail ()
-{
- echo "Test failed: $*"
- exit 1
-}
-
-echo_v ()
-{
- if [ "$verbose" = "1" ]; then
- echo "$*"
- fi
-}
-
-error_out=/dev/null
-if [ "$1" = "-v" ]; then
- verbose=1
- error_out=/dev/stderr
-fi
-for I in ${srcdir:-.}/markups/fail-*.gmarkup; do
- echo_v "Parsing $I, should fail"
- ./markup-test $I > /dev/null 2> $error_out && fail "failed to generate error on $I"
- if test "$?" != "1"; then
- fail "unexpected error on $I"
- fi
-done
-
-I=1
-while test $I -lt 100 ; do
- F=${srcdir:-.}/markups/valid-$I.gmarkup
- if [ -f $F ] ; then
- echo_v "Parsing $F, should succeed"
- ./markup-test $F > actual 2> $error_out || fail "failed on $F"
- diff ${srcdir:-.}/markups/expected-$I actual || fail "unexpected output on $F"
- rm actual
- fi
- I=`expr $I + 1`
-done
-
-echo_v "All tests passed."