/*
 * Copyright (c) 2013, 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 5015163 7172553
 * @summary tests StringJoinerTest
 * @run testng StringJoinerTest
 * @author Jim Gish
 */
import java.util.ArrayList;
import java.util.StringJoiner;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;

@Test(groups = {"unit","string","util","libs"})
public class StringJoinerTest {

    private static final String EMPTY = "EMPTY";
    private static final String ONE = "One";
    private static final int ONE_LEN = ONE.length();
    private static final String TWO = "Two";
    private static final int TWO_LEN = TWO.length();
    private static final String THREE = "Three";
    private static final String FOUR = "Four";
    private static final String FIVE = "Five";
    private static final String DASH = "-";

    public void addAddAll() {
        StringJoiner sj = new StringJoiner(DASH, "{", "}");
        sj.add(ONE);

        ArrayList<String> nextOne = new ArrayList<>();
        nextOne.add(TWO);
        nextOne.add(THREE);
        nextOne.stream().forEachOrdered(sj::add);

        String expected = "{"+ONE+DASH+TWO+DASH+THREE+"}";
        assertEquals(sj.toString(), expected);
    }

    void addAlladd() {
        StringJoiner sj = new StringJoiner(DASH, "{", "}");

        ArrayList<String> firstOne = new ArrayList<>();
        firstOne.add(ONE);
        firstOne.add(TWO);
        firstOne.stream().forEachOrdered(sj::add);

        sj.add(THREE);

        String expected = "{"+ONE+DASH+TWO+DASH+THREE+"}";
        assertEquals(sj.toString(), expected);
    }

    // The following tests do two successive adds of different types
    public void addAlladdAll() {
        StringJoiner sj = new StringJoiner(DASH, "{", "}");
        ArrayList<String> firstOne = new ArrayList<>();
        firstOne.add(ONE);
        firstOne.add(TWO);
        firstOne.add(THREE);
        firstOne.stream().forEachOrdered(sj::add);

        ArrayList<String> nextOne = new ArrayList<>();
        nextOne.add(FOUR);
        nextOne.add(FIVE);
        nextOne.stream().forEachOrdered(sj::add);

        String expected = "{"+ONE+DASH+TWO+DASH+THREE+DASH+FOUR+DASH+FIVE+"}";
        assertEquals(sj.toString(), expected);
    }

    public void addCharSequence() {
        StringJoiner sj = new StringJoiner(",");
        CharSequence cs_one = ONE;
        CharSequence cs_two = TWO;

        sj.add(cs_one);
        sj.add(cs_two);

        assertEquals(sj.toString(), ONE + "," + TWO);

        sj = new StringJoiner(DASH, "{", "}");
        sj.add(cs_one);
        sj.add(cs_two);

        assertEquals(sj.toString(), "{" + ONE + DASH + TWO + "}");

        StringBuilder builder = new StringBuilder(ONE);
        StringBuffer buffer = new StringBuffer(THREE);
        sj = new StringJoiner(", ", "{ ", " }");
        sj.add(builder).add(buffer);
        builder.append(TWO);
        buffer.append(FOUR);
        assertEquals(sj.toString(), "{ " + ONE + ", " + THREE + " }",
                "CharSequence is copied when add");
        sj.add(builder);
        assertEquals(sj.toString(), "{ " + ONE + ", " + THREE + ", " + ONE +
                TWO + " }");
    }

    public void addCharSequenceWithEmptyValue() {
        StringJoiner sj = new StringJoiner(",").setEmptyValue(EMPTY);
        CharSequence cs_one = ONE;
        CharSequence cs_two = TWO;

        sj.add(cs_one);
        sj.add(cs_two);

        assertEquals(sj.toString(), ONE + "," + TWO);

        sj = new StringJoiner(DASH, "{", "}");
        sj.add(cs_one);
        sj.add(cs_two);
        assertEquals(sj.toString(), "{" + ONE + DASH + TWO + "}");

        sj = new StringJoiner(DASH, "{", "}");
        assertEquals(sj.toString(), "{}");

        sj = new StringJoiner("=", "{", "}").setEmptyValue("");
        assertEquals(sj.toString(), "");

        sj = new StringJoiner(DASH, "{", "}").setEmptyValue(EMPTY);
        assertEquals(sj.toString(), EMPTY);

        sj.add(cs_one);
        sj.add(cs_two);
        assertEquals(sj.toString(), "{" + ONE + DASH + TWO + "}");
    }

    public void addString() {
        StringJoiner sj = new StringJoiner(DASH);
        sj.add(ONE);
        assertEquals(sj.toString(), ONE);

        sj = new StringJoiner(DASH, "{", "}");
        sj.add(ONE);
        assertEquals(sj.toString(), "{" + ONE + "}");

        sj.add(TWO);
        assertEquals(sj.toString(), "{" + ONE + DASH + TWO + "}");
    }

    public void lengthWithCustomEmptyValue() {
        StringJoiner sj = new StringJoiner(DASH, "<", ">").setEmptyValue(EMPTY);
        assertEquals(sj.length(), EMPTY.length());
        sj.add("");
        assertEquals(sj.length(), "<>".length());
        sj.add("");
        assertEquals(sj.length(), "<->".length());
        sj.add(ONE);
        assertEquals(sj.length(), 4 + ONE_LEN);
        assertEquals(sj.toString().length(), sj.length());
        sj.add(TWO);
        assertEquals(sj.length(), 5 + ONE_LEN + TWO_LEN);
        assertEquals(sj.toString().length(), sj.length());
        sj = new StringJoiner("||", "<", "-->");
        assertEquals(sj.length(), 4);
        assertEquals(sj.toString().length(), sj.length());
        sj.add("abcdef");
        assertEquals(sj.length(), 10);
        assertEquals(sj.toString().length(), sj.length());
        sj.add("xyz");
        assertEquals(sj.length(), 15);
        assertEquals(sj.toString().length(), sj.length());
    }

    public void noAddAndEmptyValue() {
        StringJoiner sj = new StringJoiner(DASH, "", "").setEmptyValue(EMPTY);
        assertEquals(sj.toString(), EMPTY);

        sj = new StringJoiner(DASH, "<..", "");
        assertEquals(sj.toString(), "<..");

        sj = new StringJoiner(DASH, "<..", "");
        assertEquals(sj.toString(), "<..");

        sj = new StringJoiner(DASH, "", "==>");
        assertEquals(sj.toString(), "==>");

        sj = new StringJoiner(DASH, "{", "}");
        assertEquals(sj.toString(), "{}");
    }

    @Test(expectedExceptions = {NullPointerException.class})
    public void setEmptyValueNull() {
        new StringJoiner(DASH, "{", "}").setEmptyValue(null);
    }

    @Test(expectedExceptions = {NullPointerException.class})
    public void setDelimiterNull() {
        new StringJoiner(null);
    }

    @Test(expectedExceptions = {NullPointerException.class})
    public void setPrefixNull() {
        new StringJoiner(DASH, null, "}");
    }

    @Test(expectedExceptions = {NullPointerException.class})
    public void setSuffixNull() {
        new StringJoiner(DASH, "{", null);
    }

    public void stringFromtoString() {
        StringJoiner sj = new StringJoiner(", ");
        assertEquals(sj.toString(), "");
        sj = new StringJoiner(",", "{", "}");
        assertEquals(sj.toString(), "{}");

        sj = new StringJoiner(",");
        sj.add(ONE);
        assertEquals(sj.toString(), ONE);

        sj.add(TWO);
        assertEquals(sj.toString(), ONE + "," + TWO);

        sj = new StringJoiner(",", "{--", "--}");
        sj.add(ONE);
        sj.add(TWO);
        assertEquals(sj.toString(), "{--" + ONE + "," + TWO + "--}");

    }

    public void stringFromtoStringWithEmptyValue() {
        StringJoiner sj = new StringJoiner(" ", "", "");
        assertEquals(sj.toString(), "");
        sj = new StringJoiner(", ");
        assertEquals(sj.toString(), "");
        sj = new StringJoiner(",", "{", "}");
        assertEquals(sj.toString(), "{}");

        sj = new StringJoiner(",", "{", "}").setEmptyValue("");
        assertEquals(sj.toString(), "");

        sj = new StringJoiner(",");
        sj.add(ONE);
        assertEquals(sj.toString(), ONE);

        sj.add(TWO);
        assertEquals(sj.toString(), ONE + "," + TWO);

        sj = new StringJoiner(",", "{--", "--}");
        sj.add(ONE);
        assertEquals(sj.toString(), "{--" + ONE + "--}" );

        sj.add(TWO);
        assertEquals(sj.toString(), "{--" + ONE + "," + TWO + "--}");

    }

    public void toStringWithCustomEmptyValue() {
        StringJoiner sj = new StringJoiner(DASH, "<", ">").setEmptyValue(EMPTY);
        assertEquals(sj.toString(), EMPTY);
        sj.add("");
        assertEquals(sj.toString(), "<>");
        sj.add("");
        assertEquals(sj.toString(), "<->");
    }

    private void testCombos(String infix, String prefix, String suffix) {
        StringJoiner sj = new StringJoiner(infix, prefix, suffix);
        assertEquals(sj.toString(), prefix + suffix);
        assertEquals(sj.toString().length(), sj.length());
        // EmptyValue
        sj = new StringJoiner(infix, prefix, suffix).setEmptyValue("<NONE>");
        assertEquals(sj.toString(), "<NONE>");
        assertEquals(sj.toString().length(), sj.length());

        // empty in front
        sj.add("");
        assertEquals(sj.toString(), prefix + suffix);
        // empty in middle
        sj.add("");
        assertEquals(sj.toString(), prefix + infix + suffix);
        sj.add("1");
        assertEquals(sj.toString(), prefix + infix + infix + "1" + suffix);
        // empty at end
        sj.add("");
        assertEquals(sj.toString(), prefix + infix + infix + "1" + infix + suffix);

        sj = new StringJoiner(infix, prefix, suffix).setEmptyValue("<NONE>");
        sj.add("1");
        assertEquals(sj.toString(), prefix + "1" + suffix);
        sj.add("2");
        assertEquals(sj.toString(), prefix + "1" + infix + "2" + suffix);
        sj.add("");
        assertEquals(sj.toString(), prefix + "1" + infix + "2" +infix + suffix);
        sj.add("3");
        assertEquals(sj.toString(), prefix + "1" + infix + "2" +infix + infix + "3" + suffix);
    }

    public void testDelimiterCombinations() {
        testCombos("", "", "");
        testCombos("", "<", "");
        testCombos("", "", ">");
        testCombos("", "<", ">");
        testCombos(",", "", "");
        testCombos(",", "<", "");
        testCombos(",", "", ">");
        testCombos(",", "<", ">");
    }
}

