1 /*
   2  * Copyright (c) 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  * @test
  25  * @bug 5015163 7172553
  26  * @summary tests StringJoinerTest
  27  * @run testng StringJoinerTest
  28  * @author Jim Gish
  29  */
  30 import java.util.ArrayList;
  31 import java.util.StringJoiner;
  32 import org.testng.annotations.Test;
  33 import static org.testng.Assert.assertEquals;
  34 
  35 @Test(groups = {"unit","string","util","libs"})
  36 public class StringJoinerTest {
  37 
  38     private static final String EMPTY = "EMPTY";
  39     private static final String ONE = "One";
  40     private static final int ONE_LEN = ONE.length();
  41     private static final String TWO = "Two";
  42     private static final int TWO_LEN = TWO.length();
  43     private static final String THREE = "Three";
  44     private static final String FOUR = "Four";
  45     private static final String FIVE = "Five";
  46     private static final String DASH = "-";
  47 
  48     public void addAddAll() {
  49         StringJoiner sj = new StringJoiner(DASH, "{", "}");
  50         sj.add(ONE);
  51 
  52         ArrayList<String> nextOne = new ArrayList<>();
  53         nextOne.add(TWO);
  54         nextOne.add(THREE);
  55         nextOne.stream().forEachOrdered(sj::add);
  56 
  57         String expected = "{"+ONE+DASH+TWO+DASH+THREE+"}";
  58         assertEquals(sj.toString(), expected);
  59     }
  60 
  61     void addAlladd() {
  62         StringJoiner sj = new StringJoiner(DASH, "{", "}");
  63 
  64         ArrayList<String> firstOne = new ArrayList<>();
  65         firstOne.add(ONE);
  66         firstOne.add(TWO);
  67         firstOne.stream().forEachOrdered(sj::add);
  68 
  69         sj.add(THREE);
  70 
  71         String expected = "{"+ONE+DASH+TWO+DASH+THREE+"}";
  72         assertEquals(sj.toString(), expected);
  73     }
  74 
  75     // The following tests do two successive adds of different types
  76     public void addAlladdAll() {
  77         StringJoiner sj = new StringJoiner(DASH, "{", "}");
  78         ArrayList<String> firstOne = new ArrayList<>();
  79         firstOne.add(ONE);
  80         firstOne.add(TWO);
  81         firstOne.add(THREE);
  82         firstOne.stream().forEachOrdered(sj::add);
  83 
  84         ArrayList<String> nextOne = new ArrayList<>();
  85         nextOne.add(FOUR);
  86         nextOne.add(FIVE);
  87         nextOne.stream().forEachOrdered(sj::add);
  88 
  89         String expected = "{"+ONE+DASH+TWO+DASH+THREE+DASH+FOUR+DASH+FIVE+"}";
  90         assertEquals(sj.toString(), expected);
  91     }
  92 
  93     public void addCharSequence() {
  94         StringJoiner sj = new StringJoiner(",");
  95         CharSequence cs_one = ONE;
  96         CharSequence cs_two = TWO;
  97 
  98         sj.add(cs_one);
  99         sj.add(cs_two);
 100 
 101         assertEquals(sj.toString(), ONE + "," + TWO);
 102 
 103         sj = new StringJoiner(DASH, "{", "}");
 104         sj.add(cs_one);
 105         sj.add(cs_two);
 106 
 107         assertEquals(sj.toString(), "{" + ONE + DASH + TWO + "}");
 108 
 109         StringBuilder builder = new StringBuilder(ONE);
 110         StringBuffer buffer = new StringBuffer(THREE);
 111         sj = new StringJoiner(", ", "{ ", " }");
 112         sj.add(builder).add(buffer);
 113         builder.append(TWO);
 114         buffer.append(FOUR);
 115         assertEquals(sj.toString(), "{ " + ONE + ", " + THREE + " }",
 116                 "CharSequence is copied when add");
 117         sj.add(builder);
 118         assertEquals(sj.toString(), "{ " + ONE + ", " + THREE + ", " + ONE +
 119                 TWO + " }");
 120     }
 121 
 122     public void addCharSequenceWithEmptyValue() {
 123         StringJoiner sj = new StringJoiner(",").setEmptyValue(EMPTY);
 124         CharSequence cs_one = ONE;
 125         CharSequence cs_two = TWO;
 126 
 127         sj.add(cs_one);
 128         sj.add(cs_two);
 129 
 130         assertEquals(sj.toString(), ONE + "," + TWO);
 131 
 132         sj = new StringJoiner(DASH, "{", "}");
 133         sj.add(cs_one);
 134         sj.add(cs_two);
 135         assertEquals(sj.toString(), "{" + ONE + DASH + TWO + "}");
 136 
 137         sj = new StringJoiner(DASH, "{", "}");
 138         assertEquals(sj.toString(), "{}");
 139 
 140         sj = new StringJoiner("=", "{", "}").setEmptyValue("");
 141         assertEquals(sj.toString(), "");
 142 
 143         sj = new StringJoiner(DASH, "{", "}").setEmptyValue(EMPTY);
 144         assertEquals(sj.toString(), EMPTY);
 145 
 146         sj.add(cs_one);
 147         sj.add(cs_two);
 148         assertEquals(sj.toString(), "{" + ONE + DASH + TWO + "}");
 149     }
 150 
 151     public void addString() {
 152         StringJoiner sj = new StringJoiner(DASH);
 153         sj.add(ONE);
 154         assertEquals(sj.toString(), ONE);
 155 
 156         sj = new StringJoiner(DASH, "{", "}");
 157         sj.add(ONE);
 158         assertEquals(sj.toString(), "{" + ONE + "}");
 159 
 160         sj.add(TWO);
 161         assertEquals(sj.toString(), "{" + ONE + DASH + TWO + "}");
 162     }
 163 
 164     public void lengthWithCustomEmptyValue() {
 165         StringJoiner sj = new StringJoiner(DASH, "<", ">").setEmptyValue(EMPTY);
 166         assertEquals(sj.length(), EMPTY.length());
 167         sj.add("");
 168         assertEquals(sj.length(), "<>".length());
 169         sj.add("");
 170         assertEquals(sj.length(), "<->".length());
 171         sj.add(ONE);
 172         assertEquals(sj.length(), 4 + ONE_LEN);
 173         assertEquals(sj.toString().length(), sj.length());
 174         sj.add(TWO);
 175         assertEquals(sj.length(), 5 + ONE_LEN + TWO_LEN);
 176         assertEquals(sj.toString().length(), sj.length());
 177         sj = new StringJoiner("||", "<", "-->");
 178         assertEquals(sj.length(), 4);
 179         assertEquals(sj.toString().length(), sj.length());
 180         sj.add("abcdef");
 181         assertEquals(sj.length(), 10);
 182         assertEquals(sj.toString().length(), sj.length());
 183         sj.add("xyz");
 184         assertEquals(sj.length(), 15);
 185         assertEquals(sj.toString().length(), sj.length());
 186     }
 187 
 188     public void noAddAndEmptyValue() {
 189         StringJoiner sj = new StringJoiner(DASH, "", "").setEmptyValue(EMPTY);
 190         assertEquals(sj.toString(), EMPTY);
 191 
 192         sj = new StringJoiner(DASH, "<..", "");
 193         assertEquals(sj.toString(), "<..");
 194 
 195         sj = new StringJoiner(DASH, "<..", "");
 196         assertEquals(sj.toString(), "<..");
 197 
 198         sj = new StringJoiner(DASH, "", "==>");
 199         assertEquals(sj.toString(), "==>");
 200 
 201         sj = new StringJoiner(DASH, "{", "}");
 202         assertEquals(sj.toString(), "{}");
 203     }
 204 
 205     @Test(expectedExceptions = {NullPointerException.class})
 206     public void setEmptyValueNull() {
 207         new StringJoiner(DASH, "{", "}").setEmptyValue(null);
 208     }
 209 
 210     @Test(expectedExceptions = {NullPointerException.class})
 211     public void setDelimiterNull() {
 212         new StringJoiner(null);
 213     }
 214 
 215     @Test(expectedExceptions = {NullPointerException.class})
 216     public void setPrefixNull() {
 217         new StringJoiner(DASH, null, "}");
 218     }
 219 
 220     @Test(expectedExceptions = {NullPointerException.class})
 221     public void setSuffixNull() {
 222         new StringJoiner(DASH, "{", null);
 223     }
 224 
 225     public void stringFromtoString() {
 226         StringJoiner sj = new StringJoiner(", ");
 227         assertEquals(sj.toString(), "");
 228         sj = new StringJoiner(",", "{", "}");
 229         assertEquals(sj.toString(), "{}");
 230 
 231         sj = new StringJoiner(",");
 232         sj.add(ONE);
 233         assertEquals(sj.toString(), ONE);
 234 
 235         sj.add(TWO);
 236         assertEquals(sj.toString(), ONE + "," + TWO);
 237 
 238         sj = new StringJoiner(",", "{--", "--}");
 239         sj.add(ONE);
 240         sj.add(TWO);
 241         assertEquals(sj.toString(), "{--" + ONE + "," + TWO + "--}");
 242 
 243     }
 244 
 245     public void stringFromtoStringWithEmptyValue() {
 246         StringJoiner sj = new StringJoiner(" ", "", "");
 247         assertEquals(sj.toString(), "");
 248         sj = new StringJoiner(", ");
 249         assertEquals(sj.toString(), "");
 250         sj = new StringJoiner(",", "{", "}");
 251         assertEquals(sj.toString(), "{}");
 252 
 253         sj = new StringJoiner(",", "{", "}").setEmptyValue("");
 254         assertEquals(sj.toString(), "");
 255 
 256         sj = new StringJoiner(",");
 257         sj.add(ONE);
 258         assertEquals(sj.toString(), ONE);
 259 
 260         sj.add(TWO);
 261         assertEquals(sj.toString(), ONE + "," + TWO);
 262 
 263         sj = new StringJoiner(",", "{--", "--}");
 264         sj.add(ONE);
 265         assertEquals(sj.toString(), "{--" + ONE + "--}" );
 266 
 267         sj.add(TWO);
 268         assertEquals(sj.toString(), "{--" + ONE + "," + TWO + "--}");
 269 
 270     }
 271 
 272     public void toStringWithCustomEmptyValue() {
 273         StringJoiner sj = new StringJoiner(DASH, "<", ">").setEmptyValue(EMPTY);
 274         assertEquals(sj.toString(), EMPTY);
 275         sj.add("");
 276         assertEquals(sj.toString(), "<>");
 277         sj.add("");
 278         assertEquals(sj.toString(), "<->");
 279     }
 280 
 281     private void testCombos(String infix, String prefix, String suffix) {
 282         StringJoiner sj = new StringJoiner(infix, prefix, suffix);
 283         assertEquals(sj.toString(), prefix + suffix);
 284         assertEquals(sj.toString().length(), sj.length());
 285         // EmptyValue
 286         sj = new StringJoiner(infix, prefix, suffix).setEmptyValue("<NONE>");
 287         assertEquals(sj.toString(), "<NONE>");
 288         assertEquals(sj.toString().length(), sj.length());
 289 
 290         // empty in front
 291         sj.add("");
 292         assertEquals(sj.toString(), prefix + suffix);
 293         // empty in middle
 294         sj.add("");
 295         assertEquals(sj.toString(), prefix + infix + suffix);
 296         sj.add("1");
 297         assertEquals(sj.toString(), prefix + infix + infix + "1" + suffix);
 298         // empty at end
 299         sj.add("");
 300         assertEquals(sj.toString(), prefix + infix + infix + "1" + infix + suffix);
 301 
 302         sj = new StringJoiner(infix, prefix, suffix).setEmptyValue("<NONE>");
 303         sj.add("1");
 304         assertEquals(sj.toString(), prefix + "1" + suffix);
 305         sj.add("2");
 306         assertEquals(sj.toString(), prefix + "1" + infix + "2" + suffix);
 307         sj.add("");
 308         assertEquals(sj.toString(), prefix + "1" + infix + "2" +infix + suffix);
 309         sj.add("3");
 310         assertEquals(sj.toString(), prefix + "1" + infix + "2" +infix + infix + "3" + suffix);
 311     }
 312 
 313     public void testDelimiterCombinations() {
 314         testCombos("", "", "");
 315         testCombos("", "<", "");
 316         testCombos("", "", ">");
 317         testCombos("", "<", ">");
 318         testCombos(",", "", "");
 319         testCombos(",", "<", "");
 320         testCombos(",", "", ">");
 321         testCombos(",", "<", ">");
 322     }
 323 }
 324