1/*
2 * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/**
25 * @test
26 * @bug 6840246 6559590
27 * @summary test String.split()
28 * @key randomness
29 */
30import java.util.Arrays;
31import java.util.Random;
32import java.util.regex.*;
33
34public class Split {
35
36    public static void main(String[] args) throws Exception {
37        String source = "0123456789";
38
39        for (int limit=-2; limit<3; limit++) {
40            for (int x=0; x<10; x++) {
41                String[] result = source.split(Integer.toString(x), limit);
42                int expectedLength = limit < 1 ? 2 : limit;
43
44                if ((limit == 0) && (x == 9)) {
45                    // expected dropping of ""
46                    if (result.length != 1)
47                        throw new RuntimeException("String.split failure 1");
48                    if (!result[0].equals("012345678")) {
49                        throw new RuntimeException("String.split failure 2");
50                    }
51                } else {
52                    if (result.length != expectedLength) {
53                        throw new RuntimeException("String.split failure 3");
54                    }
55                    if (!result[0].equals(source.substring(0,x))) {
56                        if (limit != 1) {
57                            throw new RuntimeException(
58                                "String.split failure 4");
59                        } else {
60                            if (!result[0].equals(source.substring(0,10))) {
61                            throw new RuntimeException(
62                                "String.split failure 10");
63                            }
64                        }
65                    }
66                    if (expectedLength > 1) { // Check segment 2
67                       if (!result[1].equals(source.substring(x+1,10)))
68                          throw new RuntimeException("String.split failure 5");
69                    }
70                }
71            }
72        }
73        // Check the case for no match found
74        for (int limit=-2; limit<3; limit++) {
75            String[] result = source.split("e", limit);
76            if (result.length != 1)
77                throw new RuntimeException("String.split failure 6");
78            if (!result[0].equals(source))
79                throw new RuntimeException("String.split failure 7");
80        }
81        // Check the case for limit == 0, source = "";
82        // split() now returns 0-length for empty source "" see #6559590
83        source = "";
84        String[] result = source.split("e", 0);
85        if (result.length != 1)
86            throw new RuntimeException("String.split failure 8");
87        if (!result[0].equals(source))
88            throw new RuntimeException("String.split failure 9");
89
90        // check fastpath of String.split()
91        source = "0123456789abcdefgABCDEFG";
92        Random r = new Random();
93
94        for (boolean doEscape: new boolean[] {false, true}) {
95            for (int cp = 0; cp < 0x11000; cp++) {
96                Pattern p = null;
97                String regex = new String(Character.toChars(cp));
98                if (doEscape)
99                    regex = "\\" + regex;
100                try {
101                    p = Pattern.compile(regex);
102                } catch (PatternSyntaxException pse) {
103                    // illegal syntax
104                    try {
105                        "abc".split(regex);
106                    } catch (PatternSyntaxException pse0) {
107                        continue;
108                    }
109                    throw new RuntimeException("String.split failure 11");
110                }
111                int off = r.nextInt(source.length());
112                String[] srcStrs = new String[] {
113                    "",
114                    source,
115                    regex + source,
116                    source + regex,
117                    source.substring(0, 3)
118                        + regex + source.substring(3, 9)
119                        + regex + source.substring(9, 15)
120                        + regex + source.substring(15),
121                    source.substring(0, off) + regex + source.substring(off)
122                };
123                for (String src: srcStrs) {
124                    for (int limit=-2; limit<3; limit++) {
125                        if (!Arrays.equals(src.split(regex, limit),
126                                           p.split(src, limit)))
127                            throw new RuntimeException("String.split failure 12");
128                    }
129                }
130            }
131        }
132    }
133}
134