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