// 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.

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));
}
