Files
sdk/tests/corelib/string_replace_test.dart
T
lrn@google.com 6b9ff4c4d4 Add String.replaceFirstMapped.
Also refactory VM implementation of checking if a string is one-byte,
and adds dart2js implementation of replaceFirst for non-string/regexp pattern.

BUG= http://dartbug.com/2979
R=floitsch@google.com, iposva@google.com

Review URL: https://codereview.chromium.org//920453002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@43716 260f80e4-7a28-3924-810f-c04153c831b5
2015-02-12 09:04:09 +00:00

219 lines
7.2 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() {
// Test replaceFirst.
Expect.equals(
"AtoBtoCDtoE", "AfromBtoCDtoE".replaceFirst("from", "to"));
// Test with the replaced string at the begining.
Expect.equals(
"toABtoCDtoE", "fromABtoCDtoE".replaceFirst("from", "to"));
// Test with the replaced string at the end.
Expect.equals(
"toABtoCDtoEto", "fromABtoCDtoEto".replaceFirst("from", "to"));
// Test when there are no occurence of the string to replace.
Expect.equals("ABC", "ABC".replaceFirst("from", "to"));
// Test when the string to change is the empty string.
Expect.equals("", "".replaceFirst("from", "to"));
// Test when the string to change is a substring of the string to
// replace.
Expect.equals("fro", "fro".replaceFirst("from", "to"));
// Test when the string to change is the replaced string.
Expect.equals("to", "from".replaceFirst("from", "to"));
// Test when the string to change is the replacement string.
Expect.equals("to", "to".replaceFirst("from", "to"));
// Test replacing by the empty string.
Expect.equals("", "from".replaceFirst("from", ""));
Expect.equals("AB", "AfromB".replaceFirst("from", ""));
// Test changing the empty string.
Expect.equals("to", "".replaceFirst("", "to"));
// Test replacing the empty string.
Expect.equals("toAtoBtoCto", "AtoBtoCto".replaceFirst("", "to"));
// Test startIndex.
Expect.equals(
"foo-AAA-foo-bar", "foo-bar-foo-bar".replaceFirst("bar", "AAA", 4));
// Test startIndex skipping one case at the begining.
Expect.equals(
"foo-bar-AAA-bar", "foo-bar-foo-bar".replaceFirst("foo", "AAA", 1));
// Test startIndex skipping one case at the begining.
Expect.equals(
"foo-bar-foo-AAA", "foo-bar-foo-bar".replaceFirst("bar", "AAA", 5));
// Test startIndex replacing with the empty string.
Expect.equals(
"foo-bar--bar", "foo-bar-foo-bar".replaceFirst("foo", "", 1));
// Test startIndex with a RegExp with carat
Expect.equals(
"foo-bar-foo-bar",
"foo-bar-foo-bar".replaceFirst(new RegExp(r"^foo"), "", 8));
// Test startIndex with a RegExp
Expect.equals(
"aaa{3}X{3}", "aaa{3}aaa{3}".replaceFirst(new RegExp(r"a{3}"), "X", 1));
// Test startIndex with regexp-looking String
Expect.equals(
"aaa{3}aaX", "aaa{3}aaa{3}".replaceFirst("a{3}", "X", 3));
// Test negative startIndex
Expect.throws(
() => "hello".replaceFirst("h", "X", -1), (e) => e is RangeError);
// Test startIndex too large
Expect.throws(
() => "hello".replaceFirst("h", "X", 6), (e) => e is RangeError);
// Test null startIndex
Expect.throws(
() => "hello".replaceFirst("h", "X", null), (e) => e is ArgumentError);
// Test object startIndex
Expect.throws(
() => "hello".replaceFirst("h", "X", new Object()));
// Test replaceFirstMapped.
Expect.equals(
"AtoBtoCDtoE", "AfromBtoCDtoE".replaceFirstMapped("from", (_) => "to"));
// Test with the replaced string at the begining.
Expect.equals(
"toABtoCDtoE", "fromABtoCDtoE".replaceFirstMapped("from", (_) => "to"));
// Test with the replaced string at the end.
Expect.equals(
"toABtoCDtoEto",
"fromABtoCDtoEto".replaceFirstMapped("from", (_) => "to"));
// Test when there are no occurence of the string to replace.
Expect.equals("ABC", "ABC".replaceFirstMapped("from", (_) => "to"));
// Test when the string to change is the empty string.
Expect.equals("", "".replaceFirstMapped("from", (_) => "to"));
// Test when the string to change is a substring of the string to
// replace.
Expect.equals("fro", "fro".replaceFirstMapped("from", (_) => "to"));
// Test when the string to change is the replaced string.
Expect.equals("to", "from".replaceFirstMapped("from", (_) => "to"));
// Test when the string to change is the replacement string.
Expect.equals("to", "to".replaceFirstMapped("from", (_) => "to"));
// Test replacing by the empty string.
Expect.equals("", "from".replaceFirstMapped("from", (_) => ""));
Expect.equals("AB", "AfromB".replaceFirstMapped("from", (_) => ""));
// Test changing the empty string.
Expect.equals("to", "".replaceFirstMapped("", (_) => "to"));
// Test replacing the empty string.
Expect.equals("toAtoBtoCto", "AtoBtoCto".replaceFirstMapped("", (_) => "to"));
// Test startIndex.
Expect.equals(
"foo-AAA-foo-bar",
"foo-bar-foo-bar".replaceFirstMapped("bar", (_) => "AAA", 4));
// Test startIndex skipping one case at the begining.
Expect.equals(
"foo-bar-AAA-bar",
"foo-bar-foo-bar".replaceFirstMapped("foo", (_) => "AAA", 1));
// Test startIndex skipping one case at the begining.
Expect.equals(
"foo-bar-foo-AAA",
"foo-bar-foo-bar".replaceFirstMapped("bar", (_) => "AAA", 5));
// Test startIndex replacing with the empty string.
Expect.equals(
"foo-bar--bar", "foo-bar-foo-bar".replaceFirstMapped("foo", (_) => "", 1));
// Test startIndex with a RegExp with carat
Expect.equals(
"foo-bar-foo-bar",
"foo-bar-foo-bar".replaceFirstMapped(new RegExp(r"^foo"), (_) => "", 8));
// Test startIndex with a RegExp
Expect.equals(
"aaa{3}X{3}",
"aaa{3}aaa{3}".replaceFirstMapped(new RegExp(r"a{3}"), (_) => "X", 1));
// Test startIndex with regexp-looking String
Expect.equals(
"aaa{3}aaX", "aaa{3}aaa{3}".replaceFirstMapped("a{3}", (_) => "X", 3));
// Test negative startIndex
Expect.throws(
() => "hello".replaceFirstMapped("h", (_) => "X", -1),
(e) => e is RangeError);
// Test startIndex too large
Expect.throws(
() => "hello".replaceFirstMapped("h", (_) => "X", 6),
(e) => e is RangeError);
// Test null startIndex
Expect.throws(
() => "hello".replaceFirstMapped("h", (_) => "X", null),
(e) => e is ArgumentError);
// Test object startIndex
Expect.throws(
() => "hello".replaceFirstMapped("h", (_) => "X", new Object()));
// Test replacement depending on argument.
Expect.equals(
"foo-BAR-foo-bar",
"foo-bar-foo-bar".replaceFirstMapped("bar", (v) => v[0].toUpperCase()));
Expect.equals(
"foo-[bar]-foo-bar",
"foo-bar-foo-bar".replaceFirstMapped("bar", (v) => "[${v[0]}]"));
Expect.equals("foo-foo-bar-foo-bar-foo-bar",
"foo-bar-foo-bar".replaceFirstMapped("bar", (v) => v.input));
// Test replacement throwing.
Expect.throws(
() => "foo-bar".replaceFirstMapped("bar", (v) => throw 42),
(e) => e == 42);
// Test replacement returning non-String.
var o = new Object();
Expect.equals("foo-$o", "foo-bar".replaceFirstMapped("bar",
(v) { return o; }));
Expect.equals("foo-42", "foo-bar".replaceFirstMapped("bar",
(v) { return 42; }));
// Test replacement returning object throwing on string-conversion.
var n = new Naughty();
Expect.throws(
() => "foo-bar".replaceFirstMapped("bar", (v) { return n; }));
}
// Fails to return a String on toString, throws if converted by "$naughty".
class Naughty {
toString() => this;
}