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  package org.apache.commons.lang3;
18  
19  import static org.junit.jupiter.api.Assertions.assertEquals;
20  import static org.junit.jupiter.api.Assertions.assertNull;
21  import static org.junit.jupiter.api.Assertions.assertSame;
22  
23  import org.junit.jupiter.api.Test;
24  
25  /**
26   * Unit tests {@link StringUtils} - Substring methods
27   */
28  public class StringUtilsSubstringTest extends AbstractLangTest {
29      private static final String FOO = "foo";
30      private static final String BAR = "bar";
31      private static final String BAZ = "baz";
32      private static final String FOOBAR = "foobar";
33      private static final String SENTENCE = "foo bar baz";
34  
35      @Test
36      public void testCountMatches_char() {
37          assertEquals(0, StringUtils.countMatches(null, 'D'));
38          assertEquals(5, StringUtils.countMatches("one long someone sentence of one", ' '));
39          assertEquals(6, StringUtils.countMatches("one long someone sentence of one", 'o'));
40          assertEquals(4, StringUtils.countMatches("oooooooooooo", "ooo"));
41      }
42  
43      @Test
44      public void testCountMatches_String() {
45          assertEquals(0, StringUtils.countMatches(null, null));
46          assertEquals(0, StringUtils.countMatches("blah", null));
47          assertEquals(0, StringUtils.countMatches(null, "DD"));
48  
49          assertEquals(0, StringUtils.countMatches("x", ""));
50          assertEquals(0, StringUtils.countMatches("", ""));
51  
52          assertEquals(3,
53               StringUtils.countMatches("one long someone sentence of one", "one"));
54          assertEquals(0,
55               StringUtils.countMatches("one long someone sentence of one", "two"));
56          assertEquals(4,
57               StringUtils.countMatches("oooooooooooo", "ooo"));
58          assertEquals(0, StringUtils.countMatches(null, "?"));
59          assertEquals(0, StringUtils.countMatches("", "?"));
60          assertEquals(0, StringUtils.countMatches("abba", null));
61          assertEquals(0, StringUtils.countMatches("abba", ""));
62          assertEquals(2, StringUtils.countMatches("abba", "a"));
63          assertEquals(1, StringUtils.countMatches("abba", "ab"));
64          assertEquals(0, StringUtils.countMatches("abba", "xxx"));
65          assertEquals(1, StringUtils.countMatches("ababa", "aba"));
66      }
67  
68      @Test
69      public void testLeft_String() {
70          assertSame(null, StringUtils.left(null, -1));
71          assertSame(null, StringUtils.left(null, 0));
72          assertSame(null, StringUtils.left(null, 2));
73  
74          assertEquals("", StringUtils.left("", -1));
75          assertEquals("", StringUtils.left("", 0));
76          assertEquals("", StringUtils.left("", 2));
77  
78          assertEquals("", StringUtils.left(FOOBAR, -1));
79          assertEquals("", StringUtils.left(FOOBAR, 0));
80          assertEquals(FOO, StringUtils.left(FOOBAR, 3));
81          assertSame(FOOBAR, StringUtils.left(FOOBAR, 80));
82      }
83  
84      @Test
85      public void testMid_String() {
86          assertSame(null, StringUtils.mid(null, -1, 0));
87          assertSame(null, StringUtils.mid(null, 0, -1));
88          assertSame(null, StringUtils.mid(null, 3, 0));
89          assertSame(null, StringUtils.mid(null, 3, 2));
90  
91          assertEquals("", StringUtils.mid("", 0, -1));
92          assertEquals("", StringUtils.mid("", 0, 0));
93          assertEquals("", StringUtils.mid("", 0, 2));
94  
95          assertEquals("", StringUtils.mid(FOOBAR, 3, -1));
96          assertEquals("", StringUtils.mid(FOOBAR, 3, 0));
97          assertEquals("b", StringUtils.mid(FOOBAR, 3, 1));
98          assertEquals(FOO, StringUtils.mid(FOOBAR, 0, 3));
99          assertEquals(BAR, StringUtils.mid(FOOBAR, 3, 3));
100         assertEquals(FOOBAR, StringUtils.mid(FOOBAR, 0, 80));
101         assertEquals(BAR, StringUtils.mid(FOOBAR, 3, 80));
102         assertEquals("", StringUtils.mid(FOOBAR, 9, 3));
103         assertEquals(FOO, StringUtils.mid(FOOBAR, -1, 3));
104     }
105 
106     @Test
107     public void testRight_String() {
108         assertSame(null, StringUtils.right(null, -1));
109         assertSame(null, StringUtils.right(null, 0));
110         assertSame(null, StringUtils.right(null, 2));
111 
112         assertEquals("", StringUtils.right("", -1));
113         assertEquals("", StringUtils.right("", 0));
114         assertEquals("", StringUtils.right("", 2));
115 
116         assertEquals("", StringUtils.right(FOOBAR, -1));
117         assertEquals("", StringUtils.right(FOOBAR, 0));
118         assertEquals(BAR, StringUtils.right(FOOBAR, 3));
119         assertSame(FOOBAR, StringUtils.right(FOOBAR, 80));
120     }
121 
122     @Test
123     public void testSubstring_StringInt() {
124         assertNull(StringUtils.substring(null, 0));
125         assertEquals("", StringUtils.substring("", 0));
126         assertEquals("", StringUtils.substring("", 2));
127 
128         assertEquals("", StringUtils.substring(SENTENCE, 80));
129         assertEquals(BAZ, StringUtils.substring(SENTENCE, 8));
130         assertEquals(BAZ, StringUtils.substring(SENTENCE, -3));
131         assertEquals(SENTENCE, StringUtils.substring(SENTENCE, 0));
132         assertEquals("abc", StringUtils.substring("abc", -4));
133         assertEquals("abc", StringUtils.substring("abc", -3));
134         assertEquals("bc", StringUtils.substring("abc", -2));
135         assertEquals("c", StringUtils.substring("abc", -1));
136         assertEquals("abc", StringUtils.substring("abc", 0));
137         assertEquals("bc", StringUtils.substring("abc", 1));
138         assertEquals("c", StringUtils.substring("abc", 2));
139         assertEquals("", StringUtils.substring("abc", 3));
140         assertEquals("", StringUtils.substring("abc", 4));
141     }
142 
143     @Test
144     public void testSubstring_StringIntInt() {
145         assertNull(StringUtils.substring(null, 0, 0));
146         assertNull(StringUtils.substring(null, 1, 2));
147         assertEquals("", StringUtils.substring("", 0, 0));
148         assertEquals("", StringUtils.substring("", 1, 2));
149         assertEquals("", StringUtils.substring("", -2, -1));
150 
151         assertEquals("", StringUtils.substring(SENTENCE, 8, 6));
152         assertEquals(FOO, StringUtils.substring(SENTENCE, 0, 3));
153         assertEquals("o", StringUtils.substring(SENTENCE, -9, 3));
154         assertEquals(FOO, StringUtils.substring(SENTENCE, 0, -8));
155         assertEquals("o", StringUtils.substring(SENTENCE, -9, -8));
156         assertEquals(SENTENCE, StringUtils.substring(SENTENCE, 0, 80));
157         assertEquals("", StringUtils.substring(SENTENCE, 2, 2));
158         assertEquals("b", StringUtils.substring("abc", -2, -1));
159     }
160 
161     @Test
162     public void testSubstringAfter_StringInt() {
163         assertNull(StringUtils.substringAfter(null, 0));
164         assertNull(StringUtils.substringAfter(null, 'X'));
165         assertEquals("", StringUtils.substringAfter("", 0));
166         assertEquals("", StringUtils.substringAfter("", 'X'));
167 
168         assertEquals("", StringUtils.substringAfter("foo", 0));
169         assertEquals("ot", StringUtils.substringAfter("foot", 'o'));
170         assertEquals("bc", StringUtils.substringAfter("abc", 'a'));
171         assertEquals("cba", StringUtils.substringAfter("abcba", 'b'));
172         assertEquals("", StringUtils.substringAfter("abc", 'c'));
173         assertEquals("", StringUtils.substringAfter("abc", 'd'));
174     }
175 
176     @Test
177     public void testSubstringAfter_StringString() {
178         assertEquals("barXXbaz", StringUtils.substringAfter("fooXXbarXXbaz", "XX"));
179 
180         assertNull(StringUtils.substringAfter(null, null));
181         assertNull(StringUtils.substringAfter(null, ""));
182         assertNull(StringUtils.substringAfter(null, "XX"));
183         assertEquals("", StringUtils.substringAfter("", null));
184         assertEquals("", StringUtils.substringAfter("", ""));
185         assertEquals("", StringUtils.substringAfter("", "XX"));
186 
187         assertEquals("", StringUtils.substringAfter("foo", null));
188         assertEquals("ot", StringUtils.substringAfter("foot", "o"));
189         assertEquals("bc", StringUtils.substringAfter("abc", "a"));
190         assertEquals("cba", StringUtils.substringAfter("abcba", "b"));
191         assertEquals("", StringUtils.substringAfter("abc", "c"));
192         assertEquals("abc", StringUtils.substringAfter("abc", ""));
193         assertEquals("", StringUtils.substringAfter("abc", "d"));
194     }
195 
196     @Test
197     public void testSubstringAfterLast_StringInt() {
198         assertNull(StringUtils.substringAfterLast(null, 0));
199         assertNull(StringUtils.substringAfterLast(null, 'X'));
200         assertEquals("", StringUtils.substringAfterLast("", 0));
201         assertEquals("", StringUtils.substringAfterLast("", 'a'));
202 
203         assertEquals("", StringUtils.substringAfterLast("foo", 0));
204         assertEquals("", StringUtils.substringAfterLast("foo", 'b'));
205         assertEquals("t", StringUtils.substringAfterLast("foot", 'o'));
206         assertEquals("bc", StringUtils.substringAfterLast("abc", 'a'));
207         assertEquals("a", StringUtils.substringAfterLast("abcba", 'b'));
208         assertEquals("", StringUtils.substringAfterLast("abc", 'c'));
209         assertEquals("", StringUtils.substringAfterLast("", 'd'));
210     }
211 
212     @Test
213     public void testSubstringAfterLast_StringString() {
214         assertEquals("baz", StringUtils.substringAfterLast("fooXXbarXXbaz", "XX"));
215 
216         assertNull(StringUtils.substringAfterLast(null, null));
217         assertNull(StringUtils.substringAfterLast(null, ""));
218         assertNull(StringUtils.substringAfterLast(null, "XX"));
219         assertEquals("", StringUtils.substringAfterLast("", null));
220         assertEquals("", StringUtils.substringAfterLast("", ""));
221         assertEquals("", StringUtils.substringAfterLast("", "a"));
222 
223         assertEquals("", StringUtils.substringAfterLast("foo", null));
224         assertEquals("", StringUtils.substringAfterLast("foo", "b"));
225         assertEquals("t", StringUtils.substringAfterLast("foot", "o"));
226         assertEquals("bc", StringUtils.substringAfterLast("abc", "a"));
227         assertEquals("a", StringUtils.substringAfterLast("abcba", "b"));
228         assertEquals("", StringUtils.substringAfterLast("abc", "c"));
229         assertEquals("", StringUtils.substringAfterLast("", "d"));
230         assertEquals("", StringUtils.substringAfterLast("abc", ""));
231     }
232 
233     @Test
234     public void testSubstringBefore_StringInt() {
235         assertEquals("foo", StringUtils.substringBefore("fooXXbarXXbaz", 'X'));
236 
237         assertNull(StringUtils.substringBefore(null, 0));
238         assertNull(StringUtils.substringBefore(null, 'X'));
239         assertEquals("", StringUtils.substringBefore("", 0));
240         assertEquals("", StringUtils.substringBefore("", 'X'));
241 
242         assertEquals("foo", StringUtils.substringBefore("foo", 0));
243         assertEquals("foo", StringUtils.substringBefore("foo", 'b'));
244         assertEquals("f", StringUtils.substringBefore("foot", 'o'));
245         assertEquals("", StringUtils.substringBefore("abc", 'a'));
246         assertEquals("a", StringUtils.substringBefore("abcba", 'b'));
247         assertEquals("ab", StringUtils.substringBefore("abc", 'c'));
248         assertEquals("abc", StringUtils.substringBefore("abc", 0));
249     }
250 
251     @Test
252     public void testSubstringBefore_StringString() {
253         assertEquals("foo", StringUtils.substringBefore("fooXXbarXXbaz", "XX"));
254 
255         assertNull(StringUtils.substringBefore(null, null));
256         assertNull(StringUtils.substringBefore(null, ""));
257         assertNull(StringUtils.substringBefore(null, "XX"));
258         assertEquals("", StringUtils.substringBefore("", null));
259         assertEquals("", StringUtils.substringBefore("", ""));
260         assertEquals("", StringUtils.substringBefore("", "XX"));
261 
262         assertEquals("foo", StringUtils.substringBefore("foo", null));
263         assertEquals("foo", StringUtils.substringBefore("foo", "b"));
264         assertEquals("f", StringUtils.substringBefore("foot", "o"));
265         assertEquals("", StringUtils.substringBefore("abc", "a"));
266         assertEquals("a", StringUtils.substringBefore("abcba", "b"));
267         assertEquals("ab", StringUtils.substringBefore("abc", "c"));
268         assertEquals("", StringUtils.substringBefore("abc", ""));
269         assertEquals("abc", StringUtils.substringBefore("abc", "X"));
270     }
271 
272     @Test
273     public void testSubstringBeforeLast_StringString() {
274         assertEquals("fooXXbar", StringUtils.substringBeforeLast("fooXXbarXXbaz", "XX"));
275 
276         assertNull(StringUtils.substringBeforeLast(null, null));
277         assertNull(StringUtils.substringBeforeLast(null, ""));
278         assertNull(StringUtils.substringBeforeLast(null, "XX"));
279         assertEquals("", StringUtils.substringBeforeLast("", null));
280         assertEquals("", StringUtils.substringBeforeLast("", ""));
281         assertEquals("", StringUtils.substringBeforeLast("", "XX"));
282 
283         assertEquals("foo", StringUtils.substringBeforeLast("foo", null));
284         assertEquals("foo", StringUtils.substringBeforeLast("foo", "b"));
285         assertEquals("fo", StringUtils.substringBeforeLast("foo", "o"));
286         assertEquals("abc\r\n", StringUtils.substringBeforeLast("abc\r\n", "d"));
287         assertEquals("abc", StringUtils.substringBeforeLast("abcdabc", "d"));
288         assertEquals("abcdabc", StringUtils.substringBeforeLast("abcdabcd", "d"));
289         assertEquals("a", StringUtils.substringBeforeLast("abc", "b"));
290         assertEquals("abc ", StringUtils.substringBeforeLast("abc \n", "\n"));
291         assertEquals("a", StringUtils.substringBeforeLast("a", null));
292         assertEquals("a", StringUtils.substringBeforeLast("a", ""));
293         assertEquals("", StringUtils.substringBeforeLast("a", "a"));
294     }
295 
296    @Test
297 public void testSubstringBetween_StringString() {
298     assertNull(StringUtils.substringBetween(null, "tag"));
299     assertEquals("", StringUtils.substringBetween("", ""));
300     assertNull(StringUtils.substringBetween("", "abc"));
301     assertEquals("", StringUtils.substringBetween("    ", " "));
302     assertNull(StringUtils.substringBetween("abc", null));
303     assertEquals("", StringUtils.substringBetween("abc", ""));
304     assertNull(StringUtils.substringBetween("abc", "a"));
305     assertEquals("bc", StringUtils.substringBetween("abca", "a"));
306     assertEquals("bc", StringUtils.substringBetween("abcabca", "a"));
307     assertEquals("bar", StringUtils.substringBetween("\nbar\n", "\n"));
308 }
309 
310     @Test
311     public void testSubstringBetween_StringStringString() {
312         assertNull(StringUtils.substringBetween(null, "", ""));
313         assertNull(StringUtils.substringBetween("", null, ""));
314         assertNull(StringUtils.substringBetween("", "", null));
315         assertEquals("", StringUtils.substringBetween("", "", ""));
316         assertEquals("", StringUtils.substringBetween("foo", "", ""));
317         assertNull(StringUtils.substringBetween("foo", "", "]"));
318         assertNull(StringUtils.substringBetween("foo", "[", "]"));
319         assertEquals("", StringUtils.substringBetween("    ", " ", "  "));
320         assertEquals("bar", StringUtils.substringBetween("<foo>bar</foo>", "<foo>", "</foo>") );
321         assertEquals("abc", StringUtils.substringBetween("yabczyabcz", "y", "z"));
322     }
323 
324     /**
325          * Tests the substringsBetween method that returns a String Array of substrings.
326          */
327         @Test
328         public void testSubstringsBetween_StringStringString() {
329 
330             String[] results = StringUtils.substringsBetween("[one], [two], [three]", "[", "]");
331             assertEquals(3, results.length);
332             assertEquals("one", results[0]);
333             assertEquals("two", results[1]);
334             assertEquals("three", results[2]);
335 
336             results = StringUtils.substringsBetween("[one], [two], three", "[", "]");
337             assertEquals(2, results.length);
338             assertEquals("one", results[0]);
339             assertEquals("two", results[1]);
340 
341             results = StringUtils.substringsBetween("[one], [two], three]", "[", "]");
342             assertEquals(2, results.length);
343             assertEquals("one", results[0]);
344             assertEquals("two", results[1]);
345 
346             results = StringUtils.substringsBetween("[one], two], three]", "[", "]");
347             assertEquals(1, results.length);
348             assertEquals("one", results[0]);
349 
350             results = StringUtils.substringsBetween("one], two], [three]", "[", "]");
351             assertEquals(1, results.length);
352             assertEquals("three", results[0]);
353 
354             // 'ab hello ba' will match, but 'ab non ba' won't
355             // this is because the 'a' is shared between the two and can't be matched twice
356             results = StringUtils.substringsBetween("aabhellobabnonba", "ab", "ba");
357             assertEquals(1, results.length);
358             assertEquals("hello", results[0]);
359 
360             results = StringUtils.substringsBetween("one, two, three", "[", "]");
361             assertNull(results);
362 
363             results = StringUtils.substringsBetween("[one, two, three", "[", "]");
364             assertNull(results);
365 
366             results = StringUtils.substringsBetween("one, two, three]", "[", "]");
367             assertNull(results);
368 
369             results = StringUtils.substringsBetween("[one], [two], [three]", "[", null);
370             assertNull(results);
371 
372             results = StringUtils.substringsBetween("[one], [two], [three]", null, "]");
373             assertNull(results);
374 
375             results = StringUtils.substringsBetween("[one], [two], [three]", "", "");
376             assertNull(results);
377 
378             results = StringUtils.substringsBetween(null, "[", "]");
379             assertNull(results);
380 
381             results = StringUtils.substringsBetween("", "[", "]");
382             assertEquals(0, results.length);
383         }
384 
385 }