blob: 199f7c1ddb7e77b84f8bd2ac3904e4abd1f7d7c3 [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 15.10.2.9: An escape sequence of the form \ followed by a nonzero
/// decimal number n matches the result of the Nth set of capturing parentheses
/// (see 15.10.2.11). It is an error if the regular expression has fewer than n
/// capturing parentheses. If the regular expression has n or more capturing
/// parentheses but the Nth one is undefined because it has not captured
/// anything, then the backreference always succeeds.
/// @description Checks that backreferences work as specified.
/// @3rdparty sputnik-v1:S15.10.2.9_A1_T1.js-S15.10.2.9_A1_T5.js
/// @author rodionov
import "../../../../Utils/expect.dart";
main() {
check(r"\b(\w+) \1\b", "do you listen the the band", 14, ["the the", "the"]);
check(r"([xu]\d{2}([A-H]{2})?)\1", "x09x12x01x01u00FFu00FFx04x04x23", 6,
["x01x01", "x01", null]);
check(r"([xu]\d{2}([A-H]{2})?)\1", "x09x12x01x05u00FFu00FFx04x04x23", 12,
["u00FFu00FF", "u00FF", "FF"]);
check(r"(a*)b\1+", "baaac", 0, ["b", ""]);
checkNeg(r"(a*)b\2", "aaaaaaaaab");
}
void check(String pattern, String str, int matchPos,
List<String?> expectedGroups) {
RegExp re = new RegExp(pattern);
Expect.isNotNull(re.firstMatch(str), "\"$pattern\" !~ \"$str\"");
Match fm = re.firstMatch(str) as Match;
if (matchPos >= 0) {
Expect.equals(matchPos, fm.start);
}
if (null != expectedGroups) {
Expect.equals(expectedGroups.length, fm.groupCount + 1);
for (int i = 0; i <= fm.groupCount; i++) {
String? expGr = expectedGroups[i];
String? actGr = fm.group(i);
Expect.equals(expGr, actGr,
"Mismatch at group $i: \"$expGr\" expected instead of \"$actGr\"");
}
}
}
void checkNeg(String pattern, String str) {
RegExp re = new RegExp(pattern);
Expect.isNull(re.firstMatch(str), "\"$pattern\" ~ \"$str\"");
}