blob: e1884fec0cbe503536ad6f3aec6e360d2532605f [file] [log] [blame]
// 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.
// @dart = 2.9
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}/)";
}