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