blob: 808d5a96002246f299d80b259d7421735e3109eb [file] [log] [blame]
// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/// @assertion Returns an ordered collection of matches of the regular expression
/// in [str]. The order in the collection is the order of the matches found
/// in [str].
/// @description Checks that all matches are returned in correct order
/// @author rodionov
import "../../../Utils/expect.dart";
main() {
check(r"^[^\n\r]+$", "pilOt\nsoviet\trobot\r\nopenoffice", true, false,
[[0, 5, "pilOt"],
[6, 18, "soviet\trobot"],
[20, 30, "openoffice"]]);
check(r"^(a+)\1*,\1+$", "aaaaaaaaa,aaaaaa\naa,aaaa\naaaaa,a", true, false,
[[0, 16, "aaaaaaaaa,aaaaaa", "aaa"],
[17, 24, "aa,aaaa", "aa"],
[25, 32, "aaaaa,a", "a"]]);
check(r"(ab|cd)+|ef", "AEKFCD", false, true,
[[4, 6, "CD", "CD"]]);
checkNeg(r"\bot", "pilot\nsoviet robot\topenoffice");
checkNeg(r"\2", "");
checkNeg(r"[A-Z]+", "ß", ignoreCase: true);
}
// expMatchesData is a list of matchData
// matchData is a list of the form [int, int, String, String*], where the ints
// correspond to start/end indices of the match, and the strings - to group
// values
void check(String pattern, String str, bool multiLine, bool ignoreCase,
List expMatchesData) {
RegExp re = new RegExp(pattern, multiLine: multiLine,
caseSensitive: !ignoreCase);
Iterable<Match> matches = re.allMatches(str);
if(0 == matches.length) {
Expect.fail("\"$pattern\" !~ \"$str\"");
}
Expect.equals(expMatchesData.length, matches.length);
Iterator<Match> it = matches.iterator;
expMatchesData.forEach((var expMatch) {
it.moveNext();
Match actMatch = it.current;
Expect.equals(expMatch.length, actMatch.groupCount + 3);
Expect.equals(str, actMatch.input);
Expect.isTrue(actMatch.pattern.toString().contains(pattern));
Expect.equals(expMatch[0], actMatch.start);
Expect.equals(expMatch[1], actMatch.end);
for(int i = 0; i <= actMatch.groupCount; i++) {
String actMatchStr = actMatch.group(i) as String;
String expMatchStr = expMatch[i + 2];
if(expMatchStr != actMatchStr) {
Expect.fail("Group $i incorrect: '$expMatchStr' expected instead "
+ "of '$actMatchStr'");
}
}
});
}
void checkNeg(String pattern, String str, {bool multiLine: false,
bool ignoreCase: false}) {
RegExp re = new RegExp(pattern, multiLine: multiLine,
caseSensitive: !ignoreCase);
Iterable<Match> matches = re.allMatches(str);
Expect.equals(0, matches.length);
}