// 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.
// Dart test for testing regular expressions in Dart.

// @dart = 2.9

import "package:expect/expect.dart";

void main() {
  RegExp exp = new RegExp(r"(\w+)");
  String str = "Parse my string";
  List<Match> matches = exp.allMatches(str).toList();
  Expect.equals(3, matches.length);
  Expect.equals("Parse", matches[0].group(0));
  Expect.equals("my", matches[1].group(0));
  Expect.equals("string", matches[2].group(0));

  // Check that allMatches progresses correctly for empty matches, and that
  // it includes the empty match at the end position.
  exp = new RegExp("a?");
  str = "babba";
  Expect.listEquals(["", "a", "", "", "a", ""],
      exp.allMatches(str).map((x) => x[0]).toList());

  // Check that allMatches works with optional start index.
  exp = new RegExp("as{2}");
  str = "assassin";
  Expect.equals(2, exp.allMatches(str).length);
  Expect.equals(2, exp.allMatches(str, 0).length);
  Expect.equals(1, exp.allMatches(str, 1).length);
  Expect.equals(0, exp.allMatches(str, 4).length);
  Expect.equals(0, exp.allMatches(str, str.length).length);
  Expect.throws(() => exp.allMatches(str, -1));
  Expect.throws(() => exp.allMatches(str, str.length + 1));

  exp = new RegExp(".*");
  Expect.equals("", exp.allMatches(str, str.length).single[0]);

  // The "^" must only match at the beginning of the string.
  // Using a start-index doesn't change where the string starts.
  exp = new RegExp("^ass");
  Expect.equals(1, exp.allMatches(str, 0).length);
  Expect.equals(0, exp.allMatches(str, 3).length);

  // Regression test for http://dartbug.com/2980
  exp = new RegExp("^", multiLine: true); // Any zero-length match will work.
  str = "foo\nbar\nbaz";
  Expect.equals(" foo\n bar\n baz", str.replaceAll(exp, " "));

  exp = new RegExp(r"(\w+)");
  Expect.isNull(exp.matchAsPrefix(" xyz ab"));
  Expect.isNull(exp.matchAsPrefix(" xyz ab", 0));

  var m = exp.matchAsPrefix(" xyz ab", 1);
  Expect.equals("xyz", m[0]);
  Expect.equals("xyz", m[1]);
  Expect.equals(1, m.groupCount);

  m = exp.matchAsPrefix(" xyz ab", 2);
  Expect.equals("yz", m[0]);
  Expect.equals("yz", m[1]);
  Expect.equals(1, m.groupCount);

  m = exp.matchAsPrefix(" xyz ab", 3);
  Expect.equals("z", m[0]);
  Expect.equals("z", m[1]);
  Expect.equals(1, m.groupCount);

  Expect.isNull(exp.matchAsPrefix(" xyz ab", 4));

  m = exp.matchAsPrefix(" xyz ab", 5);
  Expect.equals("ab", m[0]);
  Expect.equals("ab", m[1]);
  Expect.equals(1, m.groupCount);

  m = exp.matchAsPrefix(" xyz ab", 6);
  Expect.equals("b", m[0]);
  Expect.equals("b", m[1]);
  Expect.equals(1, m.groupCount);

  Expect.isNull(exp.matchAsPrefix(" xyz ab", 7));

  Expect.throws(() => exp.matchAsPrefix(" xyz ab", -1));
  Expect.throws(() => exp.matchAsPrefix(" xyz ab", 8));
}
