Move markup parse tests to the test framework

This commit is contained in:
Matthias Clasen 2010-07-29 20:52:31 -04:00
parent aa196c60df
commit 03be0d7237
105 changed files with 385 additions and 267 deletions

View File

@ -47,6 +47,15 @@ TEST_PROGS += string
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)
@ -128,15 +137,9 @@ dir_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
@ -155,3 +158,8 @@ EXTRA_DIST += \
4096-random-bytes \
keyfiletest.ini \
bookmarks.xbel
dist_hook:
mkdir $(distdir)/markups; \
for f in $(srcdir)/markups/*; do \
cp $$f $(distdir)/markups; done

290
glib/tests/markup-parse.c Normal file
View File

@ -0,0 +1,290 @@
#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 ();
}

View File

@ -0,0 +1 @@
ERROR Error on line 1 char 1: Document was empty or contained only whitespace

View File

@ -0,0 +1,4 @@
ELEMENT 'foo'
TEXT '
'
ERROR Error on line 2 char 8: Element '|foo' was closed, but the currently open element is 'foo'

View File

@ -0,0 +1,7 @@
ELEMENT 'foo'
TEXT '
'
ELEMENT 'bar'
TEXT '
'
ERROR Error on line 3 char 7: Element 'foo' was closed, but the currently open element is 'bar'

View File

@ -0,0 +1 @@
ERROR Error on line 1 char 6: Element 'foo' was closed, no element is currently open

View File

@ -0,0 +1 @@
ERROR Error on line 1 char 7: Element 'foo|' was closed, no element is currently open

View File

@ -0,0 +1,4 @@
ELEMENT 'foo'
TEXT '
'
ERROR Error on line 2 char 3: Document ended unexpectedly just after an open angle bracket '<'

View File

@ -0,0 +1,8 @@
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

View File

@ -0,0 +1,2 @@
ELEMENT 'foo'
ERROR Error on line 1 char 6: Document ended unexpectedly, expected to see a close angle bracket ending the tag <foo/>

View File

@ -0,0 +1 @@
ERROR Error on line 1 char 4: Document ended unexpectedly inside an element name

View File

@ -0,0 +1 @@
ERROR Error on line 1 char 9: Document ended unexpectedly inside an attribute name

View File

@ -0,0 +1 @@
ERROR Error on line 1 char 6: Document ended unexpectedly inside an element-opening tag.

View File

@ -0,0 +1 @@
ERROR Error on line 1 char 1: Document must begin with an element (e.g. <book>)

View File

@ -0,0 +1 @@
ERROR Error on line 1 char 10: Document ended unexpectedly after the equals sign following an attribute name; no attribute value

View File

@ -0,0 +1 @@
ERROR Error on line 1 char 15: Document ended unexpectedly while inside an attribute value

View File

@ -0,0 +1,2 @@
ELEMENT 'foo'
ERROR Error on line 1 char 6: Document ended unexpectedly with elements still open - 'foo' was the last element opened

View File

@ -0,0 +1,4 @@
ELEMENT 'foo'
TEXT '
'
ERROR Error on line 2 char 5: Document ended unexpectedly inside an element name

View File

@ -0,0 +1 @@
ERROR Error on line 1 char 44: Document ended unexpectedly inside a comment or processing instruction

View File

@ -0,0 +1 @@
ERROR Error on line 1 char 32: Document ended unexpectedly inside a comment or processing instruction

View File

@ -0,0 +1,2 @@
ELEMENT 'foo'
ERROR Error on line 1: Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;

View File

@ -0,0 +1,2 @@
ELEMENT 'foo'
ERROR Error on line 1: Entity name '|' is not known

View File

@ -0,0 +1,2 @@
ELEMENT 'foo'
ERROR Error on line 1: Entity name 'am|' is not known

View File

@ -0,0 +1,2 @@
ELEMENT 'foo'
ERROR Error on line 1: Entity name 'bar' is not known

View File

@ -0,0 +1,2 @@
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 &amp;

View File

@ -0,0 +1,2 @@
ELEMENT 'foo'
ERROR Error on line 1: Failed to parse '34592348345343453453455645765736575865767', which should have been a digit inside a character reference (&#234; for example) - perhaps the digit is too large

View File

@ -0,0 +1,2 @@
ELEMENT 'foo'
ERROR Error on line 1: Character reference '0' does not encode a permitted character

View File

@ -0,0 +1,2 @@
ELEMENT 'foo'
ERROR Error on line 1: Failed to parse '', which should have been a digit inside a character reference (&#234; for example) - perhaps the digit is too large

View File

@ -0,0 +1,2 @@
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 &amp;

View File

@ -0,0 +1,2 @@
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 &amp;

View File

@ -0,0 +1 @@
ERROR Error on line 1 char 2: ' ' is not a valid character following a '<' character; it may not begin an element name

View File

@ -0,0 +1,3 @@
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

View File

@ -0,0 +1,3 @@
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

View File

@ -0,0 +1 @@
ERROR Error on line 1 char 1: Document must begin with an element (e.g. <book>)

View File

@ -0,0 +1,2 @@
ELEMENT 'bla'
ERROR Error on line 1: Entity name 'unknownentityname' is not known

View File

@ -0,0 +1 @@
ERROR Error on line 2 char 1: '|foo' is not a valid name

View File

@ -0,0 +1 @@
ERROR Error on line 2 char 1: 'foo|' is not a valid name: '|'

View File

@ -0,0 +1 @@
ERROR Error on line 1 char 15: 'bar}"baz"' is not a valid name: '}'

View File

@ -0,0 +1,3 @@
ELEMENT 'foo'
END 'foo'
ERROR Error on line 1 char 6: Odd character '}', expected a '>' character to end the empty-element tag 'foo'

View File

@ -0,0 +1 @@
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'

Some files were not shown because too many files have changed in this diff Show More