mirror of
https://github.com/dart-lang/sdk
synced 2024-11-05 18:22:09 +00:00
b998b10f3e
Change-Id: I3a31632ce28fb87a410b759d092c7ebc9393574d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/128306 Commit-Queue: Bob Nystrom <rnystrom@google.com> Auto-Submit: Bob Nystrom <rnystrom@google.com> Reviewed-by: Lasse R.H. Nielsen <lrn@google.com>
144 lines
4.3 KiB
Dart
144 lines
4.3 KiB
Dart
// 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}/)";
|
|
}
|