/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is JavaScript Engine testing utilities. * * The Initial Developer of the Original Code is * Netscape Communications Corp. * Portions created by the Initial Developer are Copyright (C) 2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * pschwartau@netscape.com, rogerl@netscape.com * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ /* * * Date: 2002-07-07 * SUMMARY: Testing JS RegExp engine against Perl 5 RegExp engine. * Adjust cnLBOUND, cnUBOUND below to restrict which sections are tested. * * This test was created by running various patterns and strings through the * Perl 5 RegExp engine. We saved the results below to test the JS engine. * * NOTE: ECMA/JS and Perl do differ on certain points. We have either commented * out such sections altogether, or modified them to fit what we expect from JS. * * EXAMPLES: * * - In JS, regexp captures (/(a) etc./) must hold |undefined| if not used. * See http://bugzilla.mozilla.org/show_bug.cgi?id=123437. * By contrast, in Perl, unmatched captures hold the empty string. * We have modified such sections accordingly. Example: pattern = /^([^a-z])|(\^)$/; string = '.'; actualmatch = string.match(pattern); //expectedmatch = Array('.', '.', ''); <<<--- Perl expectedmatch = Array('.', '.', undefined); <<<--- JS addThis(); * - In JS, you can't refer to a capture before it's encountered & completed * * - Perl supports ] & ^] inside a [], ECMA does not * * - ECMA does support (?: (?= and (?! operators, but doesn't support (?< etc. * * - ECMA doesn't support (?imsx or (?-imsx * * - ECMA doesn't support (?(condition) * * - Perl has \Z has end-of-line, ECMA doesn't * * - In ECMA, ^ matches only the empty string before the first character * * - In ECMA, $ matches only the empty string at end of input (unless multiline) * * - ECMA spec says that each atom in a range must be a single character * * - ECMA doesn't support \A * * - ECMA doesn't have rules for [: * */ //----------------------------------------------------------------------------- var gTestfile = 'perlstress-001.js'; var i = 0; var BUGNUMBER = 85721; var summary = 'Testing regular expression edge cases'; var cnSingleSpace = ' '; var status = ''; var statusmessages = new Array(); var pattern = ''; var patterns = new Array(); var string = ''; var strings = new Array(); var actualmatch = ''; var actualmatches = new Array(); var expectedmatch = ''; var expectedmatches = new Array(); var cnLBOUND = 1; var cnUBOUND = 1000; status = inSection(1); pattern = /abc/; string = 'abc'; actualmatch = string.match(pattern); expectedmatch = Array('abc'); addThis(); status = inSection(2); pattern = /abc/; string = 'xabcy'; actualmatch = string.match(pattern); expectedmatch = Array('abc'); addThis(); status = inSection(3); pattern = /abc/; string = 'ababc'; actualmatch = string.match(pattern); expectedmatch = Array('abc'); addThis(); status = inSection(4); pattern = /ab*c/; string = 'abc'; actualmatch = string.match(pattern); expectedmatch = Array('abc'); addThis(); status = inSection(5); pattern = /ab*bc/; string = 'abc'; actualmatch = string.match(pattern); expectedmatch = Array('abc'); addThis(); status = inSection(6); pattern = /ab*bc/; string = 'abbc'; actualmatch = string.match(pattern); expectedmatch = Array('abbc'); addThis(); status = inSection(7); pattern = /ab*bc/; string = 'abbbbc'; actualmatch = string.match(pattern); expectedmatch = Array('abbbbc'); addThis(); status = inSection(8); pattern = /.{1}/; string = 'abbbbc'; actualmatch = string.match(pattern); expectedmatch = Array('a'); addThis(); status = inSection(9); pattern = /.{3,4}/; string = 'abbbbc'; actualmatch = string.match(pattern); expectedmatch = Array('abbb'); addThis(); status = inSection(10); pattern = /ab{0,}bc/; string = 'abbbbc'; actualmatch = string.match(pattern); expectedmatch = Array('abbbbc'); addThis(); status = inSection(11); pattern = /ab+bc/; string = 'abbc'; actualmatch = string.match(pattern); expectedmatch = Array('abbc'); addThis(); status = inSection(12); pattern = /ab+bc/; string = 'abbbbc'; actualmatch = string.match(pattern); expectedmatch = Array('abbbbc'); addThis(); status = inSection(13); pattern = /ab{1,}bc/; string = 'abbbbc'; actualmatch = string.match(pattern); expectedmatch = Array('abbbbc'); addThis(); status = inSection(14); pattern = /ab{1,3}bc/; string = 'abbbbc'; actualmatch = string.match(pattern); expectedmatch = Array('abbbbc'); addThis(); status = inSection(15); pattern = /ab{3,4}bc/; string = 'abbbbc'; actualmatch = string.match(pattern); expectedmatch = Array('abbbbc'); addThis(); status = inSection(16); pattern = /ab?bc/; string = 'abbc'; actualmatch = string.match(pattern); expectedmatch = Array('abbc'); addThis(); status = inSection(17); pattern = /ab?bc/; string = 'abc'; actualmatch = string.match(pattern); expectedmatch = Array('abc'); addThis(); status = inSection(18); pattern = /ab{0,1}bc/; string = 'abc'; actualmatch = string.match(pattern); expectedmatch = Array('abc'); addThis(); status = inSection(19); pattern = /ab?c/; string = 'abc'; actualmatch = string.match(pattern); expectedmatch = Array('abc'); addThis(); status = inSection(20); pattern = /ab{0,1}c/; string = 'abc'; actualmatch = string.match(pattern); expectedmatch = Array('abc'); addThis(); status = inSection(21); pattern = /^abc$/; string = 'abc'; actualmatch = string.match(pattern); expectedmatch = Array('abc'); addThis(); status = inSection(22); pattern = /^abc/; string = 'abcc'; actualmatch = string.match(pattern); expectedmatch = Array('abc'); addThis(); status = inSection(23); pattern = /abc$/; string = 'aabc'; actualmatch = string.match(pattern); expectedmatch = Array('abc'); addThis(); status = inSection(24); pattern = /^/; string = 'abc'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); status = inSection(25); pattern = /$/; string = 'abc'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); status = inSection(26); pattern = /a.c/; string = 'abc'; actualmatch = string.match(pattern); expectedmatch = Array('abc'); addThis(); status = inSection(27); pattern = /a.c/; string = 'axc'; actualmatch = string.match(pattern); expectedmatch = Array('axc'); addThis(); status = inSection(28); pattern = /a.*c/; string = 'axyzc'; actualmatch = string.match(pattern); expectedmatch = Array('axyzc'); addThis(); status = inSection(29); pattern = /a[bc]d/; string = 'abd'; actualmatch = string.match(pattern); expectedmatch = Array('abd'); addThis(); status = inSection(30); pattern = /a[b-d]e/; string = 'ace'; actualmatch = string.match(pattern); expectedmatch = Array('ace'); addThis(); status = inSection(31); pattern = /a[b-d]/; string = 'aac'; actualmatch = string.match(pattern); expectedmatch = Array('ac'); addThis(); status = inSection(32); pattern = /a[-b]/; string = 'a-'; actualmatch = string.match(pattern); expectedmatch = Array('a-'); addThis(); status = inSection(33); pattern = /a[b-]/; string = 'a-'; actualmatch = string.match(pattern); expectedmatch = Array('a-'); addThis(); status = inSection(34); pattern = /a]/; string = 'a]'; actualmatch = string.match(pattern); expectedmatch = Array('a]'); addThis(); /* Perl supports ] & ^] inside a [], ECMA does not pattern = /a[]]b/; status = inSection(35); string = 'a]b'; actualmatch = string.match(pattern); expectedmatch = Array('a]b'); addThis(); */ status = inSection(36); pattern = /a[^bc]d/; string = 'aed'; actualmatch = string.match(pattern); expectedmatch = Array('aed'); addThis(); status = inSection(37); pattern = /a[^-b]c/; string = 'adc'; actualmatch = string.match(pattern); expectedmatch = Array('adc'); addThis(); /* Perl supports ] & ^] inside a [], ECMA does not status = inSection(38); pattern = /a[^]b]c/; string = 'adc'; actualmatch = string.match(pattern); expectedmatch = Array('adc'); addThis(); */ status = inSection(39); pattern = /\ba\b/; string = 'a-'; actualmatch = string.match(pattern); expectedmatch = Array('a'); addThis(); status = inSection(40); pattern = /\ba\b/; string = '-a'; actualmatch = string.match(pattern); expectedmatch = Array('a'); addThis(); status = inSection(41); pattern = /\ba\b/; string = '-a-'; actualmatch = string.match(pattern); expectedmatch = Array('a'); addThis(); status = inSection(42); pattern = /\By\b/; string = 'xy'; actualmatch = string.match(pattern); expectedmatch = Array('y'); addThis(); status = inSection(43); pattern = /\by\B/; string = 'yz'; actualmatch = string.match(pattern); expectedmatch = Array('y'); addThis(); status = inSection(44); pattern = /\By\B/; string = 'xyz'; actualmatch = string.match(pattern); expectedmatch = Array('y'); addThis(); status = inSection(45); pattern = /\w/; string = 'a'; actualmatch = string.match(pattern); expectedmatch = Array('a'); addThis(); status = inSection(46); pattern = /\W/; string = '-'; actualmatch = string.match(pattern); expectedmatch = Array('-'); addThis(); status = inSection(47); pattern = /a\Sb/; string = 'a-b'; actualmatch = string.match(pattern); expectedmatch = Array('a-b'); addThis(); status = inSection(48); pattern = /\d/; string = '1'; actualmatch = string.match(pattern); expectedmatch = Array('1'); addThis(); status = inSection(49); pattern = /\D/; string = '-'; actualmatch = string.match(pattern); expectedmatch = Array('-'); addThis(); status = inSection(50); pattern = /[\w]/; string = 'a'; actualmatch = string.match(pattern); expectedmatch = Array('a'); addThis(); status = inSection(51); pattern = /[\W]/; string = '-'; actualmatch = string.match(pattern); expectedmatch = Array('-'); addThis(); status = inSection(52); pattern = /a[\S]b/; string = 'a-b'; actualmatch = string.match(pattern); expectedmatch = Array('a-b'); addThis(); status = inSection(53); pattern = /[\d]/; string = '1'; actualmatch = string.match(pattern); expectedmatch = Array('1'); addThis(); status = inSection(54); pattern = /[\D]/; string = '-'; actualmatch = string.match(pattern); expectedmatch = Array('-'); addThis(); status = inSection(55); pattern = /ab|cd/; string = 'abc'; actualmatch = string.match(pattern); expectedmatch = Array('ab'); addThis(); status = inSection(56); pattern = /ab|cd/; string = 'abcd'; actualmatch = string.match(pattern); expectedmatch = Array('ab'); addThis(); status = inSection(57); pattern = /()ef/; string = 'def'; actualmatch = string.match(pattern); expectedmatch = Array('ef', ''); addThis(); status = inSection(58); pattern = /a\(b/; string = 'a(b'; actualmatch = string.match(pattern); expectedmatch = Array('a(b'); addThis(); status = inSection(59); pattern = /a\(*b/; string = 'ab'; actualmatch = string.match(pattern); expectedmatch = Array('ab'); addThis(); status = inSection(60); pattern = /a\(*b/; string = 'a((b'; actualmatch = string.match(pattern); expectedmatch = Array('a((b'); addThis(); status = inSection(61); pattern = /a\\b/; string = 'a\\b'; actualmatch = string.match(pattern); expectedmatch = Array('a\\b'); addThis(); status = inSection(62); pattern = /((a))/; string = 'abc'; actualmatch = string.match(pattern); expectedmatch = Array('a', 'a', 'a'); addThis(); status = inSection(63); pattern = /(a)b(c)/; string = 'abc'; actualmatch = string.match(pattern); expectedmatch = Array('abc', 'a', 'c'); addThis(); status = inSection(64); pattern = /a+b+c/; string = 'aabbabc'; actualmatch = string.match(pattern); expectedmatch = Array('abc'); addThis(); status = inSection(65); pattern = /a{1,}b{1,}c/; string = 'aabbabc'; actualmatch = string.match(pattern); expectedmatch = Array('abc'); addThis(); status = inSection(66); pattern = /a.+?c/; string = 'abcabc'; actualmatch = string.match(pattern); expectedmatch = Array('abc'); addThis(); status = inSection(67); pattern = /(a+|b)*/; string = 'ab'; actualmatch = string.match(pattern); expectedmatch = Array('ab', 'b'); addThis(); status = inSection(68); pattern = /(a+|b){0,}/; string = 'ab'; actualmatch = string.match(pattern); expectedmatch = Array('ab', 'b'); addThis(); status = inSection(69); pattern = /(a+|b)+/; string = 'ab'; actualmatch = string.match(pattern); expectedmatch = Array('ab', 'b'); addThis(); status = inSection(70); pattern = /(a+|b){1,}/; string = 'ab'; actualmatch = string.match(pattern); expectedmatch = Array('ab', 'b'); addThis(); status = inSection(71); pattern = /(a+|b)?/; string = 'ab'; actualmatch = string.match(pattern); expectedmatch = Array('a', 'a'); addThis(); status = inSection(72); pattern = /(a+|b){0,1}/; string = 'ab'; actualmatch = string.match(pattern); expectedmatch = Array('a', 'a'); addThis(); status = inSection(73); pattern = /[^ab]*/; string = 'cde'; actualmatch = string.match(pattern); expectedmatch = Array('cde'); addThis(); status = inSection(74); pattern = /([abc])*d/; string = 'abbbcd'; actualmatch = string.match(pattern); expectedmatch = Array('abbbcd', 'c'); addThis(); status = inSection(75); pattern = /([abc])*bcd/; string = 'abcd'; actualmatch = string.match(pattern); expectedmatch = Array('abcd', 'a'); addThis(); status = inSection(76); pattern = /a|b|c|d|e/; string = 'e'; actualmatch = string.match(pattern); expectedmatch = Array('e'); addThis(); status = inSection(77); pattern = /(a|b|c|d|e)f/; string = 'ef'; actualmatch = string.match(pattern); expectedmatch = Array('ef', 'e'); addThis(); status = inSection(78); pattern = /abcd*efg/; string = 'abcdefg'; actualmatch = string.match(pattern); expectedmatch = Array('abcdefg'); addThis(); status = inSection(79); pattern = /ab*/; string = 'xabyabbbz'; actualmatch = string.match(pattern); expectedmatch = Array('ab'); addThis(); status = inSection(80); pattern = /ab*/; string = 'xayabbbz'; actualmatch = string.match(pattern); expectedmatch = Array('a'); addThis(); status = inSection(81); pattern = /(ab|cd)e/; string = 'abcde'; actualmatch = string.match(pattern); expectedmatch = Array('cde', 'cd'); addThis(); status = inSection(82); pattern = /[abhgefdc]ij/; string = 'hij'; actualmatch = string.match(pattern); expectedmatch = Array('hij'); addThis(); status = inSection(83); pattern = /(abc|)ef/; string = 'abcdef'; actualmatch = string.match(pattern); expectedmatch = Array('ef', ''); addThis(); status = inSection(84); pattern = /(a|b)c*d/; string = 'abcd'; actualmatch = string.match(pattern); expectedmatch = Array('bcd', 'b'); addThis(); status = inSection(85); pattern = /(ab|ab*)bc/; string = 'abc'; actualmatch = string.match(pattern); expectedmatch = Array('abc', 'a'); addThis(); status = inSection(86); pattern = /a([bc]*)c*/; string = 'abc'; actualmatch = string.match(pattern); expectedmatch = Array('abc', 'bc'); addThis(); status = inSection(87); pattern = /a([bc]*)(c*d)/; string = 'abcd'; actualmatch = string.match(pattern); expectedmatch = Array('abcd', 'bc', 'd'); addThis(); status = inSection(88); pattern = /a([bc]+)(c*d)/; string = 'abcd'; actualmatch = string.match(pattern); expectedmatch = Array('abcd', 'bc', 'd'); addThis(); status = inSection(89); pattern = /a([bc]*)(c+d)/; string = 'abcd'; actualmatch = string.match(pattern); expectedmatch = Array('abcd', 'b', 'cd'); addThis(); status = inSection(90); pattern = /a[bcd]*dcdcde/; string = 'adcdcde'; actualmatch = string.match(pattern); expectedmatch = Array('adcdcde'); addThis(); status = inSection(91); pattern = /(ab|a)b*c/; string = 'abc'; actualmatch = string.match(pattern); expectedmatch = Array('abc', 'ab'); addThis(); status = inSection(92); pattern = /((a)(b)c)(d)/; string = 'abcd'; actualmatch = string.match(pattern); expectedmatch = Array('abcd', 'abc', 'a', 'b', 'd'); addThis(); status = inSection(93); pattern = /[a-zA-Z_][a-zA-Z0-9_]*/; string = 'alpha'; actualmatch = string.match(pattern); expectedmatch = Array('alpha'); addThis(); status = inSection(94); pattern = /^a(bc+|b[eh])g|.h$/; string = 'abh'; actualmatch = string.match(pattern); expectedmatch = Array('bh', undefined); addThis(); status = inSection(95); pattern = /(bc+d$|ef*g.|h?i(j|k))/; string = 'effgz'; actualmatch = string.match(pattern); expectedmatch = Array('effgz', 'effgz', undefined); addThis(); status = inSection(96); pattern = /(bc+d$|ef*g.|h?i(j|k))/; string = 'ij'; actualmatch = string.match(pattern); expectedmatch = Array('ij', 'ij', 'j'); addThis(); status = inSection(97); pattern = /(bc+d$|ef*g.|h?i(j|k))/; string = 'reffgz'; actualmatch = string.match(pattern); expectedmatch = Array('effgz', 'effgz', undefined); addThis(); status = inSection(98); pattern = /((((((((((a))))))))))/; string = 'a'; actualmatch = string.match(pattern); expectedmatch = Array('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'); addThis(); status = inSection(99); pattern = /((((((((((a))))))))))\10/; string = 'aa'; actualmatch = string.match(pattern); expectedmatch = Array('aa', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'); addThis(); status = inSection(100); pattern = /((((((((((a))))))))))/; string = 'a!'; actualmatch = string.match(pattern); expectedmatch = Array('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'); addThis(); status = inSection(101); pattern = /(((((((((a)))))))))/; string = 'a'; actualmatch = string.match(pattern); expectedmatch = Array('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'); addThis(); status = inSection(102); pattern = /(.*)c(.*)/; string = 'abcde'; actualmatch = string.match(pattern); expectedmatch = Array('abcde', 'ab', 'de'); addThis(); status = inSection(103); pattern = /abcd/; string = 'abcd'; actualmatch = string.match(pattern); expectedmatch = Array('abcd'); addThis(); status = inSection(104); pattern = /a(bc)d/; string = 'abcd'; actualmatch = string.match(pattern); expectedmatch = Array('abcd', 'bc'); addThis(); status = inSection(105); pattern = /a[-]?c/; string = 'ac'; actualmatch = string.match(pattern); expectedmatch = Array('ac'); addThis(); status = inSection(106); pattern = /(abc)\1/; string = 'abcabc'; actualmatch = string.match(pattern); expectedmatch = Array('abcabc', 'abc'); addThis(); status = inSection(107); pattern = /([a-c]*)\1/; string = 'abcabc'; actualmatch = string.match(pattern); expectedmatch = Array('abcabc', 'abc'); addThis(); status = inSection(108); pattern = /(a)|\1/; string = 'a'; actualmatch = string.match(pattern); expectedmatch = Array('a', 'a'); addThis(); status = inSection(109); pattern = /(([a-c])b*?\2)*/; string = 'ababbbcbc'; actualmatch = string.match(pattern); expectedmatch = Array('ababb', 'bb', 'b'); addThis(); status = inSection(110); pattern = /(([a-c])b*?\2){3}/; string = 'ababbbcbc'; actualmatch = string.match(pattern); expectedmatch = Array('ababbbcbc', 'cbc', 'c'); addThis(); /* Can't refer to a capture before it's encountered & completed status = inSection(111); pattern = /((\3|b)\2(a)x)+/; string = 'aaaxabaxbaaxbbax'; actualmatch = string.match(pattern); expectedmatch = Array('bbax', 'bbax', 'b', 'a'); addThis(); status = inSection(112); pattern = /((\3|b)\2(a)){2,}/; string = 'bbaababbabaaaaabbaaaabba'; actualmatch = string.match(pattern); expectedmatch = Array('bbaaaabba', 'bba', 'b', 'a'); addThis(); */ status = inSection(113); pattern = /abc/i; string = 'ABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC'); addThis(); status = inSection(114); pattern = /abc/i; string = 'XABCY'; actualmatch = string.match(pattern); expectedmatch = Array('ABC'); addThis(); status = inSection(115); pattern = /abc/i; string = 'ABABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC'); addThis(); status = inSection(116); pattern = /ab*c/i; string = 'ABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC'); addThis(); status = inSection(117); pattern = /ab*bc/i; string = 'ABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC'); addThis(); status = inSection(118); pattern = /ab*bc/i; string = 'ABBC'; actualmatch = string.match(pattern); expectedmatch = Array('ABBC'); addThis(); status = inSection(119); pattern = /ab*?bc/i; string = 'ABBBBC'; actualmatch = string.match(pattern); expectedmatch = Array('ABBBBC'); addThis(); status = inSection(120); pattern = /ab{0,}?bc/i; string = 'ABBBBC'; actualmatch = string.match(pattern); expectedmatch = Array('ABBBBC'); addThis(); status = inSection(121); pattern = /ab+?bc/i; string = 'ABBC'; actualmatch = string.match(pattern); expectedmatch = Array('ABBC'); addThis(); status = inSection(122); pattern = /ab+bc/i; string = 'ABBBBC'; actualmatch = string.match(pattern); expectedmatch = Array('ABBBBC'); addThis(); status = inSection(123); pattern = /ab{1,}?bc/i; string = 'ABBBBC'; actualmatch = string.match(pattern); expectedmatch = Array('ABBBBC'); addThis(); status = inSection(124); pattern = /ab{1,3}?bc/i; string = 'ABBBBC'; actualmatch = string.match(pattern); expectedmatch = Array('ABBBBC'); addThis(); status = inSection(125); pattern = /ab{3,4}?bc/i; string = 'ABBBBC'; actualmatch = string.match(pattern); expectedmatch = Array('ABBBBC'); addThis(); status = inSection(126); pattern = /ab??bc/i; string = 'ABBC'; actualmatch = string.match(pattern); expectedmatch = Array('ABBC'); addThis(); status = inSection(127); pattern = /ab??bc/i; string = 'ABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC'); addThis(); status = inSection(128); pattern = /ab{0,1}?bc/i; string = 'ABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC'); addThis(); status = inSection(129); pattern = /ab??c/i; string = 'ABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC'); addThis(); status = inSection(130); pattern = /ab{0,1}?c/i; string = 'ABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC'); addThis(); status = inSection(131); pattern = /^abc$/i; string = 'ABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC'); addThis(); status = inSection(132); pattern = /^abc/i; string = 'ABCC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC'); addThis(); status = inSection(133); pattern = /abc$/i; string = 'AABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC'); addThis(); status = inSection(134); pattern = /^/i; string = 'ABC'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); status = inSection(135); pattern = /$/i; string = 'ABC'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); status = inSection(136); pattern = /a.c/i; string = 'ABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC'); addThis(); status = inSection(137); pattern = /a.c/i; string = 'AXC'; actualmatch = string.match(pattern); expectedmatch = Array('AXC'); addThis(); status = inSection(138); pattern = /a.*?c/i; string = 'AXYZC'; actualmatch = string.match(pattern); expectedmatch = Array('AXYZC'); addThis(); status = inSection(139); pattern = /a[bc]d/i; string = 'ABD'; actualmatch = string.match(pattern); expectedmatch = Array('ABD'); addThis(); status = inSection(140); pattern = /a[b-d]e/i; string = 'ACE'; actualmatch = string.match(pattern); expectedmatch = Array('ACE'); addThis(); status = inSection(141); pattern = /a[b-d]/i; string = 'AAC'; actualmatch = string.match(pattern); expectedmatch = Array('AC'); addThis(); status = inSection(142); pattern = /a[-b]/i; string = 'A-'; actualmatch = string.match(pattern); expectedmatch = Array('A-'); addThis(); status = inSection(143); pattern = /a[b-]/i; string = 'A-'; actualmatch = string.match(pattern); expectedmatch = Array('A-'); addThis(); status = inSection(144); pattern = /a]/i; string = 'A]'; actualmatch = string.match(pattern); expectedmatch = Array('A]'); addThis(); /* Perl supports ] & ^] inside a [], ECMA does not status = inSection(145); pattern = /a[]]b/i; string = 'A]B'; actualmatch = string.match(pattern); expectedmatch = Array('A]B'); addThis(); */ status = inSection(146); pattern = /a[^bc]d/i; string = 'AED'; actualmatch = string.match(pattern); expectedmatch = Array('AED'); addThis(); status = inSection(147); pattern = /a[^-b]c/i; string = 'ADC'; actualmatch = string.match(pattern); expectedmatch = Array('ADC'); addThis(); /* Perl supports ] & ^] inside a [], ECMA does not status = inSection(148); pattern = /a[^]b]c/i; string = 'ADC'; actualmatch = string.match(pattern); expectedmatch = Array('ADC'); addThis(); */ status = inSection(149); pattern = /ab|cd/i; string = 'ABC'; actualmatch = string.match(pattern); expectedmatch = Array('AB'); addThis(); status = inSection(150); pattern = /ab|cd/i; string = 'ABCD'; actualmatch = string.match(pattern); expectedmatch = Array('AB'); addThis(); status = inSection(151); pattern = /()ef/i; string = 'DEF'; actualmatch = string.match(pattern); expectedmatch = Array('EF', ''); addThis(); status = inSection(152); pattern = /a\(b/i; string = 'A(B'; actualmatch = string.match(pattern); expectedmatch = Array('A(B'); addThis(); status = inSection(153); pattern = /a\(*b/i; string = 'AB'; actualmatch = string.match(pattern); expectedmatch = Array('AB'); addThis(); status = inSection(154); pattern = /a\(*b/i; string = 'A((B'; actualmatch = string.match(pattern); expectedmatch = Array('A((B'); addThis(); status = inSection(155); pattern = /a\\b/i; string = 'A\\B'; actualmatch = string.match(pattern); expectedmatch = Array('A\\B'); addThis(); status = inSection(156); pattern = /((a))/i; string = 'ABC'; actualmatch = string.match(pattern); expectedmatch = Array('A', 'A', 'A'); addThis(); status = inSection(157); pattern = /(a)b(c)/i; string = 'ABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC', 'A', 'C'); addThis(); status = inSection(158); pattern = /a+b+c/i; string = 'AABBABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC'); addThis(); status = inSection(159); pattern = /a{1,}b{1,}c/i; string = 'AABBABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC'); addThis(); status = inSection(160); pattern = /a.+?c/i; string = 'ABCABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC'); addThis(); status = inSection(161); pattern = /a.*?c/i; string = 'ABCABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC'); addThis(); status = inSection(162); pattern = /a.{0,5}?c/i; string = 'ABCABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC'); addThis(); status = inSection(163); pattern = /(a+|b)*/i; string = 'AB'; actualmatch = string.match(pattern); expectedmatch = Array('AB', 'B'); addThis(); status = inSection(164); pattern = /(a+|b){0,}/i; string = 'AB'; actualmatch = string.match(pattern); expectedmatch = Array('AB', 'B'); addThis(); status = inSection(165); pattern = /(a+|b)+/i; string = 'AB'; actualmatch = string.match(pattern); expectedmatch = Array('AB', 'B'); addThis(); status = inSection(166); pattern = /(a+|b){1,}/i; string = 'AB'; actualmatch = string.match(pattern); expectedmatch = Array('AB', 'B'); addThis(); status = inSection(167); pattern = /(a+|b)?/i; string = 'AB'; actualmatch = string.match(pattern); expectedmatch = Array('A', 'A'); addThis(); status = inSection(168); pattern = /(a+|b){0,1}/i; string = 'AB'; actualmatch = string.match(pattern); expectedmatch = Array('A', 'A'); addThis(); status = inSection(169); pattern = /(a+|b){0,1}?/i; string = 'AB'; actualmatch = string.match(pattern); expectedmatch = Array('', undefined); addThis(); status = inSection(170); pattern = /[^ab]*/i; string = 'CDE'; actualmatch = string.match(pattern); expectedmatch = Array('CDE'); addThis(); status = inSection(171); pattern = /([abc])*d/i; string = 'ABBBCD'; actualmatch = string.match(pattern); expectedmatch = Array('ABBBCD', 'C'); addThis(); status = inSection(172); pattern = /([abc])*bcd/i; string = 'ABCD'; actualmatch = string.match(pattern); expectedmatch = Array('ABCD', 'A'); addThis(); status = inSection(173); pattern = /a|b|c|d|e/i; string = 'E'; actualmatch = string.match(pattern); expectedmatch = Array('E'); addThis(); status = inSection(174); pattern = /(a|b|c|d|e)f/i; string = 'EF'; actualmatch = string.match(pattern); expectedmatch = Array('EF', 'E'); addThis(); status = inSection(175); pattern = /abcd*efg/i; string = 'ABCDEFG'; actualmatch = string.match(pattern); expectedmatch = Array('ABCDEFG'); addThis(); status = inSection(176); pattern = /ab*/i; string = 'XABYABBBZ'; actualmatch = string.match(pattern); expectedmatch = Array('AB'); addThis(); status = inSection(177); pattern = /ab*/i; string = 'XAYABBBZ'; actualmatch = string.match(pattern); expectedmatch = Array('A'); addThis(); status = inSection(178); pattern = /(ab|cd)e/i; string = 'ABCDE'; actualmatch = string.match(pattern); expectedmatch = Array('CDE', 'CD'); addThis(); status = inSection(179); pattern = /[abhgefdc]ij/i; string = 'HIJ'; actualmatch = string.match(pattern); expectedmatch = Array('HIJ'); addThis(); status = inSection(180); pattern = /(abc|)ef/i; string = 'ABCDEF'; actualmatch = string.match(pattern); expectedmatch = Array('EF', ''); addThis(); status = inSection(181); pattern = /(a|b)c*d/i; string = 'ABCD'; actualmatch = string.match(pattern); expectedmatch = Array('BCD', 'B'); addThis(); status = inSection(182); pattern = /(ab|ab*)bc/i; string = 'ABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC', 'A'); addThis(); status = inSection(183); pattern = /a([bc]*)c*/i; string = 'ABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC', 'BC'); addThis(); status = inSection(184); pattern = /a([bc]*)(c*d)/i; string = 'ABCD'; actualmatch = string.match(pattern); expectedmatch = Array('ABCD', 'BC', 'D'); addThis(); status = inSection(185); pattern = /a([bc]+)(c*d)/i; string = 'ABCD'; actualmatch = string.match(pattern); expectedmatch = Array('ABCD', 'BC', 'D'); addThis(); status = inSection(186); pattern = /a([bc]*)(c+d)/i; string = 'ABCD'; actualmatch = string.match(pattern); expectedmatch = Array('ABCD', 'B', 'CD'); addThis(); status = inSection(187); pattern = /a[bcd]*dcdcde/i; string = 'ADCDCDE'; actualmatch = string.match(pattern); expectedmatch = Array('ADCDCDE'); addThis(); status = inSection(188); pattern = /(ab|a)b*c/i; string = 'ABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABC', 'AB'); addThis(); status = inSection(189); pattern = /((a)(b)c)(d)/i; string = 'ABCD'; actualmatch = string.match(pattern); expectedmatch = Array('ABCD', 'ABC', 'A', 'B', 'D'); addThis(); status = inSection(190); pattern = /[a-zA-Z_][a-zA-Z0-9_]*/i; string = 'ALPHA'; actualmatch = string.match(pattern); expectedmatch = Array('ALPHA'); addThis(); status = inSection(191); pattern = /^a(bc+|b[eh])g|.h$/i; string = 'ABH'; actualmatch = string.match(pattern); expectedmatch = Array('BH', undefined); addThis(); status = inSection(192); pattern = /(bc+d$|ef*g.|h?i(j|k))/i; string = 'EFFGZ'; actualmatch = string.match(pattern); expectedmatch = Array('EFFGZ', 'EFFGZ', undefined); addThis(); status = inSection(193); pattern = /(bc+d$|ef*g.|h?i(j|k))/i; string = 'IJ'; actualmatch = string.match(pattern); expectedmatch = Array('IJ', 'IJ', 'J'); addThis(); status = inSection(194); pattern = /(bc+d$|ef*g.|h?i(j|k))/i; string = 'REFFGZ'; actualmatch = string.match(pattern); expectedmatch = Array('EFFGZ', 'EFFGZ', undefined); addThis(); status = inSection(195); pattern = /((((((((((a))))))))))/i; string = 'A'; actualmatch = string.match(pattern); expectedmatch = Array('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'); addThis(); status = inSection(196); pattern = /((((((((((a))))))))))\10/i; string = 'AA'; actualmatch = string.match(pattern); expectedmatch = Array('AA', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'); addThis(); status = inSection(197); pattern = /((((((((((a))))))))))/i; string = 'A!'; actualmatch = string.match(pattern); expectedmatch = Array('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'); addThis(); status = inSection(198); pattern = /(((((((((a)))))))))/i; string = 'A'; actualmatch = string.match(pattern); expectedmatch = Array('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'); addThis(); status = inSection(199); pattern = /(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i; string = 'A'; actualmatch = string.match(pattern); expectedmatch = Array('A', 'A'); addThis(); status = inSection(200); pattern = /(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i; string = 'C'; actualmatch = string.match(pattern); expectedmatch = Array('C', 'C'); addThis(); status = inSection(201); pattern = /(.*)c(.*)/i; string = 'ABCDE'; actualmatch = string.match(pattern); expectedmatch = Array('ABCDE', 'AB', 'DE'); addThis(); status = inSection(202); pattern = /abcd/i; string = 'ABCD'; actualmatch = string.match(pattern); expectedmatch = Array('ABCD'); addThis(); status = inSection(203); pattern = /a(bc)d/i; string = 'ABCD'; actualmatch = string.match(pattern); expectedmatch = Array('ABCD', 'BC'); addThis(); status = inSection(204); pattern = /a[-]?c/i; string = 'AC'; actualmatch = string.match(pattern); expectedmatch = Array('AC'); addThis(); status = inSection(205); pattern = /(abc)\1/i; string = 'ABCABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABCABC', 'ABC'); addThis(); status = inSection(206); pattern = /([a-c]*)\1/i; string = 'ABCABC'; actualmatch = string.match(pattern); expectedmatch = Array('ABCABC', 'ABC'); addThis(); status = inSection(207); pattern = /a(?!b)./; string = 'abad'; actualmatch = string.match(pattern); expectedmatch = Array('ad'); addThis(); status = inSection(208); pattern = /a(?=d)./; string = 'abad'; actualmatch = string.match(pattern); expectedmatch = Array('ad'); addThis(); status = inSection(209); pattern = /a(?=c|d)./; string = 'abad'; actualmatch = string.match(pattern); expectedmatch = Array('ad'); addThis(); status = inSection(210); pattern = /a(?:b|c|d)(.)/; string = 'ace'; actualmatch = string.match(pattern); expectedmatch = Array('ace', 'e'); addThis(); status = inSection(211); pattern = /a(?:b|c|d)*(.)/; string = 'ace'; actualmatch = string.match(pattern); expectedmatch = Array('ace', 'e'); addThis(); status = inSection(212); pattern = /a(?:b|c|d)+?(.)/; string = 'ace'; actualmatch = string.match(pattern); expectedmatch = Array('ace', 'e'); addThis(); status = inSection(213); pattern = /a(?:b|c|d)+?(.)/; string = 'acdbcdbe'; actualmatch = string.match(pattern); expectedmatch = Array('acd', 'd'); addThis(); status = inSection(214); pattern = /a(?:b|c|d)+(.)/; string = 'acdbcdbe'; actualmatch = string.match(pattern); expectedmatch = Array('acdbcdbe', 'e'); addThis(); status = inSection(215); pattern = /a(?:b|c|d){2}(.)/; string = 'acdbcdbe'; actualmatch = string.match(pattern); expectedmatch = Array('acdb', 'b'); addThis(); status = inSection(216); pattern = /a(?:b|c|d){4,5}(.)/; string = 'acdbcdbe'; actualmatch = string.match(pattern); expectedmatch = Array('acdbcdb', 'b'); addThis(); status = inSection(217); pattern = /a(?:b|c|d){4,5}?(.)/; string = 'acdbcdbe'; actualmatch = string.match(pattern); expectedmatch = Array('acdbcd', 'd'); addThis(); // MODIFIED - ECMA has different rules for paren contents status = inSection(218); pattern = /((foo)|(bar))*/; string = 'foobar'; actualmatch = string.match(pattern); //expectedmatch = Array('foobar', 'bar', 'foo', 'bar'); expectedmatch = Array('foobar', 'bar', undefined, 'bar'); addThis(); status = inSection(219); pattern = /a(?:b|c|d){6,7}(.)/; string = 'acdbcdbe'; actualmatch = string.match(pattern); expectedmatch = Array('acdbcdbe', 'e'); addThis(); status = inSection(220); pattern = /a(?:b|c|d){6,7}?(.)/; string = 'acdbcdbe'; actualmatch = string.match(pattern); expectedmatch = Array('acdbcdbe', 'e'); addThis(); status = inSection(221); pattern = /a(?:b|c|d){5,6}(.)/; string = 'acdbcdbe'; actualmatch = string.match(pattern); expectedmatch = Array('acdbcdbe', 'e'); addThis(); status = inSection(222); pattern = /a(?:b|c|d){5,6}?(.)/; string = 'acdbcdbe'; actualmatch = string.match(pattern); expectedmatch = Array('acdbcdb', 'b'); addThis(); status = inSection(223); pattern = /a(?:b|c|d){5,7}(.)/; string = 'acdbcdbe'; actualmatch = string.match(pattern); expectedmatch = Array('acdbcdbe', 'e'); addThis(); status = inSection(224); pattern = /a(?:b|c|d){5,7}?(.)/; string = 'acdbcdbe'; actualmatch = string.match(pattern); expectedmatch = Array('acdbcdb', 'b'); addThis(); status = inSection(225); pattern = /a(?:b|(c|e){1,2}?|d)+?(.)/; string = 'ace'; actualmatch = string.match(pattern); expectedmatch = Array('ace', 'c', 'e'); addThis(); status = inSection(226); pattern = /^(.+)?B/; string = 'AB'; actualmatch = string.match(pattern); expectedmatch = Array('AB', 'A'); addThis(); /* MODIFIED - ECMA has different rules for paren contents */ status = inSection(227); pattern = /^([^a-z])|(\^)$/; string = '.'; actualmatch = string.match(pattern); //expectedmatch = Array('.', '.', ''); expectedmatch = Array('.', '.', undefined); addThis(); status = inSection(228); pattern = /^[<>]&/; string = '<&OUT'; actualmatch = string.match(pattern); expectedmatch = Array('<&'); addThis(); /* Can't refer to a capture before it's encountered & completed status = inSection(229); pattern = /^(a\1?){4}$/; string = 'aaaaaaaaaa'; actualmatch = string.match(pattern); expectedmatch = Array('aaaaaaaaaa', 'aaaa'); addThis(); status = inSection(230); pattern = /^(a(?(1)\1)){4}$/; string = 'aaaaaaaaaa'; actualmatch = string.match(pattern); expectedmatch = Array('aaaaaaaaaa', 'aaaa'); addThis(); */ status = inSection(231); pattern = /((a{4})+)/; string = 'aaaaaaaaa'; actualmatch = string.match(pattern); expectedmatch = Array('aaaaaaaa', 'aaaaaaaa', 'aaaa'); addThis(); status = inSection(232); pattern = /(((aa){2})+)/; string = 'aaaaaaaaaa'; actualmatch = string.match(pattern); expectedmatch = Array('aaaaaaaa', 'aaaaaaaa', 'aaaa', 'aa'); addThis(); status = inSection(233); pattern = /(((a{2}){2})+)/; string = 'aaaaaaaaaa'; actualmatch = string.match(pattern); expectedmatch = Array('aaaaaaaa', 'aaaaaaaa', 'aaaa', 'aa'); addThis(); status = inSection(234); pattern = /(?:(f)(o)(o)|(b)(a)(r))*/; string = 'foobar'; actualmatch = string.match(pattern); //expectedmatch = Array('foobar', 'f', 'o', 'o', 'b', 'a', 'r'); expectedmatch = Array('foobar', undefined, undefined, undefined, 'b', 'a', 'r'); addThis(); /* ECMA supports (?: (?= and (?! but doesn't support (?< etc. status = inSection(235); pattern = /(?<=a)b/; string = 'ab'; actualmatch = string.match(pattern); expectedmatch = Array('b'); addThis(); status = inSection(236); pattern = /(? status = inSection(311); pattern = /(?>a+)b/; string = 'aaab'; actualmatch = string.match(pattern); expectedmatch = Array('aaab'); addThis(); */ status = inSection(312); pattern = /([[:]+)/; string = 'a:[b]:'; actualmatch = string.match(pattern); expectedmatch = Array(':[', ':['); addThis(); status = inSection(313); pattern = /([[=]+)/; string = 'a=[b]='; actualmatch = string.match(pattern); expectedmatch = Array('=[', '=['); addThis(); status = inSection(314); pattern = /([[.]+)/; string = 'a.[b].'; actualmatch = string.match(pattern); expectedmatch = Array('.[', '.['); addThis(); /* ECMA doesn't have rules for [: status = inSection(315); pattern = /[a[:]b[:c]/; string = 'abc'; actualmatch = string.match(pattern); expectedmatch = Array('abc'); addThis(); */ /* ECMA doesn't support (?> status = inSection(316); pattern = /((?>a+)b)/; string = 'aaab'; actualmatch = string.match(pattern); expectedmatch = Array('aaab', 'aaab'); addThis(); status = inSection(317); pattern = /(?>(a+))b/; string = 'aaab'; actualmatch = string.match(pattern); expectedmatch = Array('aaab', 'aaa'); addThis(); status = inSection(318); pattern = /((?>[^()]+)|\([^()]*\))+/; string = '((abc(ade)ufh()()x'; actualmatch = string.match(pattern); expectedmatch = Array('abc(ade)ufh()()x', 'x'); addThis(); */ /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(319); pattern = /\Z/; string = 'a\nb\n'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); status = inSection(320); pattern = /\z/; string = 'a\nb\n'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); */ status = inSection(321); pattern = /$/; string = 'a\nb\n'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(322); pattern = /\Z/; string = 'b\na\n'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); status = inSection(323); pattern = /\z/; string = 'b\na\n'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); */ status = inSection(324); pattern = /$/; string = 'b\na\n'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(325); pattern = /\Z/; string = 'b\na'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); status = inSection(326); pattern = /\z/; string = 'b\na'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); */ status = inSection(327); pattern = /$/; string = 'b\na'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(328); pattern = /\Z/m; string = 'a\nb\n'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); status = inSection(329); pattern = /\z/m; string = 'a\nb\n'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); */ status = inSection(330); pattern = /$/m; string = 'a\nb\n'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(331); pattern = /\Z/m; string = 'b\na\n'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); status = inSection(332); pattern = /\z/m; string = 'b\na\n'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); */ status = inSection(333); pattern = /$/m; string = 'b\na\n'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(334); pattern = /\Z/m; string = 'b\na'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); status = inSection(335); pattern = /\z/m; string = 'b\na'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); */ status = inSection(336); pattern = /$/m; string = 'b\na'; actualmatch = string.match(pattern); expectedmatch = Array(''); addThis(); /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(337); pattern = /a\Z/; string = 'b\na\n'; actualmatch = string.match(pattern); expectedmatch = Array('a'); addThis(); */ /* $ only matches end of input unless multiline status = inSection(338); pattern = /a$/; string = 'b\na\n'; actualmatch = string.match(pattern); expectedmatch = Array('a'); addThis(); */ /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(339); pattern = /a\Z/; string = 'b\na'; actualmatch = string.match(pattern); expectedmatch = Array('a'); addThis(); status = inSection(340); pattern = /a\z/; string = 'b\na'; actualmatch = string.match(pattern); expectedmatch = Array('a'); addThis(); */ status = inSection(341); pattern = /a$/; string = 'b\na'; actualmatch = string.match(pattern); expectedmatch = Array('a'); addThis(); status = inSection(342); pattern = /a$/m; string = 'a\nb\n'; actualmatch = string.match(pattern); expectedmatch = Array('a'); addThis(); /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(343); pattern = /a\Z/m; string = 'b\na\n'; actualmatch = string.match(pattern); expectedmatch = Array('a'); addThis(); */ status = inSection(344); pattern = /a$/m; string = 'b\na\n'; actualmatch = string.match(pattern); expectedmatch = Array('a'); addThis(); /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(345); pattern = /a\Z/m; string = 'b\na'; actualmatch = string.match(pattern); expectedmatch = Array('a'); addThis(); status = inSection(346); pattern = /a\z/m; string = 'b\na'; actualmatch = string.match(pattern); expectedmatch = Array('a'); addThis(); */ status = inSection(347); pattern = /a$/m; string = 'b\na'; actualmatch = string.match(pattern); expectedmatch = Array('a'); addThis(); /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(348); pattern = /aa\Z/; string = 'b\naa\n'; actualmatch = string.match(pattern); expectedmatch = Array('aa'); addThis(); */ /* $ only matches end of input unless multiline status = inSection(349); pattern = /aa$/; string = 'b\naa\n'; actualmatch = string.match(pattern); expectedmatch = Array('aa'); addThis(); */ /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(350); pattern = /aa\Z/; string = 'b\naa'; actualmatch = string.match(pattern); expectedmatch = Array('aa'); addThis(); status = inSection(351); pattern = /aa\z/; string = 'b\naa'; actualmatch = string.match(pattern); expectedmatch = Array('aa'); addThis(); */ status = inSection(352); pattern = /aa$/; string = 'b\naa'; actualmatch = string.match(pattern); expectedmatch = Array('aa'); addThis(); status = inSection(353); pattern = /aa$/m; string = 'aa\nb\n'; actualmatch = string.match(pattern); expectedmatch = Array('aa'); addThis(); /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(354); pattern = /aa\Z/m; string = 'b\naa\n'; actualmatch = string.match(pattern); expectedmatch = Array('aa'); addThis(); */ status = inSection(355); pattern = /aa$/m; string = 'b\naa\n'; actualmatch = string.match(pattern); expectedmatch = Array('aa'); addThis(); /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(356); pattern = /aa\Z/m; string = 'b\naa'; actualmatch = string.match(pattern); expectedmatch = Array('aa'); addThis(); status = inSection(357); pattern = /aa\z/m; string = 'b\naa'; actualmatch = string.match(pattern); expectedmatch = Array('aa'); addThis(); */ status = inSection(358); pattern = /aa$/m; string = 'b\naa'; actualmatch = string.match(pattern); expectedmatch = Array('aa'); addThis(); /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(359); pattern = /ab\Z/; string = 'b\nab\n'; actualmatch = string.match(pattern); expectedmatch = Array('ab'); addThis(); */ /* $ only matches end of input unless multiline status = inSection(360); pattern = /ab$/; string = 'b\nab\n'; actualmatch = string.match(pattern); expectedmatch = Array('ab'); addThis(); */ /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(361); pattern = /ab\Z/; string = 'b\nab'; actualmatch = string.match(pattern); expectedmatch = Array('ab'); addThis(); status = inSection(362); pattern = /ab\z/; string = 'b\nab'; actualmatch = string.match(pattern); expectedmatch = Array('ab'); addThis(); */ status = inSection(363); pattern = /ab$/; string = 'b\nab'; actualmatch = string.match(pattern); expectedmatch = Array('ab'); addThis(); status = inSection(364); pattern = /ab$/m; string = 'ab\nb\n'; actualmatch = string.match(pattern); expectedmatch = Array('ab'); addThis(); /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(365); pattern = /ab\Z/m; string = 'b\nab\n'; actualmatch = string.match(pattern); expectedmatch = Array('ab'); addThis(); */ status = inSection(366); pattern = /ab$/m; string = 'b\nab\n'; actualmatch = string.match(pattern); expectedmatch = Array('ab'); addThis(); /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(367); pattern = /ab\Z/m; string = 'b\nab'; actualmatch = string.match(pattern); expectedmatch = Array('ab'); addThis(); status = inSection(368); pattern = /ab\z/m; string = 'b\nab'; actualmatch = string.match(pattern); expectedmatch = Array('ab'); addThis(); */ status = inSection(369); pattern = /ab$/m; string = 'b\nab'; actualmatch = string.match(pattern); expectedmatch = Array('ab'); addThis(); /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(370); pattern = /abb\Z/; string = 'b\nabb\n'; actualmatch = string.match(pattern); expectedmatch = Array('abb'); addThis(); */ /* $ only matches end of input unless multiline status = inSection(371); pattern = /abb$/; string = 'b\nabb\n'; actualmatch = string.match(pattern); expectedmatch = Array('abb'); addThis(); */ /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(372); pattern = /abb\Z/; string = 'b\nabb'; actualmatch = string.match(pattern); expectedmatch = Array('abb'); addThis(); status = inSection(373); pattern = /abb\z/; string = 'b\nabb'; actualmatch = string.match(pattern); expectedmatch = Array('abb'); addThis(); */ status = inSection(374); pattern = /abb$/; string = 'b\nabb'; actualmatch = string.match(pattern); expectedmatch = Array('abb'); addThis(); status = inSection(375); pattern = /abb$/m; string = 'abb\nb\n'; actualmatch = string.match(pattern); expectedmatch = Array('abb'); addThis(); /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(376); pattern = /abb\Z/m; string = 'b\nabb\n'; actualmatch = string.match(pattern); expectedmatch = Array('abb'); addThis(); */ status = inSection(377); pattern = /abb$/m; string = 'b\nabb\n'; actualmatch = string.match(pattern); expectedmatch = Array('abb'); addThis(); /* Perl has \Z has end-of-line, ECMA doesn't status = inSection(378); pattern = /abb\Z/m; string = 'b\nabb'; actualmatch = string.match(pattern); expectedmatch = Array('abb'); addThis(); status = inSection(379); pattern = /abb\z/m; string = 'b\nabb'; actualmatch = string.match(pattern); expectedmatch = Array('abb'); addThis(); */ status = inSection(380); pattern = /abb$/m; string = 'b\nabb'; actualmatch = string.match(pattern); expectedmatch = Array('abb'); addThis(); status = inSection(381); pattern = /(^|x)(c)/; string = 'ca'; actualmatch = string.match(pattern); expectedmatch = Array('c', '', 'c'); addThis(); status = inSection(382); pattern = /foo.bart/; string = 'foo.bart'; actualmatch = string.match(pattern); expectedmatch = Array('foo.bart'); addThis(); status = inSection(383); pattern = /^d[x][x][x]/m; string = 'abcd\ndxxx'; actualmatch = string.match(pattern); expectedmatch = Array('dxxx'); addThis(); status = inSection(384); pattern = /tt+$/; string = 'xxxtt'; actualmatch = string.match(pattern); expectedmatch = Array('tt'); addThis(); /* ECMA spec says that each atom in a range must be a single character status = inSection(385); pattern = /([a-\d]+)/; string = 'za-9z'; actualmatch = string.match(pattern); expectedmatch = Array('9', '9'); addThis(); status = inSection(386); pattern = /([\d-z]+)/; string = 'a0-za'; actualmatch = string.match(pattern); expectedmatch = Array('0-z', '0-z'); addThis(); */ /* ECMA doesn't support [: status = inSection(387); pattern = /([a-[:digit:]]+)/; string = 'za-9z'; actualmatch = string.match(pattern); expectedmatch = Array('a-9', 'a-9'); addThis(); status = inSection(388); pattern = /([[:digit:]-z]+)/; string = '=0-z='; actualmatch = string.match(pattern); expectedmatch = Array('0-z', '0-z'); addThis(); status = inSection(389); pattern = /([[:digit:]-[:alpha:]]+)/; string = '=0-z='; actualmatch = string.match(pattern); expectedmatch = Array('0-z', '0-z'); addThis(); */ status = inSection(390); pattern = /(\d+\.\d+)/; string = '3.1415926'; actualmatch = string.match(pattern); expectedmatch = Array('3.1415926', '3.1415926'); addThis(); status = inSection(391); pattern = /\.c(pp|xx|c)?$/i; string = 'IO.c'; actualmatch = string.match(pattern); expectedmatch = Array('.c', undefined); addThis(); status = inSection(392); pattern = /(\.c(pp|xx|c)?$)/i; string = 'IO.c'; actualmatch = string.match(pattern); expectedmatch = Array('.c', '.c', undefined); addThis(); status = inSection(393); pattern = /(^|a)b/; string = 'ab'; actualmatch = string.match(pattern); expectedmatch = Array('ab', 'a'); addThis(); status = inSection(394); pattern = /^([ab]*?)(b)?(c)$/; string = 'abac'; actualmatch = string.match(pattern); expectedmatch = Array('abac', 'aba', undefined, 'c'); addThis(); status = inSection(395); pattern = /^(?:.,){2}c/i; string = 'a,b,c'; actualmatch = string.match(pattern); expectedmatch = Array('a,b,c'); addThis(); status = inSection(396); pattern = /^(.,){2}c/i; string = 'a,b,c'; actualmatch = string.match(pattern); expectedmatch = Array('a,b,c', 'b,'); addThis(); status = inSection(397); pattern = /^(?:[^,]*,){2}c/; string = 'a,b,c'; actualmatch = string.match(pattern); expectedmatch = Array('a,b,c'); addThis(); status = inSection(398); pattern = /^([^,]*,){2}c/; string = 'a,b,c'; actualmatch = string.match(pattern); expectedmatch = Array('a,b,c', 'b,'); addThis(); status = inSection(399); pattern = /^([^,]*,){3}d/; string = 'aaa,b,c,d'; actualmatch = string.match(pattern); expectedmatch = Array('aaa,b,c,d', 'c,'); addThis(); status = inSection(400); pattern = /^([^,]*,){3,}d/; string = 'aaa,b,c,d'; actualmatch = string.match(pattern); expectedmatch = Array('aaa,b,c,d', 'c,'); addThis(); status = inSection(401); pattern = /^([^,]*,){0,3}d/; string = 'aaa,b,c,d'; actualmatch = string.match(pattern); expectedmatch = Array('aaa,b,c,d', 'c,'); addThis(); status = inSection(402); pattern = /^([^,]{1,3},){3}d/i; string = 'aaa,b,c,d'; actualmatch = string.match(pattern); expectedmatch = Array('aaa,b,c,d', 'c,'); addThis(); status = inSection(403); pattern = /^([^,]{1,3},){3,}d/; string = 'aaa,b,c,d'; actualmatch = string.match(pattern); expectedmatch = Array('aaa,b,c,d', 'c,'); addThis(); status = inSection(404); pattern = /^([^,]{1,3},){0,3}d/; string = 'aaa,b,c,d'; actualmatch = string.match(pattern); expectedmatch = Array('aaa,b,c,d', 'c,'); addThis(); status = inSection(405); pattern = /^([^,]{1,},){3}d/; string = 'aaa,b,c,d'; actualmatch = string.match(pattern); expectedmatch = Array('aaa,b,c,d', 'c,'); addThis(); status = inSection(406); pattern = /^([^,]{1,},){3,}d/; string = 'aaa,b,c,d'; actualmatch = string.match(pattern); expectedmatch = Array('aaa,b,c,d', 'c,'); addThis(); status = inSection(407); pattern = /^([^,]{1,},){0,3}d/; string = 'aaa,b,c,d'; actualmatch = string.match(pattern); expectedmatch = Array('aaa,b,c,d', 'c,'); addThis(); status = inSection(408); pattern = /^([^,]{0,3},){3}d/i; string = 'aaa,b,c,d'; actualmatch = string.match(pattern); expectedmatch = Array('aaa,b,c,d', 'c,'); addThis(); status = inSection(409); pattern = /^([^,]{0,3},){3,}d/; string = 'aaa,b,c,d'; actualmatch = string.match(pattern); expectedmatch = Array('aaa,b,c,d', 'c,'); addThis(); status = inSection(410); pattern = /^([^,]{0,3},){0,3}d/; string = 'aaa,b,c,d'; actualmatch = string.match(pattern); expectedmatch = Array('aaa,b,c,d', 'c,'); addThis(); /* ECMA doesn't support \A status = inSection(411); pattern = /(?!\A)x/m; string = 'a\nxb\n'; actualmatch = string.match(pattern); expectedmatch = Array('\n'); addThis(); */ status = inSection(412); pattern = /^(a(b)?)+$/; string = 'aba'; actualmatch = string.match(pattern); expectedmatch = Array('aba', 'a', undefined); addThis(); status = inSection(413); pattern = /^(aa(bb)?)+$/; string = 'aabbaa'; actualmatch = string.match(pattern); expectedmatch = Array('aabbaa', 'aa', undefined); addThis(); status = inSection(414); pattern = /^.{9}abc.*\n/m; string = '123\nabcabcabcabc\n'; actualmatch = string.match(pattern); expectedmatch = Array('abcabcabcabc\n'); addThis(); status = inSection(415); pattern = /^(a)?a$/; string = 'a'; actualmatch = string.match(pattern); expectedmatch = Array('a', undefined); addThis(); status = inSection(416); pattern = /^(a\1?)(a\1?)(a\2?)(a\3?)$/; string = 'aaaaaa'; actualmatch = string.match(pattern); expectedmatch = Array('aaaaaa', 'a', 'aa', 'a', 'aa'); addThis(); /* Can't refer to a capture before it's encountered & completed status = inSection(417); pattern = /^(a\1?){4}$/; string = 'aaaaaa'; actualmatch = string.match(pattern); expectedmatch = Array('aaaaaa', 'aaa'); addThis(); */ status = inSection(418); pattern = /^(0+)?(?:x(1))?/; string = 'x1'; actualmatch = string.match(pattern); expectedmatch = Array('x1', undefined, '1'); addThis(); status = inSection(419); pattern = /^([0-9a-fA-F]+)(?:x([0-9a-fA-F]+)?)(?:x([0-9a-fA-F]+))?/; string = '012cxx0190'; actualmatch = string.match(pattern); expectedmatch = Array('012cxx0190', '012c', undefined, '0190'); addThis(); status = inSection(420); pattern = /^(b+?|a){1,2}c/; string = 'bbbac'; actualmatch = string.match(pattern); expectedmatch = Array('bbbac', 'a'); addThis(); status = inSection(421); pattern = /^(b+?|a){1,2}c/; string = 'bbbbac'; actualmatch = string.match(pattern); expectedmatch = Array('bbbbac', 'a'); addThis(); status = inSection(422); pattern = /((?:aaaa|bbbb)cccc)?/; string = 'aaaacccc'; actualmatch = string.match(pattern); expectedmatch = Array('aaaacccc', 'aaaacccc'); addThis(); status = inSection(423); pattern = /((?:aaaa|bbbb)cccc)?/; string = 'bbbbcccc'; actualmatch = string.match(pattern); expectedmatch = Array('bbbbcccc', 'bbbbcccc'); addThis(); //----------------------------------------------------------------------------- test(); //----------------------------------------------------------------------------- function addThis() { if(omitCurrentSection()) return; statusmessages[i] = status; patterns[i] = pattern; strings[i] = string; actualmatches[i] = actualmatch; expectedmatches[i] = expectedmatch; i++; } function omitCurrentSection() { try { // current section number is in global status variable var n = status.match(/(\d+)/)[1]; return ((n < cnLBOUND) || (n > cnUBOUND)); } catch(e) { return false; } } function test() { enterFunc ('test'); printBugNumber(BUGNUMBER); printStatus (summary); testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches); exitFunc ('test'); }