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

// TODO(ngeoffray): test String methods with null arguments.
class StringTest {

  static testMain() {
    testOutOfRange();
    testIllegalArgument();
    testConcat();
    testIndex();
    testCharCodeAt();
    testEquals();
    testEndsWith();
    testStartsWith();
    testIndexOf();
    testLastIndexOf();
    testContains();
    testReplaceAll();
    testCompareTo();
    testToList();
    testCharCodes();
  }

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

  static testIllegalArgument() {
    String a = "Hello";
    bool exception_caught = false;
    try {
      var c = a[2.2];  // Throw exception.
      Expect.equals(true, false);
    } on ArgumentError catch (e) {
      exception_caught = true;
    } on TypeError catch (e) {  // Thrown in checked mode only.
      exception_caught = true;
    }
    Expect.equals(true, exception_caught);
  }

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

  static testCharCodeAt() {
    String str = "string";
    for (int i = 0; i < str.length; i++) {
      Expect.equals(true, str.charCodeAt(i) is int);
    }
  }

  static testConcat() {
    var a = "One";
    var b = "Four";
    var c = a.concat(b);
    Expect.equals(7, c.length);
    Expect.equals("OneFour", c);
  }

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

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

    Expect.equals(false, "str" == "s");
    Expect.equals(false, "str" == "r");
    Expect.equals(false, "str" == "st");
    Expect.equals(false, "str" == "tr");

    Expect.equals(false, "s" == "str");
    Expect.equals(false, "r" == "str");
    Expect.equals(false, "st" == "str");
    Expect.equals(false, "tr" == "str");

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

  static testEndsWith() {
    Expect.equals(true, "str".endsWith("r"));
    Expect.equals(true, "str".endsWith("tr"));
    Expect.equals(true, "str".endsWith("str"));

    Expect.equals(false, "str".endsWith("stri"));
    Expect.equals(false, "str".endsWith("t"));
    Expect.equals(false, "str".endsWith("st"));
    Expect.equals(false, "str".endsWith("s"));

    Expect.equals(true, "".endsWith(""));
    Expect.equals(false, "".endsWith("s"));
  }

  static testStartsWith() {
    Expect.equals(true, "str".startsWith("s"));
    Expect.equals(true, "str".startsWith("st"));
    Expect.equals(true, "str".startsWith("str"));

    Expect.equals(false, "str".startsWith("stri"));
    Expect.equals(false, "str".startsWith("r"));
    Expect.equals(false, "str".startsWith("tr"));
    Expect.equals(false, "str".startsWith("t"));

    Expect.equals(true, "".startsWith(""));
    Expect.equals(false, "".startsWith("s"));
  }

  static 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++) {
      int result = str.indexOf("", i);
      if (i > str.length) {
        Expect.equals(str.length, result);
      } else {
        Expect.equals(i, result);
      }
    }
  }

  static 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.equals(-1, "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));

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

  static testContains() {
    Expect.equals(true, "str".contains("s", 0));
    Expect.equals(true, "str".contains("st", 0));
    Expect.equals(true, "str".contains("str", 0));
    Expect.equals(true, "str".contains("t", 0));
    Expect.equals(true, "str".contains("r", 0));
    Expect.equals(true, "str".contains("tr", 0));

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

    Expect.equals(true, "str".contains("", 0));
    Expect.equals(true, "".contains("", 0));
    Expect.equals(false, "".contains("s", 0));
  }

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

    // Test with the replaced string at the begining.
    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 occurence 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"));
  }

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

  static testToList() {
    test(str) {
      var list = str.splitChars();
      Expect.equals(str.length, list.length);
      for (int i = 0; i < str.length; i++) {
        Expect.equals(str[i], list[i]);
      }
    }
    test("abc");
    test("");
    test(" ");
  }

  static testCharCodes() {
    test(str) {
      var list = str.charCodes;
      Expect.equals(str.length, list.length);
      for (int i = 0; i < str.length; i++) {
        Expect.equals(str.charCodeAt(i), list[i]);
      }
    }
    test("abc");
    test("");
    test(" ");
  }
}

main() {
  StringTest.testMain();
}
