test/jdk/java/lang/String/LiteralReplace.java
author jlaskey
Fri, 18 May 2018 08:43:49 -0300
changeset 50175 589ed2770141
parent 47216 71c04702a3d5
child 54728 6188582d58b5
permissions -rw-r--r--
8200436: String::isBlank Reviewed-by: sundar
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
30913
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
     1
/*
45288
58be10a068c2 8180805: move RandomFactory to the top level testlibrary
iignatyev
parents: 33663
diff changeset
     2
 * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
30913
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
     4
 *
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
     7
 * published by the Free Software Foundation.
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
     8
 *
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    13
 * accompanied this code).
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    14
 *
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    18
 *
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    21
 * questions.
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    22
 */
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    23
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    24
/* @test
33663
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
    25
 * @bug 8058779 8054307
45288
58be10a068c2 8180805: move RandomFactory to the top level testlibrary
iignatyev
parents: 33663
diff changeset
    26
 * @library /test/lib
45466
faf1c55d2046 8181759: add explicit @build actions for jdk.test.lib classes in all :tier1 tests
iignatyev
parents: 45288
diff changeset
    27
 * @build jdk.test.lib.RandomFactory
30913
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    28
 * @run testng LiteralReplace
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    29
 * @summary Basic tests of String.replace(CharSequence, CharSequence)
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    30
 * @key randomness
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    31
 */
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    32
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    33
import java.util.ArrayList;
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    34
import java.util.Arrays;
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    35
import java.util.Iterator;
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    36
import java.util.regex.Matcher;
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    37
import java.util.regex.Pattern;
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    38
import java.util.Random;
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    39
45288
58be10a068c2 8180805: move RandomFactory to the top level testlibrary
iignatyev
parents: 33663
diff changeset
    40
import jdk.test.lib.RandomFactory;
30913
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    41
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    42
import org.testng.annotations.Test;
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    43
import org.testng.annotations.DataProvider;
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    44
import static org.testng.Assert.fail;
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    45
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    46
public class LiteralReplace {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    47
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    48
    @Test(dataProvider="sourceTargetReplacementExpected")
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    49
    public void testExpected(String source, String target,
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    50
             String replacement, String expected)
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    51
    {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    52
        String canonical = canonicalReplace(source, target, replacement);
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    53
        if (!canonical.equals(expected)) {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    54
            fail("Canonical: " + canonical + " != " + expected);
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    55
        }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    56
        test0(source, target, replacement, expected);
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    57
    }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    58
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    59
    @Test(dataProvider="sourceTargetReplacement")
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    60
    public void testCanonical(String source, String target,
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    61
            String replacement)
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    62
    {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    63
        String canonical = canonicalReplace(source, target, replacement);
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    64
        test0(source, target, replacement, canonical);
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    65
    }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    66
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    67
    private void test0(String source, String target, String replacement,
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    68
            String expected)
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    69
    {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    70
        String result = source.replace(target, replacement);
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    71
        if (!result.equals(expected)) {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    72
            fail(result + " != " + expected);
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    73
        }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    74
    }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    75
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    76
    @Test(dataProvider="sourceTargetReplacementWithNull",
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    77
            expectedExceptions = {NullPointerException.class})
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    78
    public void testNPE(String source, String target, String replacement) {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    79
        source.replace(target, replacement);
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    80
    }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    81
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    82
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    83
    @DataProvider
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    84
    public static Object[][] sourceTargetReplacementExpected() {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    85
        return new Object[][] {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    86
            {"aaa", "aa", "b", "ba"},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    87
            {"abcdefgh", "def", "DEF", "abcDEFgh"},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    88
            {"abcdefgh", "123", "DEF", "abcdefgh"},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    89
            {"abcdefgh", "abcdefghi", "DEF", "abcdefgh"},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    90
            {"abcdefghabc", "abc", "DEF", "DEFdefghDEF"},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    91
            {"abcdefghdef", "def", "", "abcgh"},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    92
            {"abcdefgh", "", "_", "_a_b_c_d_e_f_g_h_"},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    93
            {"", "", "", ""},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    94
            {"", "a", "b", ""},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    95
            {"", "", "abc", "abc"},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    96
            {"abcdefgh", "abcdefgh", "abcdefgh", "abcdefgh"},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    97
            {"abcdefgh", "abcdefgh", "abcdefghi", "abcdefghi"},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    98
            {"abcdefgh", "abcdefgh", "", ""},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
    99
            {"abcdabcd", "abcd", "", ""},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   100
            {"aaaaaaaaa", "aa", "_X_", "_X__X__X__X_a"},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   101
            {"aaaaaaaaa", "aa", "aaa", "aaaaaaaaaaaaa"},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   102
            {"aaaaaaaaa", "aa", "aa", "aaaaaaaaa"},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   103
            {"a.c.e.g.", ".", "-", "a-c-e-g-"},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   104
            {"abcdefgh", "[a-h]", "X", "abcdefgh"},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   105
            {"aa+", "a+", "", "a"},
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   106
            {"^abc$", "abc", "x", "^x$"},
33663
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   107
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   108
            // more with non-latin1 characters
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   109
            {"\u4e00\u4e00\u4e00",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   110
             "\u4e00\u4e00",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   111
             "\u4e01",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   112
             "\u4e01\u4e00"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   113
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   114
            {"\u4e00\u4e01\u4e02\u4e03\u4e04\u4e05\u4e06\u4e07\u4e08",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   115
             "\u4e03\u4e04\u4e05",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   116
             "\u4e10\u4e11\u4e12",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   117
             "\u4e00\u4e01\u4e02\u4e10\u4e11\u4e12\u4e06\u4e07\u4e08"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   118
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   119
            {"\u4e00\u4e01\u4e02\u4e03\u4e04\u4e05\u4e06\u4e07\u4e08",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   120
             "ABC",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   121
             "\u4e10\u4e11\u4e12",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   122
             "\u4e00\u4e01\u4e02\u4e03\u4e04\u4e05\u4e06\u4e07\u4e08"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   123
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   124
            {"\u4e00\u4e01\u4e02\u4e03\u4e04\u4e02\u4e03\u4e07\u4e08",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   125
             "\u4e02\u4e03",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   126
             "\u4e12\u4e13",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   127
             "\u4e00\u4e01\u4e12\u4e13\u4e04\u4e12\u4e13\u4e07\u4e08"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   128
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   129
            {"\u4e00\u4e01\u4e02\u4e03\u4e04\u4e02\u4e03\u4e07\u4e08",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   130
             "\u4e02\u4e03",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   131
             "ab",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   132
             "\u4e00\u4e01ab\u4e04ab\u4e07\u4e08"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   133
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   134
            {"\u4e00\u4e01\u4e02\u4e03\u4e04\u4e05\u4e06\u4e07",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   135
             "",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   136
             "_",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   137
             "_\u4e00_\u4e01_\u4e02_\u4e03_\u4e04_\u4e05_\u4e06_\u4e07_"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   138
            {"^\u4e00\u4e01\u4e02$",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   139
             "\u4e00\u4e01\u4e02",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   140
             "\u4e03",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   141
             "^\u4e03$"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   142
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   143
            {"", "\u4e00", "\u4e01", ""},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   144
            {"", "", "\u4e00\u4e01\u4e02", "\u4e00\u4e01\u4e02"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   145
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   146
            {"^\u4e00\u4e01\u4e02$",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   147
             "\u4e00\u4e01\u4e02",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   148
             "X",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   149
             "^X$"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   150
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   151
            {"abcdefgh",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   152
             "def",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   153
             "\u4e01",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   154
             "abc\u4e01gh"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   155
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   156
            {"abcdefgh",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   157
             "def",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   158
             "\u4e01\u4e02",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   159
             "abc\u4e01\u4e02gh"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   160
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   161
            {"abcdefabcgh",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   162
             "abc",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   163
             "\u4e01\u4e02",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   164
             "\u4e01\u4e02def\u4e01\u4e02gh"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   165
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   166
            {"abcdefabcghabc",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   167
             "abc",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   168
             "\u4e01\u4e02",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   169
             "\u4e01\u4e02def\u4e01\u4e02gh\u4e01\u4e02"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   170
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   171
            {"\u4e00\u4e01\u4e02\u4e03\u4e04\u4e05",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   172
             "\u4e00\u4e01\u4e02\u4e03\u4e04\u4e05",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   173
             "abcd",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   174
             "abcd"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   175
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   176
            {"\u4e00\u4e01",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   177
             "\u4e00\u4e01",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   178
             "abcdefg",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   179
             "abcdefg"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   180
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   181
            {"\u4e00\u4e01xyz",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   182
             "\u4e00\u4e01",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   183
             "abcdefg",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   184
             "abcdefgxyz"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   185
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   186
            {"\u4e00\u4e00\u4e00\u4e00\u4e00\u4e00",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   187
             "\u4e00\u4e00",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   188
             "\u4e00\u4e00\u4e00",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   189
             "\u4e00\u4e00\u4e00\u4e00\u4e00\u4e00\u4e00\u4e00\u4e00"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   190
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   191
            {"\u4e00\u4e00\u4e00\u4e00\u4e00\u4e00",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   192
             "\u4e00\u4e00\u4e00",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   193
             "\u4e00\u4e00",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   194
             "\u4e00\u4e00\u4e00\u4e00"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   195
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   196
            {"\u4e00.\u4e01.\u4e02.\u4e03.\u4e04.",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   197
             ".",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   198
             "-",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   199
             "\u4e00-\u4e01-\u4e02-\u4e03-\u4e04-"},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   200
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   201
            {"\u4e00\u4e00\u4e00\u4e00\u4e00\u4e00",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   202
             "\u4e00",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   203
             "",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   204
             ""},
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   205
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   206
            {"\u4e00\u4e01\u4e02\u4e03\u4e04\u4e05",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   207
             "\u4e00\u4e01\u4e02\u4e03\u4e04\u4e05",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   208
             "",
2cd62a4bd471 8141132: JEP 254: Compact Strings
thartmann
parents: 30913
diff changeset
   209
             ""},
30913
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   210
        };
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   211
    }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   212
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   213
    @DataProvider
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   214
    public static Iterator<Object[]> sourceTargetReplacement() {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   215
        ArrayList<Object[]> list = new ArrayList<>();
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   216
        for (int maxSrcLen = 1; maxSrcLen <= (1 << 10); maxSrcLen <<= 1) {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   217
            for (int maxTrgLen = 1; maxTrgLen <= (1 << 10); maxTrgLen <<= 1) {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   218
                for (int maxPrlLen = 1; maxPrlLen <= (1 << 10); maxPrlLen <<= 1) {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   219
                    list.add(makeArray(makeRandomString(maxSrcLen),
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   220
                                       makeRandomString(maxTrgLen),
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   221
                                       makeRandomString(maxPrlLen)));
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   222
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   223
                    String source = makeRandomString(maxSrcLen);
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   224
                    list.add(makeArray(source,
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   225
                                       mekeRandomSubstring(source, maxTrgLen),
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   226
                                       makeRandomString(maxPrlLen)));
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   227
                }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   228
            }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   229
        }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   230
        return list.iterator();
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   231
    }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   232
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   233
    @DataProvider
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   234
    public static Iterator<Object[]> sourceTargetReplacementWithNull() {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   235
        ArrayList<Object[]> list = new ArrayList<>();
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   236
        Object[] arr = {null, "", "a", "b", "string", "str", "ababstrstr"};
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   237
        for (int i = 0; i < arr.length; ++i) {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   238
            for (int j = 0; j < arr.length; ++j) {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   239
                for (int k = 0; k < arr.length; ++k) {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   240
                    if (arr[i] != null && (arr[j] == null || arr[k] == null)) {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   241
                        list.add(makeArray(arr[i], arr[j], arr[k]));
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   242
                    }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   243
                }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   244
            }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   245
        }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   246
        return list.iterator();
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   247
    }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   248
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   249
    // utilities
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   250
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   251
    /**
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   252
     * How the String.replace(CharSequence, CharSequence) used to be implemented
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   253
     */
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   254
    private static String canonicalReplace(String source, String target, String replacement) {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   255
        return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   256
                source).replaceAll(Matcher.quoteReplacement(replacement.toString()));
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   257
    }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   258
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   259
    private static final Random random = RandomFactory.getRandom();
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   260
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   261
    private static final char[] CHARS = ("qwertyuiop[]12345678" +
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   262
        "90-=\\`asdfghjkl;'zxcvbnm,./~!@#$%^&*()_+|QWERTYUIOP{" +
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   263
        "}ASDFGHJKL:\"ZXCVBNM<>?\n\r\t\u0444\u044B\u0432\u0430").toCharArray();
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   264
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   265
    private static String makeRandomString(int maxLen) {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   266
        int len = random.nextInt(maxLen);
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   267
        char[] buf = new char[len];
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   268
        for (int i = 0; i < len; ++i) {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   269
            buf[i] = CHARS[random.nextInt(CHARS.length)];
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   270
        }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   271
        return new String(buf);
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   272
    }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   273
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   274
    private static String mekeRandomSubstring(String source, int maxLen) {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   275
        if (source.isEmpty()) {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   276
            return source;
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   277
        }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   278
        int pos = random.nextInt(source.length());
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   279
        int len = Integer.min(source.length() - pos,
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   280
                              random.nextInt(maxLen));
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   281
        return source.substring(pos, pos + len);
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   282
    }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   283
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   284
    private static Object[] makeArray(Object... array) {
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   285
         return array;
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   286
    }
bb5c454d451e 8058779: Faster implementation of String.replace(CharSequence, CharSequence)
igerasim
parents:
diff changeset
   287
}