// 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\"");
}
