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