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