View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.commons.lang3;
19  
20  import static org.junit.jupiter.api.Assertions.assertEquals;
21  import static org.junit.jupiter.api.Assertions.assertNotSame;
22  
23  import java.io.IOException;
24  import java.io.StringWriter;
25  import java.util.Arrays;
26  import java.util.Objects;
27  
28  import org.apache.commons.lang3.AppendableJoiner.Builder;
29  import org.apache.commons.lang3.text.StrBuilder;
30  import org.apache.commons.text.TextStringBuilder;
31  import org.junit.jupiter.api.Test;
32  import org.junit.jupiter.params.ParameterizedTest;
33  import org.junit.jupiter.params.provider.ValueSource;
34  
35  /**
36   * Tests {@link AppendableJoiner}.
37   */
38  public class AppendableJoinerTest {
39  
40      static class Fixture {
41  
42          private final String name;
43  
44          Fixture(final String name) {
45              this.name = name;
46          }
47  
48          /**
49           * Renders myself onto an Appendable to avoid creating intermediary strings.
50           */
51          void render(final Appendable appendable) throws IOException {
52              appendable.append(name);
53              appendable.append('!');
54          }
55      }
56  
57      @Test
58      public void testAllBuilderPropertiesStringBuilder() {
59          // @formatter:off
60          final AppendableJoiner<Object> joiner = AppendableJoiner.builder()
61                  .setPrefix("<")
62                  .setDelimiter(".")
63                  .setSuffix(">")
64                  .setElementAppender((a, e) -> a.append(String.valueOf(e)))
65                  .get();
66          // @formatter:on
67          final StringBuilder sbuilder = new StringBuilder("A");
68          assertEquals("A<B.C>", joiner.join(sbuilder, "B", "C").toString());
69          sbuilder.append("1");
70          assertEquals("A<B.C>1<D.E>", joiner.join(sbuilder, Arrays.asList("D", "E")).toString());
71      }
72  
73      @Test
74      public void testBuildDefaultStringBuilder() {
75          final Builder<Object> builder = AppendableJoiner.builder();
76          assertNotSame(builder.get(), builder.get());
77          final AppendableJoiner<Object> joiner = builder.get();
78          final StringBuilder sbuilder = new StringBuilder("A");
79          assertEquals("ABC", joiner.join(sbuilder, "B", "C").toString());
80          sbuilder.append("1");
81          assertEquals("ABC1DE", joiner.join(sbuilder, "D", "E").toString());
82      }
83  
84      @Test
85      public void testBuilder() {
86          assertNotSame(AppendableJoiner.builder(), AppendableJoiner.builder());
87      }
88  
89      @SuppressWarnings("deprecation") // Test own StrBuilder
90      @ParameterizedTest
91      @ValueSource(classes = { StringBuilder.class, StringBuffer.class, StringWriter.class, StrBuilder.class, TextStringBuilder.class })
92      public void testDelimiterAppendable(final Class<? extends Appendable> clazz) throws Exception {
93          final AppendableJoiner<Object> joiner = AppendableJoiner.builder().setDelimiter(".").get();
94          final Appendable sbuilder = clazz.newInstance();
95          sbuilder.append("A");
96          // throws IOException
97          assertEquals("AB.C", joiner.joinA(sbuilder, "B", "C").toString());
98          sbuilder.append("1");
99          // throws IOException
100         assertEquals("AB.C1D.E", joiner.joinA(sbuilder, Arrays.asList("D", "E")).toString());
101     }
102 
103     @Test
104     public void testDelimiterStringBuilder() {
105         final AppendableJoiner<Object> joiner = AppendableJoiner.builder().setDelimiter(".").get();
106         final StringBuilder sbuilder = new StringBuilder("A");
107         // does not throw IOException
108         assertEquals("AB.C", joiner.join(sbuilder, "B", "C").toString());
109         sbuilder.append("1");
110         // does not throw IOException
111         assertEquals("AB.C1D.E", joiner.join(sbuilder, Arrays.asList("D", "E")).toString());
112     }
113 
114     @Test
115     public void testToCharSequenceStringBuilder1() {
116         // @formatter:off
117         final AppendableJoiner<Object> joiner = AppendableJoiner.builder()
118                 .setPrefix("<")
119                 .setDelimiter(".")
120                 .setSuffix(">")
121                 .setElementAppender((a, e) -> a.append("|").append(Objects.toString(e)))
122                 .get();
123         // @formatter:on
124         final StringBuilder sbuilder = new StringBuilder("A");
125         assertEquals("A<|B.|C>", joiner.join(sbuilder, "B", "C").toString());
126         sbuilder.append("1");
127         assertEquals("A<|B.|C>1<|D.|E>", joiner.join(sbuilder, Arrays.asList("D", "E")).toString());
128     }
129 
130     @Test
131     public void testToCharSequenceStringBuilder2() {
132         // @formatter:off
133         final AppendableJoiner<Fixture> joiner = AppendableJoiner.<Fixture>builder()
134                 .setElementAppender((a, e) -> e.render(a))
135                 .get();
136         // @formatter:on
137         final StringBuilder sbuilder = new StringBuilder("[");
138         assertEquals("[B!C!", joiner.join(sbuilder, new Fixture("B"), new Fixture("C")).toString());
139         sbuilder.append("]");
140         assertEquals("[B!C!]D!E!", joiner.join(sbuilder, Arrays.asList(new Fixture("D"), new Fixture("E"))).toString());
141     }
142 }