michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 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: 19 June 2003 michael@0: * SUMMARY: Testing regexp submatches with quantifiers michael@0: * michael@0: * See http://bugzilla.mozilla.org/show_bug.cgi?id=209919 michael@0: * michael@0: */ michael@0: //----------------------------------------------------------------------------- michael@0: var i = 0; michael@0: var BUGNUMBER = 209919; michael@0: var summary = 'Testing regexp submatches with quantifiers'; 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: michael@0: michael@0: /* michael@0: * Waldemar: "ECMA-262 15.10.2.5, third algorithm, step 2.1 states that michael@0: * once the minimum repeat count (which is 0 for *, 1 for +, etc.) has michael@0: * been satisfied, an atom being repeated must not match the empty string." michael@0: * michael@0: * In this example, the minimum repeat count is 0, so the last thing the michael@0: * capturing parens is permitted to contain is the 'a'. It may NOT go on michael@0: * to capture the '' at the $ position of 'a', even though '' satifies michael@0: * the condition b* michael@0: * michael@0: */ michael@0: status = inSection(1); michael@0: string = 'a'; michael@0: pattern = /(a|b*)*/; michael@0: actualmatch = string.match(pattern); michael@0: expectedmatch = Array(string, 'a'); michael@0: addThis(); michael@0: michael@0: michael@0: /* michael@0: * In this example, the minimum repeat count is 5, so the capturing parens michael@0: * captures the 'a', then goes on to capture the '' at the $ position of 'a' michael@0: * 4 times before it has to stop. Therefore the last thing it contains is ''. michael@0: */ michael@0: status = inSection(2); michael@0: string = 'a'; michael@0: pattern = /(a|b*){5,}/; michael@0: actualmatch = string.match(pattern); michael@0: expectedmatch = Array(string, ''); michael@0: addThis(); michael@0: michael@0: michael@0: /* michael@0: * Reduction of the above examples to contain only the condition b* michael@0: * inside the capturing parens. This can be even harder to grasp! michael@0: * michael@0: * The global match is the '' at the ^ position of 'a', but the parens michael@0: * is NOT permitted to capture it since the minimum repeat count is 0! michael@0: */ michael@0: status = inSection(3); michael@0: string = 'a'; michael@0: pattern = /(b*)*/; michael@0: actualmatch = string.match(pattern); michael@0: expectedmatch = Array('', undefined); michael@0: addThis(); michael@0: michael@0: michael@0: /* michael@0: * Here we have used the + quantifier (repeat count 1) outside the parens. michael@0: * Therefore the parens must capture at least once before stopping, so it michael@0: * does capture the '' this time - michael@0: */ michael@0: status = inSection(4); michael@0: string = 'a'; michael@0: pattern = /(b*)+/; michael@0: actualmatch = string.match(pattern); michael@0: expectedmatch = Array('', ''); michael@0: addThis(); michael@0: michael@0: michael@0: /* michael@0: * More complex examples - michael@0: */ michael@0: pattern = /^\-?(\d{1,}|\.{0,})*(\,\d{1,})?$/; michael@0: michael@0: status = inSection(5); michael@0: string = '100.00'; michael@0: actualmatch = string.match(pattern); michael@0: expectedmatch = Array(string, '00', undefined); michael@0: addThis(); michael@0: michael@0: status = inSection(6); michael@0: string = '100,00'; michael@0: actualmatch = string.match(pattern); michael@0: expectedmatch = Array(string, '100', ',00'); michael@0: addThis(); michael@0: michael@0: status = inSection(7); michael@0: string = '1.000,00'; michael@0: actualmatch = string.match(pattern); michael@0: expectedmatch = Array(string, '000', ',00'); 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: }