1/* ***** BEGIN LICENSE BLOCK *****
2* Version: NPL 1.1/GPL 2.0/LGPL 2.1
3*
4* The contents of this file are subject to the Netscape Public License
5* Version 1.1 (the "License"); you may not use this file except in
6* compliance with the License. You may obtain a copy of the License at
7* http://www.mozilla.org/NPL/
8*
9* Software distributed under the License is distributed on an "AS IS" basis,
10* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11* for the specific language governing rights and limitations under the
12* License.
13*
14* The Original Code is JavaScript Engine testing utilities.
15*
16* The Initial Developer of the Original Code is Netscape Communications Corp.
17* Portions created by the Initial Developer are Copyright (C) 2002
18* the Initial Developer. All Rights Reserved.
19*
20* Contributor(s): pschwartau@netscape.com, rogerl@netscape.com
21*
22* Alternatively, the contents of this file may be used under the terms of
23* either the GNU General Public License Version 2 or later (the "GPL"), or
24* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
25* in which case the provisions of the GPL or the LGPL are applicable instead
26* of those above. If you wish to allow use of your version of this file only
27* under the terms of either the GPL or the LGPL, and not to allow others to
28* use your version of this file under the terms of the NPL, indicate your
29* decision by deleting the provisions above and replace them with the notice
30* and other provisions required by the GPL or the LGPL. If you do not delete
31* the provisions above, a recipient may use your version of this file under
32* the terms of any one of the NPL, the GPL or the LGPL.
33*
34* ***** END LICENSE BLOCK *****
35*
36*
37* Date:    2002-07-07
38* SUMMARY: Testing JS RegExp engine against Perl 5 RegExp engine.
39* Adjust cnLBOUND, cnUBOUND below to restrict which sections are tested.
40*
41* This test was created by running various patterns and strings through the
42* Perl 5 RegExp engine. We saved the results below to test the JS engine.
43*
44* Each of the examples below is a negative test; that is, each produces a
45* null match in Perl. Thus we set |expectedmatch| = |null| in each section.
46*
47* NOTE: ECMA/JS and Perl do differ on certain points. We have either commented
48* out such sections altogether, or modified them to fit what we expect from JS.
49*
50* EXAMPLES:
51*
52* - ECMA does support (?: (?= and (?! operators, but doesn't support (?<  etc.
53*
54* - ECMA doesn't support (?(condition)
55*
56*/
57//-----------------------------------------------------------------------------
58var i = 0;
59var bug = 85721;
60var summary = 'Testing regular expression edge cases';
61var cnSingleSpace = ' ';
62var status = '';
63var statusmessages = new Array();
64var pattern = '';
65var patterns = new Array();
66var string = '';
67var strings = new Array();
68var actualmatch = '';
69var actualmatches = new Array();
70var expectedmatch = '';
71var expectedmatches = new Array();
72var cnLBOUND = 0;
73var cnUBOUND = 1000;
74
75
76status = inSection(1);
77pattern = /abc/;
78string = 'xbc';
79actualmatch = string.match(pattern);
80expectedmatch = null;
81addThis();
82
83status = inSection(2);
84pattern = /abc/;
85string = 'axc';
86actualmatch = string.match(pattern);
87expectedmatch = null;
88addThis();
89
90status = inSection(3);
91pattern = /abc/;
92string = 'abx';
93actualmatch = string.match(pattern);
94expectedmatch = null;
95addThis();
96
97status = inSection(4);
98pattern = /ab+bc/;
99string = 'abc';
100actualmatch = string.match(pattern);
101expectedmatch = null;
102addThis();
103
104status = inSection(5);
105pattern = /ab+bc/;
106string = 'abq';
107actualmatch = string.match(pattern);
108expectedmatch = null;
109addThis();
110
111status = inSection(6);
112pattern = /ab{1,}bc/;
113string = 'abq';
114actualmatch = string.match(pattern);
115expectedmatch = null;
116addThis();
117
118status = inSection(7);
119pattern = /ab{4,5}bc/;
120string = 'abbbbc';
121actualmatch = string.match(pattern);
122expectedmatch = null;
123addThis();
124
125status = inSection(8);
126pattern = /ab?bc/;
127string = 'abbbbc';
128actualmatch = string.match(pattern);
129expectedmatch = null;
130addThis();
131
132status = inSection(9);
133pattern = /^abc$/;
134string = 'abcc';
135actualmatch = string.match(pattern);
136expectedmatch = null;
137addThis();
138
139status = inSection(10);
140pattern = /^abc$/;
141string = 'aabc';
142actualmatch = string.match(pattern);
143expectedmatch = null;
144addThis();
145
146status = inSection(11);
147pattern = /abc$/;
148string = 'aabcd';
149actualmatch = string.match(pattern);
150expectedmatch = null;
151addThis();
152
153status = inSection(12);
154pattern = /a.*c/;
155string = 'axyzd';
156actualmatch = string.match(pattern);
157expectedmatch = null;
158addThis();
159
160status = inSection(13);
161pattern = /a[bc]d/;
162string = 'abc';
163actualmatch = string.match(pattern);
164expectedmatch = null;
165addThis();
166
167status = inSection(14);
168pattern = /a[b-d]e/;
169string = 'abd';
170actualmatch = string.match(pattern);
171expectedmatch = null;
172addThis();
173
174status = inSection(15);
175pattern = /a[^bc]d/;
176string = 'abd';
177actualmatch = string.match(pattern);
178expectedmatch = null;
179addThis();
180
181status = inSection(16);
182pattern = /a[^-b]c/;
183string = 'a-c';
184actualmatch = string.match(pattern);
185expectedmatch = null;
186addThis();
187
188status = inSection(17);
189pattern = /a[^]b]c/;
190string = 'a]c';
191actualmatch = string.match(pattern);
192expectedmatch = null;
193addThis();
194
195status = inSection(18);
196pattern = /\by\b/;
197string = 'xy';
198actualmatch = string.match(pattern);
199expectedmatch = null;
200addThis();
201
202status = inSection(19);
203pattern = /\by\b/;
204string = 'yz';
205actualmatch = string.match(pattern);
206expectedmatch = null;
207addThis();
208
209status = inSection(20);
210pattern = /\by\b/;
211string = 'xyz';
212actualmatch = string.match(pattern);
213expectedmatch = null;
214addThis();
215
216status = inSection(21);
217pattern = /\Ba\B/;
218string = 'a-';
219actualmatch = string.match(pattern);
220expectedmatch = null;
221addThis();
222
223status = inSection(22);
224pattern = /\Ba\B/;
225string = '-a';
226actualmatch = string.match(pattern);
227expectedmatch = null;
228addThis();
229
230status = inSection(23);
231pattern = /\Ba\B/;
232string = '-a-';
233actualmatch = string.match(pattern);
234expectedmatch = null;
235addThis();
236
237status = inSection(24);
238pattern = /\w/;
239string = '-';
240actualmatch = string.match(pattern);
241expectedmatch = null;
242addThis();
243
244status = inSection(25);
245pattern = /\W/;
246string = 'a';
247actualmatch = string.match(pattern);
248expectedmatch = null;
249addThis();
250
251status = inSection(26);
252pattern = /a\sb/;
253string = 'a-b';
254actualmatch = string.match(pattern);
255expectedmatch = null;
256addThis();
257
258status = inSection(27);
259pattern = /\d/;
260string = '-';
261actualmatch = string.match(pattern);
262expectedmatch = null;
263addThis();
264
265status = inSection(28);
266pattern = /\D/;
267string = '1';
268actualmatch = string.match(pattern);
269expectedmatch = null;
270addThis();
271
272status = inSection(29);
273pattern = /[\w]/;
274string = '-';
275actualmatch = string.match(pattern);
276expectedmatch = null;
277addThis();
278
279status = inSection(30);
280pattern = /[\W]/;
281string = 'a';
282actualmatch = string.match(pattern);
283expectedmatch = null;
284addThis();
285
286status = inSection(31);
287pattern = /a[\s]b/;
288string = 'a-b';
289actualmatch = string.match(pattern);
290expectedmatch = null;
291addThis();
292
293status = inSection(32);
294pattern = /[\d]/;
295string = '-';
296actualmatch = string.match(pattern);
297expectedmatch = null;
298addThis();
299
300status = inSection(33);
301pattern = /[\D]/;
302string = '1';
303actualmatch = string.match(pattern);
304expectedmatch = null;
305addThis();
306
307status = inSection(34);
308pattern = /$b/;
309string = 'b';
310actualmatch = string.match(pattern);
311expectedmatch = null;
312addThis();
313
314status = inSection(35);
315pattern = /^(ab|cd)e/;
316string = 'abcde';
317actualmatch = string.match(pattern);
318expectedmatch = null;
319addThis();
320
321status = inSection(36);
322pattern = /a[bcd]+dcdcde/;
323string = 'adcdcde';
324actualmatch = string.match(pattern);
325expectedmatch = null;
326addThis();
327
328status = inSection(37);
329pattern = /(bc+d$|ef*g.|h?i(j|k))/;
330string = 'effg';
331actualmatch = string.match(pattern);
332expectedmatch = null;
333addThis();
334
335status = inSection(38);
336pattern = /(bc+d$|ef*g.|h?i(j|k))/;
337string = 'bcdd';
338actualmatch = string.match(pattern);
339expectedmatch = null;
340addThis();
341
342status = inSection(39);
343pattern = /[k]/;
344string = 'ab';
345actualmatch = string.match(pattern);
346expectedmatch = null;
347addThis();
348
349// MODIFIED - ECMA has different rules for paren contents.
350status = inSection(40);
351pattern = /(a)|\1/;
352string = 'x';
353actualmatch = string.match(pattern);
354//expectedmatch = null;
355expectedmatch = Array("", undefined);
356addThis();
357
358// MODIFIED - ECMA has different rules for paren contents.
359status = inSection(41);
360pattern = /((\3|b)\2(a)x)+/;
361string = 'aaxabxbaxbbx';
362actualmatch = string.match(pattern);
363//expectedmatch = null;
364expectedmatch = Array("ax", "ax", "", "a");
365addThis();
366
367status = inSection(42);
368pattern = /abc/i;
369string = 'XBC';
370actualmatch = string.match(pattern);
371expectedmatch = null;
372addThis();
373
374status = inSection(43);
375pattern = /abc/i;
376string = 'AXC';
377actualmatch = string.match(pattern);
378expectedmatch = null;
379addThis();
380
381status = inSection(44);
382pattern = /abc/i;
383string = 'ABX';
384actualmatch = string.match(pattern);
385expectedmatch = null;
386addThis();
387
388status = inSection(45);
389pattern = /ab+bc/i;
390string = 'ABC';
391actualmatch = string.match(pattern);
392expectedmatch = null;
393addThis();
394
395status = inSection(46);
396pattern = /ab+bc/i;
397string = 'ABQ';
398actualmatch = string.match(pattern);
399expectedmatch = null;
400addThis();
401
402status = inSection(47);
403pattern = /ab{1,}bc/i;
404string = 'ABQ';
405actualmatch = string.match(pattern);
406expectedmatch = null;
407addThis();
408
409status = inSection(48);
410pattern = /ab{4,5}?bc/i;
411string = 'ABBBBC';
412actualmatch = string.match(pattern);
413expectedmatch = null;
414addThis();
415
416status = inSection(49);
417pattern = /ab??bc/i;
418string = 'ABBBBC';
419actualmatch = string.match(pattern);
420expectedmatch = null;
421addThis();
422
423status = inSection(50);
424pattern = /^abc$/i;
425string = 'ABCC';
426actualmatch = string.match(pattern);
427expectedmatch = null;
428addThis();
429
430status = inSection(51);
431pattern = /^abc$/i;
432string = 'AABC';
433actualmatch = string.match(pattern);
434expectedmatch = null;
435addThis();
436
437status = inSection(52);
438pattern = /a.*c/i;
439string = 'AXYZD';
440actualmatch = string.match(pattern);
441expectedmatch = null;
442addThis();
443
444status = inSection(53);
445pattern = /a[bc]d/i;
446string = 'ABC';
447actualmatch = string.match(pattern);
448expectedmatch = null;
449addThis();
450
451status = inSection(54);
452pattern = /a[b-d]e/i;
453string = 'ABD';
454actualmatch = string.match(pattern);
455expectedmatch = null;
456addThis();
457
458status = inSection(55);
459pattern = /a[^bc]d/i;
460string = 'ABD';
461actualmatch = string.match(pattern);
462expectedmatch = null;
463addThis();
464
465status = inSection(56);
466pattern = /a[^-b]c/i;
467string = 'A-C';
468actualmatch = string.match(pattern);
469expectedmatch = null;
470addThis();
471
472status = inSection(57);
473pattern = /a[^]b]c/i;
474string = 'A]C';
475actualmatch = string.match(pattern);
476expectedmatch = null;
477addThis();
478
479status = inSection(58);
480pattern = /$b/i;
481string = 'B';
482actualmatch = string.match(pattern);
483expectedmatch = null;
484addThis();
485
486status = inSection(59);
487pattern = /^(ab|cd)e/i;
488string = 'ABCDE';
489actualmatch = string.match(pattern);
490expectedmatch = null;
491addThis();
492
493status = inSection(60);
494pattern = /a[bcd]+dcdcde/i;
495string = 'ADCDCDE';
496actualmatch = string.match(pattern);
497expectedmatch = null;
498addThis();
499
500status = inSection(61);
501pattern = /(bc+d$|ef*g.|h?i(j|k))/i;
502string = 'EFFG';
503actualmatch = string.match(pattern);
504expectedmatch = null;
505addThis();
506
507status = inSection(62);
508pattern = /(bc+d$|ef*g.|h?i(j|k))/i;
509string = 'BCDD';
510actualmatch = string.match(pattern);
511expectedmatch = null;
512addThis();
513
514status = inSection(63);
515pattern = /[k]/i;
516string = 'AB';
517actualmatch = string.match(pattern);
518expectedmatch = null;
519addThis();
520
521status = inSection(64);
522pattern = /^(a\1?){4}$/;
523string = 'aaaaaaaaa';
524actualmatch = string.match(pattern);
525expectedmatch = null;
526addThis();
527
528status = inSection(65);
529pattern = /^(a\1?){4}$/;
530string = 'aaaaaaaaaaa';
531actualmatch = string.match(pattern);
532expectedmatch = null;
533addThis();
534
535/* ECMA doesn't support (?(
536status = inSection(66);
537pattern = /^(a(?(1)\1)){4}$/;
538string = 'aaaaaaaaa';
539actualmatch = string.match(pattern);
540expectedmatch = null;
541addThis();
542
543status = inSection(67);
544pattern = /^(a(?(1)\1)){4}$/;
545string = 'aaaaaaaaaaa';
546actualmatch = string.match(pattern);
547expectedmatch = null;
548addThis();
549*/
550
551/* ECMA doesn't support (?<
552status = inSection(68);
553pattern = /(?<=a)b/;
554string = 'cb';
555actualmatch = string.match(pattern);
556expectedmatch = null;
557addThis();
558
559status = inSection(69);
560pattern = /(?<=a)b/;
561string = 'b';
562actualmatch = string.match(pattern);
563expectedmatch = null;
564addThis();
565
566status = inSection(70);
567pattern = /(?<!c)b/;
568string = 'cb';
569actualmatch = string.match(pattern);
570expectedmatch = null;
571addThis();
572*/
573
574/* ECMA doesn't support (?(condition)
575status = inSection(71);
576pattern = /(?:(?i)a)b/;
577string = 'aB';
578actualmatch = string.match(pattern);
579expectedmatch = null;
580addThis();
581
582status = inSection(72);
583pattern = /((?i)a)b/;
584string = 'aB';
585actualmatch = string.match(pattern);
586expectedmatch = null;
587addThis();
588
589status = inSection(73);
590pattern = /(?i:a)b/;
591string = 'aB';
592actualmatch = string.match(pattern);
593expectedmatch = null;
594addThis();
595
596status = inSection(74);
597pattern = /((?i:a))b/;
598string = 'aB';
599actualmatch = string.match(pattern);
600expectedmatch = null;
601addThis();
602
603status = inSection(75);
604pattern = /(?:(?-i)a)b/i;
605string = 'Ab';
606actualmatch = string.match(pattern);
607expectedmatch = null;
608addThis();
609
610status = inSection(76);
611pattern = /((?-i)a)b/i;
612string = 'Ab';
613actualmatch = string.match(pattern);
614expectedmatch = null;
615addThis();
616
617status = inSection(77);
618pattern = /(?:(?-i)a)b/i;
619string = 'AB';
620actualmatch = string.match(pattern);
621expectedmatch = null;
622addThis();
623
624status = inSection(78);
625pattern = /((?-i)a)b/i;
626string = 'AB';
627actualmatch = string.match(pattern);
628expectedmatch = null;
629addThis();
630
631status = inSection(79);
632pattern = /(?-i:a)b/i;
633string = 'Ab';
634actualmatch = string.match(pattern);
635expectedmatch = null;
636addThis();
637
638status = inSection(80);
639pattern = /((?-i:a))b/i;
640string = 'Ab';
641actualmatch = string.match(pattern);
642expectedmatch = null;
643addThis();
644
645status = inSection(81);
646pattern = /(?-i:a)b/i;
647string = 'AB';
648actualmatch = string.match(pattern);
649expectedmatch = null;
650addThis();
651
652status = inSection(82);
653pattern = /((?-i:a))b/i;
654string = 'AB';
655actualmatch = string.match(pattern);
656expectedmatch = null;
657addThis();
658
659status = inSection(83);
660pattern = /((?-i:a.))b/i;
661string = 'a\nB';
662actualmatch = string.match(pattern);
663expectedmatch = null;
664addThis();
665
666status = inSection(84);
667pattern = /((?s-i:a.))b/i;
668string = 'B\nB';
669actualmatch = string.match(pattern);
670expectedmatch = null;
671addThis();
672*/
673
674/* ECMA doesn't support (?<
675status = inSection(85);
676pattern = /(?<![cd])b/;
677string = 'dbcb';
678actualmatch = string.match(pattern);
679expectedmatch = null;
680addThis();
681
682status = inSection(86);
683pattern = /(?<!(c|d))b/;
684string = 'dbcb';
685actualmatch = string.match(pattern);
686expectedmatch = null;
687addThis();
688*/
689
690status = inSection(87);
691pattern = /^(?:a?b?)*$/;
692string = 'a--';
693actualmatch = string.match(pattern);
694expectedmatch = null;
695addThis();
696
697status = inSection(88);
698pattern = /^b/;
699string = 'a\nb\nc\n';
700actualmatch = string.match(pattern);
701expectedmatch = null;
702addThis();
703
704status = inSection(89);
705pattern = /()^b/;
706string = 'a\nb\nc\n';
707actualmatch = string.match(pattern);
708expectedmatch = null;
709addThis();
710
711/* ECMA doesn't support (?(
712status = inSection(90);
713pattern = /(?(1)a|b)/;
714string = 'a';
715actualmatch = string.match(pattern);
716expectedmatch = null;
717addThis();
718
719status = inSection(91);
720pattern = /(x)?(?(1)a|b)/;
721string = 'a';
722actualmatch = string.match(pattern);
723expectedmatch = null;
724addThis();
725
726status = inSection(92);
727pattern = /()(?(1)b|a)/;
728string = 'a';
729actualmatch = string.match(pattern);
730expectedmatch = null;
731addThis();
732
733status = inSection(93);
734pattern = /^(\()?blah(?(1)(\)))$/;
735string = 'blah)';
736actualmatch = string.match(pattern);
737expectedmatch = null;
738addThis();
739
740status = inSection(94);
741pattern = /^(\()?blah(?(1)(\)))$/;
742string = '(blah';
743actualmatch = string.match(pattern);
744expectedmatch = null;
745addThis();
746
747status = inSection(95);
748pattern = /^(\(+)?blah(?(1)(\)))$/;
749string = 'blah)';
750actualmatch = string.match(pattern);
751expectedmatch = null;
752addThis();
753
754status = inSection(96);
755pattern = /^(\(+)?blah(?(1)(\)))$/;
756string = '(blah';
757actualmatch = string.match(pattern);
758expectedmatch = null;
759addThis();
760
761status = inSection(97);
762pattern = /(?(?{0})a|b)/;
763string = 'a';
764actualmatch = string.match(pattern);
765expectedmatch = null;
766addThis();
767
768status = inSection(98);
769pattern = /(?(?{1})b|a)/;
770string = 'a';
771actualmatch = string.match(pattern);
772expectedmatch = null;
773addThis();
774
775status = inSection(99);
776pattern = /(?(?!a)a|b)/;
777string = 'a';
778actualmatch = string.match(pattern);
779expectedmatch = null;
780addThis();
781
782status = inSection(100);
783pattern = /(?(?=a)b|a)/;
784string = 'a';
785actualmatch = string.match(pattern);
786expectedmatch = null;
787addThis();
788*/
789
790status = inSection(101);
791pattern = /^(?=(a+?))\1ab/;
792string = 'aaab';
793actualmatch = string.match(pattern);
794expectedmatch = null;
795addThis();
796
797status = inSection(102);
798pattern = /^(?=(a+?))\1ab/;
799string = 'aaab';
800actualmatch = string.match(pattern);
801expectedmatch = null;
802addThis();
803
804status = inSection(103);
805pattern = /([\w:]+::)?(\w+)$/;
806string = 'abcd:';
807actualmatch = string.match(pattern);
808expectedmatch = null;
809addThis();
810
811status = inSection(104);
812pattern = /([\w:]+::)?(\w+)$/;
813string = 'abcd:';
814actualmatch = string.match(pattern);
815expectedmatch = null;
816addThis();
817
818status = inSection(105);
819pattern = /(>a+)ab/;
820string = 'aaab';
821actualmatch = string.match(pattern);
822expectedmatch = null;
823addThis();
824
825status = inSection(106);
826pattern = /a\Z/;
827string = 'a\nb\n';
828actualmatch = string.match(pattern);
829expectedmatch = null;
830addThis();
831
832status = inSection(107);
833pattern = /a\z/;
834string = 'a\nb\n';
835actualmatch = string.match(pattern);
836expectedmatch = null;
837addThis();
838
839status = inSection(108);
840pattern = /a$/;
841string = 'a\nb\n';
842actualmatch = string.match(pattern);
843expectedmatch = null;
844addThis();
845
846status = inSection(109);
847pattern = /a\z/;
848string = 'b\na\n';
849actualmatch = string.match(pattern);
850expectedmatch = null;
851addThis();
852
853status = inSection(110);
854pattern = /a\z/m;
855string = 'a\nb\n';
856actualmatch = string.match(pattern);
857expectedmatch = null;
858addThis();
859
860status = inSection(111);
861pattern = /a\z/m;
862string = 'b\na\n';
863actualmatch = string.match(pattern);
864expectedmatch = null;
865addThis();
866
867status = inSection(112);
868pattern = /aa\Z/;
869string = 'aa\nb\n';
870actualmatch = string.match(pattern);
871expectedmatch = null;
872addThis();
873
874status = inSection(113);
875pattern = /aa\z/;
876string = 'aa\nb\n';
877actualmatch = string.match(pattern);
878expectedmatch = null;
879addThis();
880
881status = inSection(114);
882pattern = /aa$/;
883string = 'aa\nb\n';
884actualmatch = string.match(pattern);
885expectedmatch = null;
886addThis();
887
888status = inSection(115);
889pattern = /aa\z/;
890string = 'b\naa\n';
891actualmatch = string.match(pattern);
892expectedmatch = null;
893addThis();
894
895status = inSection(116);
896pattern = /aa\z/m;
897string = 'aa\nb\n';
898actualmatch = string.match(pattern);
899expectedmatch = null;
900addThis();
901
902status = inSection(117);
903pattern = /aa\z/m;
904string = 'b\naa\n';
905actualmatch = string.match(pattern);
906expectedmatch = null;
907addThis();
908
909status = inSection(118);
910pattern = /aa\Z/;
911string = 'ac\nb\n';
912actualmatch = string.match(pattern);
913expectedmatch = null;
914addThis();
915
916status = inSection(119);
917pattern = /aa\z/;
918string = 'ac\nb\n';
919actualmatch = string.match(pattern);
920expectedmatch = null;
921addThis();
922
923status = inSection(120);
924pattern = /aa$/;
925string = 'ac\nb\n';
926actualmatch = string.match(pattern);
927expectedmatch = null;
928addThis();
929
930status = inSection(121);
931pattern = /aa\Z/;
932string = 'b\nac\n';
933actualmatch = string.match(pattern);
934expectedmatch = null;
935addThis();
936
937status = inSection(122);
938pattern = /aa\z/;
939string = 'b\nac\n';
940actualmatch = string.match(pattern);
941expectedmatch = null;
942addThis();
943
944status = inSection(123);
945pattern = /aa$/;
946string = 'b\nac\n';
947actualmatch = string.match(pattern);
948expectedmatch = null;
949addThis();
950
951status = inSection(124);
952pattern = /aa\Z/;
953string = 'b\nac';
954actualmatch = string.match(pattern);
955expectedmatch = null;
956addThis();
957
958status = inSection(125);
959pattern = /aa\z/;
960string = 'b\nac';
961actualmatch = string.match(pattern);
962expectedmatch = null;
963addThis();
964
965status = inSection(126);
966pattern = /aa$/;
967string = 'b\nac';
968actualmatch = string.match(pattern);
969expectedmatch = null;
970addThis();
971
972status = inSection(127);
973pattern = /aa\Z/m;
974string = 'ac\nb\n';
975actualmatch = string.match(pattern);
976expectedmatch = null;
977addThis();
978
979status = inSection(128);
980pattern = /aa\z/m;
981string = 'ac\nb\n';
982actualmatch = string.match(pattern);
983expectedmatch = null;
984addThis();
985
986status = inSection(129);
987pattern = /aa$/m;
988string = 'ac\nb\n';
989actualmatch = string.match(pattern);
990expectedmatch = null;
991addThis();
992
993status = inSection(130);
994pattern = /aa\Z/m;
995string = 'b\nac\n';
996actualmatch = string.match(pattern);
997expectedmatch = null;
998addThis();
999
1000status = inSection(131);
1001pattern = /aa\z/m;
1002string = 'b\nac\n';
1003actualmatch = string.match(pattern);
1004expectedmatch = null;
1005addThis();
1006
1007status = inSection(132);
1008pattern = /aa$/m;
1009string = 'b\nac\n';
1010actualmatch = string.match(pattern);
1011expectedmatch = null;
1012addThis();
1013
1014status = inSection(133);
1015pattern = /aa\Z/m;
1016string = 'b\nac';
1017actualmatch = string.match(pattern);
1018expectedmatch = null;
1019addThis();
1020
1021status = inSection(134);
1022pattern = /aa\z/m;
1023string = 'b\nac';
1024actualmatch = string.match(pattern);
1025expectedmatch = null;
1026addThis();
1027
1028status = inSection(135);
1029pattern = /aa$/m;
1030string = 'b\nac';
1031actualmatch = string.match(pattern);
1032expectedmatch = null;
1033addThis();
1034
1035status = inSection(136);
1036pattern = /aa\Z/;
1037string = 'ca\nb\n';
1038actualmatch = string.match(pattern);
1039expectedmatch = null;
1040addThis();
1041
1042status = inSection(137);
1043pattern = /aa\z/;
1044string = 'ca\nb\n';
1045actualmatch = string.match(pattern);
1046expectedmatch = null;
1047addThis();
1048
1049status = inSection(138);
1050pattern = /aa$/;
1051string = 'ca\nb\n';
1052actualmatch = string.match(pattern);
1053expectedmatch = null;
1054addThis();
1055
1056status = inSection(139);
1057pattern = /aa\Z/;
1058string = 'b\nca\n';
1059actualmatch = string.match(pattern);
1060expectedmatch = null;
1061addThis();
1062
1063status = inSection(140);
1064pattern = /aa\z/;
1065string = 'b\nca\n';
1066actualmatch = string.match(pattern);
1067expectedmatch = null;
1068addThis();
1069
1070status = inSection(141);
1071pattern = /aa$/;
1072string = 'b\nca\n';
1073actualmatch = string.match(pattern);
1074expectedmatch = null;
1075addThis();
1076
1077status = inSection(142);
1078pattern = /aa\Z/;
1079string = 'b\nca';
1080actualmatch = string.match(pattern);
1081expectedmatch = null;
1082addThis();
1083
1084status = inSection(143);
1085pattern = /aa\z/;
1086string = 'b\nca';
1087actualmatch = string.match(pattern);
1088expectedmatch = null;
1089addThis();
1090
1091status = inSection(144);
1092pattern = /aa$/;
1093string = 'b\nca';
1094actualmatch = string.match(pattern);
1095expectedmatch = null;
1096addThis();
1097
1098status = inSection(145);
1099pattern = /aa\Z/m;
1100string = 'ca\nb\n';
1101actualmatch = string.match(pattern);
1102expectedmatch = null;
1103addThis();
1104
1105status = inSection(146);
1106pattern = /aa\z/m;
1107string = 'ca\nb\n';
1108actualmatch = string.match(pattern);
1109expectedmatch = null;
1110addThis();
1111
1112status = inSection(147);
1113pattern = /aa$/m;
1114string = 'ca\nb\n';
1115actualmatch = string.match(pattern);
1116expectedmatch = null;
1117addThis();
1118
1119status = inSection(148);
1120pattern = /aa\Z/m;
1121string = 'b\nca\n';
1122actualmatch = string.match(pattern);
1123expectedmatch = null;
1124addThis();
1125
1126status = inSection(149);
1127pattern = /aa\z/m;
1128string = 'b\nca\n';
1129actualmatch = string.match(pattern);
1130expectedmatch = null;
1131addThis();
1132
1133status = inSection(150);
1134pattern = /aa$/m;
1135string = 'b\nca\n';
1136actualmatch = string.match(pattern);
1137expectedmatch = null;
1138addThis();
1139
1140status = inSection(151);
1141pattern = /aa\Z/m;
1142string = 'b\nca';
1143actualmatch = string.match(pattern);
1144expectedmatch = null;
1145addThis();
1146
1147status = inSection(152);
1148pattern = /aa\z/m;
1149string = 'b\nca';
1150actualmatch = string.match(pattern);
1151expectedmatch = null;
1152addThis();
1153
1154status = inSection(153);
1155pattern = /aa$/m;
1156string = 'b\nca';
1157actualmatch = string.match(pattern);
1158expectedmatch = null;
1159addThis();
1160
1161status = inSection(154);
1162pattern = /ab\Z/;
1163string = 'ab\nb\n';
1164actualmatch = string.match(pattern);
1165expectedmatch = null;
1166addThis();
1167
1168status = inSection(155);
1169pattern = /ab\z/;
1170string = 'ab\nb\n';
1171actualmatch = string.match(pattern);
1172expectedmatch = null;
1173addThis();
1174
1175status = inSection(156);
1176pattern = /ab$/;
1177string = 'ab\nb\n';
1178actualmatch = string.match(pattern);
1179expectedmatch = null;
1180addThis();
1181
1182status = inSection(157);
1183pattern = /ab\z/;
1184string = 'b\nab\n';
1185actualmatch = string.match(pattern);
1186expectedmatch = null;
1187addThis();
1188
1189status = inSection(158);
1190pattern = /ab\z/m;
1191string = 'ab\nb\n';
1192actualmatch = string.match(pattern);
1193expectedmatch = null;
1194addThis();
1195
1196status = inSection(159);
1197pattern = /ab\z/m;
1198string = 'b\nab\n';
1199actualmatch = string.match(pattern);
1200expectedmatch = null;
1201addThis();
1202
1203status = inSection(160);
1204pattern = /ab\Z/;
1205string = 'ac\nb\n';
1206actualmatch = string.match(pattern);
1207expectedmatch = null;
1208addThis();
1209
1210status = inSection(161);
1211pattern = /ab\z/;
1212string = 'ac\nb\n';
1213actualmatch = string.match(pattern);
1214expectedmatch = null;
1215addThis();
1216
1217status = inSection(162);
1218pattern = /ab$/;
1219string = 'ac\nb\n';
1220actualmatch = string.match(pattern);
1221expectedmatch = null;
1222addThis();
1223
1224status = inSection(163);
1225pattern = /ab\Z/;
1226string = 'b\nac\n';
1227actualmatch = string.match(pattern);
1228expectedmatch = null;
1229addThis();
1230
1231status = inSection(164);
1232pattern = /ab\z/;
1233string = 'b\nac\n';
1234actualmatch = string.match(pattern);
1235expectedmatch = null;
1236addThis();
1237
1238status = inSection(165);
1239pattern = /ab$/;
1240string = 'b\nac\n';
1241actualmatch = string.match(pattern);
1242expectedmatch = null;
1243addThis();
1244
1245status = inSection(166);
1246pattern = /ab\Z/;
1247string = 'b\nac';
1248actualmatch = string.match(pattern);
1249expectedmatch = null;
1250addThis();
1251
1252status = inSection(167);
1253pattern = /ab\z/;
1254string = 'b\nac';
1255actualmatch = string.match(pattern);
1256expectedmatch = null;
1257addThis();
1258
1259status = inSection(168);
1260pattern = /ab$/;
1261string = 'b\nac';
1262actualmatch = string.match(pattern);
1263expectedmatch = null;
1264addThis();
1265
1266status = inSection(169);
1267pattern = /ab\Z/m;
1268string = 'ac\nb\n';
1269actualmatch = string.match(pattern);
1270expectedmatch = null;
1271addThis();
1272
1273status = inSection(170);
1274pattern = /ab\z/m;
1275string = 'ac\nb\n';
1276actualmatch = string.match(pattern);
1277expectedmatch = null;
1278addThis();
1279
1280status = inSection(171);
1281pattern = /ab$/m;
1282string = 'ac\nb\n';
1283actualmatch = string.match(pattern);
1284expectedmatch = null;
1285addThis();
1286
1287status = inSection(172);
1288pattern = /ab\Z/m;
1289string = 'b\nac\n';
1290actualmatch = string.match(pattern);
1291expectedmatch = null;
1292addThis();
1293
1294status = inSection(173);
1295pattern = /ab\z/m;
1296string = 'b\nac\n';
1297actualmatch = string.match(pattern);
1298expectedmatch = null;
1299addThis();
1300
1301status = inSection(174);
1302pattern = /ab$/m;
1303string = 'b\nac\n';
1304actualmatch = string.match(pattern);
1305expectedmatch = null;
1306addThis();
1307
1308status = inSection(175);
1309pattern = /ab\Z/m;
1310string = 'b\nac';
1311actualmatch = string.match(pattern);
1312expectedmatch = null;
1313addThis();
1314
1315status = inSection(176);
1316pattern = /ab\z/m;
1317string = 'b\nac';
1318actualmatch = string.match(pattern);
1319expectedmatch = null;
1320addThis();
1321
1322status = inSection(177);
1323pattern = /ab$/m;
1324string = 'b\nac';
1325actualmatch = string.match(pattern);
1326expectedmatch = null;
1327addThis();
1328
1329status = inSection(178);
1330pattern = /ab\Z/;
1331string = 'ca\nb\n';
1332actualmatch = string.match(pattern);
1333expectedmatch = null;
1334addThis();
1335
1336status = inSection(179);
1337pattern = /ab\z/;
1338string = 'ca\nb\n';
1339actualmatch = string.match(pattern);
1340expectedmatch = null;
1341addThis();
1342
1343status = inSection(180);
1344pattern = /ab$/;
1345string = 'ca\nb\n';
1346actualmatch = string.match(pattern);
1347expectedmatch = null;
1348addThis();
1349
1350status = inSection(181);
1351pattern = /ab\Z/;
1352string = 'b\nca\n';
1353actualmatch = string.match(pattern);
1354expectedmatch = null;
1355addThis();
1356
1357status = inSection(182);
1358pattern = /ab\z/;
1359string = 'b\nca\n';
1360actualmatch = string.match(pattern);
1361expectedmatch = null;
1362addThis();
1363
1364status = inSection(183);
1365pattern = /ab$/;
1366string = 'b\nca\n';
1367actualmatch = string.match(pattern);
1368expectedmatch = null;
1369addThis();
1370
1371status = inSection(184);
1372pattern = /ab\Z/;
1373string = 'b\nca';
1374actualmatch = string.match(pattern);
1375expectedmatch = null;
1376addThis();
1377
1378status = inSection(185);
1379pattern = /ab\z/;
1380string = 'b\nca';
1381actualmatch = string.match(pattern);
1382expectedmatch = null;
1383addThis();
1384
1385status = inSection(186);
1386pattern = /ab$/;
1387string = 'b\nca';
1388actualmatch = string.match(pattern);
1389expectedmatch = null;
1390addThis();
1391
1392status = inSection(187);
1393pattern = /ab\Z/m;
1394string = 'ca\nb\n';
1395actualmatch = string.match(pattern);
1396expectedmatch = null;
1397addThis();
1398
1399status = inSection(188);
1400pattern = /ab\z/m;
1401string = 'ca\nb\n';
1402actualmatch = string.match(pattern);
1403expectedmatch = null;
1404addThis();
1405
1406status = inSection(189);
1407pattern = /ab$/m;
1408string = 'ca\nb\n';
1409actualmatch = string.match(pattern);
1410expectedmatch = null;
1411addThis();
1412
1413status = inSection(190);
1414pattern = /ab\Z/m;
1415string = 'b\nca\n';
1416actualmatch = string.match(pattern);
1417expectedmatch = null;
1418addThis();
1419
1420status = inSection(191);
1421pattern = /ab\z/m;
1422string = 'b\nca\n';
1423actualmatch = string.match(pattern);
1424expectedmatch = null;
1425addThis();
1426
1427status = inSection(192);
1428pattern = /ab$/m;
1429string = 'b\nca\n';
1430actualmatch = string.match(pattern);
1431expectedmatch = null;
1432addThis();
1433
1434status = inSection(193);
1435pattern = /ab\Z/m;
1436string = 'b\nca';
1437actualmatch = string.match(pattern);
1438expectedmatch = null;
1439addThis();
1440
1441status = inSection(194);
1442pattern = /ab\z/m;
1443string = 'b\nca';
1444actualmatch = string.match(pattern);
1445expectedmatch = null;
1446addThis();
1447
1448status = inSection(195);
1449pattern = /ab$/m;
1450string = 'b\nca';
1451actualmatch = string.match(pattern);
1452expectedmatch = null;
1453addThis();
1454
1455status = inSection(196);
1456pattern = /abb\Z/;
1457string = 'abb\nb\n';
1458actualmatch = string.match(pattern);
1459expectedmatch = null;
1460addThis();
1461
1462status = inSection(197);
1463pattern = /abb\z/;
1464string = 'abb\nb\n';
1465actualmatch = string.match(pattern);
1466expectedmatch = null;
1467addThis();
1468
1469status = inSection(198);
1470pattern = /abb$/;
1471string = 'abb\nb\n';
1472actualmatch = string.match(pattern);
1473expectedmatch = null;
1474addThis();
1475
1476status = inSection(199);
1477pattern = /abb\z/;
1478string = 'b\nabb\n';
1479actualmatch = string.match(pattern);
1480expectedmatch = null;
1481addThis();
1482
1483status = inSection(200);
1484pattern = /abb\z/m;
1485string = 'abb\nb\n';
1486actualmatch = string.match(pattern);
1487expectedmatch = null;
1488addThis();
1489
1490status = inSection(201);
1491pattern = /abb\z/m;
1492string = 'b\nabb\n';
1493actualmatch = string.match(pattern);
1494expectedmatch = null;
1495addThis();
1496
1497status = inSection(202);
1498pattern = /abb\Z/;
1499string = 'ac\nb\n';
1500actualmatch = string.match(pattern);
1501expectedmatch = null;
1502addThis();
1503
1504status = inSection(203);
1505pattern = /abb\z/;
1506string = 'ac\nb\n';
1507actualmatch = string.match(pattern);
1508expectedmatch = null;
1509addThis();
1510
1511status = inSection(204);
1512pattern = /abb$/;
1513string = 'ac\nb\n';
1514actualmatch = string.match(pattern);
1515expectedmatch = null;
1516addThis();
1517
1518status = inSection(205);
1519pattern = /abb\Z/;
1520string = 'b\nac\n';
1521actualmatch = string.match(pattern);
1522expectedmatch = null;
1523addThis();
1524
1525status = inSection(206);
1526pattern = /abb\z/;
1527string = 'b\nac\n';
1528actualmatch = string.match(pattern);
1529expectedmatch = null;
1530addThis();
1531
1532status = inSection(207);
1533pattern = /abb$/;
1534string = 'b\nac\n';
1535actualmatch = string.match(pattern);
1536expectedmatch = null;
1537addThis();
1538
1539status = inSection(208);
1540pattern = /abb\Z/;
1541string = 'b\nac';
1542actualmatch = string.match(pattern);
1543expectedmatch = null;
1544addThis();
1545
1546status = inSection(209);
1547pattern = /abb\z/;
1548string = 'b\nac';
1549actualmatch = string.match(pattern);
1550expectedmatch = null;
1551addThis();
1552
1553status = inSection(210);
1554pattern = /abb$/;
1555string = 'b\nac';
1556actualmatch = string.match(pattern);
1557expectedmatch = null;
1558addThis();
1559
1560status = inSection(211);
1561pattern = /abb\Z/m;
1562string = 'ac\nb\n';
1563actualmatch = string.match(pattern);
1564expectedmatch = null;
1565addThis();
1566
1567status = inSection(212);
1568pattern = /abb\z/m;
1569string = 'ac\nb\n';
1570actualmatch = string.match(pattern);
1571expectedmatch = null;
1572addThis();
1573
1574status = inSection(213);
1575pattern = /abb$/m;
1576string = 'ac\nb\n';
1577actualmatch = string.match(pattern);
1578expectedmatch = null;
1579addThis();
1580
1581status = inSection(214);
1582pattern = /abb\Z/m;
1583string = 'b\nac\n';
1584actualmatch = string.match(pattern);
1585expectedmatch = null;
1586addThis();
1587
1588status = inSection(215);
1589pattern = /abb\z/m;
1590string = 'b\nac\n';
1591actualmatch = string.match(pattern);
1592expectedmatch = null;
1593addThis();
1594
1595status = inSection(216);
1596pattern = /abb$/m;
1597string = 'b\nac\n';
1598actualmatch = string.match(pattern);
1599expectedmatch = null;
1600addThis();
1601
1602status = inSection(217);
1603pattern = /abb\Z/m;
1604string = 'b\nac';
1605actualmatch = string.match(pattern);
1606expectedmatch = null;
1607addThis();
1608
1609status = inSection(218);
1610pattern = /abb\z/m;
1611string = 'b\nac';
1612actualmatch = string.match(pattern);
1613expectedmatch = null;
1614addThis();
1615
1616status = inSection(219);
1617pattern = /abb$/m;
1618string = 'b\nac';
1619actualmatch = string.match(pattern);
1620expectedmatch = null;
1621addThis();
1622
1623status = inSection(220);
1624pattern = /abb\Z/;
1625string = 'ca\nb\n';
1626actualmatch = string.match(pattern);
1627expectedmatch = null;
1628addThis();
1629
1630status = inSection(221);
1631pattern = /abb\z/;
1632string = 'ca\nb\n';
1633actualmatch = string.match(pattern);
1634expectedmatch = null;
1635addThis();
1636
1637status = inSection(222);
1638pattern = /abb$/;
1639string = 'ca\nb\n';
1640actualmatch = string.match(pattern);
1641expectedmatch = null;
1642addThis();
1643
1644status = inSection(223);
1645pattern = /abb\Z/;
1646string = 'b\nca\n';
1647actualmatch = string.match(pattern);
1648expectedmatch = null;
1649addThis();
1650
1651status = inSection(224);
1652pattern = /abb\z/;
1653string = 'b\nca\n';
1654actualmatch = string.match(pattern);
1655expectedmatch = null;
1656addThis();
1657
1658status = inSection(225);
1659pattern = /abb$/;
1660string = 'b\nca\n';
1661actualmatch = string.match(pattern);
1662expectedmatch = null;
1663addThis();
1664
1665status = inSection(226);
1666pattern = /abb\Z/;
1667string = 'b\nca';
1668actualmatch = string.match(pattern);
1669expectedmatch = null;
1670addThis();
1671
1672status = inSection(227);
1673pattern = /abb\z/;
1674string = 'b\nca';
1675actualmatch = string.match(pattern);
1676expectedmatch = null;
1677addThis();
1678
1679status = inSection(228);
1680pattern = /abb$/;
1681string = 'b\nca';
1682actualmatch = string.match(pattern);
1683expectedmatch = null;
1684addThis();
1685
1686status = inSection(229);
1687pattern = /abb\Z/m;
1688string = 'ca\nb\n';
1689actualmatch = string.match(pattern);
1690expectedmatch = null;
1691addThis();
1692
1693status = inSection(230);
1694pattern = /abb\z/m;
1695string = 'ca\nb\n';
1696actualmatch = string.match(pattern);
1697expectedmatch = null;
1698addThis();
1699
1700status = inSection(231);
1701pattern = /abb$/m;
1702string = 'ca\nb\n';
1703actualmatch = string.match(pattern);
1704expectedmatch = null;
1705addThis();
1706
1707status = inSection(232);
1708pattern = /abb\Z/m;
1709string = 'b\nca\n';
1710actualmatch = string.match(pattern);
1711expectedmatch = null;
1712addThis();
1713
1714status = inSection(233);
1715pattern = /abb\z/m;
1716string = 'b\nca\n';
1717actualmatch = string.match(pattern);
1718expectedmatch = null;
1719addThis();
1720
1721status = inSection(234);
1722pattern = /abb$/m;
1723string = 'b\nca\n';
1724actualmatch = string.match(pattern);
1725expectedmatch = null;
1726addThis();
1727
1728status = inSection(235);
1729pattern = /abb\Z/m;
1730string = 'b\nca';
1731actualmatch = string.match(pattern);
1732expectedmatch = null;
1733addThis();
1734
1735status = inSection(236);
1736pattern = /abb\z/m;
1737string = 'b\nca';
1738actualmatch = string.match(pattern);
1739expectedmatch = null;
1740addThis();
1741
1742status = inSection(237);
1743pattern = /abb$/m;
1744string = 'b\nca';
1745actualmatch = string.match(pattern);
1746expectedmatch = null;
1747addThis();
1748
1749status = inSection(238);
1750pattern = /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/;
1751string = 'x';
1752actualmatch = string.match(pattern);
1753expectedmatch = null;
1754addThis();
1755
1756status = inSection(239);
1757pattern = /\GX.*X/;
1758string = 'aaaXbX';
1759actualmatch = string.match(pattern);
1760expectedmatch = null;
1761addThis();
1762
1763status = inSection(240);
1764pattern = /\.c(pp|xx|c)?$/i;
1765string = 'Changes';
1766actualmatch = string.match(pattern);
1767expectedmatch = null;
1768addThis();
1769
1770status = inSection(241);
1771pattern = /^([a-z]:)/;
1772string = 'C:/';
1773actualmatch = string.match(pattern);
1774expectedmatch = null;
1775addThis();
1776
1777status = inSection(242);
1778pattern = /(\w)?(abc)\1b/;
1779string = 'abcab';
1780actualmatch = string.match(pattern);
1781expectedmatch = null;
1782addThis();
1783
1784/* ECMA doesn't support (?(
1785status = inSection(243);
1786pattern = /^(a)?(?(1)a|b)+$/;
1787string = 'a';
1788actualmatch = string.match(pattern);
1789expectedmatch = null;
1790addThis();
1791*/
1792
1793
1794
1795//-----------------------------------------------------------------------------
1796test();
1797//-----------------------------------------------------------------------------
1798
1799
1800
1801function addThis()
1802{
1803  if(omitCurrentSection())
1804    return;
1805
1806  statusmessages[i] = status;
1807  patterns[i] = pattern;
1808  strings[i] = string;
1809  actualmatches[i] = actualmatch;
1810  expectedmatches[i] = expectedmatch;
1811  i++;
1812}
1813
1814
1815function omitCurrentSection()
1816{
1817  try
1818  {
1819    // current section number is in global status variable
1820    var n = status.match(/(\d+)/)[1];
1821    return ((n < cnLBOUND) || (n > cnUBOUND));
1822  }
1823  catch(e)
1824  {
1825    return false;
1826  }
1827}
1828
1829
1830function test()
1831{
1832  enterFunc ('test');
1833  printBugNumber (bug);
1834  printStatus (summary);
1835  testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
1836  exitFunc ('test');
1837}
1838