1/*
2 * Copyright (C) 2005 - 2006, Marco Barisione <marco@barisione.org>
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
18 */
19
20#undef G_DISABLE_ASSERT
21#undef G_LOG_DOMAIN
22
23#include <string.h>
24#include <locale.h>
25#include "glib.h"
26
27#ifdef ENABLE_REGEX
28
29/* U+20AC EURO SIGN (symbol, currency) */
30#define EURO "\xe2\x82\xac"
31/* U+00E0 LATIN SMALL LETTER A WITH GRAVE (letter, lowercase) */
32#define AGRAVE "\xc3\xa0"
33/* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE (letter, uppercase) */
34#define AGRAVE_UPPER "\xc3\x80"
35/* U+00E8 LATIN SMALL LETTER E WITH GRAVE (letter, lowercase) */
36#define EGRAVE "\xc3\xa8"
37/* U+00F2 LATIN SMALL LETTER O WITH GRAVE (letter, lowercase) */
38#define OGRAVE "\xc3\xb2"
39/* U+014B LATIN SMALL LETTER ENG (letter, lowercase) */
40#define ENG "\xc5\x8b"
41/* U+0127 LATIN SMALL LETTER H WITH STROKE (letter, lowercase) */
42#define HSTROKE "\xc4\xa7"
43/* U+0634 ARABIC LETTER SHEEN (letter, other) */
44#define SHEEN "\xd8\xb4"
45/* U+1374 ETHIOPIC NUMBER THIRTY (number, other) */
46#define ETH30 "\xe1\x8d\xb4"
47
48/* A random value use to mark untouched integer variables. */
49#define UNTOUCHED -559038737
50
51static gboolean noisy = FALSE;
52static gboolean abort_on_fail = FALSE;
53
54#define PASS passed++
55#define FAIL \
56  G_STMT_START \
57    { \
58      failed++; \
59      if (abort_on_fail) \
60	goto end; \
61    } \
62  G_STMT_END
63
64/* A replacement for strcmp that doesn't crash with null pointers. */
65static gboolean
66streq (const gchar *s1, const gchar *s2)
67{
68  if (s1 == NULL && s2 == NULL)
69    return TRUE;
70  else if (s1 == NULL)
71    return FALSE;
72  else if (s2 == NULL)
73    return FALSE;
74  else
75    return strcmp (s1, s2) == 0;
76}
77
78static void
79verbose (const gchar *format, ...)
80{
81  /* Function copied from glib/tests/patterntest.c by Matthias Clasen. */
82  gchar *msg;
83  va_list args;
84
85  va_start (args, format);
86  msg = g_strdup_vprintf (format, args);
87  va_end (args);
88
89  if (noisy)
90    g_print ("%s", msg);
91  g_free (msg);
92}
93
94static gboolean
95test_new (const gchar        *pattern,
96	  GRegexCompileFlags  compile_opts,
97	  GRegexMatchFlags    match_opts)
98{
99  GRegex *regex;
100
101  verbose ("compiling \"%s\" \t", pattern);
102
103  regex = g_regex_new (pattern, compile_opts, match_opts, NULL);
104  if (regex == NULL)
105    {
106      g_print ("failed \t(pattern: \"%s\", compile: %d, match %d)\n",
107	       pattern, compile_opts, match_opts);
108      return FALSE;
109    }
110
111  if (!streq (g_regex_get_pattern (regex), pattern))
112    {
113      g_print ("failed \t(pattern: \"%s\")\n",
114	       pattern);
115      g_regex_unref (regex);
116      return FALSE;
117    }
118
119  g_regex_unref (regex);
120
121  verbose ("passed\n");
122  return TRUE;
123}
124
125#define TEST_NEW(pattern, compile_opts, match_opts) { \
126  total++; \
127  if (test_new (pattern, compile_opts, match_opts)) \
128    PASS; \
129  else \
130    FAIL; \
131}
132
133static gboolean
134test_new_fail (const gchar        *pattern,
135	       GRegexCompileFlags  compile_opts,
136	       GRegexError         expected_error)
137{
138  GRegex *regex;
139  GError *error = NULL;
140
141  verbose ("compiling \"%s\" (expected a failure) \t", pattern);
142
143  regex = g_regex_new (pattern, compile_opts, 0, &error);
144
145  if (regex != NULL)
146    {
147      g_print ("failed \t(pattern: \"%s\", compile: %d)\n",
148	       pattern, compile_opts);
149      g_regex_unref (regex);
150      return FALSE;
151    }
152
153  if (error->code != expected_error)
154    {
155      g_print ("failed \t(pattern: \"%s\", compile: %d, got error: %d, "
156	       "expected error: %d)\n",
157	       pattern, compile_opts, error->code, expected_error);
158      g_error_free (error);
159      return FALSE;
160    }
161
162  verbose ("passed\n");
163  return TRUE;
164}
165
166#define TEST_NEW_FAIL(pattern, compile_opts, expected_error) { \
167  total++; \
168  if (test_new_fail (pattern, compile_opts, expected_error)) \
169    PASS; \
170  else \
171    FAIL; \
172}
173
174static gboolean
175test_match_simple (const gchar        *pattern,
176		   const gchar        *string,
177		   GRegexCompileFlags  compile_opts,
178		   GRegexMatchFlags    match_opts,
179		   gboolean            expected)
180{
181  gboolean match;
182
183  verbose ("matching \"%s\" against \"%s\" \t", string, pattern);
184
185  match = g_regex_match_simple (pattern, string, compile_opts, match_opts);
186  if (match != expected)
187    {
188      g_print ("failed \t(unexpected %s)\n", match ? "match" : "mismatch");
189      return FALSE;
190    }
191  else
192    {
193      verbose ("passed (%s)\n", match ? "match" : "nomatch");
194      return TRUE;
195    }
196}
197
198#define TEST_MATCH_SIMPLE(pattern, string, compile_opts, match_opts, expected) { \
199  total++; \
200  if (test_match_simple (pattern, string, compile_opts, match_opts, expected)) \
201    PASS; \
202  else \
203    FAIL; \
204}
205
206static gboolean
207test_match (const gchar        *pattern,
208	    GRegexCompileFlags  compile_opts,
209	    GRegexMatchFlags    match_opts,
210	    const gchar        *string,
211	    gssize              string_len,
212	    gint                start_position,
213	    GRegexMatchFlags    match_opts2,
214	    gboolean            expected)
215{
216  GRegex *regex;
217  gboolean match;
218
219  verbose ("matching \"%s\" against \"%s\" (start: %d, len: %d) \t",
220	   string, pattern, start_position, string_len);
221
222  regex = g_regex_new (pattern, compile_opts, match_opts, NULL);
223  match = g_regex_match_full (regex, string, string_len,
224			      start_position, match_opts2, NULL, NULL);
225  if (match != expected)
226    {
227      gchar *e1 = g_strescape (pattern, NULL);
228      gchar *e2 = g_strescape (string, NULL);
229      g_print ("failed \t(unexpected %s) '%s' against '%s'\n", match ? "match" : "mismatch", e1, e2);
230      g_free (e1);
231      g_free (e2);
232      g_regex_unref (regex);
233      return FALSE;
234    }
235
236  if (string_len == -1 && start_position == 0)
237    {
238      match = g_regex_match (regex, string, match_opts2, NULL);
239      if (match != expected)
240	{
241	  g_print ("failed \t(pattern: \"%s\", string: \"%s\")\n",
242		   pattern, string);
243	  g_regex_unref (regex);
244	  return FALSE;
245	}
246    }
247
248  g_regex_unref (regex);
249
250  verbose ("passed (%s)\n", match ? "match" : "nomatch");
251  return TRUE;
252}
253
254#define TEST_MATCH(pattern, compile_opts, match_opts, string, \
255		   string_len, start_position, match_opts2, expected) { \
256  total++; \
257  if (test_match (pattern, compile_opts, match_opts, string, \
258		  string_len, start_position, match_opts2, expected)) \
259    PASS; \
260  else \
261    FAIL; \
262}
263
264struct _Match
265{
266  gchar *string;
267  gint start, end;
268};
269typedef struct _Match Match;
270
271static void
272free_match (gpointer data, gpointer user_data)
273{
274  Match *match = data;
275  if (match == NULL)
276    return;
277  g_free (match->string);
278  g_free (match);
279}
280
281static gboolean
282test_match_next (const gchar *pattern,
283		 const gchar *string,
284		 gssize       string_len,
285		 gint         start_position,
286		 ...)
287{
288  GRegex *regex;
289  GMatchInfo *match_info;
290  va_list args;
291  GSList *matches = NULL;
292  GSList *expected = NULL;
293  GSList *l_exp, *l_match;
294  gboolean ret = TRUE;
295
296  verbose ("matching \"%s\" against \"%s\" (start: %d, len: %d) \t",
297	   string, pattern, start_position, string_len);
298
299  /* The va_list is a NULL-terminated sequence of: extected matched string,
300   * expected start and expected end. */
301  va_start (args, start_position);
302  while (TRUE)
303   {
304      Match *match;
305      const gchar *expected_string = va_arg (args, const gchar *);
306      if (expected_string == NULL)
307        break;
308      match = g_new0 (Match, 1);
309      match->string = g_strdup (expected_string);
310      match->start = va_arg (args, gint);
311      match->end = va_arg (args, gint);
312      expected = g_slist_prepend (expected, match);
313    }
314  expected = g_slist_reverse (expected);
315  va_end (args);
316
317  regex = g_regex_new (pattern, 0, 0, NULL);
318
319  g_regex_match_full (regex, string, string_len,
320		      start_position, 0, &match_info, NULL);
321  while (g_match_info_matches (match_info))
322    {
323      Match *match = g_new0 (Match, 1);
324      match->string = g_match_info_fetch (match_info, 0);
325      match->start = UNTOUCHED;
326      match->end = UNTOUCHED;
327      g_match_info_fetch_pos (match_info, 0, &match->start, &match->end);
328      matches = g_slist_prepend (matches, match);
329      g_match_info_next (match_info, NULL);
330    }
331  g_assert (regex == g_match_info_get_regex (match_info));
332  g_assert (string == g_match_info_get_string (match_info));
333  g_match_info_free (match_info);
334  matches = g_slist_reverse (matches);
335
336  if (g_slist_length (matches) != g_slist_length (expected))
337    {
338      gint match_count = g_slist_length (matches);
339      g_print ("failed \t(got %d %s, expected %d)\n", match_count,
340	       match_count == 1 ? "match" : "matches",
341	       g_slist_length (expected));
342      ret = FALSE;
343      goto exit;
344    }
345
346  l_exp = expected;
347  l_match =  matches;
348  while (l_exp != NULL)
349    {
350      Match *exp = l_exp->data;
351      Match *match = l_match->data;
352
353      if (!streq(exp->string, match->string))
354	{
355	  g_print ("failed \t(got \"%s\", expected \"%s\")\n",
356		   match->string, exp->string);
357	  ret = FALSE;
358	  goto exit;
359	}
360
361      if (exp->start != match->start || exp->end != match->end)
362	{
363	  g_print ("failed \t(got [%d, %d], expected [%d, %d])\n",
364		   match->start, match->end, exp->start, exp->end);
365	  ret = FALSE;
366	  goto exit;
367	}
368
369      l_exp = g_slist_next (l_exp);
370      l_match = g_slist_next (l_match);
371    }
372
373exit:
374  if (ret)
375    {
376      gint count = g_slist_length (matches);
377      verbose ("passed (%d %s)\n", count, count == 1 ? "match" : "matches");
378    }
379
380  g_regex_unref (regex);
381  g_slist_foreach (expected, free_match, NULL);
382  g_slist_free (expected);
383  g_slist_foreach (matches, free_match, NULL);
384  g_slist_free (matches);
385
386  return ret;
387}
388
389#define TEST_MATCH_NEXT0(pattern, string, string_len, start_position) { \
390  total++; \
391  if (test_match_next (pattern, string, string_len, start_position, NULL)) \
392    PASS; \
393  else \
394    FAIL; \
395}
396
397#define TEST_MATCH_NEXT1(pattern, string, string_len, start_position, \
398			      t1, s1, e1) { \
399  total++; \
400  if (test_match_next (pattern, string, string_len, start_position, \
401		       t1, s1, e1, NULL)) \
402    PASS; \
403  else \
404    FAIL; \
405}
406
407#define TEST_MATCH_NEXT2(pattern, string, string_len, start_position, \
408			 t1, s1, e1, t2, s2, e2) { \
409  total++; \
410  if (test_match_next (pattern, string, string_len, start_position, \
411		       t1, s1, e1, t2, s2, e2, NULL)) \
412    PASS; \
413  else \
414    FAIL; \
415}
416
417#define TEST_MATCH_NEXT3(pattern, string, string_len, start_position, \
418			 t1, s1, e1, t2, s2, e2, t3, s3, e3) { \
419  total++; \
420  if (test_match_next (pattern, string, string_len, start_position, \
421		       t1, s1, e1, t2, s2, e2, t3, s3, e3, NULL)) \
422    PASS; \
423  else \
424    FAIL; \
425}
426
427#define TEST_MATCH_NEXT4(pattern, string, string_len, start_position, \
428			 t1, s1, e1, t2, s2, e2, t3, s3, e3, t4, s4, e4) { \
429  total++; \
430  if (test_match_next (pattern, string, string_len, start_position, \
431		       t1, s1, e1, t2, s2, e2, t3, s3, e3, t4, s4, e4, NULL)) \
432    PASS; \
433  else \
434    FAIL; \
435}
436
437static gboolean
438test_match_count (const gchar      *pattern,
439		  const gchar      *string,
440		  gint              start_position,
441                  GRegexMatchFlags  match_opts,
442		  gint              expected_count)
443{
444  GRegex *regex;
445  GMatchInfo *match_info;
446  gint count;
447
448  verbose ("fetching match count (string: \"%s\", pattern: \"%s\", start: %d) \t",
449	   string, pattern, start_position);
450
451  regex = g_regex_new (pattern, 0, 0, NULL);
452
453  g_regex_match_full (regex, string, -1, start_position,
454		      match_opts, &match_info, NULL);
455  count = g_match_info_get_match_count (match_info);
456
457  if (count != expected_count)
458    {
459      g_print ("failed \t(got %d, expected: %d)\n", count, expected_count);
460      return FALSE;
461    }
462
463  g_match_info_free (match_info);
464  g_regex_unref (regex);
465
466  verbose ("passed\n");
467  return TRUE;
468}
469
470#define TEST_MATCH_COUNT(pattern, string, start_position, match_opts, expected_count) { \
471  total++; \
472  if (test_match_count (pattern, string, start_position, match_opts, expected_count)) \
473    PASS; \
474  else \
475    FAIL; \
476}
477
478static gboolean
479test_partial (const gchar *pattern,
480	      const gchar *string,
481	      gboolean     expected)
482{
483  GRegex *regex;
484  GMatchInfo *match_info;
485
486  verbose ("partial matching (string: \"%s\", pattern: \"%s\") \t",
487	   string, pattern);
488
489  regex = g_regex_new (pattern, 0, 0, NULL);
490
491  g_regex_match (regex, string, G_REGEX_MATCH_PARTIAL, &match_info);
492  if (expected != g_match_info_is_partial_match (match_info))
493    {
494      g_print ("failed \t(got %d, expected: %d)\n", !expected, expected);
495      g_regex_unref (regex);
496      return FALSE;
497    }
498
499  if (expected && g_match_info_fetch_pos (match_info, 0, NULL, NULL))
500    {
501      g_print ("failed \t(got sub-pattern 0)\n");
502      g_regex_unref (regex);
503      return FALSE;
504    }
505
506  if (expected && g_match_info_fetch_pos (match_info, 1, NULL, NULL))
507    {
508      g_print ("failed \t(got sub-pattern 1)\n");
509      g_regex_unref (regex);
510      return FALSE;
511    }
512
513  g_match_info_free (match_info);
514  g_regex_unref (regex);
515
516  verbose ("passed\n");
517  return TRUE;
518}
519
520#define TEST_PARTIAL(pattern, string, expected) { \
521  total++; \
522  if (test_partial (pattern, string, expected)) \
523    PASS; \
524  else \
525    FAIL; \
526}
527
528static gboolean
529test_sub_pattern (const gchar *pattern,
530		  const gchar *string,
531		  gint         start_position,
532		  gint         sub_n,
533		  const gchar *expected_sub,
534		  gint         expected_start,
535		  gint         expected_end)
536{
537  GRegex *regex;
538  GMatchInfo *match_info;
539  gchar *sub_expr;
540  gint start = UNTOUCHED, end = UNTOUCHED;
541
542  verbose ("fetching sub-pattern %d from \"%s\" (pattern: \"%s\") \t",
543	   sub_n, string, pattern);
544
545  regex = g_regex_new (pattern, 0, 0, NULL);
546  g_regex_match_full (regex, string, -1, start_position, 0, &match_info, NULL);
547
548  sub_expr = g_match_info_fetch (match_info, sub_n);
549  if (!streq(sub_expr, expected_sub))
550    {
551      g_print ("failed \t(got \"%s\", expected \"%s\")\n",
552	       sub_expr, expected_sub);
553      g_free (sub_expr);
554      g_regex_unref (regex);
555      return FALSE;
556    }
557  g_free (sub_expr);
558
559  g_match_info_fetch_pos (match_info, sub_n, &start, &end);
560  if (start != expected_start || end != expected_end)
561    {
562      g_print ("failed \t(got [%d, %d], expected [%d, %d])\n",
563	       start, end, expected_start, expected_end);
564      g_regex_unref (regex);
565      return FALSE;
566    }
567
568  g_match_info_free (match_info);
569  g_regex_unref (regex);
570
571  verbose ("passed\n");
572  return TRUE;
573}
574
575#define TEST_SUB_PATTERN(pattern, string, start_position, sub_n, expected_sub, \
576			 expected_start, expected_end) { \
577  total++; \
578  if (test_sub_pattern (pattern, string, start_position, sub_n, expected_sub, \
579			expected_start, expected_end)) \
580    PASS; \
581  else \
582    FAIL; \
583}
584
585static gboolean
586test_named_sub_pattern (const gchar *pattern,
587			GRegexCompileFlags flags,
588			const gchar *string,
589			gint         start_position,
590			const gchar *sub_name,
591			const gchar *expected_sub,
592			gint         expected_start,
593			gint         expected_end)
594{
595  GRegex *regex;
596  GMatchInfo *match_info;
597  gint start = UNTOUCHED, end = UNTOUCHED;
598  gchar *sub_expr;
599
600  verbose ("fetching sub-pattern \"%s\" from \"%s\" (pattern: \"%s\") \t",
601	   sub_name, string, pattern);
602
603  regex = g_regex_new (pattern, flags, 0, NULL);
604
605  g_regex_match_full (regex, string, -1, start_position, 0, &match_info, NULL);
606  sub_expr = g_match_info_fetch_named (match_info, sub_name);
607  if (!streq (sub_expr, expected_sub))
608    {
609      g_print ("failed \t(got \"%s\", expected \"%s\")\n",
610	       sub_expr, expected_sub);
611      g_free (sub_expr);
612      g_regex_unref (regex);
613      return FALSE;
614    }
615  g_free (sub_expr);
616
617  g_match_info_fetch_named_pos (match_info, sub_name, &start, &end);
618  if (start != expected_start || end != expected_end)
619    {
620      g_print ("failed \t(got [%d, %d], expected [%d, %d])\n",
621	       start, end, expected_start, expected_end);
622      g_regex_unref (regex);
623      return FALSE;
624    }
625
626  g_match_info_free (match_info);
627  g_regex_unref (regex);
628
629  verbose ("passed\n");
630  return TRUE;
631}
632
633#define TEST_NAMED_SUB_PATTERN(pattern, string, start_position, sub_name, \
634			       expected_sub, expected_start, expected_end) { \
635  total++; \
636  if (test_named_sub_pattern (pattern, 0, string, start_position, sub_name, \
637			      expected_sub, expected_start, expected_end)) \
638    PASS; \
639  else \
640    FAIL; \
641}
642
643#define TEST_NAMED_SUB_PATTERN_DUPNAMES(pattern, string, start_position, sub_name, \
644					expected_sub, expected_start, expected_end) { \
645  total++; \
646  if (test_named_sub_pattern (pattern, G_REGEX_DUPNAMES, string, start_position, \
647			      sub_name, expected_sub, expected_start, expected_end)) \
648    PASS; \
649  else \
650    FAIL; \
651}
652
653static gboolean
654test_fetch_all (const gchar *pattern,
655		const gchar *string,
656		...)
657{
658  GRegex *regex;
659  GMatchInfo *match_info;
660  va_list args;
661  GSList *expected = NULL;
662  GSList *l_exp;
663  gchar **matches;
664  gint match_count;
665  gboolean ret = TRUE;
666  gint i;
667
668  verbose ("fetching all sub-patterns from \"%s\" (pattern: \"%s\") \t",
669	   string, pattern);
670
671  /* The va_list is a NULL-terminated sequence of extected strings. */
672  va_start (args, string);
673  while (TRUE)
674   {
675      gchar *expected_string = va_arg (args, gchar *);
676      if (expected_string == NULL)
677        break;
678      else
679        expected = g_slist_prepend (expected, g_strdup (expected_string));
680    }
681  expected = g_slist_reverse (expected);
682  va_end (args);
683
684  regex = g_regex_new (pattern, 0, 0, NULL);
685  g_regex_match (regex, string, 0, &match_info);
686  matches = g_match_info_fetch_all (match_info);
687  if (matches)
688    match_count = g_strv_length (matches);
689  else
690    match_count = 0;
691
692  if (match_count != g_slist_length (expected))
693    {
694      g_print ("failed \t(got %d %s, expected %d)\n", match_count,
695	       match_count == 1 ? "match" : "matches",
696	       g_slist_length (expected));
697      ret = FALSE;
698      goto exit;
699    }
700
701  l_exp = expected;
702  for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp))
703    {
704      if (!streq(l_exp->data, matches [i]))
705	{
706	  g_print ("failed \t(got \"%s\", expected \"%s\")\n",
707		   matches [i], (gchar *)l_exp->data);
708	  ret = FALSE;
709	  goto exit;
710	}
711    }
712
713  verbose ("passed (%d %s)\n", match_count,
714	   match_count == 1 ? "match" : "matches");
715
716exit:
717  g_match_info_free (match_info);
718  g_regex_unref (regex);
719  g_slist_foreach (expected, (GFunc)g_free, NULL);
720  g_slist_free (expected);
721  g_strfreev (matches);
722
723  return ret;
724}
725
726#define TEST_FETCH_ALL0(pattern, string) { \
727  total++; \
728  if (test_fetch_all (pattern, string, NULL)) \
729    PASS; \
730  else \
731    FAIL; \
732}
733
734#define TEST_FETCH_ALL1(pattern, string, e1) { \
735  total++; \
736  if (test_fetch_all (pattern, string, e1, NULL)) \
737    PASS; \
738  else \
739    FAIL; \
740}
741
742#define TEST_FETCH_ALL2(pattern, string, e1, e2) { \
743  total++; \
744  if (test_fetch_all (pattern, string, e1, e2, NULL)) \
745    PASS; \
746  else \
747    FAIL; \
748}
749
750#define TEST_FETCH_ALL3(pattern, string, e1, e2, e3) { \
751  total++; \
752  if (test_fetch_all (pattern, string, e1, e2, e3, NULL)) \
753    PASS; \
754  else \
755    FAIL; \
756}
757
758static gboolean
759test_split_simple (const gchar *pattern,
760		   const gchar *string,
761		   ...)
762{
763  va_list args;
764  GSList *expected = NULL;
765  GSList *l_exp;
766  gchar **tokens;
767  gint token_count;
768  gboolean ret = TRUE;
769  gint i;
770
771  verbose ("splitting \"%s\" against \"%s\" \t", string, pattern);
772
773  /* The va_list is a NULL-terminated sequence of extected strings. */
774  va_start (args, string);
775  while (TRUE)
776   {
777      gchar *expected_string = va_arg (args, gchar *);
778      if (expected_string == NULL)
779        break;
780      else
781        expected = g_slist_prepend (expected, g_strdup (expected_string));
782    }
783  expected = g_slist_reverse (expected);
784  va_end (args);
785
786  tokens = g_regex_split_simple (pattern, string, 0, 0);
787  if (tokens)
788    token_count = g_strv_length (tokens);
789  else
790    token_count = 0;
791
792  if (token_count != g_slist_length (expected))
793    {
794      g_print ("failed \t(got %d %s, expected %d)\n", token_count,
795	       token_count == 1 ? "match" : "matches",
796	       g_slist_length (expected));
797      ret = FALSE;
798      goto exit;
799    }
800
801  l_exp = expected;
802  for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp))
803    {
804      if (!streq(l_exp->data, tokens [i]))
805	{
806	  g_print ("failed \t(got \"%s\", expected \"%s\")\n",
807		   tokens[i], (gchar *)l_exp->data);
808	  ret = FALSE;
809	  goto exit;
810	}
811    }
812
813  verbose ("passed (%d %s)\n", token_count,
814	   token_count == 1 ? "token" : "tokens");
815
816exit:
817  g_slist_foreach (expected, (GFunc)g_free, NULL);
818  g_slist_free (expected);
819  g_strfreev (tokens);
820
821  return ret;
822}
823
824#define TEST_SPLIT_SIMPLE0(pattern, string) { \
825  total++; \
826  if (test_split_simple (pattern, string, NULL)) \
827    PASS; \
828  else \
829    FAIL; \
830}
831
832#define TEST_SPLIT_SIMPLE1(pattern, string, e1) { \
833  total++; \
834  if (test_split_simple (pattern, string, e1, NULL)) \
835    PASS; \
836  else \
837    FAIL; \
838}
839
840#define TEST_SPLIT_SIMPLE2(pattern, string, e1, e2) { \
841  total++; \
842  if (test_split_simple (pattern, string, e1, e2, NULL)) \
843    PASS; \
844  else \
845    FAIL; \
846}
847
848#define TEST_SPLIT_SIMPLE3(pattern, string, e1, e2, e3) { \
849  total++; \
850  if (test_split_simple (pattern, string, e1, e2, e3, NULL)) \
851    PASS; \
852  else \
853    FAIL; \
854}
855
856static gboolean
857test_split_full (const gchar *pattern,
858		 const gchar *string,
859		 gint         start_position,
860		 gint         max_tokens,
861		 ...)
862{
863  GRegex *regex;
864  va_list args;
865  GSList *expected = NULL;
866  GSList *l_exp;
867  gchar **tokens;
868  gint token_count;
869  gboolean ret = TRUE;
870  gint i;
871
872  verbose ("splitting \"%s\" against \"%s\" (start: %d, max: %d) \t",
873	   string, pattern, start_position, max_tokens);
874
875  /* The va_list is a NULL-terminated sequence of extected strings. */
876  va_start (args, max_tokens);
877  while (TRUE)
878   {
879      gchar *expected_string = va_arg (args, gchar *);
880      if (expected_string == NULL)
881        break;
882      else
883        expected = g_slist_prepend (expected, g_strdup (expected_string));
884    }
885  expected = g_slist_reverse (expected);
886  va_end (args);
887
888  regex = g_regex_new (pattern, 0, 0, NULL);
889  tokens = g_regex_split_full (regex, string, -1, start_position,
890			       0, max_tokens, NULL);
891  if (tokens)
892    token_count = g_strv_length (tokens);
893  else
894    token_count = 0;
895
896  if (token_count != g_slist_length (expected))
897    {
898      g_print ("failed \t(got %d %s, expected %d)\n", token_count,
899	       token_count == 1 ? "match" : "matches",
900	       g_slist_length (expected));
901      ret = FALSE;
902      goto exit;
903    }
904
905  l_exp = expected;
906  for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp))
907    {
908      if (!streq(l_exp->data, tokens [i]))
909	{
910	  g_print ("failed \t(got \"%s\", expected \"%s\")\n",
911		   tokens[i], (gchar *)l_exp->data);
912	  ret = FALSE;
913	  goto exit;
914	}
915    }
916
917  verbose ("passed (%d %s)\n", token_count,
918	   token_count == 1 ? "token" : "tokens");
919
920exit:
921  g_regex_unref (regex);
922  g_slist_foreach (expected, (GFunc)g_free, NULL);
923  g_slist_free (expected);
924  g_strfreev (tokens);
925
926  return ret;
927}
928
929static gboolean
930test_split (const gchar *pattern,
931	    const gchar *string,
932	    ...)
933{
934  GRegex *regex;
935  va_list args;
936  GSList *expected = NULL;
937  GSList *l_exp;
938  gchar **tokens;
939  gint token_count;
940  gboolean ret = TRUE;
941  gint i;
942
943  verbose ("splitting \"%s\" against \"%s\" \t", string, pattern);
944
945  /* The va_list is a NULL-terminated sequence of extected strings. */
946  va_start (args, string);
947  while (TRUE)
948   {
949      gchar *expected_string = va_arg (args, gchar *);
950      if (expected_string == NULL)
951        break;
952      else
953        expected = g_slist_prepend (expected, g_strdup (expected_string));
954    }
955  expected = g_slist_reverse (expected);
956  va_end (args);
957
958  regex = g_regex_new (pattern, 0, 0, NULL);
959  tokens = g_regex_split (regex, string, 0);
960  if (tokens)
961    token_count = g_strv_length (tokens);
962  else
963    token_count = 0;
964
965  if (token_count != g_slist_length (expected))
966    {
967      g_print ("failed \t(got %d %s, expected %d)\n", token_count,
968	       token_count == 1 ? "match" : "matches",
969	       g_slist_length (expected));
970      ret = FALSE;
971      goto exit;
972    }
973
974  l_exp = expected;
975  for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp))
976    {
977      if (!streq(l_exp->data, tokens [i]))
978	{
979	  g_print ("failed \t(got \"%s\", expected \"%s\")\n",
980		   tokens[i], (gchar *)l_exp->data);
981	  ret = FALSE;
982	  goto exit;
983	}
984    }
985
986  verbose ("passed (%d %s)\n", token_count,
987	   token_count == 1 ? "token" : "tokens");
988
989exit:
990  g_regex_unref (regex);
991  g_slist_foreach (expected, (GFunc)g_free, NULL);
992  g_slist_free (expected);
993  g_strfreev (tokens);
994
995  return ret;
996}
997
998#define TEST_SPLIT0(pattern, string, start_position, max_tokens) { \
999  total++; \
1000  if (test_split_full (pattern, string, start_position, max_tokens, NULL)) \
1001    PASS; \
1002  else \
1003    FAIL; \
1004  if (start_position == 0 && max_tokens <= 0) \
1005  { \
1006    total++; \
1007    if (test_split (pattern, string, NULL)) \
1008      PASS; \
1009    else \
1010      FAIL; \
1011  } \
1012}
1013
1014#define TEST_SPLIT1(pattern, string, start_position, max_tokens, e1) { \
1015  total++; \
1016  if (test_split_full (pattern, string, start_position, max_tokens, e1, NULL)) \
1017    PASS; \
1018  else \
1019    FAIL; \
1020  if (start_position == 0 && max_tokens <= 0) \
1021  { \
1022    total++; \
1023    if (test_split (pattern, string, e1, NULL)) \
1024      PASS; \
1025    else \
1026      FAIL; \
1027  } \
1028}
1029
1030#define TEST_SPLIT2(pattern, string, start_position, max_tokens, e1, e2) { \
1031  total++; \
1032  if (test_split_full (pattern, string, start_position, max_tokens, e1, e2, NULL)) \
1033    PASS; \
1034  else \
1035    FAIL; \
1036  if (start_position == 0 && max_tokens <= 0) \
1037  { \
1038    total++; \
1039    if (test_split (pattern, string, e1, e2, NULL)) \
1040      PASS; \
1041    else \
1042      FAIL; \
1043  } \
1044}
1045
1046#define TEST_SPLIT3(pattern, string, start_position, max_tokens, e1, e2, e3) { \
1047  total++; \
1048  if (test_split_full (pattern, string, start_position, max_tokens, e1, e2, e3, NULL)) \
1049    PASS; \
1050  else \
1051    FAIL; \
1052  if (start_position == 0 && max_tokens <= 0) \
1053  { \
1054    total++; \
1055    if (test_split (pattern, string, e1, e2, e3, NULL)) \
1056      PASS; \
1057    else \
1058      FAIL; \
1059  } \
1060}
1061
1062static gboolean
1063test_check_replacement (const gchar *string_to_expand,
1064			gboolean     expected,
1065			gboolean     expected_refs)
1066{
1067  gboolean result;
1068  gboolean has_refs;
1069
1070  verbose ("checking replacement string \"%s\" \t", string_to_expand);
1071
1072  result = g_regex_check_replacement (string_to_expand, &has_refs, NULL);
1073  if (expected != result)
1074    {
1075      g_print ("failed \t(got \"%s\", expected \"%s\")\n",
1076	       result ? "TRUE" : "FALSE",
1077	       expected ? "TRUE" : "FALSE");
1078      return FALSE;
1079    }
1080
1081  if (expected && expected_refs != has_refs)
1082    {
1083      g_print ("failed \t(got has_references \"%s\", expected \"%s\")\n",
1084	       has_refs ? "TRUE" : "FALSE",
1085	       expected_refs ? "TRUE" : "FALSE");
1086      return FALSE;
1087    }
1088
1089  verbose ("passed\n");
1090  return TRUE;
1091}
1092
1093#define TEST_CHECK_REPLACEMENT(string_to_expand, expected, expected_refs) { \
1094  total++; \
1095  if (test_check_replacement (string_to_expand, expected, expected_refs)) \
1096    PASS; \
1097  else \
1098    FAIL; \
1099}
1100static gboolean
1101test_expand (const gchar *pattern,
1102	     const gchar *string,
1103	     const gchar *string_to_expand,
1104	     gboolean     raw,
1105	     const gchar *expected)
1106{
1107  GRegex *regex = NULL;
1108  GMatchInfo *match_info = NULL;
1109  gchar *res;
1110
1111  verbose ("expanding the references in \"%s\" (pattern: \"%s\", string: \"%s\") \t",
1112	   string_to_expand,
1113	   pattern ? pattern : "(null)",
1114	   string ? string : "(null)");
1115
1116  if (pattern)
1117    {
1118      regex = g_regex_new (pattern, raw ? G_REGEX_RAW : 0, 0, NULL);
1119      g_regex_match (regex, string, 0, &match_info);
1120    }
1121
1122  res = g_match_info_expand_references (match_info, string_to_expand, NULL);
1123  if (!streq (res, expected))
1124    {
1125      g_print ("failed \t(got \"%s\", expected \"%s\")\n", res, expected);
1126      g_free (res);
1127      g_match_info_free (match_info);
1128      g_regex_unref (regex);
1129      return FALSE;
1130    }
1131
1132  g_free (res);
1133  g_match_info_free (match_info);
1134  if (regex)
1135    g_regex_unref (regex);
1136
1137  verbose ("passed\n");
1138  return TRUE;
1139}
1140
1141#define TEST_EXPAND(pattern, string, string_to_expand, raw, expected) { \
1142  total++; \
1143  if (test_expand (pattern, string, string_to_expand, raw, expected)) \
1144    PASS; \
1145  else \
1146    FAIL; \
1147}
1148
1149static gboolean
1150test_replace (const gchar *pattern,
1151	      const gchar *string,
1152	      gint         start_position,
1153	      const gchar *replacement,
1154	      const gchar *expected)
1155{
1156  GRegex *regex;
1157  gchar *res;
1158
1159  verbose ("replacing \"%s\" in \"%s\" (pattern: \"%s\", start: %d) \t",
1160	   replacement, string, pattern, start_position);
1161
1162  regex = g_regex_new (pattern, 0, 0, NULL);
1163  res = g_regex_replace (regex, string, -1, start_position, replacement, 0, NULL);
1164  if (!streq (res, expected))
1165    {
1166      g_print ("failed \t(got \"%s\", expected \"%s\")\n", res, expected);
1167      g_free (res);
1168      g_regex_unref (regex);
1169      return FALSE;
1170    }
1171
1172  g_free (res);
1173  g_regex_unref (regex);
1174
1175  verbose ("passed\n");
1176  return TRUE;
1177}
1178
1179#define TEST_REPLACE(pattern, string, start_position, replacement, expected) { \
1180  total++; \
1181  if (test_replace (pattern, string, start_position, replacement, expected)) \
1182    PASS; \
1183  else \
1184    FAIL; \
1185}
1186
1187static gboolean
1188test_replace_lit (const gchar *pattern,
1189		  const gchar *string,
1190		  gint         start_position,
1191		  const gchar *replacement,
1192		  const gchar *expected)
1193{
1194  GRegex *regex;
1195  gchar *res;
1196
1197  verbose ("replacing literally \"%s\" in \"%s\" (pattern: \"%s\", start: %d) \t",
1198	   replacement, string, pattern, start_position);
1199
1200  regex = g_regex_new (pattern, 0, 0, NULL);
1201  res = g_regex_replace_literal (regex, string, -1, start_position,
1202				 replacement, 0, NULL);
1203  if (!streq (res, expected))
1204    {
1205      g_print ("failed \t(got \"%s\", expected \"%s\")\n", res, expected);
1206      g_free (res);
1207      g_regex_unref (regex);
1208      return FALSE;
1209    }
1210
1211  g_free (res);
1212  g_regex_unref (regex);
1213
1214  verbose ("passed\n");
1215  return TRUE;
1216}
1217
1218#define TEST_REPLACE_LIT(pattern, string, start_position, replacement, expected) { \
1219  total++; \
1220  if (test_replace_lit (pattern, string, start_position, replacement, expected)) \
1221    PASS; \
1222  else \
1223    FAIL; \
1224}
1225
1226static gboolean
1227test_get_string_number (const gchar *pattern,
1228			const gchar *name,
1229			gint         expected_num)
1230{
1231  GRegex *regex;
1232  gint num;
1233
1234  verbose ("getting the number of \"%s\" (pattern: \"%s\") \t",
1235	   name, pattern);
1236
1237  regex = g_regex_new (pattern, 0, 0, NULL);
1238  num = g_regex_get_string_number (regex, name);
1239  g_regex_unref (regex);
1240
1241  if (num != expected_num)
1242    {
1243      g_print ("failed \t(got %d, expected %d)\n", num, expected_num);
1244      return FALSE;
1245    }
1246  else
1247    {
1248      verbose ("passed\n");
1249      return TRUE;
1250    }
1251}
1252
1253#define TEST_GET_STRING_NUMBER(pattern, name, expected_num) { \
1254  total++; \
1255  if (test_get_string_number (pattern, name, expected_num)) \
1256    PASS; \
1257  else \
1258    FAIL; \
1259}
1260
1261static gboolean
1262test_escape (const gchar *string,
1263	     gint         length,
1264	     const gchar *expected)
1265{
1266  gchar *escaped;
1267
1268  verbose ("escaping \"%s\" (len: %d) \t", string, length);
1269
1270  escaped = g_regex_escape_string (string, length);
1271
1272  if (!streq (escaped, expected))
1273    {
1274      g_print ("failed \t(got \"%s\", expected \"%s\")\n", escaped, expected);
1275      g_free (escaped);
1276      return FALSE;
1277    }
1278
1279  g_free (escaped);
1280
1281  verbose ("passed\n");
1282  return TRUE;
1283}
1284
1285#define TEST_ESCAPE(string, length, expected) { \
1286  total++; \
1287  if (test_escape (string, length, expected)) \
1288    PASS; \
1289  else \
1290    FAIL; \
1291}
1292
1293static gboolean
1294test_match_all_full (const gchar *pattern,
1295		     const gchar *string,
1296		     gssize       string_len,
1297		     gint         start_position,
1298		     ...)
1299{
1300  GRegex *regex;
1301  GMatchInfo *match_info;
1302  va_list args;
1303  GSList *expected = NULL;
1304  GSList *l_exp;
1305  gboolean match_ok;
1306  gboolean ret = TRUE;
1307  gint match_count;
1308  gint i;
1309
1310  verbose ("matching all in \"%s\" against \"%s\" (start: %d, len: %d) \t",
1311	   string, pattern, start_position, string_len);
1312
1313  /* The va_list is a NULL-terminated sequence of: extected matched string,
1314   * expected start and expected end. */
1315  va_start (args, start_position);
1316  while (TRUE)
1317   {
1318      Match *match;
1319      const gchar *expected_string = va_arg (args, const gchar *);
1320      if (expected_string == NULL)
1321        break;
1322      match = g_new0 (Match, 1);
1323      match->string = g_strdup (expected_string);
1324      match->start = va_arg (args, gint);
1325      match->end = va_arg (args, gint);
1326      expected = g_slist_prepend (expected, match);
1327    }
1328  expected = g_slist_reverse (expected);
1329  va_end (args);
1330
1331  regex = g_regex_new (pattern, 0, 0, NULL);
1332  match_ok = g_regex_match_all_full (regex, string, string_len, start_position,
1333				     0, &match_info, NULL);
1334
1335  if (match_ok && g_slist_length (expected) == 0)
1336    {
1337      g_print ("failed\n");
1338      ret = FALSE;
1339      goto exit;
1340    }
1341  if (!match_ok && g_slist_length (expected) != 0)
1342    {
1343      g_print ("failed\n");
1344      ret = FALSE;
1345      goto exit;
1346    }
1347
1348  match_count = g_match_info_get_match_count (match_info);
1349  if (match_count != g_slist_length (expected))
1350    {
1351      g_print ("failed \t(got %d %s, expected %d)\n", match_count,
1352	       match_count == 1 ? "match" : "matches",
1353	       g_slist_length (expected));
1354      ret = FALSE;
1355      goto exit;
1356    }
1357
1358  l_exp = expected;
1359  for (i = 0; i < match_count; i++)
1360    {
1361      gint start, end;
1362      gchar *matched_string;
1363      Match *exp = l_exp->data;
1364
1365      matched_string = g_match_info_fetch (match_info, i);
1366      g_match_info_fetch_pos (match_info, i, &start, &end);
1367
1368      if (!streq(exp->string, matched_string))
1369	{
1370	  g_print ("failed \t(got \"%s\", expected \"%s\")\n",
1371		   matched_string, exp->string);
1372          g_free (matched_string);
1373	  ret = FALSE;
1374	  goto exit;
1375	}
1376      g_free (matched_string);
1377
1378      if (exp->start != start || exp->end != end)
1379	{
1380	  g_print ("failed \t(got [%d, %d], expected [%d, %d])\n",
1381		   start, end, exp->start, exp->end);
1382	  ret = FALSE;
1383	  goto exit;
1384	}
1385
1386      l_exp = g_slist_next (l_exp);
1387    }
1388
1389exit:
1390  if (ret)
1391    {
1392      verbose ("passed (%d %s)\n", match_count, match_count == 1 ? "match" : "matches");
1393    }
1394
1395  g_match_info_free (match_info);
1396  g_regex_unref (regex);
1397  g_slist_foreach (expected, free_match, NULL);
1398  g_slist_free (expected);
1399
1400  return ret;
1401}
1402
1403static gboolean
1404test_match_all (const gchar *pattern,
1405		const gchar *string,
1406                ...)
1407{
1408  GRegex *regex;
1409  GMatchInfo *match_info;
1410  va_list args;
1411  GSList *expected = NULL;
1412  GSList *l_exp;
1413  gboolean match_ok;
1414  gboolean ret = TRUE;
1415  gint match_count;
1416  gint i;
1417
1418  verbose ("matching all in \"%s\" against \"%s\" \t", string, pattern);
1419
1420  /* The va_list is a NULL-terminated sequence of: extected matched string,
1421   * expected start and expected end. */
1422  va_start (args, string);
1423  while (TRUE)
1424   {
1425      Match *match;
1426      const gchar *expected_string = va_arg (args, const gchar *);
1427      if (expected_string == NULL)
1428        break;
1429      match = g_new0 (Match, 1);
1430      match->string = g_strdup (expected_string);
1431      match->start = va_arg (args, gint);
1432      match->end = va_arg (args, gint);
1433      expected = g_slist_prepend (expected, match);
1434    }
1435  expected = g_slist_reverse (expected);
1436  va_end (args);
1437
1438  regex = g_regex_new (pattern, 0, 0, NULL);
1439  match_ok = g_regex_match_all (regex, string, 0, &match_info);
1440
1441  if (match_ok && g_slist_length (expected) == 0)
1442    {
1443      g_print ("failed\n");
1444      ret = FALSE;
1445      goto exit;
1446    }
1447  if (!match_ok && g_slist_length (expected) != 0)
1448    {
1449      g_print ("failed\n");
1450      ret = FALSE;
1451      goto exit;
1452    }
1453
1454  match_count = g_match_info_get_match_count (match_info);
1455  if (match_count != g_slist_length (expected))
1456    {
1457      g_print ("failed \t(got %d %s, expected %d)\n", match_count,
1458	       match_count == 1 ? "match" : "matches",
1459	       g_slist_length (expected));
1460      ret = FALSE;
1461      goto exit;
1462    }
1463
1464  l_exp = expected;
1465  for (i = 0; i < match_count; i++)
1466    {
1467      gint start, end;
1468      gchar *matched_string;
1469      Match *exp = l_exp->data;
1470
1471      matched_string = g_match_info_fetch (match_info, i);
1472      g_match_info_fetch_pos (match_info, i, &start, &end);
1473
1474      if (!streq(exp->string, matched_string))
1475	{
1476	  g_print ("failed \t(got \"%s\", expected \"%s\")\n",
1477		   matched_string, exp->string);
1478          g_free (matched_string);
1479	  ret = FALSE;
1480	  goto exit;
1481	}
1482      g_free (matched_string);
1483
1484      if (exp->start != start || exp->end != end)
1485	{
1486	  g_print ("failed \t(got [%d, %d], expected [%d, %d])\n",
1487		   start, end, exp->start, exp->end);
1488	  ret = FALSE;
1489	  goto exit;
1490	}
1491
1492      l_exp = g_slist_next (l_exp);
1493    }
1494
1495exit:
1496  if (ret)
1497    {
1498      verbose ("passed (%d %s)\n", match_count, match_count == 1 ? "match" : "matches");
1499    }
1500
1501  g_match_info_free (match_info);
1502  g_regex_unref (regex);
1503  g_slist_foreach (expected, free_match, NULL);
1504  g_slist_free (expected);
1505
1506  return ret;
1507}
1508
1509#define TEST_MATCH_ALL0(pattern, string, string_len, start_position) { \
1510  total++; \
1511  if (test_match_all_full (pattern, string, string_len, start_position, NULL)) \
1512    PASS; \
1513  else \
1514    FAIL; \
1515  if (string_len == -1 && start_position == 0) \
1516  { \
1517    total++; \
1518    if (test_match_all (pattern, string, NULL)) \
1519      PASS; \
1520    else \
1521      FAIL; \
1522  } \
1523}
1524
1525#define TEST_MATCH_ALL1(pattern, string, string_len, start_position, \
1526			t1, s1, e1) { \
1527  total++; \
1528  if (test_match_all_full (pattern, string, string_len, start_position, \
1529			   t1, s1, e1, NULL)) \
1530    PASS; \
1531  else \
1532    FAIL; \
1533  if (string_len == -1 && start_position == 0) \
1534  { \
1535    total++; \
1536    if (test_match_all (pattern, string, t1, s1, e1, NULL)) \
1537      PASS; \
1538    else \
1539      FAIL; \
1540  } \
1541}
1542
1543#define TEST_MATCH_ALL2(pattern, string, string_len, start_position, \
1544			t1, s1, e1, t2, s2, e2) { \
1545  total++; \
1546  if (test_match_all_full (pattern, string, string_len, start_position, \
1547			   t1, s1, e1, t2, s2, e2, NULL)) \
1548    PASS; \
1549  else \
1550    FAIL; \
1551  if (string_len == -1 && start_position == 0) \
1552  { \
1553    total++; \
1554    if (test_match_all (pattern, string, t1, s1, e1, t2, s2, e2, NULL)) \
1555      PASS; \
1556    else \
1557      FAIL; \
1558  } \
1559}
1560
1561#define TEST_MATCH_ALL3(pattern, string, string_len, start_position, \
1562			t1, s1, e1, t2, s2, e2, t3, s3, e3) { \
1563  total++; \
1564  if (test_match_all_full (pattern, string, string_len, start_position, \
1565			   t1, s1, e1, t2, s2, e2, t3, s3, e3, NULL)) \
1566    PASS; \
1567  else \
1568    FAIL; \
1569  if (string_len == -1 && start_position == 0) \
1570  { \
1571    total++; \
1572    if (test_match_all (pattern, string, t1, s1, e1, t2, s2, e2, t3, s3, e3, NULL)) \
1573      PASS; \
1574    else \
1575      FAIL; \
1576  } \
1577}
1578
1579int
1580main (int argc, char *argv[])
1581{
1582  gint total = 0;
1583  gint passed = 0;
1584  gint failed = 0;
1585  gint i = 0;
1586
1587  setlocale (LC_ALL, "");
1588
1589  for (i = 1; i < argc; i++)
1590    {
1591      if (streq ("--noisy", argv[i]))
1592	noisy = TRUE;
1593      else if (streq ("--abort", argv[i]))
1594	abort_on_fail = TRUE;
1595    }
1596
1597  g_setenv ("G_DEBUG", "fatal_warnings", TRUE);
1598
1599  /* TEST_NEW(pattern, compile_opts, match_opts) */
1600  TEST_NEW("", 0, 0);
1601  TEST_NEW(".*", 0, 0);
1602  TEST_NEW(".*", G_REGEX_OPTIMIZE, 0);
1603  TEST_NEW(".*", G_REGEX_MULTILINE, 0);
1604  TEST_NEW(".*", G_REGEX_DOTALL, 0);
1605  TEST_NEW(".*", G_REGEX_DOTALL, G_REGEX_MATCH_NOTBOL);
1606  TEST_NEW("(123\\d*)[a-zA-Z]+(?P<hello>.*)", 0, 0);
1607  TEST_NEW("(123\\d*)[a-zA-Z]+(?P<hello>.*)", G_REGEX_CASELESS, 0);
1608  TEST_NEW("(123\\d*)[a-zA-Z]+(?P<hello>.*)", G_REGEX_CASELESS | G_REGEX_OPTIMIZE, 0);
1609  TEST_NEW("(?P<A>x)|(?P<A>y)", G_REGEX_DUPNAMES, 0);
1610  TEST_NEW("(?P<A>x)|(?P<A>y)", G_REGEX_DUPNAMES | G_REGEX_OPTIMIZE, 0);
1611  /* This gives "internal error: code overflow" with pcre 6.0 */
1612  TEST_NEW("(?i)(?-i)", 0, 0);
1613
1614  /* TEST_NEW_FAIL(pattern, compile_opts, expected_error) */
1615  TEST_NEW_FAIL("(", 0, G_REGEX_ERROR_UNMATCHED_PARENTHESIS);
1616  TEST_NEW_FAIL(")", 0, G_REGEX_ERROR_UNMATCHED_PARENTHESIS);
1617  TEST_NEW_FAIL("[", 0, G_REGEX_ERROR_UNTERMINATED_CHARACTER_CLASS);
1618  TEST_NEW_FAIL("*", 0, G_REGEX_ERROR_NOTHING_TO_REPEAT);
1619  TEST_NEW_FAIL("?", 0, G_REGEX_ERROR_NOTHING_TO_REPEAT);
1620  TEST_NEW_FAIL("(?P<A>x)|(?P<A>y)", 0, G_REGEX_ERROR_DUPLICATE_SUBPATTERN_NAME);
1621
1622  /* TEST_MATCH_SIMPLE(pattern, string, compile_opts, match_opts, expected) */
1623  TEST_MATCH_SIMPLE("a", "", 0, 0, FALSE);
1624  TEST_MATCH_SIMPLE("a", "a", 0, 0, TRUE);
1625  TEST_MATCH_SIMPLE("a", "ba", 0, 0, TRUE);
1626  TEST_MATCH_SIMPLE("^a", "ba", 0, 0, FALSE);
1627  TEST_MATCH_SIMPLE("a", "ba", G_REGEX_ANCHORED, 0, FALSE);
1628  TEST_MATCH_SIMPLE("a", "ba", 0, G_REGEX_MATCH_ANCHORED, FALSE);
1629  TEST_MATCH_SIMPLE("a", "ab", G_REGEX_ANCHORED, 0, TRUE);
1630  TEST_MATCH_SIMPLE("a", "ab", 0, G_REGEX_MATCH_ANCHORED, TRUE);
1631  TEST_MATCH_SIMPLE("a", "a", G_REGEX_CASELESS, 0, TRUE);
1632  TEST_MATCH_SIMPLE("a", "A", G_REGEX_CASELESS, 0, TRUE);
1633  /* These are needed to test extended properties. */
1634  TEST_MATCH_SIMPLE(AGRAVE, AGRAVE, G_REGEX_CASELESS, 0, TRUE);
1635  TEST_MATCH_SIMPLE(AGRAVE, AGRAVE_UPPER, G_REGEX_CASELESS, 0, TRUE);
1636  TEST_MATCH_SIMPLE("\\p{L}", "a", 0, 0, TRUE);
1637  TEST_MATCH_SIMPLE("\\p{L}", "1", 0, 0, FALSE);
1638  TEST_MATCH_SIMPLE("\\p{L}", AGRAVE, 0, 0, TRUE);
1639  TEST_MATCH_SIMPLE("\\p{L}", AGRAVE_UPPER, 0, 0, TRUE);
1640  TEST_MATCH_SIMPLE("\\p{L}", SHEEN, 0, 0, TRUE);
1641  TEST_MATCH_SIMPLE("\\p{L}", ETH30, 0, 0, FALSE);
1642  TEST_MATCH_SIMPLE("\\p{Ll}", "a", 0, 0, TRUE);
1643  TEST_MATCH_SIMPLE("\\p{Ll}", AGRAVE, 0, 0, TRUE);
1644  TEST_MATCH_SIMPLE("\\p{Ll}", AGRAVE_UPPER, 0, 0, FALSE);
1645  TEST_MATCH_SIMPLE("\\p{Ll}", ETH30, 0, 0, FALSE);
1646  TEST_MATCH_SIMPLE("\\p{Sc}", AGRAVE, 0, 0, FALSE);
1647  TEST_MATCH_SIMPLE("\\p{Sc}", EURO, 0, 0, TRUE);
1648  TEST_MATCH_SIMPLE("\\p{Sc}", ETH30, 0, 0, FALSE);
1649  TEST_MATCH_SIMPLE("\\p{N}", "a", 0, 0, FALSE);
1650  TEST_MATCH_SIMPLE("\\p{N}", "1", 0, 0, TRUE);
1651  TEST_MATCH_SIMPLE("\\p{N}", AGRAVE, 0, 0, FALSE);
1652  TEST_MATCH_SIMPLE("\\p{N}", AGRAVE_UPPER, 0, 0, FALSE);
1653  TEST_MATCH_SIMPLE("\\p{N}", SHEEN, 0, 0, FALSE);
1654  TEST_MATCH_SIMPLE("\\p{N}", ETH30, 0, 0, TRUE);
1655  TEST_MATCH_SIMPLE("\\p{Nd}", "a", 0, 0, FALSE);
1656  TEST_MATCH_SIMPLE("\\p{Nd}", "1", 0, 0, TRUE);
1657  TEST_MATCH_SIMPLE("\\p{Nd}", AGRAVE, 0, 0, FALSE);
1658  TEST_MATCH_SIMPLE("\\p{Nd}", AGRAVE_UPPER, 0, 0, FALSE);
1659  TEST_MATCH_SIMPLE("\\p{Nd}", SHEEN, 0, 0, FALSE);
1660  TEST_MATCH_SIMPLE("\\p{Nd}", ETH30, 0, 0, FALSE);
1661  TEST_MATCH_SIMPLE("\\p{Common}", SHEEN, 0, 0, FALSE);
1662  TEST_MATCH_SIMPLE("\\p{Common}", "a", 0, 0, FALSE);
1663  TEST_MATCH_SIMPLE("\\p{Common}", AGRAVE, 0, 0, FALSE);
1664  TEST_MATCH_SIMPLE("\\p{Common}", AGRAVE_UPPER, 0, 0, FALSE);
1665  TEST_MATCH_SIMPLE("\\p{Common}", ETH30, 0, 0, FALSE);
1666  TEST_MATCH_SIMPLE("\\p{Common}", "%", 0, 0, TRUE);
1667  TEST_MATCH_SIMPLE("\\p{Common}", "1", 0, 0, TRUE);
1668  TEST_MATCH_SIMPLE("\\p{Arabic}", SHEEN, 0, 0, TRUE);
1669  TEST_MATCH_SIMPLE("\\p{Arabic}", "a", 0, 0, FALSE);
1670  TEST_MATCH_SIMPLE("\\p{Arabic}", AGRAVE, 0, 0, FALSE);
1671  TEST_MATCH_SIMPLE("\\p{Arabic}", AGRAVE_UPPER, 0, 0, FALSE);
1672  TEST_MATCH_SIMPLE("\\p{Arabic}", ETH30, 0, 0, FALSE);
1673  TEST_MATCH_SIMPLE("\\p{Arabic}", "%", 0, 0, FALSE);
1674  TEST_MATCH_SIMPLE("\\p{Arabic}", "1", 0, 0, FALSE);
1675  TEST_MATCH_SIMPLE("\\p{Latin}", SHEEN, 0, 0, FALSE);
1676  TEST_MATCH_SIMPLE("\\p{Latin}", "a", 0, 0, TRUE);
1677  TEST_MATCH_SIMPLE("\\p{Latin}", AGRAVE, 0, 0, TRUE);
1678  TEST_MATCH_SIMPLE("\\p{Latin}", AGRAVE_UPPER, 0, 0, TRUE);
1679  TEST_MATCH_SIMPLE("\\p{Latin}", ETH30, 0, 0, FALSE);
1680  TEST_MATCH_SIMPLE("\\p{Latin}", "%", 0, 0, FALSE);
1681  TEST_MATCH_SIMPLE("\\p{Latin}", "1", 0, 0, FALSE);
1682  TEST_MATCH_SIMPLE("\\p{Ethiopic}", SHEEN, 0, 0, FALSE);
1683  TEST_MATCH_SIMPLE("\\p{Ethiopic}", "a", 0, 0, FALSE);
1684  TEST_MATCH_SIMPLE("\\p{Ethiopic}", AGRAVE, 0, 0, FALSE);
1685  TEST_MATCH_SIMPLE("\\p{Ethiopic}", AGRAVE_UPPER, 0, 0, FALSE);
1686  TEST_MATCH_SIMPLE("\\p{Ethiopic}", ETH30, 0, 0, TRUE);
1687  TEST_MATCH_SIMPLE("\\p{Ethiopic}", "%", 0, 0, FALSE);
1688  TEST_MATCH_SIMPLE("\\p{Ethiopic}", "1", 0, 0, FALSE);
1689  TEST_MATCH_SIMPLE("\\p{L}(?<=\\p{Arabic})", SHEEN, 0, 0, TRUE);
1690  TEST_MATCH_SIMPLE("\\p{L}(?<=\\p{Latin})", SHEEN, 0, 0, FALSE);
1691  /* Invalid patterns. */
1692  TEST_MATCH_SIMPLE("\\", "a", 0, 0, FALSE);
1693  TEST_MATCH_SIMPLE("[", "", 0, 0, FALSE);
1694
1695  /* TEST_MATCH(pattern, compile_opts, match_opts, string,
1696   * 		string_len, start_position, match_opts2, expected) */
1697  TEST_MATCH("a", 0, 0, "a", -1, 0, 0, TRUE);
1698  TEST_MATCH("a", 0, 0, "A", -1, 0, 0, FALSE);
1699  TEST_MATCH("a", G_REGEX_CASELESS, 0, "A", -1, 0, 0, TRUE);
1700  TEST_MATCH("a", 0, 0, "ab", -1, 1, 0, FALSE);
1701  TEST_MATCH("a", 0, 0, "ba", 1, 0, 0, FALSE);
1702  TEST_MATCH("a", 0, 0, "bab", -1, 0, 0, TRUE);
1703  TEST_MATCH("a", 0, 0, "b", -1, 0, 0, FALSE);
1704  TEST_MATCH("a", 0, G_REGEX_ANCHORED, "a", -1, 0, 0, TRUE);
1705  TEST_MATCH("a", 0, G_REGEX_ANCHORED, "ab", -1, 1, 0, FALSE);
1706  TEST_MATCH("a", 0, G_REGEX_ANCHORED, "ba", 1, 0, 0, FALSE);
1707  TEST_MATCH("a", 0, G_REGEX_ANCHORED, "bab", -1, 0, 0, FALSE);
1708  TEST_MATCH("a", 0, G_REGEX_ANCHORED, "b", -1, 0, 0, FALSE);
1709  TEST_MATCH("a", 0, 0, "a", -1, 0, G_REGEX_ANCHORED, TRUE);
1710  TEST_MATCH("a", 0, 0, "ab", -1, 1, G_REGEX_ANCHORED, FALSE);
1711  TEST_MATCH("a", 0, 0, "ba", 1, 0, G_REGEX_ANCHORED, FALSE);
1712  TEST_MATCH("a", 0, 0, "bab", -1, 0, G_REGEX_ANCHORED, FALSE);
1713  TEST_MATCH("a", 0, 0, "b", -1, 0, G_REGEX_ANCHORED, FALSE);
1714  TEST_MATCH("a|b", 0, 0, "a", -1, 0, 0, TRUE);
1715  TEST_MATCH("\\d", 0, 0, EURO, -1, 0, 0, FALSE);
1716  TEST_MATCH("^.$", 0, 0, EURO, -1, 0, 0, TRUE);
1717  TEST_MATCH("^.{3}$", 0, 0, EURO, -1, 0, 0, FALSE);
1718  TEST_MATCH("^.$", G_REGEX_RAW, 0, EURO, -1, 0, 0, FALSE);
1719  TEST_MATCH("^.{3}$", G_REGEX_RAW, 0, EURO, -1, 0, 0, TRUE);
1720  TEST_MATCH(AGRAVE, G_REGEX_CASELESS, 0, AGRAVE_UPPER, -1, 0, 0, TRUE);
1721
1722  /* New lines handling. */
1723  TEST_MATCH("^a\\Rb$", 0, 0, "a\r\nb", -1, 0, 0, TRUE);
1724  TEST_MATCH("^a\\Rb$", 0, 0, "a\nb", -1, 0, 0, TRUE);
1725  TEST_MATCH("^a\\Rb$", 0, 0, "a\rb", -1, 0, 0, TRUE);
1726  TEST_MATCH("^a\\Rb$", 0, 0, "a\n\rb", -1, 0, 0, FALSE);
1727  TEST_MATCH("^a\\R\\Rb$", 0, 0, "a\n\rb", -1, 0, 0, TRUE);
1728  TEST_MATCH("^a\\nb$", 0, 0, "a\r\nb", -1, 0, 0, FALSE);
1729  TEST_MATCH("^a\\r\\nb$", 0, 0, "a\r\nb", -1, 0, 0, TRUE);
1730
1731  TEST_MATCH("^b$", 0, 0, "a\nb\nc", -1, 0, 0, FALSE);
1732  TEST_MATCH("^b$", G_REGEX_MULTILINE, 0, "a\nb\nc", -1, 0, 0, TRUE);
1733  TEST_MATCH("^b$", G_REGEX_MULTILINE, 0, "a\r\nb\r\nc", -1, 0, 0, TRUE);
1734  TEST_MATCH("^b$", G_REGEX_MULTILINE, 0, "a\rb\rc", -1, 0, 0, TRUE);
1735  TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, 0, "a\nb\nc", -1, 0, 0, FALSE);
1736  TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_LF, 0, "a\nb\nc", -1, 0, 0, TRUE);
1737  TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CRLF, 0, "a\nb\nc", -1, 0, 0, FALSE);
1738  TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, 0, "a\r\nb\r\nc", -1, 0, 0, FALSE);
1739  TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_LF, 0, "a\r\nb\r\nc", -1, 0, 0, FALSE);
1740  TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CRLF, 0, "a\r\nb\r\nc", -1, 0, 0, TRUE);
1741  TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, 0, "a\rb\rc", -1, 0, 0, TRUE);
1742  TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_LF, 0, "a\rb\rc", -1, 0, 0, FALSE);
1743  TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CRLF, 0, "a\rb\rc", -1, 0, 0, FALSE);
1744  TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CR, "a\nb\nc", -1, 0, 0, FALSE);
1745  TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_LF, "a\nb\nc", -1, 0, 0, TRUE);
1746  TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CRLF, "a\nb\nc", -1, 0, 0, FALSE);
1747  TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CR, "a\r\nb\r\nc", -1, 0, 0, FALSE);
1748  TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_LF, "a\r\nb\r\nc", -1, 0, 0, FALSE);
1749  TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CRLF, "a\r\nb\r\nc", -1, 0, 0, TRUE);
1750  TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CR, "a\rb\rc", -1, 0, 0, TRUE);
1751  TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_LF, "a\rb\rc", -1, 0, 0, FALSE);
1752  TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CRLF, "a\rb\rc", -1, 0, 0, FALSE);
1753
1754  TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_ANY, "a\nb\nc", -1, 0, 0, TRUE);
1755  TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_ANY, "a\rb\rc", -1, 0, 0, TRUE);
1756  TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_ANY, "a\r\nb\r\nc", -1, 0, 0, TRUE);
1757  TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_LF, "a\nb\nc", -1, 0, 0, TRUE);
1758  TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_LF, "a\rb\rc", -1, 0, 0, FALSE);
1759  TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_CRLF, "a\r\nb\r\nc", -1, 0, 0, TRUE);
1760  TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_CRLF, "a\rb\rc", -1, 0, 0, FALSE);
1761
1762  TEST_MATCH("a#\nb", G_REGEX_EXTENDED, 0, "a", -1, 0, 0, FALSE);
1763  TEST_MATCH("a#\r\nb", G_REGEX_EXTENDED, 0, "a", -1, 0, 0, FALSE);
1764  TEST_MATCH("a#\rb", G_REGEX_EXTENDED, 0, "a", -1, 0, 0, FALSE);
1765  TEST_MATCH("a#\nb", G_REGEX_EXTENDED, G_REGEX_MATCH_NEWLINE_CR, "a", -1, 0, 0, FALSE);
1766  TEST_MATCH("a#\nb", G_REGEX_EXTENDED | G_REGEX_NEWLINE_CR, 0, "a", -1, 0, 0, TRUE);
1767
1768  /* TEST_MATCH_NEXT#(pattern, string, string_len, start_position, ...) */
1769  TEST_MATCH_NEXT0("a", "x", -1, 0);
1770  TEST_MATCH_NEXT0("a", "ax", -1, 1);
1771  TEST_MATCH_NEXT0("a", "xa", 1, 0);
1772  TEST_MATCH_NEXT0("a", "axa", 1, 2);
1773  TEST_MATCH_NEXT1("a", "a", -1, 0, "a", 0, 1);
1774  TEST_MATCH_NEXT1("a", "xax", -1, 0, "a", 1, 2);
1775  TEST_MATCH_NEXT1(EURO, ENG EURO, -1, 0, EURO, 2, 5);
1776  TEST_MATCH_NEXT1("a*", "", -1, 0, "", 0, 0);
1777  TEST_MATCH_NEXT2("a*", "aa", -1, 0, "aa", 0, 2, "", 2, 2);
1778  TEST_MATCH_NEXT2(EURO "*", EURO EURO, -1, 0, EURO EURO, 0, 6, "", 6, 6);
1779  TEST_MATCH_NEXT2("a", "axa", -1, 0, "a", 0, 1, "a", 2, 3);
1780  TEST_MATCH_NEXT2("a+", "aaxa", -1, 0, "aa", 0, 2, "a", 3, 4);
1781  TEST_MATCH_NEXT2("a", "aa", -1, 0, "a", 0, 1, "a", 1, 2);
1782  TEST_MATCH_NEXT2("a", "ababa", -1, 2, "a", 2, 3, "a", 4, 5);
1783  TEST_MATCH_NEXT2(EURO "+", EURO "-" EURO, -1, 0, EURO, 0, 3, EURO, 4, 7);
1784  TEST_MATCH_NEXT3("", "ab", -1, 0, "", 0, 0, "", 1, 1, "", 2, 2);
1785  TEST_MATCH_NEXT3("", AGRAVE "b", -1, 0, "", 0, 0, "", 2, 2, "", 3, 3);
1786  TEST_MATCH_NEXT3("a", "aaxa", -1, 0, "a", 0, 1, "a", 1, 2, "a", 3, 4);
1787  TEST_MATCH_NEXT3("a", "aa" OGRAVE "a", -1, 0, "a", 0, 1, "a", 1, 2, "a", 4, 5);
1788  TEST_MATCH_NEXT3("a*", "aax", -1, 0, "aa", 0, 2, "", 2, 2, "", 3, 3);
1789  TEST_MATCH_NEXT3("(?=[A-Z0-9])", "RegExTest", -1, 0, "", 0, 0, "", 3, 3, "", 5, 5);
1790  TEST_MATCH_NEXT4("a*", "aaxa", -1, 0, "aa", 0, 2, "", 2, 2, "a", 3, 4, "", 4, 4);
1791
1792  /* TEST_MATCH_COUNT(pattern, string, start_position, match_opts, expected_count) */
1793  TEST_MATCH_COUNT("a", "", 0, 0, 0);
1794  TEST_MATCH_COUNT("a", "a", 0, 0, 1);
1795  TEST_MATCH_COUNT("a", "a", 1, 0, 0);
1796  TEST_MATCH_COUNT("(.)", "a", 0, 0, 2);
1797  TEST_MATCH_COUNT("(.)", EURO, 0, 0, 2);
1798  TEST_MATCH_COUNT("(?:.)", "a", 0, 0, 1);
1799  TEST_MATCH_COUNT("(?P<A>.)", "a", 0, 0, 2);
1800  TEST_MATCH_COUNT("a$", "a", 0, G_REGEX_MATCH_NOTEOL, 0);
1801  TEST_MATCH_COUNT("(a)?(b)", "b", 0, 0, 3);
1802  TEST_MATCH_COUNT("(a)?(b)", "ab", 0, 0, 3);
1803
1804  /* TEST_PARTIAL(pattern, string, expected) */
1805  TEST_PARTIAL("^ab", "a", TRUE);
1806  TEST_PARTIAL("^ab", "xa", FALSE);
1807  TEST_PARTIAL("ab", "xa", TRUE);
1808  TEST_PARTIAL("ab", "ab", FALSE); /* normal match. */
1809  TEST_PARTIAL("a+b", "aa", FALSE); /* PCRE_ERROR_BAD_PARTIAL */
1810  TEST_PARTIAL("(a)+b", "aa", TRUE);
1811  TEST_PARTIAL("a?b", "a", TRUE);
1812
1813  /* TEST_SUB_PATTERN(pattern, string, start_position, sub_n, expected_sub,
1814   * 		      expected_start, expected_end) */
1815  TEST_SUB_PATTERN("a", "a", 0, 0, "a", 0, 1);
1816  TEST_SUB_PATTERN("a(.)", "ab", 0, 1, "b", 1, 2);
1817  TEST_SUB_PATTERN("a(.)", "a" EURO, 0, 1, EURO, 1, 4);
1818  TEST_SUB_PATTERN("(?:.*)(a)(.)", "xxa" ENG, 0, 2, ENG, 3, 5);
1819  TEST_SUB_PATTERN("(" HSTROKE ")", "a" HSTROKE ENG, 0, 1, HSTROKE, 1, 3);
1820  TEST_SUB_PATTERN("a", "a", 0, 1, NULL, UNTOUCHED, UNTOUCHED);
1821  TEST_SUB_PATTERN("a", "a", 0, 1, NULL, UNTOUCHED, UNTOUCHED);
1822  TEST_SUB_PATTERN("(a)?(b)", "b", 0, 0, "b", 0, 1);
1823  TEST_SUB_PATTERN("(a)?(b)", "b", 0, 1, "", -1, -1);
1824  TEST_SUB_PATTERN("(a)?(b)", "b", 0, 2, "b", 0, 1);
1825
1826  /* TEST_NAMED_SUB_PATTERN(pattern, string, start_position, sub_name,
1827   * 			    expected_sub, expected_start, expected_end) */
1828  TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", "ab", 0, "A", "b", 1, 2);
1829  TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", "aab", 1, "A", "b", 2, 3);
1830  TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", EURO "ab", 0, "A", "b", 4, 5);
1831  TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", EURO "ab", 0, "B", NULL, UNTOUCHED, UNTOUCHED);
1832  TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", EURO "ab", 0, "C", NULL, UNTOUCHED, UNTOUCHED);
1833  TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", "a" EGRAVE "x", 0, "A", EGRAVE, 1, 3);
1834  TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", "a" EGRAVE "x", 0, "B", "x", 3, 4);
1835  TEST_NAMED_SUB_PATTERN("(?P<A>a)?(?P<B>b)", "b", 0, "A", "", -1, -1);
1836  TEST_NAMED_SUB_PATTERN("(?P<A>a)?(?P<B>b)", "b", 0, "B", "b", 0, 1);
1837
1838  /* TEST_NAMED_SUB_PATTERN_DUPNAMES(pattern, string, start_position, sub_name,
1839   *				     expected_sub, expected_start, expected_end) */
1840  TEST_NAMED_SUB_PATTERN_DUPNAMES("(?P<N>a)|(?P<N>b)", "ab", 0, "N", "a", 0, 1);
1841  TEST_NAMED_SUB_PATTERN_DUPNAMES("(?P<N>aa)|(?P<N>a)", "aa", 0, "N", "aa", 0, 2);
1842  TEST_NAMED_SUB_PATTERN_DUPNAMES("(?P<N>aa)(?P<N>a)", "aaa", 0, "N", "aa", 0, 2);
1843  TEST_NAMED_SUB_PATTERN_DUPNAMES("(?P<N>x)|(?P<N>a)", "a", 0, "N", "a", 0, 1);
1844  TEST_NAMED_SUB_PATTERN_DUPNAMES("(?P<N>x)y|(?P<N>a)b", "ab", 0, "N", "a", 0, 1);
1845
1846  /* DUPNAMES option inside the pattern */
1847  TEST_NAMED_SUB_PATTERN("(?J)(?P<N>a)|(?P<N>b)", "ab", 0, "N", "a", 0, 1);
1848  TEST_NAMED_SUB_PATTERN("(?J)(?P<N>aa)|(?P<N>a)", "aa", 0, "N", "aa", 0, 2);
1849  TEST_NAMED_SUB_PATTERN("(?J)(?P<N>aa)(?P<N>a)", "aaa", 0, "N", "aa", 0, 2);
1850  TEST_NAMED_SUB_PATTERN("(?J)(?P<N>x)|(?P<N>a)", "a", 0, "N", "a", 0, 1);
1851  TEST_NAMED_SUB_PATTERN("(?J)(?P<N>x)y|(?P<N>a)b", "ab", 0, "N", "a", 0, 1);
1852
1853  /* TEST_FETCH_ALL#(pattern, string, ...) */
1854  TEST_FETCH_ALL0("a", "");
1855  TEST_FETCH_ALL0("a", "b");
1856  TEST_FETCH_ALL1("a", "a", "a");
1857  TEST_FETCH_ALL1("a+", "aa", "aa");
1858  TEST_FETCH_ALL1("(?:a)", "a", "a");
1859  TEST_FETCH_ALL2("(a)", "a", "a", "a");
1860  TEST_FETCH_ALL2("a(.)", "ab", "ab", "b");
1861  TEST_FETCH_ALL2("a(.)", "a" HSTROKE, "a" HSTROKE, HSTROKE);
1862  TEST_FETCH_ALL3("(?:.*)(a)(.)", "xyazk", "xyaz", "a", "z");
1863  TEST_FETCH_ALL3("(?P<A>.)(a)", "xa", "xa", "x", "a");
1864  TEST_FETCH_ALL3("(?P<A>.)(a)", ENG "a", ENG "a", ENG, "a");
1865  TEST_FETCH_ALL3("(a)?(b)", "b", "b", "", "b");
1866  TEST_FETCH_ALL3("(a)?(b)", "ab", "ab", "a", "b");
1867
1868  /* TEST_SPLIT_SIMPLE#(pattern, string, ...) */
1869  TEST_SPLIT_SIMPLE0("", "");
1870  TEST_SPLIT_SIMPLE0("a", "");
1871  TEST_SPLIT_SIMPLE1(",", "a", "a");
1872  TEST_SPLIT_SIMPLE1("(,)\\s*", "a", "a");
1873  TEST_SPLIT_SIMPLE2(",", "a,b", "a", "b");
1874  TEST_SPLIT_SIMPLE3(",", "a,b,c", "a", "b", "c");
1875  TEST_SPLIT_SIMPLE3(",\\s*", "a,b,c", "a", "b", "c");
1876  TEST_SPLIT_SIMPLE3(",\\s*", "a, b, c", "a", "b", "c");
1877  TEST_SPLIT_SIMPLE3("(,)\\s*", "a,b", "a", ",", "b");
1878  TEST_SPLIT_SIMPLE3("(,)\\s*", "a, b", "a", ",", "b");
1879  /* Not matched sub-strings. */
1880  TEST_SPLIT_SIMPLE2("a|(b)", "xay", "x", "y");
1881  TEST_SPLIT_SIMPLE3("a|(b)", "xby", "x", "b", "y");
1882  /* Empty matches. */
1883  TEST_SPLIT_SIMPLE3("", "abc", "a", "b", "c");
1884  TEST_SPLIT_SIMPLE3(" *", "ab c", "a", "b", "c");
1885  /* Invalid patterns. */
1886  TEST_SPLIT_SIMPLE0("\\", "");
1887  TEST_SPLIT_SIMPLE0("[", "");
1888
1889  /* TEST_SPLIT#(pattern, string, start_position, max_tokens, ...) */
1890  TEST_SPLIT0("", "", 0, 0);
1891  TEST_SPLIT0("a", "", 0, 0);
1892  TEST_SPLIT0("a", "", 0, 1);
1893  TEST_SPLIT0("a", "", 0, 2);
1894  TEST_SPLIT0("a", "a", 1, 0);
1895  TEST_SPLIT1(",", "a", 0, 0, "a");
1896  TEST_SPLIT1(",", "a,b", 0, 1, "a,b");
1897  TEST_SPLIT1("(,)\\s*", "a", 0, 0, "a");
1898  TEST_SPLIT1(",", "a,b", 2, 0, "b");
1899  TEST_SPLIT2(",", "a,b", 0, 0, "a", "b");
1900  TEST_SPLIT2(",", "a,b,c", 0, 2, "a", "b,c");
1901  TEST_SPLIT2(",", "a,b", 1, 0, "", "b");
1902  TEST_SPLIT2(",", "a,", 0, 0, "a", "");
1903  TEST_SPLIT3(",", "a,b,c", 0, 0, "a", "b", "c");
1904  TEST_SPLIT3(",\\s*", "a,b,c", 0, 0, "a", "b", "c");
1905  TEST_SPLIT3(",\\s*", "a, b, c", 0, 0, "a", "b", "c");
1906  TEST_SPLIT3("(,)\\s*", "a,b", 0, 0, "a", ",", "b");
1907  TEST_SPLIT3("(,)\\s*", "a, b", 0, 0, "a", ",", "b");
1908  /* Not matched sub-strings. */
1909  TEST_SPLIT2("a|(b)", "xay", 0, 0, "x", "y");
1910  TEST_SPLIT3("a|(b)", "xby", 0, -1, "x", "b", "y");
1911  /* Empty matches. */
1912  TEST_SPLIT2(" *", "ab c", 1, 0, "b", "c");
1913  TEST_SPLIT3("", "abc", 0, 0, "a", "b", "c");
1914  TEST_SPLIT3(" *", "ab c", 0, 0, "a", "b", "c");
1915  TEST_SPLIT1(" *", "ab c", 0, 1, "ab c");
1916  TEST_SPLIT2(" *", "ab c", 0, 2, "a", "b c");
1917  TEST_SPLIT3(" *", "ab c", 0, 3, "a", "b", "c");
1918  TEST_SPLIT3(" *", "ab c", 0, 4, "a", "b", "c");
1919
1920  /* TEST_CHECK_REPLACEMENT(string_to_expand, expected, expected_refs) */
1921  TEST_CHECK_REPLACEMENT("", TRUE, FALSE);
1922  TEST_CHECK_REPLACEMENT("a", TRUE, FALSE);
1923  TEST_CHECK_REPLACEMENT("\\t\\n\\v\\r\\f\\a\\b\\\\\\x{61}", TRUE, FALSE);
1924  TEST_CHECK_REPLACEMENT("\\0", TRUE, TRUE);
1925  TEST_CHECK_REPLACEMENT("\\n\\2", TRUE, TRUE);
1926  TEST_CHECK_REPLACEMENT("\\g<foo>", TRUE, TRUE);
1927  /* Invalid strings */
1928  TEST_CHECK_REPLACEMENT("\\Q", FALSE, FALSE);
1929  TEST_CHECK_REPLACEMENT("x\\Ay", FALSE, FALSE);
1930
1931  /* TEST_EXPAND(pattern, string, string_to_expand, raw, expected) */
1932  TEST_EXPAND("a", "a", "", FALSE, "");
1933  TEST_EXPAND("a", "a", "\\0", FALSE, "a");
1934  TEST_EXPAND("a", "a", "\\1", FALSE, "");
1935  TEST_EXPAND("(a)", "ab", "\\1", FALSE, "a");
1936  TEST_EXPAND("(a)", "a", "\\1", FALSE, "a");
1937  TEST_EXPAND("(a)", "a", "\\g<1>", FALSE, "a");
1938  TEST_EXPAND("a", "a", "\\0130", FALSE, "X");
1939  TEST_EXPAND("a", "a", "\\\\\\0", FALSE, "\\a");
1940  TEST_EXPAND("a(?P<G>.)c", "xabcy", "X\\g<G>X", FALSE, "XbX");
1941  TEST_EXPAND("(.)(?P<1>.)", "ab", "\\1", FALSE, "a");
1942  TEST_EXPAND("(.)(?P<1>.)", "ab", "\\g<1>", FALSE, "a");
1943  TEST_EXPAND(".", EURO, "\\0", FALSE, EURO);
1944  TEST_EXPAND("(.)", EURO, "\\1", FALSE, EURO);
1945  TEST_EXPAND("(?P<G>.)", EURO, "\\g<G>", FALSE, EURO);
1946  TEST_EXPAND(".", "a", EURO, FALSE, EURO);
1947  TEST_EXPAND(".", "a", EURO "\\0", FALSE, EURO "a");
1948  TEST_EXPAND(".", "", "\\Lab\\Ec", FALSE, "abc");
1949  TEST_EXPAND(".", "", "\\LaB\\EC", FALSE, "abC");
1950  TEST_EXPAND(".", "", "\\Uab\\Ec", FALSE, "ABc");
1951  TEST_EXPAND(".", "", "a\\ubc", FALSE, "aBc");
1952  TEST_EXPAND(".", "", "a\\lbc", FALSE, "abc");
1953  TEST_EXPAND(".", "", "A\\uBC", FALSE, "ABC");
1954  TEST_EXPAND(".", "", "A\\lBC", FALSE, "AbC");
1955  TEST_EXPAND(".", "", "A\\l\\\\BC", FALSE, "A\\BC");
1956  TEST_EXPAND(".", "", "\\L" AGRAVE "\\E", FALSE, AGRAVE);
1957  TEST_EXPAND(".", "", "\\U" AGRAVE "\\E", FALSE, AGRAVE_UPPER);
1958  TEST_EXPAND(".", "", "\\u" AGRAVE "a", FALSE, AGRAVE_UPPER "a");
1959  TEST_EXPAND(".", "ab", "x\\U\\0y\\Ez", FALSE, "xAYz");
1960  TEST_EXPAND(".(.)", "AB", "x\\L\\1y\\Ez", FALSE, "xbyz");
1961  TEST_EXPAND(".", "ab", "x\\u\\0y\\Ez", FALSE, "xAyz");
1962  TEST_EXPAND(".(.)", "AB", "x\\l\\1y\\Ez", FALSE, "xbyz");
1963  TEST_EXPAND(".(.)", "a" AGRAVE_UPPER, "x\\l\\1y", FALSE, "x" AGRAVE "y");
1964  TEST_EXPAND("a", "bab", "\\x{61}", FALSE, "a");
1965  TEST_EXPAND("a", "bab", "\\x61", FALSE, "a");
1966  TEST_EXPAND("a", "bab", "\\x5a", FALSE, "Z");
1967  TEST_EXPAND("a", "bab", "\\0\\x5A", FALSE, "aZ");
1968  TEST_EXPAND("a", "bab", "\\1\\x{5A}", FALSE, "Z");
1969  TEST_EXPAND("a", "bab", "\\x{00E0}", FALSE, AGRAVE);
1970  TEST_EXPAND("", "bab", "\\x{0634}", FALSE, SHEEN);
1971  TEST_EXPAND("", "bab", "\\x{634}", FALSE, SHEEN);
1972  TEST_EXPAND("", "", "\\t", FALSE, "\t");
1973  TEST_EXPAND("", "", "\\v", FALSE, "\v");
1974  TEST_EXPAND("", "", "\\r", FALSE, "\r");
1975  TEST_EXPAND("", "", "\\n", FALSE, "\n");
1976  TEST_EXPAND("", "", "\\f", FALSE, "\f");
1977  TEST_EXPAND("", "", "\\a", FALSE, "\a");
1978  TEST_EXPAND("", "", "\\b", FALSE, "\b");
1979  TEST_EXPAND("a(.)", "abc", "\\0\\b\\1", FALSE, "ab\bb");
1980  TEST_EXPAND("a(.)", "abc", "\\0141", FALSE, "a");
1981  TEST_EXPAND("a(.)", "abc", "\\078", FALSE, "\a8");
1982  TEST_EXPAND("a(.)", "abc", "\\077", FALSE, "?");
1983  TEST_EXPAND("a(.)", "abc", "\\0778", FALSE, "?8");
1984  TEST_EXPAND("a(.)", "a" AGRAVE "b", "\\1", FALSE, AGRAVE);
1985  TEST_EXPAND("a(.)", "a" AGRAVE "b", "\\1", TRUE, "\xc3");
1986  TEST_EXPAND("a(.)", "a" AGRAVE "b", "\\0", TRUE, "a\xc3");
1987  /* Invalid strings. */
1988  TEST_EXPAND("", "", "\\Q", FALSE, NULL);
1989  TEST_EXPAND("", "", "x\\Ay", FALSE, NULL);
1990  TEST_EXPAND("", "", "\\g<", FALSE, NULL);
1991  TEST_EXPAND("", "", "\\g<>", FALSE, NULL);
1992  TEST_EXPAND("", "", "\\g<1a>", FALSE, NULL);
1993  TEST_EXPAND("", "", "\\g<a$>", FALSE, NULL);
1994  TEST_EXPAND("", "", "\\", FALSE, NULL);
1995  TEST_EXPAND("a", "a", "\\x{61", FALSE, NULL);
1996  TEST_EXPAND("a", "a", "\\x6X", FALSE, NULL);
1997  /* Pattern-less. */
1998  TEST_EXPAND(NULL, NULL, "", FALSE, "");
1999  TEST_EXPAND(NULL, NULL, "\\n", FALSE, "\n");
2000  /* Invalid strings */
2001  TEST_EXPAND(NULL, NULL, "\\Q", FALSE, NULL);
2002  TEST_EXPAND(NULL, NULL, "x\\Ay", FALSE, NULL);
2003
2004  /* TEST_REPLACE(pattern, string, start_position, replacement, expected) */
2005  TEST_REPLACE("a", "ababa", 0, "A", "AbAbA");
2006  TEST_REPLACE("a", "ababa", 1, "A", "abAbA");
2007  TEST_REPLACE("a", "ababa", 2, "A", "abAbA");
2008  TEST_REPLACE("a", "ababa", 3, "A", "ababA");
2009  TEST_REPLACE("a", "ababa", 4, "A", "ababA");
2010  TEST_REPLACE("a", "ababa", 5, "A", "ababa");
2011  TEST_REPLACE("a", "ababa", 6, "A", "ababa");
2012  TEST_REPLACE("a", "abababa", 2, "A", "abAbAbA");
2013  TEST_REPLACE("a", "abab", 0, "A", "AbAb");
2014  TEST_REPLACE("a", "baba", 0, "A", "bAbA");
2015  TEST_REPLACE("a", "bab", 0, "A", "bAb");
2016  TEST_REPLACE("$^", "abc", 0, "X", "abc");
2017  TEST_REPLACE("(.)a", "ciao", 0, "a\\1", "caio");
2018  TEST_REPLACE("a.", "abc", 0, "\\0\\0", "ababc");
2019  TEST_REPLACE("a", "asd", 0, "\\0101", "Asd");
2020  TEST_REPLACE("(a).\\1", "aba cda", 0, "\\1\\n", "a\n cda");
2021  TEST_REPLACE("a" AGRAVE "a", "a" AGRAVE "a", 0, "x", "x");
2022  TEST_REPLACE("a" AGRAVE "a", "a" AGRAVE "a", 0, OGRAVE, OGRAVE);
2023  TEST_REPLACE("[^-]", "-" EURO "-x-" HSTROKE, 0, "a", "-a-a-a");
2024  TEST_REPLACE("[^-]", "-" EURO "-" HSTROKE, 0, "a\\g<0>a", "-a" EURO "a-a" HSTROKE "a");
2025  TEST_REPLACE("-", "-" EURO "-" HSTROKE, 0, "", EURO HSTROKE);
2026  TEST_REPLACE(".*", "hello", 0, "\\U\\0\\E", "HELLO");
2027  TEST_REPLACE(".*", "hello", 0, "\\u\\0", "Hello");
2028  TEST_REPLACE("\\S+", "hello world", 0, "\\U-\\0-", "-HELLO- -WORLD-");
2029  TEST_REPLACE(".", "a", 0, "\\A", NULL);
2030  TEST_REPLACE(".", "a", 0, "\\g", NULL);
2031
2032  /* TEST_REPLACE_LIT(pattern, string, start_position, replacement, expected) */
2033  TEST_REPLACE_LIT("a", "ababa", 0, "A", "AbAbA");
2034  TEST_REPLACE_LIT("a", "ababa", 1, "A", "abAbA");
2035  TEST_REPLACE_LIT("a", "ababa", 2, "A", "abAbA");
2036  TEST_REPLACE_LIT("a", "ababa", 3, "A", "ababA");
2037  TEST_REPLACE_LIT("a", "ababa", 4, "A", "ababA");
2038  TEST_REPLACE_LIT("a", "ababa", 5, "A", "ababa");
2039  TEST_REPLACE_LIT("a", "ababa", 6, "A", "ababa");
2040  TEST_REPLACE_LIT("a", "abababa", 2, "A", "abAbAbA");
2041  TEST_REPLACE_LIT("a", "abcadaa", 0, "A", "AbcAdAA");
2042  TEST_REPLACE_LIT("$^", "abc", 0, "X", "abc");
2043  TEST_REPLACE_LIT("(.)a", "ciao", 0, "a\\1", "ca\\1o");
2044  TEST_REPLACE_LIT("a.", "abc", 0, "\\0\\0\\n", "\\0\\0\\nc");
2045  TEST_REPLACE_LIT("a" AGRAVE "a", "a" AGRAVE "a", 0, "x", "x");
2046  TEST_REPLACE_LIT("a" AGRAVE "a", "a" AGRAVE "a", 0, OGRAVE, OGRAVE);
2047  TEST_REPLACE_LIT(AGRAVE, "-" AGRAVE "-" HSTROKE, 0, "a" ENG "a", "-a" ENG "a-" HSTROKE);
2048  TEST_REPLACE_LIT("[^-]", "-" EURO "-" AGRAVE "-" HSTROKE, 0, "a", "-a-a-a");
2049  TEST_REPLACE_LIT("[^-]", "-" EURO "-" AGRAVE, 0, "a\\g<0>a", "-a\\g<0>a-a\\g<0>a");
2050  TEST_REPLACE_LIT("-", "-" EURO "-" AGRAVE "-" HSTROKE, 0, "", EURO AGRAVE HSTROKE);
2051  TEST_REPLACE_LIT("(?=[A-Z0-9])", "RegExTest", 0, "_", "_Reg_Ex_Test");
2052  TEST_REPLACE_LIT("(?=[A-Z0-9])", "RegExTest", 1, "_", "Reg_Ex_Test");
2053
2054  /* TEST_GET_STRING_NUMBER(pattern, name, expected_num) */
2055  TEST_GET_STRING_NUMBER("", "A", -1);
2056  TEST_GET_STRING_NUMBER("(?P<A>.)", "A", 1);
2057  TEST_GET_STRING_NUMBER("(?P<A>.)", "B", -1);
2058  TEST_GET_STRING_NUMBER("(?P<A>.)(?P<B>a)", "A", 1);
2059  TEST_GET_STRING_NUMBER("(?P<A>.)(?P<B>a)", "B", 2);
2060  TEST_GET_STRING_NUMBER("(?P<A>.)(?P<B>a)", "C", -1);
2061  TEST_GET_STRING_NUMBER("(?P<A>.)(.)(?P<B>a)", "A", 1);
2062  TEST_GET_STRING_NUMBER("(?P<A>.)(.)(?P<B>a)", "B", 3);
2063  TEST_GET_STRING_NUMBER("(?P<A>.)(.)(?P<B>a)", "C", -1);
2064  TEST_GET_STRING_NUMBER("(?:a)(?P<A>.)", "A", 1);
2065  TEST_GET_STRING_NUMBER("(?:a)(?P<A>.)", "B", -1);
2066
2067  /* TEST_ESCAPE(string, length, expected) */
2068  TEST_ESCAPE("hello world", -1, "hello world");
2069  TEST_ESCAPE("hello world", 5, "hello");
2070  TEST_ESCAPE("hello.world", -1, "hello\\.world");
2071  TEST_ESCAPE("a(b\\b.$", -1, "a\\(b\\\\b\\.\\$");
2072  TEST_ESCAPE("hello\0world", -1, "hello");
2073  TEST_ESCAPE("hello\0world", 11, "hello\\0world");
2074  TEST_ESCAPE(EURO "*" ENG, -1, EURO "\\*" ENG);
2075  TEST_ESCAPE("a$", -1, "a\\$");
2076  TEST_ESCAPE("$a", -1, "\\$a");
2077  TEST_ESCAPE("a$a", -1, "a\\$a");
2078  TEST_ESCAPE("$a$", -1, "\\$a\\$");
2079  TEST_ESCAPE("$a$", 0, "");
2080  TEST_ESCAPE("$a$", 1, "\\$");
2081  TEST_ESCAPE("$a$", 2, "\\$a");
2082  TEST_ESCAPE("$a$", 3, "\\$a\\$");
2083  TEST_ESCAPE("$a$", 4, "\\$a\\$\\0");
2084  TEST_ESCAPE("|()[]{}^$*+?.", -1, "\\|\\(\\)\\[\\]\\{\\}\\^\\$\\*\\+\\?\\.");
2085  TEST_ESCAPE("a|a(a)a[a]a{a}a^a$a*a+a?a.a", -1,
2086	      "a\\|a\\(a\\)a\\[a\\]a\\{a\\}a\\^a\\$a\\*a\\+a\\?a\\.a");
2087
2088  /* TEST_MATCH_ALL#(pattern, string, string_len, start_position, ...) */
2089  TEST_MATCH_ALL0("<.*>", "", -1, 0);
2090  TEST_MATCH_ALL0("a+", "", -1, 0);
2091  TEST_MATCH_ALL0("a+", "a", 0, 0);
2092  TEST_MATCH_ALL0("a+", "a", -1, 1);
2093  TEST_MATCH_ALL1("<.*>", "<a>", -1, 0, "<a>", 0, 3);
2094  TEST_MATCH_ALL1("a+", "a", -1, 0, "a", 0, 1);
2095  TEST_MATCH_ALL1("a+", "aa", 1, 0, "a", 0, 1);
2096  TEST_MATCH_ALL1("a+", "aa", -1, 1, "a", 1, 2);
2097  TEST_MATCH_ALL1("a+", "aa", 2, 1, "a", 1, 2);
2098  TEST_MATCH_ALL1(".+", ENG, -1, 0, ENG, 0, 2);
2099  TEST_MATCH_ALL2("<.*>", "<a><b>", -1, 0, "<a><b>", 0, 6, "<a>", 0, 3);
2100  TEST_MATCH_ALL2("a+", "aa", -1, 0, "aa", 0, 2, "a", 0, 1);
2101  TEST_MATCH_ALL2(".+", ENG EURO, -1, 0, ENG EURO, 0, 5, ENG, 0, 2);
2102  TEST_MATCH_ALL3("<.*>", "<a><b><c>", -1, 0, "<a><b><c>", 0, 9,
2103		  "<a><b>", 0, 6, "<a>", 0, 3);
2104  TEST_MATCH_ALL3("a+", "aaa", -1, 0, "aaa", 0, 3, "aa", 0, 2, "a", 0, 1);
2105
2106end: /* if abort_on_fail is TRUE the flow passes to this label. */
2107  verbose ("\n%u tests passed, %u failed\n", passed, failed);
2108  return failed;
2109}
2110
2111#else /* ENABLE_REGEX false */
2112
2113int
2114main (int argc, char *argv[])
2115{
2116  g_print ("GRegex is disabled.\n");
2117  return 0;
2118}
2119
2120#endif /* ENABLE_REGEX */
2121