// Copyright (c) 2017, 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 Match matchAsPrefix(String string, [int start = 0])
 * Match this pattern against the start of string.
 *
 * If start is provided, it must be an integer in the range 0 .. string.length.
 * In that case, this patten is tested against the string at the start position.
 * That is, a Match is returned if the pattern can match a part of the string
 * starting from position start. Returns null if the pattern doesn't match.
 * @description Checks that the returned Match is correctly initialized.
 * @author sgrekhov@unipro.ru
 */
import "../../../Utils/expect.dart";
 
main() {
  check("AE", "AEKFCD", [0, 2, "AE"]);
  check("acd", "acdKFCD", [0, 3, "acd"]);
  check("AB", "abcdefg", null);
  check("AB", "ABcdefg", [0, 2, "AB"]);
  check("\s", " ABcdefg", null);
  check(":alpha:", "ABcdefg", null);
  check(":alpha:", ":alphaABcdefg", null);
  check(":alpha:", ":alpha:ABcdefg", [0, 7, ":alpha:"]);
}

void check(String pattern, String str, List? groupData) {
  Match? fm = pattern.matchAsPrefix(str);
  if(fm == null && groupData != null) {
    Expect.fail("Nothing found for pattern <$pattern> in string <$str>");
  }
  if (groupData == null) {
    Expect.isNull(fm);
    return;
  }
  if (fm != null) {
    Expect.equals(str, fm.input);
    Expect.equals(pattern, fm.pattern);
    Expect.equals(groupData.length, 3);
    Expect.equals(groupData[0], fm.start);
    Expect.equals(groupData[1], fm.end);
    Expect.equals(groupData[2], fm.group(0));
  } else {
    Expect.fail("Match is null");
  }
}
