1 #undef G_DISABLE_ASSERT
10 static GString
*string
;
18 g_string_append (string
, " ");
24 start_element_handler (GMarkupParseContext
*context
,
25 const gchar
*element_name
,
26 const gchar
**attribute_names
,
27 const gchar
**attribute_values
,
34 g_string_append_printf (string
, "ELEMENT '%s'\n", element_name
);
37 while (attribute_names
[i
] != NULL
)
41 g_string_append_printf (string
, "%s=\"%s\"\n",
52 end_element_handler (GMarkupParseContext
*context
,
53 const gchar
*element_name
,
59 g_string_append_printf (string
, "END '%s'\n", element_name
);
63 text_handler (GMarkupParseContext
*context
,
70 g_string_append_printf (string
, "TEXT '%.*s'\n", (int)text_len
, text
);
75 passthrough_handler (GMarkupParseContext
*context
,
76 const gchar
*passthrough_text
,
83 g_string_append_printf (string
, "PASS '%.*s'\n", (int)text_len
, passthrough_text
);
87 error_handler (GMarkupParseContext
*context
,
91 g_string_append_printf (string
, "ERROR %s\n", error
->message
);
94 static const GMarkupParser parser
= {
95 start_element_handler
,
102 static const GMarkupParser silent_parser
= {
111 test_in_chunks (const gchar
*contents
,
114 GMarkupParseFlags flags
)
116 GMarkupParseContext
*context
;
119 context
= g_markup_parse_context_new (&silent_parser
, flags
, NULL
, NULL
);
123 int this_chunk
= MIN (length
- i
, chunk_size
);
125 if (!g_markup_parse_context_parse (context
,
130 g_markup_parse_context_free (context
);
137 if (!g_markup_parse_context_end_parse (context
, NULL
))
139 g_markup_parse_context_free (context
);
143 g_markup_parse_context_free (context
);
149 test_file (const gchar
*filename
, GMarkupParseFlags flags
)
154 GMarkupParseContext
*context
;
158 if (!g_file_get_contents (filename
,
163 fprintf (stderr
, "%s\n", error
->message
);
164 g_error_free (error
);
168 context
= g_markup_parse_context_new (&parser
, flags
, NULL
, NULL
);
169 g_assert (g_markup_parse_context_get_user_data (context
) == NULL
);
170 g_markup_parse_context_get_position (context
, &line
, &col
);
171 g_assert (line
== 1 && col
== 1);
173 if (!g_markup_parse_context_parse (context
, contents
, length
, NULL
))
175 g_markup_parse_context_free (context
);
180 if (!g_markup_parse_context_end_parse (context
, NULL
))
182 g_markup_parse_context_free (context
);
187 g_markup_parse_context_free (context
);
189 /* A byte at a time */
190 if (test_in_chunks (contents
, length
, 1, flags
) != 0)
197 if (test_in_chunks (contents
, length
, 2, flags
) != 0)
204 if (test_in_chunks (contents
, length
, 5, flags
) != 0)
211 if (test_in_chunks (contents
, length
, 12, flags
) != 0)
218 if (test_in_chunks (contents
, length
, 1024, flags
) != 0)
230 get_expected_filename (const gchar
*filename
,
231 GMarkupParseFlags flags
)
233 gchar
*f
, *p
, *expected
;
235 f
= g_strdup (filename
);
236 p
= strstr (f
, ".gmarkup");
240 expected
= g_strconcat (f
, ".expected", NULL
);
241 else if (flags
== G_MARKUP_TREAT_CDATA_AS_TEXT
)
242 expected
= g_strconcat (f
, ".cdata-as-text", NULL
);
244 g_assert_not_reached ();
252 test_parse (gconstpointer d
)
254 const gchar
*filename
= d
;
255 gchar
*expected_file
;
257 gboolean valid_input
;
258 GError
*error
= NULL
;
261 valid_input
= strstr (filename
, "valid") != NULL
;
262 expected_file
= get_expected_filename (filename
, 0);
265 string
= g_string_sized_new (0);
267 res
= test_file (filename
, 0);
268 g_assert_cmpint (res
, ==, valid_input
? 0 : 1);
270 g_file_get_contents (expected_file
, &expected
, NULL
, &error
);
271 g_assert_no_error (error
);
272 g_assert_cmpstr (string
->str
, ==, expected
);
275 g_string_free (string
, TRUE
);
277 g_free (expected_file
);
279 expected_file
= get_expected_filename (filename
, G_MARKUP_TREAT_CDATA_AS_TEXT
);
280 if (g_file_test (expected_file
, G_FILE_TEST_EXISTS
))
283 string
= g_string_sized_new (0);
285 res
= test_file (filename
, G_MARKUP_TREAT_CDATA_AS_TEXT
);
286 g_assert_cmpint (res
, ==, valid_input
? 0 : 1);
288 g_file_get_contents (expected_file
, &expected
, NULL
, &error
);
289 g_assert_no_error (error
);
290 g_assert_cmpstr (string
->str
, ==, expected
);
293 g_string_free (string
, TRUE
);
296 g_free (expected_file
);
300 main (int argc
, char *argv
[])
307 g_setenv ("LC_ALL", "C", TRUE
);
308 setlocale (LC_ALL
, "");
310 g_test_init (&argc
, &argv
, NULL
);
312 /* allow to easily generate expected output for new test cases */
316 GMarkupParseFlags flags
= 0;
318 if (strcmp (argv
[1], "--cdata-as-text") == 0)
320 flags
= G_MARKUP_TREAT_CDATA_AS_TEXT
;
323 string
= g_string_sized_new (0);
324 test_file (argv
[arg
], flags
);
325 g_print ("%s", string
->str
);
330 path
= g_test_build_filename (G_TEST_DIST
, "markups", NULL
);
331 dir
= g_dir_open (path
, 0, &error
);
333 g_assert_no_error (error
);
334 while ((name
= g_dir_read_name (dir
)) != NULL
)
336 if (!strstr (name
, "gmarkup"))
339 path
= g_strdup_printf ("/markup/parse/%s", name
);
340 g_test_add_data_func_full (path
, g_test_build_filename (G_TEST_DIST
, "markups", name
, NULL
),
346 return g_test_run ();