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