// 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 = 2.9

import "package:expect/expect.dart";

main() {
  // Test replaceFirst.
  Expect.equals("AtoBtoCDtoE", "AfromBtoCDtoE".replaceFirst("from", "to"));

  // Test with the replaced string at the beginning.
  Expect.equals("toABtoCDtoE", "fromABtoCDtoE".replaceFirst("from", "to"));

  // Test with the replaced string at the end.
  Expect.equals("toABtoCDtoEto", "fromABtoCDtoEto".replaceFirst("from", "to"));

  // Test when there are no occurrence of the string to replace.
  Expect.equals("ABC", "ABC".replaceFirst("from", "to"));

  // Test when the string to change is the empty string.
  Expect.equals("", "".replaceFirst("from", "to"));

  // Test when the string to change is a substring of the string to
  // replace.
  Expect.equals("fro", "fro".replaceFirst("from", "to"));

  // Test when the string to change is the replaced string.
  Expect.equals("to", "from".replaceFirst("from", "to"));

  // Test when the string to change is the replacement string.
  Expect.equals("to", "to".replaceFirst("from", "to"));

  // Test replacing by the empty string.
  Expect.equals("", "from".replaceFirst("from", ""));
  Expect.equals("AB", "AfromB".replaceFirst("from", ""));

  // Test changing the empty string.
  Expect.equals("to", "".replaceFirst("", "to"));

  // Test replacing the empty string.
  Expect.equals("toAtoBtoCto", "AtoBtoCto".replaceFirst("", "to"));

  // Test startIndex.
  Expect.equals(
      "foo-AAA-foo-bar", "foo-bar-foo-bar".replaceFirst("bar", "AAA", 4));

  // Test startIndex skipping one case at the beginning.
  Expect.equals(
      "foo-bar-AAA-bar", "foo-bar-foo-bar".replaceFirst("foo", "AAA", 1));

  // Test startIndex skipping one case at the beginning.
  Expect.equals(
      "foo-bar-foo-AAA", "foo-bar-foo-bar".replaceFirst("bar", "AAA", 5));

  // Test startIndex replacing with the empty string.
  Expect.equals("foo-bar--bar", "foo-bar-foo-bar".replaceFirst("foo", "", 1));

  // Test startIndex with a RegExp with carat
  Expect.equals("foo-bar-foo-bar",
      "foo-bar-foo-bar".replaceFirst(new RegExp(r"^foo"), "", 8));

  // Test startIndex with a RegExp
  Expect.equals(
      "aaa{3}X{3}", "aaa{3}aaa{3}".replaceFirst(new RegExp(r"a{3}"), "X", 1));

  // Test startIndex with regexp-looking String
  Expect.equals("aaa{3}aaX", "aaa{3}aaa{3}".replaceFirst("a{3}", "X", 3));

  // Test negative startIndex
  Expect.throwsRangeError(() => "hello".replaceFirst("h", "X", -1));

  // Test startIndex too large
  Expect.throwsRangeError(() => "hello".replaceFirst("h", "X", 6));

  // Test null startIndex
  Expect.throwsArgumentError(() => "hello".replaceFirst("h", "X", null));

  // Test replaceFirstMapped.
  Expect.equals(
      "AtoBtoCDtoE", "AfromBtoCDtoE".replaceFirstMapped("from", (_) => "to"));

  // Test with the replaced string at the beginning.
  Expect.equals(
      "toABtoCDtoE", "fromABtoCDtoE".replaceFirstMapped("from", (_) => "to"));

  // Test with the replaced string at the end.
  Expect.equals("toABtoCDtoEto",
      "fromABtoCDtoEto".replaceFirstMapped("from", (_) => "to"));

  // Test when there are no occurrence of the string to replace.
  Expect.equals("ABC", "ABC".replaceFirstMapped("from", (_) => "to"));

  // Test when the string to change is the empty string.
  Expect.equals("", "".replaceFirstMapped("from", (_) => "to"));

  // Test when the string to change is a substring of the string to
  // replace.
  Expect.equals("fro", "fro".replaceFirstMapped("from", (_) => "to"));

  // Test when the string to change is the replaced string.
  Expect.equals("to", "from".replaceFirstMapped("from", (_) => "to"));

  // Test when the string to change is the replacement string.
  Expect.equals("to", "to".replaceFirstMapped("from", (_) => "to"));

  // Test replacing by the empty string.
  Expect.equals("", "from".replaceFirstMapped("from", (_) => ""));
  Expect.equals("AB", "AfromB".replaceFirstMapped("from", (_) => ""));

  // Test changing the empty string.
  Expect.equals("to", "".replaceFirstMapped("", (_) => "to"));

  // Test replacing the empty string.
  Expect.equals("toAtoBtoCto", "AtoBtoCto".replaceFirstMapped("", (_) => "to"));

  // Test startIndex.
  Expect.equals("foo-AAA-foo-bar",
      "foo-bar-foo-bar".replaceFirstMapped("bar", (_) => "AAA", 4));

  // Test startIndex skipping one case at the beginning.
  Expect.equals("foo-bar-AAA-bar",
      "foo-bar-foo-bar".replaceFirstMapped("foo", (_) => "AAA", 1));

  // Test startIndex skipping one case at the beginning.
  Expect.equals("foo-bar-foo-AAA",
      "foo-bar-foo-bar".replaceFirstMapped("bar", (_) => "AAA", 5));

  // Test startIndex replacing with the empty string.
  Expect.equals("foo-bar--bar",
      "foo-bar-foo-bar".replaceFirstMapped("foo", (_) => "", 1));

  // Test startIndex with a RegExp with carat
  Expect.equals("foo-bar-foo-bar",
      "foo-bar-foo-bar".replaceFirstMapped(new RegExp(r"^foo"), (_) => "", 8));

  // Test startIndex with a RegExp
  Expect.equals("aaa{3}X{3}",
      "aaa{3}aaa{3}".replaceFirstMapped(new RegExp(r"a{3}"), (_) => "X", 1));

  // Test startIndex with regexp-looking String
  Expect.equals(
      "aaa{3}aaX", "aaa{3}aaa{3}".replaceFirstMapped("a{3}", (_) => "X", 3));

  // Test negative startIndex
  Expect.throwsRangeError(
      () => "hello".replaceFirstMapped("h", (_) => "X", -1));

  // Test startIndex too large
  Expect.throwsRangeError(() => "hello".replaceFirstMapped("h", (_) => "X", 6));

  // Test null startIndex
  Expect.throwsArgumentError(
      () => "hello".replaceFirstMapped("h", (_) => "X", null));

  // Test replacement depending on argument.
  Expect.equals("foo-BAR-foo-bar",
      "foo-bar-foo-bar".replaceFirstMapped("bar", (v) => v[0].toUpperCase()));

  Expect.equals("foo-[bar]-foo-bar",
      "foo-bar-foo-bar".replaceFirstMapped("bar", (v) => "[${v[0]}]"));

  Expect.equals("foo-foo-bar-foo-bar-foo-bar",
      "foo-bar-foo-bar".replaceFirstMapped("bar", (v) => v.input));

  // Test replacement throwing.
  Expect.throws(() => "foo-bar".replaceFirstMapped("bar", (v) => throw 42),
      (e) => e == 42);

  // Test replacement returning non-String.
  var o = new Object();
  Expect.equals(
      "foo-$o",
      "foo-bar".replaceFirstMapped("bar", (v) {
        // TODO(jmesserly): in strong mode, this function must return a string.
        // If we want to allow any Object, we'll have to fix the API signature.
        // See https://github.com/dart-lang/sdk/issues/30248.
        return '$o';
      }));

  for (var string in ["", "x", "foo", "x\u2000z"]) {
    for (var replacement in ["", "foo", string]) {
      for (int start = 0; start <= string.length; start++) {
        var expect;
        for (int end = start; end <= string.length; end++) {
          expect =
              string.substring(0, start) + replacement + string.substring(end);
          Expect.equals(expect, string.replaceRange(start, end, replacement),
              '"$string"[$start:$end]="$replacement"');
        }
        // Reuse expect from "end == string.length" case when omitting end.
        Expect.equals(expect, string.replaceRange(start, null, replacement),
            '"$string"[$start:]="$replacement"');
      }
    }
    Expect.throws(() => string.replaceRange(0, 0, null));
    Expect.throws(() => string.replaceRange(-1, 0, "x"));
    Expect.throws(() => string.replaceRange(0, string.length + 1, "x"));
  }
}
