// 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";

void main() {
  testOutOfRange();
  testConcat();
  testIndex();
  testCodeUnitAt();
  testEquals();
  testEndsWith();
  testStartsWith();
  testIndexOf();
  testLastIndexOf();
  testContains();
  testReplaceAll();
  testCompareTo();
  testCharCodes();
  testRepeat();
  testPadLeft();
  testPadRight();
}

void testLength() {
  String str = "";
  for (var i = 0; i < 20; i++) {
    testStringLength(i, str);
    str += " ";
  }
}

void testOutOfRange() {
  String a = "Hello";
  bool exception_caught = false;
  try {
    var c = a[20]; // Throw exception.
  } on RangeError catch (e) {
    exception_caught = true;
  }
  Expect.isTrue(exception_caught);
}

void testIndex() {
  String str = "string";
  for (int i = 0; i < str.length; i++) {
    Expect.isTrue(str[i] is String);
    testStringLength(1, str[i]);
  }
}

void testCodeUnitAt() {
  String str = "string";
  for (int i = 0; i < str.length; i++) {
    Expect.isTrue(str.codeUnitAt(i) is int);
  }
}

void testConcat() {
  var a = "One";
  var b = "Four";
  var c = a + b;
  testStringLength(7, c);
  Expect.equals("OneFour", c);
}

void testEquals() {
  Expect.equals("str", "str");

  Expect.equals("str", "s" + "t" + "r");
  Expect.equals("s" + "t" + "r", "str");

  Expect.isFalse("str" == "s");
  Expect.isFalse("str" == "r");
  Expect.isFalse("str" == "st");
  Expect.isFalse("str" == "tr");

  Expect.isFalse("s" == "str");
  Expect.isFalse("r" == "str");
  Expect.isFalse("st" == "str");
  Expect.isFalse("tr" == "str");

  Expect.isFalse("" == "s");
  Expect.equals("", "");
}

void testEndsWith() {
  Expect.isTrue("str".endsWith("r"));
  Expect.isTrue("str".endsWith("tr"));
  Expect.isTrue("str".endsWith("str"));

  Expect.isFalse("str".endsWith("stri"));
  Expect.isFalse("str".endsWith("t"));
  Expect.isFalse("str".endsWith("st"));
  Expect.isFalse("str".endsWith("s"));

  Expect.isTrue("".endsWith(""));
  Expect.isFalse("".endsWith("s"));
}

void testStartsWith() {
  Expect.isTrue("str".startsWith("s"));
  Expect.isTrue("str".startsWith("st"));
  Expect.isTrue("str".startsWith("str"));

  Expect.isFalse("str".startsWith("stri"));
  Expect.isFalse("str".startsWith("r"));
  Expect.isFalse("str".startsWith("tr"));
  Expect.isFalse("str".startsWith("t"));

  Expect.isTrue("".startsWith(""));
  Expect.isFalse("".startsWith("s"));

  Expect.isFalse("strstr".startsWith("s", 1));
  Expect.isFalse("strstr".startsWith("s", 2));
  Expect.isTrue("strstr".startsWith("s", 3));
  Expect.isFalse("strstr".startsWith("s", 4));

  Expect.isFalse("strstr".startsWith("st", 1));
  Expect.isFalse("strstr".startsWith("st", 2));
  Expect.isTrue("strstr".startsWith("st", 3));
  Expect.isFalse("strstr".startsWith("st", 4));

  Expect.isFalse("strstr".startsWith("str", 1));
  Expect.isFalse("strstr".startsWith("str", 2));
  Expect.isTrue("strstr".startsWith("str", 3));
  Expect.isFalse("strstr".startsWith("str", 4));

  Expect.isTrue("str".startsWith("", 0));
  Expect.isTrue("str".startsWith("", 1));
  Expect.isTrue("str".startsWith("", 2));
  Expect.isTrue("str".startsWith("", 3));

  Expect.throws(() => "str".startsWith("", -1));
  Expect.throws(() => "str".startsWith("", 4));

  var regexp = new RegExp("s(?:tr?)?");
  Expect.isTrue("s".startsWith(regexp));
  Expect.isTrue("st".startsWith(regexp));
  Expect.isTrue("str".startsWith(regexp));
  Expect.isTrue("sX".startsWith(regexp));
  Expect.isTrue("stX".startsWith(regexp));
  Expect.isTrue("strX".startsWith(regexp));

  Expect.isFalse("".startsWith(regexp));
  Expect.isFalse("astr".startsWith(regexp));

  Expect.isTrue("".startsWith(new RegExp("")));
  Expect.isTrue("".startsWith(new RegExp("a?")));

  Expect.isFalse("strstr".startsWith(regexp, 1));
  Expect.isFalse("strstr".startsWith(regexp, 2));
  Expect.isTrue("strstr".startsWith(regexp, 3));
  Expect.isFalse("strstr".startsWith(regexp, 4));

  Expect.isTrue("str".startsWith(new RegExp(""), 0));
  Expect.isTrue("str".startsWith(new RegExp(""), 1));
  Expect.isTrue("str".startsWith(new RegExp(""), 2));
  Expect.isTrue("str".startsWith(new RegExp(""), 3));
  Expect.isTrue("str".startsWith(new RegExp("a?"), 0));
  Expect.isTrue("str".startsWith(new RegExp("a?"), 1));
  Expect.isTrue("str".startsWith(new RegExp("a?"), 2));
  Expect.isTrue("str".startsWith(new RegExp("a?"), 3));

  Expect.throws(() => "str".startsWith(regexp, -1));
  Expect.throws(() => "str".startsWith(regexp, 4));

  regexp = new RegExp("^str");
  Expect.isTrue("strstr".startsWith(regexp));
  Expect.isTrue("strstr".startsWith(regexp, 0));
  Expect.isFalse("strstr".startsWith(regexp, 1));
  Expect.isFalse("strstr".startsWith(regexp, 2));
  Expect.isFalse("strstr".startsWith(regexp, 3)); // Second "str" isn't at ^.
}

void testIndexOf() {
  Expect.equals(0, "str".indexOf("", 0));
  Expect.equals(0, "".indexOf("", 0));
  Expect.equals(-1, "".indexOf("a", 0));

  Expect.equals(1, "str".indexOf("t", 0));
  Expect.equals(1, "str".indexOf("tr", 0));
  Expect.equals(0, "str".indexOf("str", 0));
  Expect.equals(0, "str".indexOf("st", 0));
  Expect.equals(0, "str".indexOf("s", 0));
  Expect.equals(2, "str".indexOf("r", 0));
  Expect.equals(-1, "str".indexOf("string", 0));

  Expect.equals(1, "strstr".indexOf("t", 0));
  Expect.equals(1, "strstr".indexOf("tr", 0));
  Expect.equals(0, "strstr".indexOf("str", 0));
  Expect.equals(0, "strstr".indexOf("st", 0));
  Expect.equals(0, "strstr".indexOf("s", 0));
  Expect.equals(2, "strstr".indexOf("r", 0));
  Expect.equals(-1, "str".indexOf("string", 0));

  Expect.equals(4, "strstr".indexOf("t", 2));
  Expect.equals(4, "strstr".indexOf("tr", 2));
  Expect.equals(3, "strstr".indexOf("str", 1));
  Expect.equals(3, "strstr".indexOf("str", 2));
  Expect.equals(3, "strstr".indexOf("str", 3));
  Expect.equals(3, "strstr".indexOf("st", 1));
  Expect.equals(3, "strstr".indexOf("s", 3));
  Expect.equals(5, "strstr".indexOf("r", 3));
  Expect.equals(5, "strstr".indexOf("r", 4));
  Expect.equals(5, "strstr".indexOf("r", 5));

  String str = "hello";
  for (int i = 0; i < 10; i++) {
    if (i > str.length) {
      Expect.throws(() => str.indexOf("", i));
    } else {
      int result = str.indexOf("", i);
      Expect.equals(i, result);
    }
  }

  var re = new RegExp("an?");
  Expect.equals(1, "banana".indexOf(re));
  Expect.equals(1, "banana".indexOf(re, 0));
  Expect.equals(1, "banana".indexOf(re, 1));
  Expect.equals(3, "banana".indexOf(re, 2));
  Expect.equals(3, "banana".indexOf(re, 3));
  Expect.equals(5, "banana".indexOf(re, 4));
  Expect.equals(5, "banana".indexOf(re, 5));
  Expect.equals(-1, "banana".indexOf(re, 6));
  Expect.throws(() => "banana".indexOf(re, -1));
  Expect.throws(() => "banana".indexOf(re, 7));
  re = new RegExp("x?");
  for (int i = 0; i <= str.length; i++) {
    Expect.equals(i, str.indexOf(re, i));
  }
}

void testLastIndexOf() {
  Expect.equals(2, "str".lastIndexOf("", 2));
  Expect.equals(0, "".lastIndexOf("", 0));
  Expect.equals(-1, "".lastIndexOf("a", 0));

  Expect.equals(1, "str".lastIndexOf("t", 2));
  Expect.equals(1, "str".lastIndexOf("tr", 2));
  Expect.equals(0, "str".lastIndexOf("str", 2));
  Expect.equals(0, "str".lastIndexOf("st", 2));
  Expect.equals(0, "str".lastIndexOf("s", 2));
  Expect.equals(2, "str".lastIndexOf("r", 2));
  Expect.equals(-1, "str".lastIndexOf("string", 2));

  Expect.equals(4, "strstr".lastIndexOf("t", 5));
  Expect.equals(4, "strstr".lastIndexOf("tr", 5));
  Expect.equals(3, "strstr".lastIndexOf("str", 5));
  Expect.equals(3, "strstr".lastIndexOf("st", 5));
  Expect.equals(3, "strstr".lastIndexOf("s", 5));
  Expect.equals(5, "strstr".lastIndexOf("r", 5));
  Expect.throws(() {
    "str".lastIndexOf("string", 5);
  });
  Expect.equals(4, "strstr".lastIndexOf("t", 5));
  Expect.equals(4, "strstr".lastIndexOf("tr", 5));
  Expect.equals(3, "strstr".lastIndexOf("str", 5));
  Expect.equals(3, "strstr".lastIndexOf("str", 5));
  Expect.equals(3, "strstr".lastIndexOf("str", 5));
  Expect.equals(3, "strstr".lastIndexOf("st", 5));
  Expect.equals(3, "strstr".lastIndexOf("s", 5));
  Expect.equals(5, "strstr".lastIndexOf("r", 5));
  Expect.equals(2, "strstr".lastIndexOf("r", 4));
  Expect.equals(2, "strstr".lastIndexOf("r", 3));
  Expect.equals(5, "strstr".lastIndexOf("r"));
  Expect.equals(5, "strstr".lastIndexOf("r", null));

  String str = "hello";
  for (int i = 0; i < 10; i++) {
    if (i > str.length) {
      Expect.throws(() => str.indexOf("", i));
    } else {
      int result = str.lastIndexOf("", i);
      Expect.equals(i, result);
    }
  }

  var re = new RegExp("an?");
  Expect.equals(5, "banana".lastIndexOf(re));
  Expect.equals(5, "banana".lastIndexOf(re, 6));
  Expect.equals(5, "banana".lastIndexOf(re, 5));
  Expect.equals(3, "banana".lastIndexOf(re, 4));
  Expect.equals(3, "banana".lastIndexOf(re, 3));
  Expect.equals(1, "banana".lastIndexOf(re, 2));
  Expect.equals(1, "banana".lastIndexOf(re, 1));
  Expect.equals(-1, "banana".lastIndexOf(re, 0));
  Expect.throws(() => "banana".lastIndexOf(re, -1));
  Expect.throws(() => "banana".lastIndexOf(re, 7));
  re = new RegExp("x?");
  for (int i = 0; i <= str.length; i++) {
    Expect.equals(i, str.indexOf(re, i));
  }
}

void testContains() {
  Expect.isTrue("str".contains("s", 0));
  Expect.isTrue("str".contains("st", 0));
  Expect.isTrue("str".contains("str", 0));
  Expect.isTrue("str".contains("t", 0));
  Expect.isTrue("str".contains("r", 0));
  Expect.isTrue("str".contains("tr", 0));

  Expect.isFalse("str".contains("sr", 0));
  Expect.isFalse("str".contains("string", 0));

  Expect.isTrue("str".contains("", 0));
  Expect.isTrue("".contains("", 0));
  Expect.isFalse("".contains("s", 0));
}

void testReplaceAll() {
  Expect.equals("AtoBtoCDtoE", "AfromBfromCDfromE".replaceAll("from", "to"));

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

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

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

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

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

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

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

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

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

  // Test replacing the empty string.
  Expect.equals("toAtoBtoCto", "ABC".replaceAll("", "to"));
}

void testCompareTo() {
  Expect.equals(0, "".compareTo(""));
  Expect.equals(0, "str".compareTo("str"));
  Expect.equals(-1, "str".compareTo("string"));
  Expect.equals(1, "string".compareTo("str"));
  Expect.equals(1, "string".compareTo(""));
  Expect.equals(-1, "".compareTo("string"));
}

void testCharCodes() {
  test(str) {
    var list = str.codeUnits;
    Expect.equals(str.length, list.length);
    for (int i = 0; i < str.length; i++) {
      Expect.equals(str.codeUnitAt(i), list[i]);
    }
  }

  test("abc");
  test("");
  test(" ");
}

void testStringLength(int length, String str) {
  Expect.equals(length, str.length);
  (length == 0 ? Expect.isTrue : Expect.isFalse)(str.isEmpty);
  (length != 0 ? Expect.isTrue : Expect.isFalse)(str.isNotEmpty);
}

void testRepeat() {
  List<String> testStrings = [
    "",
    "\x00",
    "a",
    "ab",
    "\x80",
    "\xff",
    "\u2028",
    "abcdef\u2028",
    "\u{10002}",
    "abcdef\u{10002}"
  ];
  List<int> counts = [
    0,
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9,
    10,
    11,
    12,
    13,
    14,
    15,
    16,
    17,
    127,
    128,
    129
  ];
  void testRepeat(str, repeat) {
    String expect;
    if (repeat <= 0) {
      expect = "";
    } else if (repeat == 1) {
      expect = str;
    } else {
      StringBuffer buf = new StringBuffer();
      for (int i = 0; i < repeat; i++) {
        buf.write(str);
      }
      expect = buf.toString();
    }
    String actual = str * repeat;
    Expect.equals(expect, actual, "$str#${str.length} * $repeat");
  }

  for (String str in testStrings) {
    for (int repeat in counts) {
      testRepeat(str, repeat);
    }
  }
}

void testPadLeft() {
  Expect.equals("    1", "1".padLeft(5, ' '));
  Expect.equals("   11", "11".padLeft(5, ' '));
  Expect.equals("  111", "111".padLeft(5, ' '));
  Expect.equals(" 1111", "1111".padLeft(5, ' '));
  Expect.equals("11111", "11111".padLeft(5, ' '));
  Expect.equals("111111", "111111".padLeft(5, ' '));
  Expect.equals("   \u{10002}", "\u{10002}".padLeft(5, ' '));
  Expect.equals('', ''.padLeft(0, 'a'));
  Expect.equals('a', ''.padLeft(1, 'a'));
  Expect.equals('aaaaa', ''.padLeft(5, 'a'));
  Expect.equals('', ''.padLeft(-2, 'a'));

  Expect.equals('xyzxyzxyzxyzxyz', ''.padLeft(5, 'xyz'));
  Expect.equals('xyzxyzxyzxyza', 'a'.padLeft(5, 'xyz'));
  Expect.equals('xyzxyzxyzaa', 'aa'.padLeft(5, 'xyz'));
  Expect.equals('\u{10002}\u{10002}\u{10002}aa', 'aa'.padLeft(5, '\u{10002}'));
  Expect.equals('a', 'a'.padLeft(10, ''));
}

void testPadRight() {
  Expect.equals("1    ", "1".padRight(5, ' '));
  Expect.equals("11   ", "11".padRight(5, ' '));
  Expect.equals("111  ", "111".padRight(5, ' '));
  Expect.equals("1111 ", "1111".padRight(5, ' '));
  Expect.equals("11111", "11111".padRight(5, ' '));
  Expect.equals("111111", "111111".padRight(5, ' '));
  Expect.equals("\u{10002}   ", "\u{10002}".padRight(5, ' '));
  Expect.equals('', ''.padRight(0, 'a'));
  Expect.equals('a', ''.padRight(1, 'a'));
  Expect.equals('aaaaa', ''.padRight(5, 'a'));
  Expect.equals('', ''.padRight(-2, 'a'));

  Expect.equals('xyzxyzxyzxyzxyz', ''.padRight(5, 'xyz'));
  Expect.equals('axyzxyzxyzxyz', 'a'.padRight(5, 'xyz'));
  Expect.equals('aaxyzxyzxyz', 'aa'.padRight(5, 'xyz'));
  Expect.equals('aa\u{10002}\u{10002}\u{10002}', 'aa'.padRight(5, '\u{10002}'));
  Expect.equals('a', 'a'.padRight(10, ''));
}
