|  | // 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"; | 
|  |  | 
|  | main() { | 
|  | testSplitString(); | 
|  | testSplitRegExp(); | 
|  | testSplitPattern(); | 
|  | } | 
|  |  | 
|  | testSplit(List<String> expect, String string, Pattern pattern) { | 
|  | String patternString; | 
|  | if (pattern is String) { | 
|  | patternString = '"$pattern"'; | 
|  | } else if (pattern is RegExp) { | 
|  | patternString = "/${pattern.pattern}/"; | 
|  | } else { | 
|  | patternString = pattern.toString(); | 
|  | } | 
|  | List actual = string.split(pattern); | 
|  |  | 
|  | // Ensure that the correct type is reified. | 
|  | actual = actual as List<String>; | 
|  |  | 
|  | // Check that store of the wrong type throws. Some platforms don't do this, | 
|  | // so it's protected by multitest syntax. | 
|  | Expect.throwsTypeError(() => actual.add(42), //      //# checkedstore: ok | 
|  | 'List<String>.add should not accept an int'); // //# checkedstore: ok | 
|  |  | 
|  | Expect.listEquals(expect, actual, '"$string".split($patternString)'); | 
|  | } | 
|  |  | 
|  | /** String patterns. */ | 
|  | void testSplitString() { | 
|  | // Normal match. | 
|  | testSplit(["a", "b", "c"], "a b c", " "); | 
|  | testSplit(["a", "b", "c"], "adbdc", "d"); | 
|  | testSplit(["a", "b", "c"], "addbddc", "dd"); | 
|  | // No match. | 
|  | testSplit(["abc"], "abc", " "); | 
|  | testSplit(["a"], "a", "b"); | 
|  | testSplit([""], "", "b"); | 
|  | // Empty match matches everywhere except start/end. | 
|  | testSplit(["a", "b", "c"], "abc", ""); | 
|  | // All empty parts. | 
|  | testSplit(["", "", "", "", ""], "aaaa", "a"); | 
|  | testSplit(["", "", "", "", ""], "    ", " "); | 
|  | testSplit(["", ""], "a", "a"); | 
|  | // No overlapping matches. Match as early as possible. | 
|  | testSplit(["", "", "", "a"], "aaaaaaa", "aa"); | 
|  | // Cannot split the empty string. | 
|  | testSplit([], "", ""); // Match. | 
|  | testSplit([""], "", "a"); // No match. | 
|  | } | 
|  |  | 
|  | /** RegExp patterns. */ | 
|  | void testSplitRegExp() { | 
|  | testSplitWithRegExp((s) => new RegExp(s)); | 
|  | } | 
|  |  | 
|  | /** Non-String, non-RegExp patterns. */ | 
|  | void testSplitPattern() { | 
|  | testSplitWithRegExp((s) => new RegExpWrap(s)); | 
|  | } | 
|  |  | 
|  | void testSplitWithRegExp(makePattern) { | 
|  | testSplit(["a", "b", "c"], "a b c", makePattern(r" ")); | 
|  |  | 
|  | testSplit(["a", "b", "c"], "adbdc", makePattern(r"[dz]")); | 
|  |  | 
|  | testSplit(["a", "b", "c"], "addbddc", makePattern(r"dd")); | 
|  |  | 
|  | testSplit(["abc"], "abc", makePattern(r"b$")); | 
|  |  | 
|  | testSplit(["a", "b", "c"], "abc", makePattern(r"")); | 
|  |  | 
|  | testSplit(["", "", "", ""], "   ", makePattern(r"[ ]")); | 
|  |  | 
|  | // Non-zero-length match at end. | 
|  | testSplit(["aa", ""], "aaa", makePattern(r"a$")); | 
|  |  | 
|  | // Zero-length match at end. | 
|  | testSplit(["aaa"], "aaa", makePattern(r"$")); | 
|  |  | 
|  | // Non-zero-length match at start. | 
|  | testSplit(["", "aa"], "aaa", makePattern(r"^a")); | 
|  |  | 
|  | // Zero-length match at start. | 
|  | testSplit(["aaa"], "aaa", makePattern(r"^")); | 
|  |  | 
|  | // Picks first match, not longest or shortest. | 
|  | testSplit(["", "", "", "a"], "aaaaaaa", makePattern(r"aa|aaa")); | 
|  |  | 
|  | testSplit(["", "", "", "a"], "aaaaaaa", makePattern(r"aa|")); | 
|  |  | 
|  | testSplit(["", "", "a"], "aaaaaaa", makePattern(r"aaa|aa")); | 
|  |  | 
|  | // Zero-width match depending on the following. | 
|  | testSplit(["a", "bc"], "abc", makePattern(r"(?=[ab])")); | 
|  |  | 
|  | testSplit(["a", "b", "c"], "abc", makePattern(r"(?!^)")); | 
|  |  | 
|  | // Cannot split empty string. | 
|  | testSplit([], "", makePattern(r"")); | 
|  |  | 
|  | testSplit([], "", makePattern(r"(?:)")); | 
|  |  | 
|  | testSplit([], "", makePattern(r"$|(?=.)")); | 
|  |  | 
|  | testSplit([""], "", makePattern(r"a")); | 
|  |  | 
|  | // Can split singleton string if it matches. | 
|  | testSplit(["", ""], "a", makePattern(r"a")); | 
|  |  | 
|  | testSplit(["a"], "a", makePattern(r"b")); | 
|  |  | 
|  | // Do not include captures. | 
|  | testSplit(["a", "", "a"], "abba", makePattern(r"(b)")); | 
|  |  | 
|  | testSplit(["a", "a"], "abba", makePattern(r"(bb)")); | 
|  |  | 
|  | testSplit(["a", "a"], "abba", makePattern(r"(b*)")); | 
|  |  | 
|  | testSplit(["a", "a"], "aa", makePattern(r"(b*)")); | 
|  |  | 
|  | // But captures are still there, and do work with backreferences. | 
|  | testSplit(["a", "cba"], "abcba", makePattern(r"([bc])(?=.*\1)")); | 
|  | } | 
|  |  | 
|  | // A Pattern implementation with the same capabilities as a RegExp, but not | 
|  | // directly recognizable as a RegExp. | 
|  | class RegExpWrap implements Pattern { | 
|  | final regexp; | 
|  | RegExpWrap(String source) : regexp = new RegExp(source); | 
|  | Iterable<Match> allMatches(String string, [int start = 0]) => | 
|  | regexp.allMatches(string, start); | 
|  |  | 
|  | Match matchAsPrefix(String string, [int start = 0]) => | 
|  | regexp.matchAsPrefix(string, start); | 
|  |  | 
|  | String toString() => "Wrap(/${regexp.pattern}/)"; | 
|  | } |