blob: 6d4ef825a663025de00aef61e29212594bd11d1a [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 the strings matched by [groups]. The order in the returned
/// string follows the order in [groups].
/// @description Checks that the correct groups are returned and their order is
/// correct (including the cases of both repeating and missing indices as well as
/// matches other than the first one).
/// @author rodionov
import "../../../Utils/expect.dart";
main() {
check(".+: gr(a|e)y", "color: grey", 0, [0, 1], ["color: grey", "e"]);
check(".+: gr(a|e)y", "color: grey", 0, [1, 0], ["e", "color: grey"]);
check(".+: gr(a|e)y", "color: grey", 0, [0, 0, 0],
["color: grey", "color: grey", "color: grey"]);
check(".+: gr(a|e)y", "color: grey", 0, [1, 1], ["e", "e"]);
check("((a)|(ab))((c)|(bc))", "abc", 0, [0, 1, 2, 3, 4, 5, 6],
["abc", "a", "a", null, "bc", null, "bc"]);
check("((a)|(ab))((c)|(bc))", "abc", 0, [0], ["abc"]);
check("((a)|(ab))((c)|(bc))", "abc", 0, [1, 1], ["a", "a"]);
check("((a)|(ab))((c)|(bc))", "abc", 0, [3, 3, 3, 0, 4, 4, 4],
[null, null, null, "abc", "bc", "bc", "bc"]);
check("((a)|(ab))((c)|(bc))", "abc", 0, [6, 4, 2, 1, 3, 5, 0],
["bc", "bc", "a", "a", null, null, "abc"]);
check("((a)|(ab))((c)|(bc))", "abc", 0, [6, 6, 6, 6, 6, 6, 6, 6],
["bc", "bc", "bc", "bc", "bc", "bc", "bc", "bc"]);
check("((a)|(ab))((c)|(bc))", "abc", 0,
[6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6],
["bc", "bc", "bc", "bc", "bc", "bc", "bc", "bc", "bc", "bc", "bc", "bc",
"bc", "bc", "bc"]);
check(r"^(a+)\1*,(\1+)$", "aaaaaaaaa,aaaaaa\naa,aaaa\naaaaa,a", 1, [0, 1, 2],
["aa,aaaa", "aa", "aaaa"], multiLine: true);
check(r"^(a+)\1*,(\1+)$", "aaaaaaaaa,aaaaaa\naa,aaaa\naaaaa,a", 1, [1], ["aa"],
multiLine: true);
check(r"^(a+)\1*,(\1+)$", "aaaaaaaaa,aaaaaa\naa,aaaa\naaaaa,a", 1,
[2, 1, 2, 0, 2, 2], ["aaaa", "aa", "aaaa", "aa,aaaa", "aaaa", "aaaa"],
multiLine: true);
}
void check(String pattern, String str, int matchNum, List<int> groupIndices,
List<String?> expGroups, {bool multiLine: false, bool caseSensitive: true}) {
RegExp re = new RegExp(pattern, multiLine: multiLine,
caseSensitive: caseSensitive);
Match? match = new List.from(re.allMatches(str))[matchNum];
if(null == match) {
Expect.fail("No match #$matchNum in '$pattern'/ ~ '$str'!");
}
// make sure the test parameters are correct
Expect.equals(expGroups.length, groupIndices.length);
List<String?> groups = match?.groups(groupIndices) as List<String?>;
Expect.equals(groupIndices.length, groups.length);
for(int i = 0; i < expGroups.length; i++) {
if(expGroups[i] != groups[i]) {
Expect.fail("Result of Match.groups() incorrect: $expGroups != $groups");
}
}
}