// 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.7: The production QuantifierPrefix :: {DecimalDigits, }
/// evaluates by returning MV of DecimalDigits and infinity.
/// @description Checks that this quantifier is applied correctly in various
/// scenarios.
/// @3rdparty sputnik-v1:S15.10.2.7_A6_T1.js-S15.10.2.7_A6_T6.js
/// @author rodionov

import "../../../../Utils/expect.dart";
 
main() {
  check(r"b{2,}c", "aaabbbbcccddeeeefffff",3, ["bbbbc"]);
  checkNeg(r"b{8,}c", "aaabbbbcccddeeeefffff");
  check(r"\d{1,}", "wqe456646dsff", 3, ["456646"]);
  check(r"(123){1,}", "123123", 0, ["123123", "123"]);
  check(r"(123){1,}?", "123123", 0, ["123", "123"]);
  check(r"(123){1,}x\1", "123123x123", 0, ["123123x123", "123"]);
  check(r"x{1,2}x{1,}", "xxxxxxx", 0, ["xxxxxxx"]);
  check(r"(a{1,2})\1{1,}", "aaaaaaaa", 0, ["aaaaaaaa", "aa"]);
  check(r"(a{1,2})\1{1,}", "aaaaaaaaa", 0, ["aaaaaaaa", "aa"]);
}

void check(String pattern, String str, int matchPos, List<String> expGroups) {
  RegExp re = new RegExp(pattern);
  Expect.isNotNull(re.firstMatch(str));
  Match fm = re.firstMatch(str) as Match;
  if(matchPos >= 0) {
    Expect.equals(matchPos, fm.start);
  }
  if(null != expGroups) {
    Expect.equals(expGroups.length, fm.groupCount + 1);
    
    for(int i = 0; i <= fm.groupCount; i++) {
      String? expGr = expGroups[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\"");
}
