/*
 * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/**
 * @test
 * @bug 6840246
 * @summary test String.split()
 */
import java.util.Arrays;
import java.util.Random;
import java.util.regex.*;

public class Split {

    public static void main(String[] args) throws Exception {
        String source = "0123456789";

        for (int limit=-2; limit<3; limit++) {
            for (int x=0; x<10; x++) {
                String[] result = source.split(Integer.toString(x), limit);
                int expectedLength = limit < 1 ? 2 : limit;

                if ((limit == 0) && (x == 9)) {
                    // expected dropping of ""
                    if (result.length != 1)
                        throw new RuntimeException("String.split failure 1");
                    if (!result[0].equals("012345678")) {
                        throw new RuntimeException("String.split failure 2");
                    }
                } else {
                    if (result.length != expectedLength) {
                        throw new RuntimeException("String.split failure 3");
                    }
                    if (!result[0].equals(source.substring(0,x))) {
                        if (limit != 1) {
                            throw new RuntimeException(
                                "String.split failure 4");
                        } else {
                            if (!result[0].equals(source.substring(0,10))) {
                            throw new RuntimeException(
                                "String.split failure 10");
                            }
                        }
                    }
                    if (expectedLength > 1) { // Check segment 2
                       if (!result[1].equals(source.substring(x+1,10)))
                          throw new RuntimeException("String.split failure 5");
                    }
                }
            }
        }
        // Check the case for no match found
        for (int limit=-2; limit<3; limit++) {
            String[] result = source.split("e", limit);
            if (result.length != 1)
                throw new RuntimeException("String.split failure 6");
            if (!result[0].equals(source))
                throw new RuntimeException("String.split failure 7");
        }
        // Check the case for limit == 0, source = "";
        source = "";
        String[] result = source.split("e", 0);
        if (result.length != 1)
            throw new RuntimeException("String.split failure 8");
        if (!result[0].equals(source))
            throw new RuntimeException("String.split failure 9");

        // check fastpath of String.split()
        source = "0123456789abcdefgABCDEFG";
        Random r = new Random();

        for (boolean doEscape: new boolean[] {false, true}) {
            for (int cp = 0; cp < 0x11000; cp++) {
                Pattern p = null;
                String regex = new String(Character.toChars(cp));
                if (doEscape)
                    regex = "\\" + regex;
                try {
                    p = Pattern.compile(regex);
                } catch (PatternSyntaxException pse) {
                    // illegal syntax
                    try {
                        "abc".split(regex);
                    } catch (PatternSyntaxException pse0) {
                        continue;
                    }
                    throw new RuntimeException("String.split failure 11");
                }
                int off = r.nextInt(source.length());
                String[] srcStrs = new String[] {
                    "",
                    source,
                    regex + source,
                    source + regex,
                    source.substring(0, 3)
                        + regex + source.substring(3, 9)
                        + regex + source.substring(9, 15)
                        + regex + source.substring(15),
                    source.substring(0, off) + regex + source.substring(off)
                };
                for (String src: srcStrs) {
                    for (int limit=-2; limit<3; limit++) {
                        if (!Arrays.equals(src.split(regex, limit),
                                           p.split(src, limit)))
                            throw new RuntimeException("String.split failure 12");
                    }
                }
            }
        }
    }
}
