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    *      https://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  package org.apache.commons.lang3;
18  
19  import static org.junit.jupiter.api.Assertions.assertArrayEquals;
20  import static org.junit.jupiter.api.Assertions.assertEquals;
21  import static org.junit.jupiter.api.Assertions.assertNull;
22  
23  import org.junit.jupiter.api.Disabled;
24  import org.junit.jupiter.api.Test;
25  
26  /**
27   * Tests {@link StringUtils} strip methods.
28   */
29  class StringUtilsStripTest extends AbstractLangTest {
30      private static final String FOO = "foo";
31  
32      @Test
33      void testStripAccents() {
34          final String cue = "\u00C7\u00FA\u00EA";
35          assertEquals("Cue", StringUtils.stripAccents(cue), "Failed to strip accents from " + cue);
36  
37          final String lots = "\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C7\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF\u00D1\u00D2\u00D3"
38                  + "\u00D4\u00D5\u00D6\u00D9\u00DA\u00DB\u00DC\u00DD";
39          assertEquals("AAAAAACEEEEIIIINOOOOOUUUUY", StringUtils.stripAccents(lots), "Failed to strip accents from " + lots);
40  
41          assertNull(StringUtils.stripAccents(null), "Failed null safety");
42          assertEquals("", StringUtils.stripAccents(""), "Failed empty String");
43          assertEquals("control", StringUtils.stripAccents("control"), "Failed to handle non-accented text");
44          assertEquals("eclair", StringUtils.stripAccents("\u00E9clair"), "Failed to handle easy example");
45          assertEquals("ALOSZZCND aloszzcnd",
46                  StringUtils.stripAccents("\u0104\u0141\u00D3\u015A\u017B\u0179\u0106\u0143\u0110 \u0105\u0142\u00F3\u015B\u017C\u017A\u0107\u0144\u0111"));
47          assertEquals("The cafe\u2019s pinata gave me deja vu.", StringUtils.stripAccents("The caf\u00e9\u2019s pi\u00f1ata gave me d\u00e9j\u00e0 vu."),
48                  "Failed to handle accented text");
49          assertEquals("fluid quest", StringUtils.stripAccents("\ufb02uid que\ufb06"), "Failed to handle ligatures");
50          assertEquals("a b c 1 2 3", StringUtils.stripAccents("\u1d43 \u1d47 \u1d9c \u00b9 \u00b2 \u00b3"), "Failed to handle superscript text");
51          assertEquals("math italic",
52                  StringUtils.stripAccents("\uD835\uDC5A\uD835\uDC4E\uD835\uDC61\u210E \uD835\uDC56\uD835\uDC61\uD835\uDC4E\uD835\uDC59\uD835\uDC56\uD835\uDC50"),
53                  "Failed to handle UTF32 example");
54          assertEquals("\uD83D\uDF01 \uD83D\uDF02 \uD83D\uDF03 \uD83D\uDF04", StringUtils.stripAccents("\uD83D\uDF01 \uD83D\uDF02 \uD83D\uDF03 \uD83D\uDF04"),
55                  "Failed to handle non-accented text");
56      }
57  
58      @Test
59      void testStripAccentsIWithBar() {
60          assertEquals("I i I i I", StringUtils.stripAccents("\u0197 \u0268 \u1D7B \u1DA4 \u1DA7"));
61      }
62  
63      @Test
64      @Disabled
65      void testStripAccentsKorean() {
66          // LANG-1655
67          final String input = "\uC78A\uC9C0\uB9C8 \uB10C \uD750\uB9B0 \uC5B4\uB460\uC0AC\uC774 \uC67C\uC190\uC73C\uB85C \uADF8\uB9B0 \uBCC4 \uD558\uB098";
68          assertEquals(input, StringUtils.stripAccents(input), "Failed to handle Korean text");
69      }
70  
71      /**
72       * Decomposes ligatures and digraphs per the KD column in the <a href = "https://www.unicode.org/charts/normalization/">Unicode Normalization Chart.</a>
73       */
74      @Test
75      void testStripAccentsSymbolMath() {
76          // Noop
77          final String lt = "<";
78          assertEquals(lt, StringUtils.stripAccents(lt));
79          // https://www.unicode.org/charts/normalization/chart_Symbol-Math.html
80          assertEquals(lt, StringUtils.stripAccents("\uFE64"));
81          assertEquals(lt, StringUtils.stripAccents("\uFF1C"));
82          assertEquals(lt, StringUtils.stripAccents("\u226E"));
83          // Noop
84          final String gt = ">";
85          assertEquals(gt, StringUtils.stripAccents(gt));
86          // https://www.unicode.org/charts/normalization/chart_Symbol-Math.html
87          assertEquals(gt, StringUtils.stripAccents("\uFE65"));
88          assertEquals(gt, StringUtils.stripAccents("\uFE65"));
89          assertEquals(gt, StringUtils.stripAccents("\u226F"));
90          //
91          assertEquals("</script>", StringUtils.stripAccents("\uFF1C\uFF0Fscript\uFF1E"));
92      }
93  
94      @Test
95      void testStripAccentsTWithStroke() {
96          assertEquals("T t", StringUtils.stripAccents("\u0166 \u0167"));
97      }
98  
99      /**
100      * Tests Unicode vulgar fractions.
101      */
102     @Test
103     void testStripAccentsUnicodeVulgarFractions() {
104         // 1/4, note "⁄", not "/".
105         assertEquals("1⁄4", StringUtils.stripAccents("\u00BC"));
106         // 1/2, note "⁄", not "/".
107         assertEquals("1⁄2", StringUtils.stripAccents("\u00BD"));
108         // 3/4, note "⁄", not "/".
109         assertEquals("3⁄4", StringUtils.stripAccents("\u00BE"));
110     }
111 
112     @Test
113     void testStripAccentsUWithBar() {
114         assertEquals("U u U u", StringUtils.stripAccents("\u0244 \u0289 \u1D7E \u1DB6"));
115     }
116 
117     @Test
118     void testStripAll() {
119         // test stripAll method, merely an array version of the above strip
120         final String[] empty = {};
121         final String[] fooSpace = { "  " + FOO + "  ", "  " + FOO, FOO + "  " };
122         final String[] fooDots = { ".." + FOO + "..", ".." + FOO, FOO + ".." };
123         final String[] foo = { FOO, FOO, FOO };
124 
125         assertNull(StringUtils.stripAll((String[]) null));
126         // Additional varargs tests
127         assertArrayEquals(empty, StringUtils.stripAll()); // empty array
128         assertArrayEquals(new String[] { null }, StringUtils.stripAll((String) null)); // == new String[]{null}
129 
130         assertArrayEquals(empty, StringUtils.stripAll(empty));
131         assertArrayEquals(foo, StringUtils.stripAll(fooSpace));
132 
133         assertNull(StringUtils.stripAll(null, null));
134         assertArrayEquals(foo, StringUtils.stripAll(fooSpace, null));
135         assertArrayEquals(foo, StringUtils.stripAll(fooDots, "."));
136     }
137 
138     @Test
139     void testStripEndStringString() {
140         // null stripEnd
141         assertNull(StringUtils.stripEnd(null, null));
142         assertEquals("", StringUtils.stripEnd("", null));
143         assertEquals("", StringUtils.stripEnd("        ", null));
144         assertEquals("  abc", StringUtils.stripEnd("  abc  ", null));
145         assertEquals(StringUtilsTest.WHITESPACE + StringUtilsTest.NON_WHITESPACE,
146                 StringUtils.stripEnd(StringUtilsTest.WHITESPACE + StringUtilsTest.NON_WHITESPACE + StringUtilsTest.WHITESPACE, null));
147 
148         // "" stripEnd
149         assertNull(StringUtils.stripEnd(null, ""));
150         assertEquals("", StringUtils.stripEnd("", ""));
151         assertEquals("        ", StringUtils.stripEnd("        ", ""));
152         assertEquals("  abc  ", StringUtils.stripEnd("  abc  ", ""));
153         assertEquals(StringUtilsTest.WHITESPACE, StringUtils.stripEnd(StringUtilsTest.WHITESPACE, ""));
154 
155         // " " stripEnd
156         assertNull(StringUtils.stripEnd(null, " "));
157         assertEquals("", StringUtils.stripEnd("", " "));
158         assertEquals("", StringUtils.stripEnd("        ", " "));
159         assertEquals("  abc", StringUtils.stripEnd("  abc  ", " "));
160 
161         // "ab" stripEnd
162         assertNull(StringUtils.stripEnd(null, "ab"));
163         assertEquals("", StringUtils.stripEnd("", "ab"));
164         assertEquals("        ", StringUtils.stripEnd("        ", "ab"));
165         assertEquals("  abc  ", StringUtils.stripEnd("  abc  ", "ab"));
166         assertEquals("abc", StringUtils.stripEnd("abcabab", "ab"));
167         assertEquals(StringUtilsTest.WHITESPACE, StringUtils.stripEnd(StringUtilsTest.WHITESPACE, ""));
168     }
169 
170     @Test
171     void testStripStartStringString() {
172         // null stripStart
173         assertNull(StringUtils.stripStart(null, null));
174         assertEquals("", StringUtils.stripStart("", null));
175         assertEquals("", StringUtils.stripStart("        ", null));
176         assertEquals("abc  ", StringUtils.stripStart("  abc  ", null));
177         assertEquals(StringUtilsTest.NON_WHITESPACE + StringUtilsTest.WHITESPACE,
178                 StringUtils.stripStart(StringUtilsTest.WHITESPACE + StringUtilsTest.NON_WHITESPACE + StringUtilsTest.WHITESPACE, null));
179 
180         // "" stripStart
181         assertNull(StringUtils.stripStart(null, ""));
182         assertEquals("", StringUtils.stripStart("", ""));
183         assertEquals("        ", StringUtils.stripStart("        ", ""));
184         assertEquals("  abc  ", StringUtils.stripStart("  abc  ", ""));
185         assertEquals(StringUtilsTest.WHITESPACE, StringUtils.stripStart(StringUtilsTest.WHITESPACE, ""));
186 
187         // " " stripStart
188         assertNull(StringUtils.stripStart(null, " "));
189         assertEquals("", StringUtils.stripStart("", " "));
190         assertEquals("", StringUtils.stripStart("        ", " "));
191         assertEquals("abc  ", StringUtils.stripStart("  abc  ", " "));
192 
193         // "ab" stripStart
194         assertNull(StringUtils.stripStart(null, "ab"));
195         assertEquals("", StringUtils.stripStart("", "ab"));
196         assertEquals("        ", StringUtils.stripStart("        ", "ab"));
197         assertEquals("  abc  ", StringUtils.stripStart("  abc  ", "ab"));
198         assertEquals("cabab", StringUtils.stripStart("abcabab", "ab"));
199         assertEquals(StringUtilsTest.WHITESPACE, StringUtils.stripStart(StringUtilsTest.WHITESPACE, ""));
200     }
201 
202     @Test
203     void testStripString() {
204         assertNull(StringUtils.strip(null));
205         assertEquals("", StringUtils.strip(""));
206         assertEquals("", StringUtils.strip("        "));
207         assertEquals("abc", StringUtils.strip("  abc  "));
208         assertEquals(StringUtilsTest.NON_WHITESPACE,
209                 StringUtils.strip(StringUtilsTest.WHITESPACE + StringUtilsTest.NON_WHITESPACE + StringUtilsTest.WHITESPACE));
210     }
211 
212     @Test
213     void testStripStringString() {
214         // null strip
215         assertNull(StringUtils.strip(null, null));
216         assertEquals("", StringUtils.strip("", null));
217         assertEquals("", StringUtils.strip("        ", null));
218         assertEquals("abc", StringUtils.strip("  abc  ", null));
219         assertEquals(StringUtilsTest.NON_WHITESPACE,
220                 StringUtils.strip(StringUtilsTest.WHITESPACE + StringUtilsTest.NON_WHITESPACE + StringUtilsTest.WHITESPACE, null));
221 
222         // "" strip
223         assertNull(StringUtils.strip(null, ""));
224         assertEquals("", StringUtils.strip("", ""));
225         assertEquals("        ", StringUtils.strip("        ", ""));
226         assertEquals("  abc  ", StringUtils.strip("  abc  ", ""));
227         assertEquals(StringUtilsTest.WHITESPACE, StringUtils.strip(StringUtilsTest.WHITESPACE, ""));
228 
229         // " " strip
230         assertNull(StringUtils.strip(null, " "));
231         assertEquals("", StringUtils.strip("", " "));
232         assertEquals("", StringUtils.strip("        ", " "));
233         assertEquals("abc", StringUtils.strip("  abc  ", " "));
234 
235         // "ab" strip
236         assertNull(StringUtils.strip(null, "ab"));
237         assertEquals("", StringUtils.strip("", "ab"));
238         assertEquals("        ", StringUtils.strip("        ", "ab"));
239         assertEquals("  abc  ", StringUtils.strip("  abc  ", "ab"));
240         assertEquals("c", StringUtils.strip("abcabab", "ab"));
241         assertEquals(StringUtilsTest.WHITESPACE, StringUtils.strip(StringUtilsTest.WHITESPACE, ""));
242     }
243 
244     @Test
245     void testStripSupplementaryCodePoints() {
246         // U+1D51E and U+1D51F share the high surrogate \uD835; U+1D11E shares the low surrogate \uDD1E with U+1D51E.
247         final String mathA = "\uD835\uDD1E"; // U+1D51E
248         final String mathB = "\uD835\uDD1F"; // U+1D51F
249         final String clef = "\uD834\uDD1E";  // U+1D11E
250 
251         // A supplementary strip character must not match a code point that only shares one surrogate half.
252         assertEquals(mathA + "abc", StringUtils.stripStart(mathA + "abc", mathB));
253         assertEquals("abc" + clef, StringUtils.stripEnd("abc" + clef, mathA));
254         assertEquals(mathA + "abc" + mathA, StringUtils.strip(mathA + "abc" + mathA, mathB));
255 
256         // Genuine membership still strips the whole supplementary code point.
257         assertEquals("abc", StringUtils.stripStart(mathA + mathA + "abc", mathA));
258         assertEquals("abc", StringUtils.stripEnd("abc" + mathA + mathA, mathA));
259         assertEquals("abc", StringUtils.strip(mathA + "abc" + mathA, mathA));
260     }
261 
262     @Test
263     void testStripToEmptyString() {
264         assertEquals("", StringUtils.stripToEmpty(null));
265         assertEquals("", StringUtils.stripToEmpty(""));
266         assertEquals("", StringUtils.stripToEmpty("        "));
267         assertEquals("", StringUtils.stripToEmpty(StringUtilsTest.WHITESPACE));
268         assertEquals("ab c", StringUtils.stripToEmpty("  ab c  "));
269         assertEquals(StringUtilsTest.NON_WHITESPACE,
270                 StringUtils.stripToEmpty(StringUtilsTest.WHITESPACE + StringUtilsTest.NON_WHITESPACE + StringUtilsTest.WHITESPACE));
271     }
272 
273     @Test
274     void testStripToNullString() {
275         assertNull(StringUtils.stripToNull(null));
276         assertNull(StringUtils.stripToNull(""));
277         assertNull(StringUtils.stripToNull("        "));
278         assertNull(StringUtils.stripToNull(StringUtilsTest.WHITESPACE));
279         assertEquals("ab c", StringUtils.stripToNull("  ab c  "));
280         assertEquals(StringUtilsTest.NON_WHITESPACE,
281                 StringUtils.stripToNull(StringUtilsTest.WHITESPACE + StringUtilsTest.NON_WHITESPACE + StringUtilsTest.WHITESPACE));
282     }
283 }