// 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 :: * evaluates by
 * returning the two results 0 and infinity.
 * @description Checks that this quantifier is applied correctly in various
 * scenarios.
 * @3rdparty sputnik-v1:S15.10.2.7_A4_T1.js-S15.10.2.7_A4_T19.js
 * @author rodionov
 */
import "../../../../Utils/expect.dart";
 

main() {
  check("[^\"]*", "\"beast\"-nickname", 0, [""]);
  check("[^\"]*", "alice said: \"don\'t\"", 0, ["alice said: "]);
  check("[^\"]*", "before\'i\'start", 0, ["before\'i\'start"]);
  check("[^\"]*", "alice \"sweep\": \"don\'t\"", 0, ["alice "]);
  check("[^\"]*", "alice \u0022sweep\u0022: \"don\'t\"", 0, ["alice "]);
  check("[\"\'][^\"\']*[\"\']", "alice \u0022sweep\u0022: \"don\'t\"", 6,
      ["\"sweep\""]);
  check("[\"\'][^\"\']*[\"\']", "alice cries out: \'don\'t\'", 17, ["\'don\'"]);
  checkNeg("[\"\'][^\"\']*[\"\']", "alice cries out: don\'t");
  check("[\"\'][^\"\']*[\"\']", "alice cries out: \"\"", 17, ["\"\""]);
  check("d*", "abcddddefg", 0, [""]);
  check("cd*", "abcddddefg", 2, ["cdddd"]);
  check("cx*d", "abcddddefg", 2, ["cd"]);
  check("(x*)(x+)", "xxxxxxx", 0, ["xxxxxxx", "xxxxxx", "x"]);
  check(r"(\d*)(\d+)", "0123456789", 0, ["0123456789", "012345678", "9"]);
  check(r"(\d*)\d(\d+)", "0123456789", 0, ["0123456789", "01234567", "9"]);
  check("(x+)(x*)", "xxxxxxx", 0, ["xxxxxxx", "xxxxxxx", ""]);
  check(r"x*y+$", "xxxxxxyyyyyy", 0, ["xxxxxxyyyyyy"]);
  check(r"[\d]*[\s]*bc.", "abcdef", 1, ["bcd"]);
  check(r"bc..[\d]*[\s]*", "abcdef", 1, ["bcde"]);
  check(".*", "a1b2c3", 0, ["a1b2c3"]);
  checkNeg("[xyz]*1", "a0.b2.c3");
}

void check(String pattern, String str, [int matchPos = -1,
    List<String>? expectedGroups = null]) {
  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 != 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\"");
}
