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

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