1 /* tests.c - test cases for rx-xml
2  *
3  ****************************************************************
4  * Copyright (C) 2000 Tom Lord
5  *
6  * See the file "COPYING" for further information about
7  * the copyright and warranty status of this work.
8  */
9 
10 
11 #include "hackerlab/tests/rx-xml-tests/tests.h"
12 
13 
14 
15 #define TEST(name,re,comperr,str,matcherr,ismatch) \
16   { name, re, comperr, str, matcherr, ismatch }
17 
18 #define TEST_LIST \
19 											                                \
20   /* 			ATOM TESTS 							                                \
21    */											                                \
22 											                                \
23 											                                \
24   /* normal characters */								                                \
25   TEST("atom test 0", "x", 0, "x", 0, 1),						                                \
26 											                                \
27   /* 	character classes */								                                \
28 											                                \
29   /* 		single character escape */						                                \
30   TEST("atom test 1", "\\n", 0, "\n", 0, 1),						                                \
31   TEST("atom test 2", "\\r", 0, "\r", 0, 1),						                                \
32   TEST("atom test 3", "\\t", 0, "\t", 0, 1),						                                \
33   TEST("atom test 4", "\\\\", 0, "\\", 0, 1),						                                \
34   TEST("atom test 5", "\\.", 0, ".", 0, 1),						                                \
35   TEST("atom test 6", "\\.", 0, "x", 0, 0),						                                \
36 											                                \
37   TEST("atom test 7", "\\-", 0, "-", 0, 1),						                                \
38   TEST("atom test 8", "\\^", 0, "^", 0, 1),						                                \
39   TEST("atom test 9", "\\?", 0, "?", 0, 1),						                                \
40   TEST("atom test 10", "\\*", 0, "*", 0, 1),						                                \
41   TEST("atom test 11", "\\+", 0, "+", 0, 1),						                                \
42   TEST("atom test 12", "\\{", 0, "{", 0, 1),						                                \
43   TEST("atom test 13", "\\}", 0, "}", 0, 1),						                                \
44   TEST("atom test 14", "\\(", 0, "(", 0, 1),						                                \
45   TEST("atom test 15", "\\)", 0, ")", 0, 1),						                                \
46   TEST("atom test 16", "\\[", 0, "[", 0, 1),						                                \
47 											                                \
48   TEST("atom test 17", "\\a", rx_xml_recomp_BOGUS_CHAR, "a", 0, 0),			                                \
49 											                                \
50   /* category escapes */												\
51   TEST("category test 0", "\\p{isGreek}", 0, "\\u0370", 0, 1),				                                \
52   TEST("category test 1", "\\p{isBasicLatin}", 0, "\\u0370", 0, 0),			                                \
53   TEST("category test 2", "\\p{isbasiclatin}", 0, "\\u0370", 0, 0),			                                \
54   TEST("category test 3", "\\p{isBasic Latin}", 0, "\\u0370", 0, 0),			                                \
55   TEST("category test 4", "\\p{isbasic latin}", 0, "\\u0370", 0, 0),			                                \
56   TEST("category test 5", "\\p{isGreek}", 0, "a", 0, 0),				                                \
57   TEST("category test 6", "\\p{isBasicLatin}", 0, "a", 0, 1),			                                	\
58   TEST("category test 7", "\\p{isbasiclatin}", 0, "a", 0, 1),			                                	\
59   TEST("category test 8", "\\p{isBasic Latin}", 0, "a", 0, 1),			                                	\
60   TEST("category test 9", "\\p{isbasic latin}", 0, "a", 0, 1),			                                	\
61 															\
62   /* multi-character escapes */						                                		\
63   TEST("mce test 0", ".", 0, "a", 0, 1),						                                \
64   TEST("mce test 1", ".", 0, "b", 0, 1),						                                \
65   TEST("mce test 2", ".", 0, "\n", 0, 0),						                                \
66   TEST("mce test 3", ".", 0, "\r", 0, 0),						                                \
67   TEST("mce test 4", ".", 0, " ", 0, 1),						                                \
68   TEST("mce test 5", ".", 0, "\\u2200", 0, 1),					                                	\
69 											                                \
70   TEST("mce test 6", "\\s", 0, " ", 0, 1),						                                \
71   TEST("mce test 7", "\\s", 0, "\t", 0, 1),						                                \
72   TEST("mce test 8", "\\s", 0, "\n", 0, 1),						                                \
73   TEST("mce test 9", "\\s", 0, "\r", 0, 1),						                                \
74   TEST("mce test 10", "\\s", 0, "x", 0, 0),						                                \
75 											                                \
76   TEST("mce test 11", "\\S", 0, " ", 0, 0),						                                \
77   TEST("mce test 12", "\\S", 0, "\t", 0, 0),						                                \
78   TEST("mce test 13", "\\S", 0, "\n", 0, 0),						                                \
79   TEST("mce test 14", "\\S", 0, "\r", 0, 0),						                                \
80   TEST("mce test 15", "\\S", 0, "x", 0, 1),						                                \
81 											                                \
82 											                                \
83   TEST("mce test 16", "\\i", 0, "a", 0, 1),						                                \
84   TEST("mce test 17", "\\i", 0, "A", 0, 1),						                                \
85   TEST("mce test 18", "\\i", 0, "\\u4e00", 0, 1),					                                \
86   TEST("mce test 19", "\\i", 0, ":", 0, 1),						                                \
87   TEST("mce test 20", "\\i", 0, "_", 0, 1),						                                \
88   TEST("mce test 21", "\\i", 0, "2", 0, 0),						                                \
89   TEST("mce test 22", "\\i", 0, ".", 0, 0),						                                \
90   TEST("mce test 23", "\\i", 0, "\\u0300", 0, 0),					                                \
91   TEST("mce test 24", "\\i", 0, " ", 0, 0),						                                \
92   TEST("mce test 25", "\\i", 0, "\n", 0, 0),						                                \
93 											                                \
94   TEST("mce test 26", "\\I", 0, "a", 0, 0),						                                \
95   TEST("mce test 27", "\\I", 0, "A", 0, 0),						                                \
96   TEST("mce test 28", "\\I", 0, "\\u4e00", 0, 0),					                                \
97   TEST("mce test 29", "\\I", 0, ":", 0, 0),						                                \
98   TEST("mce test 30", "\\I", 0, "_", 0, 0),						                                \
99   TEST("mce test 31", "\\I", 0, "2", 0, 1),						                                \
100   TEST("mce test 32", "\\I", 0, ".", 0, 1),						                                \
101   TEST("mce test 33", "\\I", 0, "\\u0300", 0, 1),					                                \
102   TEST("mce test 34", "\\I", 0, " ", 0, 1),						                                \
103   TEST("mce test 35", "\\I", 0, "\n", 0, 1),						                                \
104 											                                \
105   TEST("mce test 36", "\\c", 0, "a", 0, 1),						                                \
106   TEST("mce test 37", "\\c", 0, "A", 0, 1),						                                \
107   TEST("mce test 38", "\\c", 0, "\\u4e00", 0, 1),					                                \
108   TEST("mce test 39", "\\c", 0, ":", 0, 1),						                                \
109   TEST("mce test 40", "\\c", 0, "_", 0, 1),						                                \
110   TEST("mce test 41", "\\c", 0, "2", 0, 1),						                                \
111   TEST("mce test 42", "\\c", 0, ".", 0, 1),						                                \
112   TEST("mce test 43", "\\c", 0, "\\u0300", 0, 1),					                                \
113   TEST("mce test 44", "\\c", 0, " ", 0, 0),						                                \
114   TEST("mce test 45", "\\c", 0, "\n", 0, 0),						                                \
115 											                                \
116   TEST("mce test 46", "\\C", 0, "a", 0, 0),						                                \
117   TEST("mce test 47", "\\C", 0, "A", 0, 0),						                                \
118   TEST("mce test 48", "\\C", 0, "\\u4e00", 0, 0),					                                \
119   TEST("mce test 49", "\\C", 0, ":", 0, 0),						                                \
120   TEST("mce test 50", "\\C", 0, "_", 0, 0),						                                \
121   TEST("mce test 51", "\\C", 0, "2", 0, 0),						                                \
122   TEST("mce test 52", "\\C", 0, ".", 0, 0),						                                \
123   TEST("mce test 53", "\\C", 0, "\\u0300", 0, 0),					                                \
124   TEST("mce test 54", "\\C", 0, " ", 0, 1),						                                \
125   TEST("mce test 55", "\\C", 0, "\n", 0, 1),						                                \
126 											                                \
127   TEST("mce test 56", "\\d", 0, "0", 0, 1),						                                \
128   TEST("mce test 57", "\\d", 0, "9", 0, 1),						                                \
129   TEST("mce test 58", "\\d", 0, "\\u0660", 0, 1),					                                \
130   TEST("mce test 59", "\\d", 0, "\\u0966", 0, 1),					                                \
131   TEST("mce test 60", "\\d", 0, "x", 0, 0),						                                \
132 											                                \
133   TEST("mce test 61", "\\D", 0, "0", 0, 0),						                                \
134   TEST("mce test 62", "\\D", 0, "9", 0, 0),						                                \
135   TEST("mce test 63", "\\D", 0, "\\u0660", 0, 0),					                                \
136   TEST("mce test 64", "\\D", 0, "\\u0966", 0, 0),					                                \
137   TEST("mce test 65", "\\D", 0, "x", 0, 1),						                                \
138 											                                \
139   TEST("mce test 66", "\\w", 0, "a", 0, 1),						                                \
140   TEST("mce test 67", "\\w", 0, "\\u2200", 0, 1),					                                \
141   TEST("mce test 68", "\\w", 0, "\\u4e00", 0, 1),					                                \
142   TEST("mce test 69", "\\w", 0, " ", 0, 0),						                                \
143   TEST("mce test 70", "\\w", 0, "\t", 0, 0),						                                \
144 											                                \
145   TEST("mce test 71", "\\W", 0, "a", 0, 0),						                                \
146   TEST("mce test 72", "\\W", 0, "\\u2200", 0, 0),					                                \
147   TEST("mce test 73", "\\W", 0, "\\u4e00", 0, 0),					                                \
148   TEST("mce test 74", "\\W", 0, " ", 0, 1),						                                \
149   TEST("mce test 75", "\\W", 0, "\t", 0, 1),						                                \
150 											                                \
151 											                                \
152   /* 		character class expression */						                                \
153   TEST("class test 0", "[ABC]", 0, "A", 0, 1),						                                \
154   TEST("class test 1", "[a" RANGE "z]", 0, "m", 0, 1),					                                \
155   TEST("class test 2", "[a" RANGE "z]", 0, "z", 0, 1),					                                \
156   TEST("class test 3", "[012]", 0, "1", 0, 1),						                                \
157   TEST("class test 4", "[7" RANGE "9]", 0, "8", 0, 1),					                                \
158   TEST("class test 5", "[\\p{Sm}]", 0, "\\u2200", 0, 1),				                                \
159   TEST("class test 6", "[\\p{isGreek}]", 0, "\\u0370", 0, 1),				                                \
160   TEST("class test 7", "[\\p{isGreek}]", 0, "\\u03ff", 0, 1),				                                \
161   TEST("class test 8", "[\\p{isGreek}]", 0, "\\u036f", 0, 0),				                                \
162   TEST("class test 9", "[\\p{isGreek}]", 0, "\\u0400", 0, 0),				                                \
163 											                                \
164   TEST("class test 10", "[ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}]", 0, "A", 0, 1),				\
165   TEST("class test 11", "[ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}]", 0, "m", 0, 1),				\
166   TEST("class test 12", "[ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}]", 0, "1", 0, 1),				\
167   TEST("class test 13", "[ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}]", 0, "8", 0, 1),				\
168   TEST("class test 14", "[ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}]", 0, "\\u2200", 0, 1),			\
169   TEST("class test 15", "[ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}]", 0, "\\u0370", 0, 1),			\
170   TEST("class test 16", "[ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}]", 0, "\\u0400", 0, 0),			\
171   TEST("class test 17", "[ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}]", 0, "M", 0, 0),				\
172 															\
173   TEST("class test 18", "[^ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}]", 0, "A", 0, 0),				\
174   TEST("class test 19", "[^ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}]", 0, "z", 0, 0),				\
175   TEST("class test 20", "[^ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}]", 0, "m", 0, 0),				\
176   TEST("class test 21", "[^ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}]", 0, "1", 0, 0),				\
177   TEST("class test 22", "[^ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}]", 0, "8", 0, 0),				\
178   TEST("class test 23", "[^ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}]", 0, "\\u2200", 0, 0),			\
179   TEST("class test 24", "[^ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}]", 0, "\\u0370", 0, 0),			\
180   TEST("class test 25", "[^ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}]", 0, "\\u0400", 0, 1),			\
181   TEST("class test 26", "[^ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}]", 0, "M", 0, 1),				\
182 															\
183   TEST("class test 27", "[ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}" MINUS "[aeiou8" RANGE "9]]", 0, "A", 0, 1),	\
184   TEST("class test 28", "[ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}" MINUS "[aeiou8" RANGE "9]]", 0, "e", 0, 0),	\
185   TEST("class test 29", "[ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}" MINUS "[aeiou8" RANGE "9]]", 0, "1", 0, 1),	\
186   TEST("class test 30", "[ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}" MINUS "[aeiou8" RANGE "9]]", 0, "8", 0, 0),	\
187 															\
188   /* simple concatenation */												\
189   TEST("concat test 187", "abcd", 0, "abcd", 0, 1),									\
190   TEST("concat test 188", "abcd", 0, "abcde", 0, 0),									\
191   TEST("concat test 189", "abcd", 0, "abc", 0, 0),									\
192 															\
193   /* parenthesized subexpressions */											\
194   TEST("paren test 0", "(\\n)", 0, "\n", 0, 1),										\
195   TEST("paren test 1", "(\\t)", 0, "\t", 0, 1),										\
196   TEST("paren test 2", "(\\.)", 0, ".", 0, 1),										\
197   TEST("paren test 3", "(\\-)", 0, "-", 0, 1),										\
198   TEST("paren test 4", "(\\?)", 0, "?", 0, 1),										\
199   TEST("paren test 5", "(\\+)", 0, "+", 0, 1),										\
200   TEST("paren test 6", "(\\})", 0, "}", 0, 1),										\
201   TEST("paren test 7", "(\\))", 0, ")", 0, 1),										\
202   TEST("paren test 8", "(\\a)", rx_xml_recomp_BOGUS_CHAR, "a", 0, 0),							\
203   TEST("paren test 9", "(.)", 0, "b", 0, 1),										\
204   TEST("paren test 10", "(.)", 0, "\r", 0, 0),										\
205   TEST("paren test 11", "(.)", 0, "\\u2200", 0, 1),									\
206   TEST("paren test 12", "(\\s)", 0, "\t", 0, 1),									\
207   TEST("paren test 13", "(\\s)", 0, "\r", 0, 1),									\
208   TEST("paren test 14", "(\\S)", 0, " ", 0, 0),										\
209   TEST("paren test 15", "(\\S)", 0, "\n", 0, 0),									\
210   TEST("paren test 16", "(\\S)", 0, "x", 0, 1),										\
211   TEST("paren test 17", "(\\i)", 0, "A", 0, 1),										\
212   TEST("paren test 18", "(\\i)", 0, ":", 0, 1),										\
213   TEST("paren test 19", "(\\i)", 0, "2", 0, 0),										\
214   TEST("paren test 20", "(\\i)", 0, "\\u0300", 0, 0),									\
215   TEST("paren test 21", "(\\i)", 0, "\n", 0, 0),									\
216   TEST("paren test 22", "(\\I)", 0, "A", 0, 0),										\
217   TEST("paren test 23", "(\\I)", 0, ":", 0, 0),										\
218   TEST("paren test 24", "(\\I)", 0, "2", 0, 1),										\
219   TEST("paren test 25", "(\\I)", 0, "\\u0300", 0, 1),									\
220   TEST("paren test 26", "(\\I)", 0, "\n", 0, 1),									\
221   TEST("paren test 27", "(\\c)", 0, "A", 0, 1),										\
222   TEST("paren test 28", "(\\c)", 0, ":", 0, 1),										\
223   TEST("paren test 29", "(\\c)", 0, "2", 0, 1),										\
224   TEST("paren test 30", "(\\c)", 0, "\\u0300", 0, 1),									\
225   TEST("paren test 31", "(\\c)", 0, "\n", 0, 0),									\
226   TEST("paren test 32", "(\\C)", 0, "A", 0, 0),										\
227   TEST("paren test 33", "(\\C)", 0, ":", 0, 0),										\
228   TEST("paren test 34", "(\\C)", 0, "2", 0, 0),										\
229   TEST("paren test 35", "(\\C)", 0, "\\u0300", 0, 0),									\
230   TEST("paren test 36", "(\\C)", 0, "\n", 0, 1),									\
231   TEST("paren test 37", "(\\d)", 0, "9", 0, 1),										\
232   TEST("paren test 38", "(\\d)", 0, "\\u0966", 0, 1),									\
233   TEST("paren test 39", "(\\D)", 0, "0", 0, 0),										\
234   TEST("paren test 40", "(\\D)", 0, "\\u0660", 0, 0),									\
235   TEST("paren test 41", "(\\D)", 0, "x", 0, 1),										\
236   TEST("paren test 42", "(\\w)", 0, "\\u2200", 0, 1),									\
237   TEST("paren test 43", "(\\w)", 0, " ", 0, 0),										\
238   TEST("paren test 44", "(\\W)", 0, "a", 0, 0),										\
239   TEST("paren test 45", "(\\W)", 0, "\\u4e00", 0, 0),									\
240   TEST("paren test 46", "(\\W)", 0, "\t", 0, 1),									\
241   TEST("paren test 47", "([a" RANGE "z])", 0, "m", 0, 1),								\
242   TEST("paren test 48", "([012])", 0, "1", 0, 1),									\
243   TEST("paren test 49", "([\\p{Sm}])", 0, "\\u2200", 0, 1),								\
244   TEST("paren test 50", "([\\p{isGreek}])", 0, "\\u03ff", 0, 1),							\
245   TEST("paren test 51", "([\\p{isGreek}])", 0, "\\u0400", 0, 0),							\
246   TEST("paren test 52", "([ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}])", 0, "m", 0, 1),				\
247   TEST("paren test 53", "([ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}])", 0, "8", 0, 1),				\
248   TEST("paren test 54", "([ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}])", 0, "\\u0370", 0, 1),			\
249   TEST("paren test 55", "([ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}])", 0, "M", 0, 0),				\
250   TEST("paren test 56", "([^ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}])", 0, "z", 0, 0),				\
251   TEST("paren test 57", "([^ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}])", 0, "1", 0, 0),				\
252   TEST("paren test 58", "([^ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}])", 0, "\\u2200", 0, 0),			\
253   TEST("paren test 59", "([^ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}])", 0, "\\u0400", 0, 1),			\
254   TEST("paren test 60", "([ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}" MINUS "[aeiou8" RANGE "9]])", 0, "A", 0, 1),\
255   TEST("paren test 61", "([ABCa" RANGE "z0127" RANGE "9\\p{Sm}\\p{isGreek}" MINUS "[aeiou8" RANGE "9]])", 0, "1", 0, 1),\
256 															\
257   TEST("paren test 62", "(abcd)", 0, "abcd", 0, 1),									\
258   TEST("paren test 63", "(abcd)", 0, "abcde", 0, 0),									\
259   TEST("paren test 64", "(abcd)", 0, "abc", 0, 0),									\
260 															\
261 															\
262 															\
263   /* 			PIECE TESTS 											\
264    */															\
265 															\
266   TEST("piece test 0", "x?", 0, "", 0, 1),										\
267   TEST("piece test 1", "x?", 0, "x", 0, 1),										\
268   TEST("piece test 2", "x?", 0, "y", 0, 0),										\
269   TEST("piece test 3", "abcx?", 0, "abc", 0, 1),									\
270   TEST("piece test 4", "abcx?", 0, "abcx", 0, 1),									\
271   TEST("piece test 5", "abcx?", 0, "abcy", 0, 0),									\
272 															\
273   TEST("piece test 6", "x*", 0, "", 0, 1),										\
274   TEST("piece test 7", "x*", 0, "x", 0, 1),										\
275   TEST("piece test 8", "x*", 0, "xx", 0, 1),										\
276   TEST("piece test 9", "x*", 0, "xxx", 0, 1),										\
277   TEST("piece test 10", "x*", 0, "y", 0, 0),										\
278   TEST("piece test 11", "x*", 0, "xxy", 0, 0),										\
279 															\
280   TEST("piece test 12", "abcx*", 0, "abc", 0, 1),									\
281   TEST("piece test 13", "abcx*", 0, "abcx", 0, 1),									\
282   TEST("piece test 14", "abcx*", 0, "abcxx", 0, 1),									\
283   TEST("piece test 15", "abcx*", 0, "abcxxx", 0, 1),									\
284   TEST("piece test 16", "abcx*", 0, "abcy", 0, 0),									\
285   TEST("piece test 17", "abcx*", 0, "abcxxy", 0, 0),									\
286 															\
287 															\
288   TEST("piece test 18", "x+", 0, "", 0, 0),										\
289   TEST("piece test 19", "x+", 0, "x", 0, 1),										\
290   TEST("piece test 20", "x+", 0, "xx", 0, 1),										\
291   TEST("piece test 21", "x+", 0, "xxx", 0, 1),										\
292   TEST("piece test 22", "x+", 0, "y", 0, 0),										\
293   TEST("piece test 23", "x+", 0, "xxy", 0, 0),										\
294 															\
295   TEST("piece test 24", "abcx+", 0, "abc", 0, 0),									\
296   TEST("piece test 25", "abcx+", 0, "abcx", 0, 1),									\
297   TEST("piece test 26", "abcx+", 0, "abcxx", 0, 1),									\
298   TEST("piece test 27", "abcx+", 0, "abcxxx", 0, 1),									\
299   TEST("piece test 28", "abcx+", 0, "abcy", 0, 0),									\
300   TEST("piece test 29", "abcx+", 0, "abcxxy", 0, 0),									\
301 															\
302   TEST("piece test 30", "x{0,0}", 0, "", 0, 1),										\
303   TEST("piece test 31", "x{0,0}", 0, "x", 0, 0),									\
304   TEST("piece test 32", "x{0,1}", 0, "", 0, 1),										\
305   TEST("piece test 33", "x{0,1}", 0, "x", 0, 1),									\
306   TEST("piece test 34", "x{0,1}", 0, "xx", 0, 0),									\
307   TEST("piece test 35", "x{0,3}", 0, "", 0, 1),										\
308   TEST("piece test 36", "x{0,3}", 0, "x", 0, 1),									\
309   TEST("piece test 37", "x{0,3}", 0, "xx", 0, 1),									\
310   TEST("piece test 38", "x{0,3}", 0, "xxx", 0, 1),									\
311   TEST("piece test 39", "x{0,3}", 0, "xxxx", 0, 0),									\
312 															\
313   TEST("piece test 40", "x{1,0}", rx_xml_recomp_BAD_DUPLICATION_RANGE, "", 0, 1),						\
314   TEST("piece test 41", "x{1,0}", rx_xml_recomp_BAD_DUPLICATION_RANGE, "x", 0, 0),						\
315   TEST("piece test 42", "x{1,1}", 0, "", 0, 0),										\
316   TEST("piece test 43", "x{1,1}", 0, "x", 0, 1),									\
317   TEST("piece test 44", "x{1,1}", 0, "xx", 0, 0),									\
318   TEST("piece test 45", "x{1,3}", 0, "", 0, 0),										\
319   TEST("piece test 46", "x{1,3}", 0, "x", 0, 1),									\
320   TEST("piece test 47", "x{1,3}", 0, "xx", 0, 1),									\
321   TEST("piece test 48", "x{1,3}", 0, "xxx", 0, 1),									\
322   TEST("piece test 49", "x{1,3}", 0, "xxxx", 0, 0),									\
323 															\
324 															\
325   TEST("piece test 50", "abcx{0,0}lmn", 0, "abclmn", 0, 1),								\
326   TEST("piece test 51", "abcx{0,0}lmn", 0, "abcxlmn", 0, 0),								\
327   TEST("piece test 52", "abcx{0,1}lmn", 0, "abclmn", 0, 1),								\
328   TEST("piece test 53", "abcx{0,1}lmn", 0, "abcxlmn", 0, 1),								\
329   TEST("piece test 54", "abcx{0,1}lmn", 0, "abcxxlmn", 0, 0),								\
330   TEST("piece test 55", "abcx{0,3}lmn", 0, "abclmn", 0, 1),								\
331   TEST("piece test 56", "abcx{0,3}lmn", 0, "abcxlmn", 0, 1),								\
332   TEST("piece test 57", "abcx{0,3}lmn", 0, "abcxxlmn", 0, 1),								\
333   TEST("piece test 58", "abcx{0,3}lmn", 0, "abcxxxlmn", 0, 1),								\
334   TEST("piece test 59", "abcx{0,3}lmn", 0, "abcxxxxlmn", 0, 0),								\
335 															\
336   TEST("piece test 60", "abcx{1,0}lmn", rx_xml_recomp_BAD_DUPLICATION_RANGE, "abclmn", 0, 1),				\
337   TEST("piece test 61", "abcx{1,0}lmn", rx_xml_recomp_BAD_DUPLICATION_RANGE, "abcxlmn", 0, 0),				\
338   TEST("piece test 62", "abcx{1,1}lmn", 0, "abclmn", 0, 0),								\
339   TEST("piece test 63", "abcx{1,1}lmn", 0, "abcxlmn", 0, 1),								\
340   TEST("piece test 64", "abcx{1,1}lmn", 0, "abcxxlmn", 0, 0),								\
341   TEST("piece test 65", "abcx{1,3}lmn", 0, "abclmn", 0, 0),								\
342   TEST("piece test 66", "abcx{1,3}lmn", 0, "abcxlmn", 0, 1),								\
343   TEST("piece test 67", "abcx{1,3}lmn", 0, "abcxxlmn", 0, 1),								\
344   TEST("piece test 68", "abcx{1,3}lmn", 0, "abcxxxlmn", 0, 1),								\
345   TEST("piece test 69", "abcx{1,3}lmn", 0, "abcxxxxlmn", 0, 0),								\
346 															\
347   TEST("piece test 70", "abcx{0,}lmn", 0, "abclmn", 0, 1),								\
348   TEST("piece test 71", "abcx{0,}lmn", 0, "abcxlmn", 0, 1),								\
349   TEST("piece test 72", "abcx{0,}lmn", 0, "abclmn", 0, 1),								\
350   TEST("piece test 73", "abcx{0,}lmn", 0, "abcxlmn", 0, 1),								\
351   TEST("piece test 74", "abcx{0,}lmn", 0, "abcxxlmn", 0, 1),								\
352   TEST("piece test 75", "abcx{0,}lmn", 0, "abclmn", 0, 1),								\
353   TEST("piece test 76", "abcx{0,}lmn", 0, "abcxlmn", 0, 1),								\
354   TEST("piece test 77", "abcx{0,}lmn", 0, "abcxxlmn", 0, 1),								\
355   TEST("piece test 78", "abcx{0,}lmn", 0, "abcxxxlmn", 0, 1),								\
356   TEST("piece test 79", "abcx{0,}lmn", 0, "abcxxxxlmn", 0, 1),								\
357   TEST("piece test 80", "abcx{0,}lmn", 0, "abcxxxxxxxxxxxxxxlmn", 0, 1),						\
358 															\
359   TEST("piece test 81", "abcx{1,}lmn", 0, "abclmn", 0, 0),								\
360   TEST("piece test 82", "abcx{1,}lmn", 0, "abcxlmn", 0, 1),								\
361   TEST("piece test 83", "abcx{1,}lmn", 0, "abclmn", 0, 0),								\
362   TEST("piece test 84", "abcx{1,}lmn", 0, "abcxlmn", 0, 1),								\
363   TEST("piece test 85", "abcx{1,}lmn", 0, "abcxxlmn", 0, 1),								\
364   TEST("piece test 86", "abcx{1,}lmn", 0, "abclmn", 0, 0),								\
365   TEST("piece test 87", "abcx{1,}lmn", 0, "abcxlmn", 0, 1),								\
366   TEST("piece test 88", "abcx{1,}lmn", 0, "abcxxlmn", 0, 1),								\
367   TEST("piece test 89", "abcx{1,}lmn", 0, "abcxxxlmn", 0, 1),								\
368   TEST("piece test 90", "abcx{1,}lmn", 0, "abcxxxxlmn", 0, 1),								\
369   TEST("piece test 91", "abcx{1,}lmn", 0, "abcxxxxxxxxxxxxxxlmn", 0, 1),						\
370 															\
371   TEST("piece test 92", "\\p{Ll}{4}-\\p{Nd}{5}", 0, "lmnop-09876", 0, 0),						\
372   TEST("piece test 93", "\\p{Ll}{4}-\\p{Nd}{5}", 0, "\\u03ac\\u03ad\\u03ae\\u03af-12345", 0, 1),			\
373   TEST("piece test 94", "\\p{Ll}{4}-\\p{Nd}{5}", 0, "\\u0255\\u0256\\u0257\\u0258-67890", 0, 1),			\
374   TEST("piece test 95", "\\p{Ll}{4}-\\p{Nd}{5}", 0, "\\u0561\\u0562\\u0563\\u0564-24680", 0, 1),			\
375   TEST("piece test 96", "\\p{Ll}{4}-\\p{Nd}{5}", 0, "abcd-13579", 0, 1),						\
376   TEST("piece test 97", "\\p{Ll}{4}-\\p{Nd}{5}", 0, "\\u00e0\\u00e1\\u00e2\\u00e3-\\u0966\\u0967\\u0968\\u0969\\u096a", 0, 1), \
377 															\
378   /*			BRANCH TESTS											\
379    */															\
380 															\
381   TEST("alternative test 0", "(wee|week)(night|knights)", 0, "weeknights", 0, 1),					\
382   TEST("alternative test 1", "(week|wee)(night|knights)", 0, "weeknights", 0, 1),					\
383   TEST("alternative test 2", "(wee|week)(knights|night)", 0, "weeknights", 0, 1),					\
384   TEST("alternative test 3", "(week|wee)(knights|night)", 0, "weeknights", 0, 1),					\
385 															\
386 															\
387 															\
388   TEST("tutorial example 0", "Chapter \\d", 0, "Chapter 0", 0, 1),							\
389   TEST("tutorial example 1", "Chapter \\d", 0, "Chapter 1", 0, 1),							\
390   TEST("tutorial example 2", "Chapter \\d", 0, "Chapter 9", 0, 1),							\
391   TEST("tutorial example 3", "Chapter \\d", 0, "Chapter x", 0, 0),							\
392   TEST("tutorial example 4", "Chapter \\d", 0, "Chapter 19", 0, 0),							\
393   TEST("tutorial example 5", "Chapter \\d", 0, "Chapter ", 0, 0),							\
394 															\
395 															\
396   TEST("tutorial example 6", "Chapter\\s\\d", 0, "Chapter 0", 0, 1),							\
397   TEST("tutorial example 7", "Chapter\\s\\d", 0, "Chapter.0", 0, 0),							\
398   TEST("tutorial example 8", "Chapter\\s\\d", 0, "Chapter	1", 0, 1),						\
399   TEST("tutorial example 9", "Chapter\\s\\d", 0, "Chapter\n9", 0, 1),							\
400   TEST("tutorial example 10", "Chapter\\s\\d", 0, "Chapter\rx", 0, 0),							\
401   TEST("tutorial example 11", "Chapter\\s\\d", 0, "Chapter 19", 0, 0),							\
402   TEST("tutorial example 12", "Chapter\\s\\d", 0, "Chapter ", 0, 0),							\
403 															\
404   /* complex expressions */												\
405 															\
406   TEST("complex 0", "((\\p{Ll}{4}-\\p{Nd}*)|([\\p{isGreek}]+))?", 0, "", 0, 1),						\
407   TEST("complex 1", "((\\p{Ll}{4}-\\p{Nd}*)|([\\p{isGreek}]+))?", 0, "abcd-1234", 0, 1),				\
408   TEST("complex 2", "((\\p{Ll}{4}-\\p{Nd}*)|([\\p{isGreek}]+))?", 0, "abcdx-1234", 0, 0),				\
409   TEST("complex 3", "((\\p{Ll}{4}-\\p{Nd}*)|([\\p{isGreek}]+))?", 0, "\\u03ac\\u03ad\\u03ae\\u03af", 0, 1),		\
410   TEST("complex 4", "((\\p{Ll}{4}-\\p{Nd}*)|([\\p{isGreek}]+))?", 0, "\\u03ac\\u03ad\\u03ae\\u03af-", 0, 1),		\
411   TEST("complex 5", "((\\p{Ll}{4}-\\p{Nd}*)|([\\p{isGreek}]+))?", 0, "\\u03ac\\u03ad\\u03ae\\u03af-234", 0, 1),		\
412   TEST("complex 6", "((\\p{Ll}{4}-\\p{Nd}*)|([\\p{isGreek}]+))?", 0, "\\u03acx\\u03ae\\u03af-234", 0, 1),		\
413 															\
414   /* invalid expressions */												\
415   TEST("error 0", "a{1x}", rx_xml_recomp_MISSING_COMMA, 0, 0, 0),							\
416   TEST("error 1", "a{1,", rx_xml_recomp_MISSING_BRACE, 0, 0, 0),							\
417   TEST("error 2", "a{3,2}", rx_xml_recomp_BAD_DUPLICATION_RANGE, 0, 0, 0),						\
418   TEST("error 3", "(a", rx_xml_recomp_MISSING_RPAREN, 0, 0, 0),								\
419   TEST("error 4", "[abc", rx_xml_recomp_BOGUS_CHARACTER_CLASS, 0, 0, 0),						\
420   TEST("error 5", "\\px", rx_xml_recomp_BOGUS_CATEGORY_ESCAPE, 0, 0, 0),						\
421   TEST("error 6", "\\P", rx_xml_recomp_BOGUS_CATEGORY_ESCAPE, 0, 0, 0),							\
422   TEST("error 7", "[z" RANGE "a]", rx_xml_recomp_BOGUS_CHARACTER_CLASS, 0, 0, 0),					\
423   TEST("error 8", "[z" RANGE "]", rx_xml_recomp_BOGUS_CHARACTER_CLASS, 0, 0, 0),					\
424   TEST(0, 0, 0, 0, 0, 0)
425 
426 
427 
428 struct xml_re_test_case xml_re_test_cases[] =
429 {
430 #define RANGE	"-"
431 #define MINUS   "-"
432 
433    TEST_LIST
434 };
435 
436 struct xml_re_test_case xml_re_test_cases_alternative_syntax[] =
437 {
438 #undef RANGE
439 #undef MINUS
440 #define RANGE	".."
441 #define MINUS   "^"
442 
443    TEST_LIST
444 };
445 
446