1 /******************************************************************************
2 * Copyright (c) 2000-2014 Ericsson Telecom AB
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 ******************************************************************************/
11 import from ReadXml all;
13 import from rec { type R , Neg; function test_match; };
14 // We import the component Neg and testcases to have a single control part.
15 // This is all bogus because everything is imported.
19 external function encRS(in RS pars) return octetstring
20 with { extension "prototype(convert) encode(XER:XER_EXTENDED)" }
22 /*---------------------------- OMIT ----------------------------*/
25 { 1, "first" , true , 7.0 },
26 { 2, "second", false, -3.7 }
29 erroneous ([1]) "value := omit";
32 template Nodes t_omit := { // the equivalent of an 1-element record-of
33 // node type , depth, name , value
34 { XML_READER_TYPE_ELEMENT , 0, "RS" , "", "" },
36 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
37 { XML_READER_TYPE_ELEMENT , 2, "i" , "", "" },
38 { XML_READER_TYPE_TEXT , 3, "#text", "1", "" },
39 { XML_READER_TYPE_END_ELEMENT, 2, "i" , "", "" },
40 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
41 { XML_READER_TYPE_TEXT , 3, "#text", "first", "" },
42 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
43 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
44 { XML_READER_TYPE_TEXT , 3, "#text", "true", "" },
45 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },
46 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
47 { XML_READER_TYPE_TEXT , 3, "#text", "7.000000", "" },
48 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
49 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },
51 { XML_READER_TYPE_END_ELEMENT, 0, "RS" , "", "" } // [15]
54 testcase rof_omit() runs on Neg
60 nodes := gather(o, ignore_ws);
61 check_match(nodes, t_omit);
64 /*---------------------------- PLAIN ----------------------------*/
66 // int, charstring, boolean, float
68 { 1, "first" , true , 7.0 },
69 { 2, "second", false, -3.7 }
72 template Nodes t_plain modifies t_omit := {
73 // node type , depth, name , value
74 [15] := { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
75 [16] := { XML_READER_TYPE_ELEMENT , 2, "i" , "", "" },
76 [17] := { XML_READER_TYPE_TEXT , 3, "#text", "2", "" },
77 [18] := { XML_READER_TYPE_END_ELEMENT, 2, "i" , "", "" },
78 [19] := { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
79 [20] := { XML_READER_TYPE_TEXT , 3, "#text", "second", "" },
80 [21] := { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
81 [22] := { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
82 [23] := { XML_READER_TYPE_TEXT , 3, "#text", "false", "" },
83 [24] := { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },
84 [25] := { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
85 [26] := { XML_READER_TYPE_TEXT , 3, "#text", "-3.700000", "" },
86 [27] := { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
87 [28] := { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },
89 [29] := { XML_READER_TYPE_END_ELEMENT, 0, "RS" , "", "" }
92 testcase rof_plain() runs on Neg
98 nodes := gather(o, ignore_ws);
99 check_match(nodes, t_plain);
102 /*--------------------------- BEFORE -----------------------------*/
104 type integer myinteger;
106 // int, charstring, boolean, float
107 const RS c_before_elem := {
108 { 1, "first" , true , 7.0 },
109 { 2, "second", false, -3.7 }
112 erroneous ([0]) "before := 42"
115 // int, charstring, boolean, float
116 const RS c_before_elem_named := {
117 { 1, "first" , true , 7.0 },
118 { 2, "second", false, -3.7 }
121 erroneous ([0]) "before := myinteger : 42"
124 const RS c_before_member := {
125 { 1, "first" , true , 7.0 },
126 { 2, "second", false, -3.7 }
129 erroneous ([0].i) "before := 42"
132 const RS c_before_member_named := {
133 { 1, "first" , true , 7.0 },
134 { 2, "second", false, -3.7 }
137 erroneous ([0].i) "before := myinteger : 42"
140 template Nodes t_before_elem := {
141 // node type , depth, name , value
142 { XML_READER_TYPE_ELEMENT , 0, "RS" , "", "" },
144 // Perturbation: an extra element
145 { XML_READER_TYPE_ELEMENT, 1, "INTEGER", "", "" },
146 { XML_READER_TYPE_TEXT, 2, "#text", "42", "" },
147 { XML_READER_TYPE_END_ELEMENT, 1, "INTEGER", "", "" },
149 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
150 { XML_READER_TYPE_ELEMENT , 2, "i" , "", "" },
151 { XML_READER_TYPE_TEXT , 3, "#text", "1", "" },
152 { XML_READER_TYPE_END_ELEMENT, 2, "i" , "", "" },
153 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
154 { XML_READER_TYPE_TEXT , 3, "#text", "first", "" },
155 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
156 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
157 { XML_READER_TYPE_TEXT , 3, "#text", "true", "" },
158 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },
159 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
160 { XML_READER_TYPE_TEXT , 3, "#text", "7.000000", "" },
161 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
162 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },
163 // node type , depth, name , value
164 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
165 { XML_READER_TYPE_ELEMENT , 2, "i" , "", "" },
166 { XML_READER_TYPE_TEXT , 3, "#text", "2", "" },
167 { XML_READER_TYPE_END_ELEMENT, 2, "i" , "", "" },
168 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
169 { XML_READER_TYPE_TEXT , 3, "#text", "second", "" },
170 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
171 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
172 { XML_READER_TYPE_TEXT , 3, "#text", "false", "" },
173 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },
174 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
175 { XML_READER_TYPE_TEXT , 3, "#text", "-3.700000", "" },
176 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
177 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },
179 { XML_READER_TYPE_END_ELEMENT, 0, "RS" , "", "" }
182 template Nodes t_before_member modifies t_before_elem :=
184 // just move the <INTEGER> inside the <R> (need to adjust depths)
185 [1] := { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" }, //t_before_elem[4],
186 [2] := { XML_READER_TYPE_ELEMENT, 2, "INTEGER", "", "" }, //t_before_elem[1],
187 [3] := { XML_READER_TYPE_TEXT, 3, "#text", "42", "" }, //t_before_elem[2],
188 [4] := { XML_READER_TYPE_END_ELEMENT, 2, "INTEGER", "", "" } //,t_before_elem[3]
191 template Nodes t_before_elem_named modifies t_before_elem := {
193 [1] := { XML_READER_TYPE_ELEMENT, 1, "myinteger", "", "" },
194 //[2] := { XML_READER_TYPE_TEXT, 2, "#text", "42", "" }, // unmodified
195 [3] := { XML_READER_TYPE_END_ELEMENT, 1, "myinteger", "", "" }
198 template Nodes t_before_member_named modifies t_before_member := {
199 [2] := { XML_READER_TYPE_ELEMENT, 2, "myinteger", "", "" },
200 [4] := { XML_READER_TYPE_END_ELEMENT, 2, "myinteger", "", "" }
203 testcase rof_before() runs on Neg
208 o := encRS(c_before_elem);
209 nodes := gather(o, ignore_ws);
210 check_match(nodes, t_before_elem);
212 o := encRS(c_before_member);
213 nodes := gather(o, ignore_ws);
214 check_match(nodes, t_before_member);
216 o := encRS(c_before_elem_named);
217 nodes := gather(o, ignore_ws);
218 check_match(nodes, t_before_elem_named);
220 o := encRS(c_before_member_named);
221 nodes := gather(o, ignore_ws);
222 check_match(nodes, t_before_member_named);
226 // int, charstring, boolean, float
227 const RS c_before_elem_raw := {
228 { 1, "first" , true , 7.0 },
229 { 2, "second", false, -3.7 }
232 erroneous ([0]) "before(raw) := ""rawr before first elem"" "
235 const RS c_before_member_raw := {
236 { 1, "first" , true , 7.0 },
237 { 2, "second", false, -3.7 }
240 erroneous ([0].i) "before(raw) := ""rawr before member of first"" "
243 template Nodes t_before_elem_raw := {
244 // node type , depth, name , value
245 { XML_READER_TYPE_ELEMENT , 0, "RS" , "", "" },
247 // Perturbation: an extra text node
248 { XML_READER_TYPE_TEXT, 1, "#text", pattern "\s#(1,)rawr before first elem\s#(1,)", "" },
250 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
251 { XML_READER_TYPE_ELEMENT , 2, "i" , "", "" },
252 { XML_READER_TYPE_TEXT , 3, "#text", "1", "" },
253 { XML_READER_TYPE_END_ELEMENT, 2, "i" , "", "" },
254 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
255 { XML_READER_TYPE_TEXT , 3, "#text", "first", "" },
256 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
257 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
258 { XML_READER_TYPE_TEXT , 3, "#text", "true", "" },
259 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },
260 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
261 { XML_READER_TYPE_TEXT , 3, "#text", "7.000000", "" },
262 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
263 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },
264 // node type , depth, name , value
265 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
266 { XML_READER_TYPE_ELEMENT , 2, "i" , "", "" },
267 { XML_READER_TYPE_TEXT , 3, "#text", "2", "" },
268 { XML_READER_TYPE_END_ELEMENT, 2, "i" , "", "" },
269 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
270 { XML_READER_TYPE_TEXT , 3, "#text", "second", "" },
271 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
272 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
273 { XML_READER_TYPE_TEXT , 3, "#text", "false", "" },
274 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },
275 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
276 { XML_READER_TYPE_TEXT , 3, "#text", "-3.700000", "" },
277 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
278 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },
280 { XML_READER_TYPE_END_ELEMENT, 0, "RS" , "", "" }
283 // <RS> text <R> <i> becomes <RS> <R> text <i>
284 template Nodes t_before_member_raw modifies t_before_elem_raw :=
286 // just move the #text inside the <R> (need to adjust depths)
287 [1] := { XML_READER_TYPE_ELEMENT, 1, "R" , "", "" }, //t_before_elem_raw[2],
288 [2] := { XML_READER_TYPE_TEXT, 2, "#text", pattern "\s#(1,)rawr before member of first\s#(1,)", "" } //t_before_elem_raw[1],
291 testcase rof_before_raw() runs on Neg
296 o := encRS(c_before_elem_raw);
297 nodes := gather(o, ignore_ws);
298 check_match(nodes, t_before_elem_raw);
300 o := encRS(c_before_member_raw);
301 nodes := gather(o, ignore_ws);
302 check_match(nodes, t_before_member_raw);
307 /*---------------------------- REPLACE ----------------------------*/
309 const RS c_replace_elem := {
310 { 1, "first" , true , 7.0 },
311 { 2, "second", false, -3.7 }
314 erroneous ([0]) "value := 42"
317 const RS c_replace_member := {
318 { 1, "first" , true , 7.0 },
319 { 2, "second", false, -3.7 }
322 erroneous ([0].i) "value := 42"
325 template Nodes t_replace_elem := {
326 // node type , depth, name , value
327 { XML_READER_TYPE_ELEMENT , 0, "RS" , "", "" },
329 // first record element replaced with single <INTEGER>
330 { XML_READER_TYPE_ELEMENT, 1, "INTEGER", "", "" },
331 { XML_READER_TYPE_TEXT, 2, "#text", "42", "" },
332 { XML_READER_TYPE_END_ELEMENT, 1, "INTEGER", "", "" },
334 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
335 { XML_READER_TYPE_ELEMENT , 2, "i" , "", "" },
336 { XML_READER_TYPE_TEXT , 3, "#text", "2", "" },
337 { XML_READER_TYPE_END_ELEMENT, 2, "i" , "", "" },
338 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
339 { XML_READER_TYPE_TEXT , 3, "#text", "second", "" },
340 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
341 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
342 { XML_READER_TYPE_TEXT , 3, "#text", "false", "" },
343 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },
344 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
345 { XML_READER_TYPE_TEXT , 3, "#text", "-3.700000", "" },
346 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
347 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },
349 { XML_READER_TYPE_END_ELEMENT, 0, "RS" , "", "" } // [15]
352 template Nodes t_replace_member := {
353 // node type , depth, name , value
354 { XML_READER_TYPE_ELEMENT , 0, "RS" , "", "" },
356 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
358 { XML_READER_TYPE_ELEMENT, 2, "INTEGER", "", "" },
359 { XML_READER_TYPE_TEXT, 3, "#text", "42", "" },
360 { XML_READER_TYPE_END_ELEMENT, 2, "INTEGER", "", "" },
362 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
363 { XML_READER_TYPE_TEXT , 3, "#text", "first", "" },
364 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
365 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
366 { XML_READER_TYPE_TEXT , 3, "#text", "true", "" },
367 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },
368 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
369 { XML_READER_TYPE_TEXT , 3, "#text", "7.000000", "" },
370 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
371 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },
373 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
374 { XML_READER_TYPE_ELEMENT , 2, "i" , "", "" },
375 { XML_READER_TYPE_TEXT , 3, "#text", "2", "" },
376 { XML_READER_TYPE_END_ELEMENT, 2, "i" , "", "" },
377 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
378 { XML_READER_TYPE_TEXT , 3, "#text", "second", "" },
379 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
380 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
381 { XML_READER_TYPE_TEXT , 3, "#text", "false", "" },
382 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },
383 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
384 { XML_READER_TYPE_TEXT , 3, "#text", "-3.700000", "" },
385 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
386 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },
388 { XML_READER_TYPE_END_ELEMENT, 0, "RS" , "", "" } // [15]
393 const RS c_replace_elem_named := {
394 { 1, "first" , true , 7.0 },
395 { 2, "second", false, -3.7 }
398 erroneous ([0]) "value := real : 42.42"
401 const RS c_replace_member_named := {
402 { 1, "first" , true , 7.0 },
403 { 2, "second", false, -3.7 }
406 erroneous ([0].i) "value := real : 42.42"
409 template Nodes t_replace_elem_named modifies t_replace_elem := {
410 [1] := { XML_READER_TYPE_ELEMENT, 1, "real", "", "" },
411 [2] := { XML_READER_TYPE_TEXT, 2, "#text", "42.420000", "" },
412 [3] := { XML_READER_TYPE_END_ELEMENT, 1, "real", "", "" }
415 template Nodes t_replace_member_named modifies t_replace_member := {
416 [2] := { XML_READER_TYPE_ELEMENT, 2, "real", "", "" },
417 [3] := { XML_READER_TYPE_TEXT, 3, "#text", "42.420000", "" },
418 [4] := { XML_READER_TYPE_END_ELEMENT, 2, "real", "", "" }
422 const RS c_replace_elem_raw := {
423 { 1, "first" , true , 7.0 },
424 { 2, "second", false, -3.7 }
427 erroneous ([0]) "value(raw) := char2oct(""Nothing to see here"")"
430 const RS c_replace_member_raw := {
431 { 1, "first" , true , 7.0 },
432 { 2, "second", false, -3.7 }
435 erroneous ([0].i) "value(raw) := 'e5909be98194e381aee59fbae59cb0e381afe38081e585a8e381a643415453e3818ce38184e3819fe381a0e38184e3819f'O "
438 template Nodes t_replace_elem_raw := {
439 // node type , depth, name , value
440 { XML_READER_TYPE_ELEMENT , 0, "RS" , "", "" },
442 // first record element replaced with single text node
443 { XML_READER_TYPE_TEXT, 1, "#text", "\nNothing to see here\t", "" },
445 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
446 { XML_READER_TYPE_ELEMENT , 2, "i" , "", "" },
447 { XML_READER_TYPE_TEXT , 3, "#text", "2", "" },
448 { XML_READER_TYPE_END_ELEMENT, 2, "i" , "", "" },
449 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
450 { XML_READER_TYPE_TEXT , 3, "#text", "second", "" },
451 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
452 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
453 { XML_READER_TYPE_TEXT , 3, "#text", "false", "" },
454 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },
455 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
456 { XML_READER_TYPE_TEXT , 3, "#text", "-3.700000", "" },
457 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
458 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },
460 { XML_READER_TYPE_END_ELEMENT, 0, "RS" , "", "" } // [15]
463 template Nodes t_replace_member_raw := {
464 // node type , depth, name , value
465 { XML_READER_TYPE_ELEMENT , 0, "RS" , "", "" },
467 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
469 { XML_READER_TYPE_TEXT, 2, "#text", "\n" & "\xe5\x90\x9b\xe9\x81\x94\xe3\x81\xae\xe5\x9f\xba\xe5\x9c\xb0\xe3\x81\xaf\xe3\x80\x81\xe5\x85\xa8\xe3\x81\xa6\x43\x41\x54\x53\xe3\x81\x8c\xe3\x81\x84\xe3\x81\x9f\xe3\x81\xa0\xe3\x81\x84\xe3\x81\x9f" & "\t\t", "" },
471 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
472 { XML_READER_TYPE_TEXT , 3, "#text", "first", "" },
473 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
474 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
475 { XML_READER_TYPE_TEXT , 3, "#text", "true", "" },
476 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },
477 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
478 { XML_READER_TYPE_TEXT , 3, "#text", "7.000000", "" },
479 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
480 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },
482 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
483 { XML_READER_TYPE_ELEMENT , 2, "i" , "", "" },
484 { XML_READER_TYPE_TEXT , 3, "#text", "2", "" },
485 { XML_READER_TYPE_END_ELEMENT, 2, "i" , "", "" },
486 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
487 { XML_READER_TYPE_TEXT , 3, "#text", "second", "" },
488 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
489 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
490 { XML_READER_TYPE_TEXT , 3, "#text", "false", "" },
491 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },
492 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
493 { XML_READER_TYPE_TEXT , 3, "#text", "-3.700000", "" },
494 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
495 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },
497 { XML_READER_TYPE_END_ELEMENT, 0, "RS" , "", "" } // [15]
501 testcase rof_replacer() runs on Neg
506 o := encRS(c_replace_elem);
507 nodes := gather(o, ignore_ws);
508 check_match(nodes, t_replace_elem);
510 o := encRS(c_replace_member);
511 nodes := gather(o, ignore_ws);
512 check_match(nodes, t_replace_member);
514 o := encRS(c_replace_elem_named);
515 nodes := gather(o, ignore_ws);
516 check_match(nodes, t_replace_elem_named);
518 o := encRS(c_replace_member_named);
519 nodes := gather(o, ignore_ws);
520 check_match(nodes, t_replace_member_named);
523 testcase rof_replacer_raw() runs on Neg
528 o := encRS(c_replace_elem_raw);
529 nodes := gather(o, ignore_ws);
530 check_match(nodes, t_replace_elem_raw);
532 o := encRS(c_replace_member_raw);
533 nodes := gather(o, ignore_ws);
534 check_match(nodes, t_replace_member_raw);
538 /*--------------------------- AFTER -----------------------------*/
541 // int, charstring, boolean, float
542 const RS c_after_elem := {
543 { 1, "first" , true , 7.0 },
544 { 2, "second", false, -3.7 }
547 erroneous ([0]) "after := 42"
550 const RS c_after_member := {
551 { 1, "first" , true , 7.0 },
552 { 2, "second", false, -3.7 }
555 erroneous ([0].i) "after := 42"
558 template Nodes t_after_elem := {
559 // node type , depth, name , value
560 { XML_READER_TYPE_ELEMENT , 0, "RS" , "", "" },
562 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
563 { XML_READER_TYPE_ELEMENT , 2, "i" , "", "" },
564 { XML_READER_TYPE_TEXT , 3, "#text", "1", "" },
565 { XML_READER_TYPE_END_ELEMENT, 2, "i" , "", "" },
566 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
567 { XML_READER_TYPE_TEXT , 3, "#text", "first", "" },
568 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
569 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
570 { XML_READER_TYPE_TEXT , 3, "#text", "true", "" },
571 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },// 10
572 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
573 { XML_READER_TYPE_TEXT , 3, "#text", "7.000000", "" },
574 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
575 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },//14
577 // Perturbation: an extra element
578 { XML_READER_TYPE_ELEMENT, 1, "INTEGER", "", "" },
579 { XML_READER_TYPE_TEXT, 2, "#text", "42", "" },
580 { XML_READER_TYPE_END_ELEMENT, 1, "INTEGER", "", "" },
582 // node type , depth, name , value
583 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
584 { XML_READER_TYPE_ELEMENT , 2, "i" , "", "" },
585 { XML_READER_TYPE_TEXT , 3, "#text", "2", "" },
586 { XML_READER_TYPE_END_ELEMENT, 2, "i" , "", "" },
587 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
588 { XML_READER_TYPE_TEXT , 3, "#text", "second", "" },
589 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
590 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
591 { XML_READER_TYPE_TEXT , 3, "#text", "false", "" },
592 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },
593 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
594 { XML_READER_TYPE_TEXT , 3, "#text", "-3.700000", "" },
595 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
596 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },
598 { XML_READER_TYPE_END_ELEMENT, 0, "RS" , "", "" }
601 template Nodes t_after_member :=
603 // node type , depth, name , value
604 { XML_READER_TYPE_ELEMENT , 0, "RS" , "", "" },
606 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
607 { XML_READER_TYPE_ELEMENT , 2, "i" , "", "" },
608 { XML_READER_TYPE_TEXT , 3, "#text", "1", "" },
609 { XML_READER_TYPE_END_ELEMENT, 2, "i" , "", "" }, //4
611 // Perturbation: an extra element
612 { XML_READER_TYPE_ELEMENT, 2, "INTEGER", "", "" },
613 { XML_READER_TYPE_TEXT, 3, "#text", "42", "" },
614 { XML_READER_TYPE_END_ELEMENT, 2, "INTEGER", "", "" },
616 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
617 { XML_READER_TYPE_TEXT , 3, "#text", "first", "" },
618 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
619 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
620 { XML_READER_TYPE_TEXT , 3, "#text", "true", "" },
621 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },// 10
622 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
623 { XML_READER_TYPE_TEXT , 3, "#text", "7.000000", "" },
624 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
625 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },//14
627 // node type , depth, name , value
628 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
629 { XML_READER_TYPE_ELEMENT , 2, "i" , "", "" },
630 { XML_READER_TYPE_TEXT , 3, "#text", "2", "" },
631 { XML_READER_TYPE_END_ELEMENT, 2, "i" , "", "" },
632 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
633 { XML_READER_TYPE_TEXT , 3, "#text", "second", "" },
634 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
635 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
636 { XML_READER_TYPE_TEXT , 3, "#text", "false", "" },
637 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },
638 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
639 { XML_READER_TYPE_TEXT , 3, "#text", "-3.700000", "" },
640 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
641 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },
643 { XML_READER_TYPE_END_ELEMENT, 0, "RS" , "", "" }
646 type universal charstring ustr;
648 const RS c_after_elem_named := {
649 { 1, "first" , true , 7.0 },
650 { 2, "second", false, -3.7 }
653 erroneous ([0]) "after := ustr : ""fourty-two"" "
656 const RS c_after_member_named := {
657 { 1, "first" , true , 7.0 },
658 { 2, "second", false, -3.7 }
661 erroneous ([0].i) "after := ustr : ""fourty-two"" "
664 template Nodes t_after_elem_named modifies t_after_elem := {
665 // Perturbation: an extra element
666 [15] := { XML_READER_TYPE_ELEMENT, 1, "ustr", "", "" },
667 [16] := { XML_READER_TYPE_TEXT, 2, "#text", "fourty-two", "" },
668 [17] := { XML_READER_TYPE_END_ELEMENT, 1, "ustr", "", "" }
671 template Nodes t_after_member_named modifies t_after_member := {
672 // Perturbation: an extra element
673 [5] := { XML_READER_TYPE_ELEMENT, 2, "ustr", "", "" },
674 [6] := { XML_READER_TYPE_TEXT, 3, "#text", "fourty-two", "" },
675 [7] := { XML_READER_TYPE_END_ELEMENT, 2, "ustr", "", "" }
678 testcase rof_after() runs on Neg
683 o := encRS(c_after_elem);
684 nodes := gather(o, ignore_ws);
685 check_match(nodes, t_after_elem);
687 o := encRS(c_after_member);
688 nodes := gather(o, ignore_ws);
689 check_match(nodes, t_after_member);
691 o := encRS(c_after_elem_named);
692 nodes := gather(o, ignore_ws);
693 check_match(nodes, t_after_elem_named);
695 o := encRS(c_after_member_named);
696 nodes := gather(o, ignore_ws);
697 check_match(nodes, t_after_member_named);
701 // int, charstring, boolean, float
702 const RS c_after_elem_raw := {
703 { 1, "first" , true , 7.0 },
704 { 2, "second", false, -3.7 }
707 erroneous ([0]) "after(raw) := ""rawr after first elem"" "
710 const RS c_after_member_raw := {
711 { 1, "first" , true , 7.0 },
712 { 2, "second", false, -3.7 }
715 erroneous ([0].i) "after(raw) := ustr : ""rawr after member of first"" "
718 template Nodes t_after_elem_raw := {
719 // node type , depth, name , value
720 { XML_READER_TYPE_ELEMENT , 0, "RS" , "", "" },
722 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
723 { XML_READER_TYPE_ELEMENT , 2, "i" , "", "" },
724 { XML_READER_TYPE_TEXT , 3, "#text", "1", "" },
725 { XML_READER_TYPE_END_ELEMENT, 2, "i" , "", "" },
726 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
727 { XML_READER_TYPE_TEXT , 3, "#text", "first", "" },
728 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
729 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
730 { XML_READER_TYPE_TEXT , 3, "#text", "true", "" },
731 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },
732 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
733 { XML_READER_TYPE_TEXT , 3, "#text", "7.000000", "" },
734 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
735 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },
737 // Perturbation: an extra text node
738 { XML_READER_TYPE_TEXT, 1, "#text", pattern "\s#(1,)rawr after first elem\s#(1,)", "" },
740 // node type , depth, name , value
741 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
742 { XML_READER_TYPE_ELEMENT , 2, "i" , "", "" },
743 { XML_READER_TYPE_TEXT , 3, "#text", "2", "" },
744 { XML_READER_TYPE_END_ELEMENT, 2, "i" , "", "" },
745 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
746 { XML_READER_TYPE_TEXT , 3, "#text", "second", "" },
747 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
748 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
749 { XML_READER_TYPE_TEXT , 3, "#text", "false", "" },
750 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },
751 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
752 { XML_READER_TYPE_TEXT , 3, "#text", "-3.700000", "" },
753 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
754 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },
756 { XML_READER_TYPE_END_ELEMENT, 0, "RS" , "", "" }
759 // <RS> text <R> <i> becomes <RS> <R> text <i>
760 template Nodes t_after_member_raw modifies t_after_elem_raw :=
762 // node type , depth, name , value
763 { XML_READER_TYPE_ELEMENT , 0, "RS" , "", "" },
765 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
766 { XML_READER_TYPE_ELEMENT , 2, "i" , "", "" },
767 { XML_READER_TYPE_TEXT , 3, "#text", "1", "" },
768 { XML_READER_TYPE_END_ELEMENT, 2, "i" , "", "" },
770 // Perturbation: an extra text node
771 { XML_READER_TYPE_TEXT, 2, "#text", pattern "\s#(1,)rawr after member of first\s#(1,)", "" },
773 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
774 { XML_READER_TYPE_TEXT , 3, "#text", "first", "" },
775 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
776 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
777 { XML_READER_TYPE_TEXT , 3, "#text", "true", "" },
778 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },
779 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
780 { XML_READER_TYPE_TEXT , 3, "#text", "7.000000", "" },
781 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
782 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },
783 // node type , depth, name , value
784 { XML_READER_TYPE_ELEMENT , 1, "R" , "", "" },
785 { XML_READER_TYPE_ELEMENT , 2, "i" , "", "" },
786 { XML_READER_TYPE_TEXT , 3, "#text", "2", "" },
787 { XML_READER_TYPE_END_ELEMENT, 2, "i" , "", "" },
788 { XML_READER_TYPE_ELEMENT , 2, "s" , "", "" },
789 { XML_READER_TYPE_TEXT , 3, "#text", "second", "" },
790 { XML_READER_TYPE_END_ELEMENT, 2, "s" , "", "" },
791 { XML_READER_TYPE_ELEMENT , 2, "b" , "", "" },
792 { XML_READER_TYPE_TEXT , 3, "#text", "false", "" },
793 { XML_READER_TYPE_END_ELEMENT, 2, "b" , "", "" },
794 { XML_READER_TYPE_ELEMENT , 2, "f" , "", "" },
795 { XML_READER_TYPE_TEXT , 3, "#text", "-3.700000", "" },
796 { XML_READER_TYPE_END_ELEMENT, 2, "f" , "", "" },
797 { XML_READER_TYPE_END_ELEMENT, 1, "R" , "", "" },
799 { XML_READER_TYPE_END_ELEMENT, 0, "RS" , "", "" }
802 testcase rof_after_raw() runs on Neg
807 o := encRS(c_after_elem_raw);
808 nodes := gather(o, ignore_ws);
809 check_match(nodes, t_after_elem_raw);
811 o := encRS(c_after_member_raw);
812 nodes := gather(o, ignore_ws);
813 check_match(nodes, t_after_member_raw);