/* * Copyright © 2007 Ryan Lortie * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * See the included COPYING file for more information. */ #include #include static void start (GMarkupParseContext *context, const char *element_name, const char **attribute_names, const char **attribute_values, gpointer user_data, GError **error) { GString *string = user_data; gboolean result; #define collect(...) \ g_markup_collect_attributes (element_name, attribute_names, \ attribute_values, error, __VA_ARGS__, \ G_MARKUP_COLLECT_INVALID) #define BOOL G_MARKUP_COLLECT_BOOLEAN #define OPTBOOL G_MARKUP_COLLECT_BOOLEAN | G_MARKUP_COLLECT_OPTIONAL #define TRI G_MARKUP_COLLECT_TRISTATE #define STR G_MARKUP_COLLECT_STRING #define STRDUP G_MARKUP_COLLECT_STRDUP #define OPTSTR G_MARKUP_COLLECT_STRING | G_MARKUP_COLLECT_OPTIONAL #define OPTDUP G_MARKUP_COLLECT_STRDUP | G_MARKUP_COLLECT_OPTIONAL #define n(x) ((x)?(x):"(null)") if (strcmp (element_name, "bool") == 0) { gboolean mb = 2, ob = 2, tri = 2; result = collect (BOOL, "mb", &mb, OPTBOOL, "ob", &ob, TRI, "tri", &tri); g_assert (result || (mb == FALSE && ob == FALSE && tri != TRUE && tri != FALSE)); if (tri != FALSE && tri != TRUE) tri = -1; g_string_append_printf (string, "", result, mb, ob, tri); } else if (strcmp (element_name, "str") == 0) { const char *cm, *co; char *am, *ao; result = collect (STR, "cm", &cm, STRDUP, "am", &am, OPTDUP, "ao", &ao, OPTSTR, "co", &co); g_assert (result || (cm == NULL && am == NULL && ao == NULL && co == NULL)); g_string_append_printf (string, "", result, n (cm), n (am), n (ao), n (co)); g_free (am); g_free (ao); } } static GMarkupParser parser = { start }; struct test { const char *document; const char *result; GMarkupError error_code; const char *error_info; }; static struct test tests[] = { { "", "", G_MARKUP_ERROR_PARSE, "'bool'" }, { "", "" }, { "", "" }, { "", "" }, { "", "" }, { "", "", G_MARKUP_ERROR_MISSING_ATTRIBUTE, "'mb'" }, { "", "", G_MARKUP_ERROR_INVALID_CONTENT, "'mb'" }, { "", "", G_MARKUP_ERROR_INVALID_CONTENT, "'tri'" }, { "", "" }, { "", "", G_MARKUP_ERROR_MISSING_ATTRIBUTE, "'cm'" }, { "", "", G_MARKUP_ERROR_MISSING_ATTRIBUTE, "'cm'" }, { "", "", G_MARKUP_ERROR_INVALID_CONTENT, "'am'" }, { "", "", G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, "'qm'" }, { "", "", G_MARKUP_ERROR_INVALID_CONTENT, "'am'" }, { "", "", G_MARKUP_ERROR_INVALID_CONTENT, "'am'" }, { "", "", G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, "'a'" }, { "", "", G_MARKUP_ERROR_INVALID_CONTENT, "'mb'" }, { "", "", G_MARKUP_ERROR_INVALID_CONTENT, "'mb'" } }; int main (int argc, char **argv) { gboolean verbose = FALSE; int i; if (argc > 1) { if (argc != 2 || strcmp (argv[1], "-v") != 0) { g_print ("error: call with no arguments or '-v' for verbose\n"); return 1; } verbose = TRUE; } for (i = 0; i < G_N_ELEMENTS (tests); i++) { GMarkupParseContext *ctx; GError *error = NULL; GString *string; gboolean result; string = g_string_new (""); ctx = g_markup_parse_context_new (&parser, 0, string, NULL); result = g_markup_parse_context_parse (ctx, tests[i].document, -1, &error); if (result) result = g_markup_parse_context_end_parse (ctx, &error); if (verbose) g_print ("%d: %s:\n (error %d, \"%s\")\n %s\n\n", i, tests[i].document, error ? error->code : 0, error ? error->message : "(no error)", string->str); if (result) { if (error != NULL) g_error ("parser successful but error is set: " "%s(%d) '%s'", g_quark_to_string (error->domain), error->code, error->message); if (tests[i].error_code != 0) g_error ("parser succeeded on test %d ('%s') but " "we expected a failure with code %d\n", i, tests[i].document, tests[i].error_code); } else { if (error->domain != G_MARKUP_ERROR) g_error ("error occured on test %d ('%s') but is not in " "the GMarkupError domain, but rather '%s'", i, tests[i].document, g_quark_to_string (error->domain)); if (error->code != tests[i].error_code) g_error ("failure expected with test %d ('%s') but it " "has error code %d (we expected code %d)", i, tests[i].document, error->code, tests[i].error_code); if (strstr (error->message, tests[i].error_info) == NULL) g_error ("failure message on test %d ('%s') fails " "to mention '%s' in the error message", i, tests[i].document, tests[i].error_info); } if (strcmp (tests[i].result, string->str) != 0) g_error ("result on test %d ('%s') expected to be '%s' " "but came out as '%s'", i, tests[i].document, tests[i].result, string->str); g_markup_parse_context_free (ctx); g_string_free (string, TRUE); g_clear_error (&error); } if (verbose) g_print ("\n*** all tests passed ***\n\n"); return 0; }