michael@0: /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: /* michael@0: * michael@0: * Date: 12 December 2003 michael@0: * SUMMARY: Testing regexps with unescaped braces michael@0: * See http://bugzilla.mozilla.org/show_bug.cgi?id=228087 michael@0: * michael@0: * Note: unbalanced, unescaped braces are not permitted by ECMA-262 Ed.3, michael@0: * but we decided to follow Perl and IE and allow this for compatibility. michael@0: * michael@0: * See http://bugzilla.mozilla.org/show_bug.cgi?id=188206 and its testcase. michael@0: * See http://bugzilla.mozilla.org/show_bug.cgi?id=223273 and its testcase. michael@0: */ michael@0: //----------------------------------------------------------------------------- michael@0: var i = 0; michael@0: var BUGNUMBER = 228087; michael@0: var summary = 'Testing regexps with unescaped braces'; michael@0: var status = ''; michael@0: var statusmessages = new Array(); michael@0: var pattern = ''; michael@0: var patterns = new Array(); michael@0: var string = ''; michael@0: var strings = new Array(); michael@0: var actualmatch = ''; michael@0: var actualmatches = new Array(); michael@0: var expectedmatch = ''; michael@0: var expectedmatches = new Array(); michael@0: var e; michael@0: michael@0: michael@0: string = 'foo {1} foo {2} foo'; michael@0: michael@0: // try an example with the braces escaped michael@0: status = inSection(1); michael@0: try michael@0: { michael@0: pattern = new RegExp('\{1.*\}', 'g'); michael@0: actualmatch = string.match(pattern); michael@0: } michael@0: catch (e) michael@0: { michael@0: pattern = 'error'; michael@0: actualmatch = ''; michael@0: } michael@0: expectedmatch = Array('{1} foo {2}'); michael@0: addThis(); michael@0: michael@0: // just like Section 1, without the braces being escaped michael@0: status = inSection(2); michael@0: try michael@0: { michael@0: pattern = new RegExp('{1.*}', 'g'); michael@0: actualmatch = string.match(pattern); michael@0: } michael@0: catch (e) michael@0: { michael@0: pattern = 'error'; michael@0: actualmatch = ''; michael@0: } michael@0: expectedmatch = Array('{1} foo {2}'); michael@0: addThis(); michael@0: michael@0: // try an example with the braces escaped michael@0: status = inSection(3); michael@0: try michael@0: { michael@0: pattern = new RegExp('\{1[.!\}]*\}', 'g'); michael@0: actualmatch = string.match(pattern); michael@0: } michael@0: catch (e) michael@0: { michael@0: pattern = 'error'; michael@0: actualmatch = ''; michael@0: } michael@0: expectedmatch = Array('{1}'); michael@0: addThis(); michael@0: michael@0: // just like Section 3, without the braces being escaped michael@0: status = inSection(4); michael@0: try michael@0: { michael@0: pattern = new RegExp('{1[.!}]*}', 'g'); michael@0: actualmatch = string.match(pattern); michael@0: } michael@0: catch (e) michael@0: { michael@0: pattern = 'error'; michael@0: actualmatch = ''; michael@0: } michael@0: expectedmatch = Array('{1}'); michael@0: addThis(); michael@0: michael@0: michael@0: string = 'abccccc{3 }c{ 3}c{3, }c{3 ,}c{3 ,4}c{3, 4}c{3,4 }de'; michael@0: michael@0: // use braces in a normal quantifier construct michael@0: status = inSection(5); michael@0: try michael@0: { michael@0: pattern = new RegExp('c{3}'); michael@0: actualmatch = string.match(pattern); michael@0: } michael@0: catch (e) michael@0: { michael@0: pattern = 'error'; michael@0: actualmatch = ''; michael@0: } michael@0: expectedmatch = Array('ccc'); michael@0: addThis(); michael@0: michael@0: // now disrupt the quantifer - the braces should now be interpreted literally michael@0: status = inSection(6); michael@0: try michael@0: { michael@0: pattern = new RegExp('c{3 }'); michael@0: actualmatch = string.match(pattern); michael@0: } michael@0: catch (e) michael@0: { michael@0: pattern = 'error'; michael@0: actualmatch = ''; michael@0: } michael@0: expectedmatch = Array('c{3 }'); michael@0: addThis(); michael@0: michael@0: status = inSection(7); michael@0: try michael@0: { michael@0: pattern = new RegExp('c{3.}'); michael@0: actualmatch = string.match(pattern); michael@0: } michael@0: catch (e) michael@0: { michael@0: pattern = 'error'; michael@0: actualmatch = ''; michael@0: } michael@0: expectedmatch = Array('c{3 }'); michael@0: addThis(); michael@0: michael@0: status = inSection(8); michael@0: try michael@0: { michael@0: // need to escape the \ in \s since michael@0: // this has been converted to a constructor call michael@0: // instead of a literal regexp michael@0: pattern = new RegExp('c{3\\s}'); michael@0: actualmatch = string.match(pattern); michael@0: } michael@0: catch (e) michael@0: { michael@0: pattern = 'error'; michael@0: actualmatch = ''; michael@0: } michael@0: expectedmatch = Array('c{3 }'); michael@0: addThis(); michael@0: michael@0: status = inSection(9); michael@0: try michael@0: { michael@0: pattern = new RegExp('c{3[ ]}'); michael@0: actualmatch = string.match(pattern); michael@0: } michael@0: catch (e) michael@0: { michael@0: pattern = 'error'; michael@0: actualmatch = ''; michael@0: } michael@0: expectedmatch = Array('c{3 }'); michael@0: addThis(); michael@0: michael@0: status = inSection(10); michael@0: try michael@0: { michael@0: pattern = new RegExp('c{ 3}'); michael@0: actualmatch = string.match(pattern); michael@0: } michael@0: catch (e) michael@0: { michael@0: pattern = 'error'; michael@0: actualmatch = ''; michael@0: } michael@0: expectedmatch = Array('c{ 3}'); michael@0: addThis(); michael@0: michael@0: // using braces in a normal quantifier construct again michael@0: status = inSection(11); michael@0: try michael@0: { michael@0: pattern = new RegExp('c{3,}'); michael@0: actualmatch = string.match(pattern); michael@0: } michael@0: catch (e) michael@0: { michael@0: pattern = 'error'; michael@0: actualmatch = ''; michael@0: } michael@0: expectedmatch = Array('ccccc'); michael@0: addThis(); michael@0: michael@0: // now disrupt it - the braces should now be interpreted literally michael@0: status = inSection(12); michael@0: try michael@0: { michael@0: pattern = new RegExp('c{3, }'); michael@0: actualmatch = string.match(pattern); michael@0: } michael@0: catch (e) michael@0: { michael@0: pattern = 'error'; michael@0: actualmatch = ''; michael@0: } michael@0: expectedmatch = Array('c{3, }'); michael@0: addThis(); michael@0: michael@0: status = inSection(13); michael@0: try michael@0: { michael@0: pattern = new RegExp('c{3 ,}'); michael@0: actualmatch = string.match(pattern); michael@0: } michael@0: catch (e) michael@0: { michael@0: pattern = 'error'; michael@0: actualmatch = ''; michael@0: } michael@0: expectedmatch = Array('c{3 ,}'); michael@0: addThis(); michael@0: michael@0: // using braces in a normal quantifier construct again michael@0: status = inSection(14); michael@0: try michael@0: { michael@0: pattern = new RegExp('c{3,4}'); michael@0: actualmatch = string.match(pattern); michael@0: } michael@0: catch (e) michael@0: { michael@0: pattern = 'error'; michael@0: actualmatch = ''; michael@0: } michael@0: expectedmatch = Array('cccc'); michael@0: addThis(); michael@0: michael@0: // now disrupt it - the braces should now be interpreted literally michael@0: status = inSection(15); michael@0: try michael@0: { michael@0: pattern = new RegExp('c{3 ,4}'); michael@0: actualmatch = string.match(pattern); michael@0: } michael@0: catch (e) michael@0: { michael@0: pattern = 'error'; michael@0: actualmatch = ''; michael@0: } michael@0: expectedmatch = Array('c{3 ,4}'); michael@0: addThis(); michael@0: michael@0: status = inSection(16); michael@0: try michael@0: { michael@0: pattern = new RegExp('c{3, 4}'); michael@0: actualmatch = string.match(pattern); michael@0: } michael@0: catch (e) michael@0: { michael@0: pattern = 'error'; michael@0: actualmatch = ''; michael@0: } michael@0: expectedmatch = Array('c{3, 4}'); michael@0: addThis(); michael@0: michael@0: status = inSection(17); michael@0: try michael@0: { michael@0: pattern = new RegExp('c{3,4 }'); michael@0: actualmatch = string.match(pattern); michael@0: } michael@0: catch (e) michael@0: { michael@0: pattern = 'error'; michael@0: actualmatch = ''; michael@0: } michael@0: expectedmatch = Array('c{3,4 }'); michael@0: addThis(); michael@0: michael@0: michael@0: michael@0: michael@0: //------------------------------------------------------------------------------------------------- michael@0: test(); michael@0: //------------------------------------------------------------------------------------------------- michael@0: michael@0: michael@0: michael@0: function addThis() michael@0: { michael@0: statusmessages[i] = status; michael@0: patterns[i] = pattern; michael@0: strings[i] = string; michael@0: actualmatches[i] = actualmatch; michael@0: expectedmatches[i] = expectedmatch; michael@0: i++; michael@0: } michael@0: michael@0: michael@0: function test() michael@0: { michael@0: enterFunc ('test'); michael@0: printBugNumber(BUGNUMBER); michael@0: printStatus (summary); michael@0: testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches); michael@0: exitFunc ('test'); michael@0: }