13b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie/*
23b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie * Copyright © 2007 Ryan Lortie
33b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie *
43b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie * This program is free software: you can redistribute it and/or modify
53b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie * it under the terms of the GNU Lesser General Public License as
63b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie * published by the Free Software Foundation; either version 2 of the
73b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie * License, or (at your option) any later version.
83b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie *
93b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie * See the included COPYING file for more information.
103b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie */
113b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
123b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie#include <string.h>
133b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie#include <glib.h>
143b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
153b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortiestatic void
163b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortiestart (GMarkupParseContext  *context,
173b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie       const char           *element_name,
183b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie       const char          **attribute_names,
193b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie       const char          **attribute_values,
203b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie       gpointer              user_data,
213b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie       GError              **error)
223b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie{
233b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  GString *string = user_data;
243b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  gboolean result;
253b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
263b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie#define collect(...) \
273b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  g_markup_collect_attributes (element_name, attribute_names, \
283b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                               attribute_values, error, __VA_ARGS__, \
293b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                               G_MARKUP_COLLECT_INVALID)
303b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie#define BOOL    G_MARKUP_COLLECT_BOOLEAN
313b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie#define OPTBOOL G_MARKUP_COLLECT_BOOLEAN | G_MARKUP_COLLECT_OPTIONAL
323b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie#define TRI     G_MARKUP_COLLECT_TRISTATE
333b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie#define STR     G_MARKUP_COLLECT_STRING
343b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie#define STRDUP  G_MARKUP_COLLECT_STRDUP
353b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie#define OPTSTR  G_MARKUP_COLLECT_STRING | G_MARKUP_COLLECT_OPTIONAL
363b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie#define OPTDUP  G_MARKUP_COLLECT_STRDUP | G_MARKUP_COLLECT_OPTIONAL
373b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie#define n(x)    ((x)?(x):"(null)")
383b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
393b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  if (strcmp (element_name, "bool") == 0)
403b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    {
413b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      gboolean mb = 2, ob = 2, tri = 2;
423b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
433b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      result = collect (BOOL,    "mb", &mb,
443b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                        OPTBOOL, "ob", &ob,
453b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                        TRI,     "tri", &tri);
463b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
473b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      g_assert (result ||
483b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                (mb == FALSE && ob == FALSE && tri != TRUE && tri != FALSE));
493b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
503b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      if (tri != FALSE && tri != TRUE)
513b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie        tri = -1;
523b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
533b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      g_string_append_printf (string, "<bool(%d) %d %d %d>",
543b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                              result, mb, ob, tri);
553b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    }
563b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
573b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  else if (strcmp (element_name, "str") == 0)
583b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    {
593b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      const char *cm, *co;
603b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      char *am, *ao;
613b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
623b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      result = collect (STR,    "cm", &cm,
633b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                        STRDUP, "am", &am,
643b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                        OPTDUP, "ao", &ao,
653b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                        OPTSTR, "co", &co);
663b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
673b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      g_assert (result ||
683b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                (cm == NULL && am == NULL && ao == NULL && co == NULL));
693b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
703b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      g_string_append_printf (string, "<str(%d) %s %s %s %s>",
713b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                              result, n (cm), n (am), n (ao), n (co));
723b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
733b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      g_free (am);
743b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      g_free (ao);
753b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    }
763b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie}
773b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
783b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortiestatic GMarkupParser parser = { start };
793b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
803b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortiestruct test
813b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie{
823b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  const char   *document;
833b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  const char   *result;
843b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  GMarkupError  error_code;
853b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  const char   *error_info;
863b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie};
873b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
883b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortiestatic struct test tests[] =
893b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie{
903b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  { "<bool mb='y'>", "<bool(1) 1 0 -1>",
913b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    G_MARKUP_ERROR_PARSE, "'bool'" },
923b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
933b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  { "<bool mb='false'/>", "<bool(1) 0 0 -1>" },
943b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  { "<bool mb='true'/>", "<bool(1) 1 0 -1>" },
953b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  { "<bool mb='t' ob='f' tri='1'/>", "<bool(1) 1 0 1>" },
963b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  { "<bool mb='y' ob='n' tri='0'/>", "<bool(1) 1 0 0>" },
973b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
983b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  { "<bool ob='y'/>", "<bool(0) 0 0 -1>",
993b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    G_MARKUP_ERROR_MISSING_ATTRIBUTE, "'mb'" },
1003b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1013b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  { "<bool mb='y' mb='y'/>", "<bool(0) 0 0 -1>",
1023b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    G_MARKUP_ERROR_INVALID_CONTENT, "'mb'" },
1033b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1043b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  { "<bool mb='y' tri='y' tri='n'/>", "<bool(0) 0 0 -1>",
1053b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    G_MARKUP_ERROR_INVALID_CONTENT, "'tri'" },
1063b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1073b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  { "<str cm='x' am='y'/>", "<str(1) x y (null) (null)>" },
1083b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1093b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  { "<str am='x' co='y'/>", "<str(0) (null) (null) (null) (null)>",
1103b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    G_MARKUP_ERROR_MISSING_ATTRIBUTE, "'cm'" },
1113b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1123b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  { "<str am='x'/>", "<str(0) (null) (null) (null) (null)>",
1133b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    G_MARKUP_ERROR_MISSING_ATTRIBUTE, "'cm'" },
1143b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1153b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  { "<str am='x' cm='x' am='y'/>", "<str(0) (null) (null) (null) (null)>",
1163b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    G_MARKUP_ERROR_INVALID_CONTENT, "'am'" },
1173b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1183b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  { "<str am='x' qm='y' cm='x'/>", "<str(0) (null) (null) (null) (null)>",
1193b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, "'qm'" },
1203b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1213b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  { "<str am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' cm='x'/>", "<str(0) (null) (null) (null) (null)>",
1223b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    G_MARKUP_ERROR_INVALID_CONTENT, "'am'" },
1233b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1243b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  { "<str cm='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x' am='x'/>", "<str(0) (null) (null) (null) (null)>",
1253b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    G_MARKUP_ERROR_INVALID_CONTENT, "'am'" },
1263b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1273b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  { "<str a='x' b='x' c='x' d='x' e='x' f='x' g='x' h='x' i='x' j='x' k='x' l='x' m='x' n='x' o='x' p='x' q='x' r='x' s='x' t='x' u='x' v='x' w='x' x='x' y='x' z='x' aa='x' bb='x' cc='x' dd='x' ee='x' ff='x' gg='x' hh='x' ii='x' jj='x' kk='x' ll='x' mm='x' nn='x' oo='x' pp='x' qq='x' rr='x' ss='x' tt='x' uu='x' vv='x' ww='x' xx='x' yy='x' zz='x' am='x' cm='x'/>",
1283b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    "<str(0) (null) (null) (null) (null)>",
129b9743a23ddd083aca5ed8db4e9280df2ed6424fcMatthias Clasen    G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, "'a'" },
130b9743a23ddd083aca5ed8db4e9280df2ed6424fcMatthias Clasen
131b9743a23ddd083aca5ed8db4e9280df2ed6424fcMatthias Clasen  { "<bool mb='ja'/>", "<bool(0) 0 0 -1>",
132b9743a23ddd083aca5ed8db4e9280df2ed6424fcMatthias Clasen    G_MARKUP_ERROR_INVALID_CONTENT, "'mb'" },
133b9743a23ddd083aca5ed8db4e9280df2ed6424fcMatthias Clasen
134b9743a23ddd083aca5ed8db4e9280df2ed6424fcMatthias Clasen  { "<bool mb='nein'/>", "<bool(0) 0 0 -1>",
135b9743a23ddd083aca5ed8db4e9280df2ed6424fcMatthias Clasen    G_MARKUP_ERROR_INVALID_CONTENT, "'mb'" }
1363b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie};
1373b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1383b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortieint
1393b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortiemain (int argc, char **argv)
1403b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie{
1413b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  gboolean verbose = FALSE;
1423b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  int i;
1433b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1443b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  if (argc > 1)
1453b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    {
1463b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      if (argc != 2 || strcmp (argv[1], "-v") != 0)
1473b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie        {
1483b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie          g_print ("error: call with no arguments or '-v' for verbose\n");
1493b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie          return 1;
1503b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie        }
1513b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1523b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      verbose = TRUE;
1533b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    }
1543b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1553b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  for (i = 0; i < G_N_ELEMENTS (tests); i++)
1563b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    {
1573b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      GMarkupParseContext *ctx;
1583b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      GError *error = NULL;
1593b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      GString *string;
1603b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      gboolean result;
1613b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1623b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      string = g_string_new ("");
1633b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      ctx = g_markup_parse_context_new (&parser, 0, string, NULL);
1643b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      result = g_markup_parse_context_parse (ctx,
1653b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                                             tests[i].document,
1663b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                                             -1, &error);
1673b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      if (result)
1683b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie        result = g_markup_parse_context_end_parse (ctx, &error);
1693b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1703b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      if (verbose)
1713b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie        g_print ("%d: %s:\n  (error %d, \"%s\")\n  %s\n\n",
1723b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                 i, tests[i].document,
1733b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                 error ? error->code : 0,
1743b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                 error ? error->message : "(no error)",
1753b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                 string->str);
1763b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1773b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      if (result)
1783b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie        {
1793b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie          if (error != NULL)
1803b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie            g_error ("parser successful but error is set: "
1813b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                     "%s(%d) '%s'", g_quark_to_string (error->domain),
1823b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                     error->code, error->message);
1833b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1843b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie          if (tests[i].error_code != 0)
1853b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie            g_error ("parser succeeded on test %d ('%s') but "
1863b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                     "we expected a failure with code %d\n", i,
1873b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                     tests[i].document, tests[i].error_code);
1883b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie        }
1893b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      else
1903b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie        {
1913b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie          if (error->domain != G_MARKUP_ERROR)
1923b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie            g_error ("error occured on test %d ('%s') but is not in "
1933b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                     "the GMarkupError domain, but rather '%s'", i,
1943b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                     tests[i].document, g_quark_to_string (error->domain));
1953b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
1963b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie          if (error->code != tests[i].error_code)
1973b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie            g_error ("failure expected with test %d ('%s') but it "
1983b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                    "has error code %d (we expected code %d)", i,
1993b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                    tests[i].document, error->code, tests[i].error_code);
2003b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
2013b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie          if (strstr (error->message, tests[i].error_info) == NULL)
2023b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie            g_error ("failure message on test %d ('%s') fails "
2033b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                     "to mention '%s' in the error message", i,
2043b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                     tests[i].document, tests[i].error_info);
2053b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie        }
2063b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
2073b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      if (strcmp (tests[i].result, string->str) != 0)
2083b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie        g_error ("result on test %d ('%s') expected to be '%s' "
2093b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                 "but came out as '%s'", i, tests[i].document,
2103b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie                 tests[i].result, string->str);
2113b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
2123b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      g_markup_parse_context_free (ctx);
2133b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      g_string_free (string, TRUE);
2143b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie      g_clear_error (&error);
2153b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    }
2163b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
2173b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  if (verbose)
2183b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie    g_print ("\n*** all tests passed ***\n\n");
2193b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie
2203b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie  return 0;
2213b4c9c92ddc8336e93ab1197a1fc4f88ac456885Ryan Lortie}
222