1 /* 2 * Copyright (C) 2009 The Guava Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.common.base; 18 19 import static com.google.common.truth.Truth.assertThat; 20 import static org.junit.Assert.assertThrows; 21 22 import com.google.common.annotations.GwtCompatible; 23 import com.google.common.annotations.GwtIncompatible; 24 import com.google.common.annotations.J2ktIncompatible; 25 import com.google.common.base.Splitter.MapSplitter; 26 import com.google.common.collect.ImmutableMap; 27 import com.google.common.testing.NullPointerTester; 28 import java.util.Iterator; 29 import java.util.List; 30 import java.util.Map; 31 import java.util.regex.Pattern; 32 import junit.framework.TestCase; 33 34 /** 35 * @author Julien Silland 36 */ 37 @ElementTypesAreNonnullByDefault 38 @GwtCompatible(emulated = true) 39 public class SplitterTest extends TestCase { 40 41 private static final Splitter COMMA_SPLITTER = Splitter.on(','); 42 testSplitNullString()43 public void testSplitNullString() { 44 try { 45 COMMA_SPLITTER.split(null); 46 fail(); 47 } catch (NullPointerException expected) { 48 } 49 } 50 testCharacterSimpleSplit()51 public void testCharacterSimpleSplit() { 52 String simple = "a,b,c"; 53 Iterable<String> letters = COMMA_SPLITTER.split(simple); 54 assertThat(letters).containsExactly("a", "b", "c").inOrder(); 55 } 56 57 /** 58 * All of the infrastructure of split and splitToString is identical, so we do one test of 59 * splitToString. All other cases should be covered by testing of split. 60 * 61 * <p>TODO(user): It would be good to make all the relevant tests run on both split and 62 * splitToString automatically. 63 */ testCharacterSimpleSplitToList()64 public void testCharacterSimpleSplitToList() { 65 String simple = "a,b,c"; 66 List<String> letters = COMMA_SPLITTER.splitToList(simple); 67 assertThat(letters).containsExactly("a", "b", "c").inOrder(); 68 } 69 testToString()70 public void testToString() { 71 assertEquals("[]", COMMA_SPLITTER.split("").toString()); 72 assertEquals("[a, b, c]", COMMA_SPLITTER.split("a,b,c").toString()); 73 assertEquals("[yam, bam, jam, ham]", Splitter.on(", ").split("yam, bam, jam, ham").toString()); 74 } 75 testCharacterSimpleSplitWithNoDelimiter()76 public void testCharacterSimpleSplitWithNoDelimiter() { 77 String simple = "a,b,c"; 78 Iterable<String> letters = Splitter.on('.').split(simple); 79 assertThat(letters).containsExactly("a,b,c").inOrder(); 80 } 81 testCharacterSplitWithDoubleDelimiter()82 public void testCharacterSplitWithDoubleDelimiter() { 83 String doubled = "a,,b,c"; 84 Iterable<String> letters = COMMA_SPLITTER.split(doubled); 85 assertThat(letters).containsExactly("a", "", "b", "c").inOrder(); 86 } 87 testCharacterSplitWithDoubleDelimiterAndSpace()88 public void testCharacterSplitWithDoubleDelimiterAndSpace() { 89 String doubled = "a,, b,c"; 90 Iterable<String> letters = COMMA_SPLITTER.split(doubled); 91 assertThat(letters).containsExactly("a", "", " b", "c").inOrder(); 92 } 93 testCharacterSplitWithTrailingDelimiter()94 public void testCharacterSplitWithTrailingDelimiter() { 95 String trailing = "a,b,c,"; 96 Iterable<String> letters = COMMA_SPLITTER.split(trailing); 97 assertThat(letters).containsExactly("a", "b", "c", "").inOrder(); 98 } 99 testCharacterSplitWithLeadingDelimiter()100 public void testCharacterSplitWithLeadingDelimiter() { 101 String leading = ",a,b,c"; 102 Iterable<String> letters = COMMA_SPLITTER.split(leading); 103 assertThat(letters).containsExactly("", "a", "b", "c").inOrder(); 104 } 105 testCharacterSplitWithMultipleLetters()106 public void testCharacterSplitWithMultipleLetters() { 107 Iterable<String> testCharacteringMotto = 108 Splitter.on('-').split("Testing-rocks-Debugging-sucks"); 109 assertThat(testCharacteringMotto) 110 .containsExactly("Testing", "rocks", "Debugging", "sucks") 111 .inOrder(); 112 } 113 testCharacterSplitWithMatcherDelimiter()114 public void testCharacterSplitWithMatcherDelimiter() { 115 Iterable<String> testCharacteringMotto = 116 Splitter.on(CharMatcher.whitespace()).split("Testing\nrocks\tDebugging sucks"); 117 assertThat(testCharacteringMotto) 118 .containsExactly("Testing", "rocks", "Debugging", "sucks") 119 .inOrder(); 120 } 121 testCharacterSplitWithDoubleDelimiterOmitEmptyStrings()122 public void testCharacterSplitWithDoubleDelimiterOmitEmptyStrings() { 123 String doubled = "a..b.c"; 124 Iterable<String> letters = Splitter.on('.').omitEmptyStrings().split(doubled); 125 assertThat(letters).containsExactly("a", "b", "c").inOrder(); 126 } 127 testCharacterSplitEmptyToken()128 public void testCharacterSplitEmptyToken() { 129 String emptyToken = "a. .c"; 130 Iterable<String> letters = Splitter.on('.').trimResults().split(emptyToken); 131 assertThat(letters).containsExactly("a", "", "c").inOrder(); 132 } 133 testCharacterSplitEmptyTokenOmitEmptyStrings()134 public void testCharacterSplitEmptyTokenOmitEmptyStrings() { 135 String emptyToken = "a. .c"; 136 Iterable<String> letters = Splitter.on('.').omitEmptyStrings().trimResults().split(emptyToken); 137 assertThat(letters).containsExactly("a", "c").inOrder(); 138 } 139 testCharacterSplitOnEmptyString()140 public void testCharacterSplitOnEmptyString() { 141 Iterable<String> nothing = Splitter.on('.').split(""); 142 assertThat(nothing).containsExactly("").inOrder(); 143 } 144 testCharacterSplitOnEmptyStringOmitEmptyStrings()145 public void testCharacterSplitOnEmptyStringOmitEmptyStrings() { 146 assertThat(Splitter.on('.').omitEmptyStrings().split("")).isEmpty(); 147 } 148 testCharacterSplitOnOnlyDelimiter()149 public void testCharacterSplitOnOnlyDelimiter() { 150 Iterable<String> blankblank = Splitter.on('.').split("."); 151 assertThat(blankblank).containsExactly("", "").inOrder(); 152 } 153 testCharacterSplitOnOnlyDelimitersOmitEmptyStrings()154 public void testCharacterSplitOnOnlyDelimitersOmitEmptyStrings() { 155 Iterable<String> empty = Splitter.on('.').omitEmptyStrings().split("..."); 156 assertThat(empty).isEmpty(); 157 } 158 testCharacterSplitWithTrim()159 public void testCharacterSplitWithTrim() { 160 String jacksons = 161 "arfo(Marlon)aorf, (Michael)orfa, afro(Jackie)orfa, " + "ofar(Jemaine), aff(Tito)"; 162 Iterable<String> family = 163 COMMA_SPLITTER 164 .trimResults(CharMatcher.anyOf("afro").or(CharMatcher.whitespace())) 165 .split(jacksons); 166 assertThat(family) 167 .containsExactly("(Marlon)", "(Michael)", "(Jackie)", "(Jemaine)", "(Tito)") 168 .inOrder(); 169 } 170 testStringSimpleSplit()171 public void testStringSimpleSplit() { 172 String simple = "a,b,c"; 173 Iterable<String> letters = Splitter.on(",").split(simple); 174 assertThat(letters).containsExactly("a", "b", "c").inOrder(); 175 } 176 testStringSimpleSplitWithNoDelimiter()177 public void testStringSimpleSplitWithNoDelimiter() { 178 String simple = "a,b,c"; 179 Iterable<String> letters = Splitter.on(".").split(simple); 180 assertThat(letters).containsExactly("a,b,c").inOrder(); 181 } 182 testStringSplitWithDoubleDelimiter()183 public void testStringSplitWithDoubleDelimiter() { 184 String doubled = "a,,b,c"; 185 Iterable<String> letters = Splitter.on(",").split(doubled); 186 assertThat(letters).containsExactly("a", "", "b", "c").inOrder(); 187 } 188 testStringSplitWithDoubleDelimiterAndSpace()189 public void testStringSplitWithDoubleDelimiterAndSpace() { 190 String doubled = "a,, b,c"; 191 Iterable<String> letters = Splitter.on(",").split(doubled); 192 assertThat(letters).containsExactly("a", "", " b", "c").inOrder(); 193 } 194 testStringSplitWithTrailingDelimiter()195 public void testStringSplitWithTrailingDelimiter() { 196 String trailing = "a,b,c,"; 197 Iterable<String> letters = Splitter.on(",").split(trailing); 198 assertThat(letters).containsExactly("a", "b", "c", "").inOrder(); 199 } 200 testStringSplitWithLeadingDelimiter()201 public void testStringSplitWithLeadingDelimiter() { 202 String leading = ",a,b,c"; 203 Iterable<String> letters = Splitter.on(",").split(leading); 204 assertThat(letters).containsExactly("", "a", "b", "c").inOrder(); 205 } 206 testStringSplitWithMultipleLetters()207 public void testStringSplitWithMultipleLetters() { 208 Iterable<String> testStringingMotto = Splitter.on("-").split("Testing-rocks-Debugging-sucks"); 209 assertThat(testStringingMotto) 210 .containsExactly("Testing", "rocks", "Debugging", "sucks") 211 .inOrder(); 212 } 213 testStringSplitWithDoubleDelimiterOmitEmptyStrings()214 public void testStringSplitWithDoubleDelimiterOmitEmptyStrings() { 215 String doubled = "a..b.c"; 216 Iterable<String> letters = Splitter.on(".").omitEmptyStrings().split(doubled); 217 assertThat(letters).containsExactly("a", "b", "c").inOrder(); 218 } 219 testStringSplitEmptyToken()220 public void testStringSplitEmptyToken() { 221 String emptyToken = "a. .c"; 222 Iterable<String> letters = Splitter.on(".").trimResults().split(emptyToken); 223 assertThat(letters).containsExactly("a", "", "c").inOrder(); 224 } 225 testStringSplitEmptyTokenOmitEmptyStrings()226 public void testStringSplitEmptyTokenOmitEmptyStrings() { 227 String emptyToken = "a. .c"; 228 Iterable<String> letters = Splitter.on(".").omitEmptyStrings().trimResults().split(emptyToken); 229 assertThat(letters).containsExactly("a", "c").inOrder(); 230 } 231 testStringSplitWithLongDelimiter()232 public void testStringSplitWithLongDelimiter() { 233 String longDelimiter = "a, b, c"; 234 Iterable<String> letters = Splitter.on(", ").split(longDelimiter); 235 assertThat(letters).containsExactly("a", "b", "c").inOrder(); 236 } 237 testStringSplitWithLongLeadingDelimiter()238 public void testStringSplitWithLongLeadingDelimiter() { 239 String longDelimiter = ", a, b, c"; 240 Iterable<String> letters = Splitter.on(", ").split(longDelimiter); 241 assertThat(letters).containsExactly("", "a", "b", "c").inOrder(); 242 } 243 testStringSplitWithLongTrailingDelimiter()244 public void testStringSplitWithLongTrailingDelimiter() { 245 String longDelimiter = "a, b, c, "; 246 Iterable<String> letters = Splitter.on(", ").split(longDelimiter); 247 assertThat(letters).containsExactly("a", "b", "c", "").inOrder(); 248 } 249 testStringSplitWithDelimiterSubstringInValue()250 public void testStringSplitWithDelimiterSubstringInValue() { 251 String fourCommasAndFourSpaces = ",,,, "; 252 Iterable<String> threeCommasThenThreeSpaces = Splitter.on(", ").split(fourCommasAndFourSpaces); 253 assertThat(threeCommasThenThreeSpaces).containsExactly(",,,", " ").inOrder(); 254 } 255 testStringSplitWithEmptyString()256 public void testStringSplitWithEmptyString() { 257 try { 258 Splitter.on(""); 259 fail(); 260 } catch (IllegalArgumentException expected) { 261 } 262 } 263 testStringSplitOnEmptyString()264 public void testStringSplitOnEmptyString() { 265 Iterable<String> notMuch = Splitter.on(".").split(""); 266 assertThat(notMuch).containsExactly("").inOrder(); 267 } 268 testStringSplitOnEmptyStringOmitEmptyString()269 public void testStringSplitOnEmptyStringOmitEmptyString() { 270 assertThat(Splitter.on(".").omitEmptyStrings().split("")).isEmpty(); 271 } 272 testStringSplitOnOnlyDelimiter()273 public void testStringSplitOnOnlyDelimiter() { 274 Iterable<String> blankblank = Splitter.on(".").split("."); 275 assertThat(blankblank).containsExactly("", "").inOrder(); 276 } 277 testStringSplitOnOnlyDelimitersOmitEmptyStrings()278 public void testStringSplitOnOnlyDelimitersOmitEmptyStrings() { 279 Iterable<String> empty = Splitter.on(".").omitEmptyStrings().split("..."); 280 assertThat(empty).isEmpty(); 281 } 282 testStringSplitWithTrim()283 public void testStringSplitWithTrim() { 284 String jacksons = 285 "arfo(Marlon)aorf, (Michael)orfa, afro(Jackie)orfa, " + "ofar(Jemaine), aff(Tito)"; 286 Iterable<String> family = 287 Splitter.on(",") 288 .trimResults(CharMatcher.anyOf("afro").or(CharMatcher.whitespace())) 289 .split(jacksons); 290 assertThat(family) 291 .containsExactly("(Marlon)", "(Michael)", "(Jackie)", "(Jemaine)", "(Tito)") 292 .inOrder(); 293 } 294 295 @J2ktIncompatible 296 @GwtIncompatible // Splitter.onPattern testPatternSimpleSplit()297 public void testPatternSimpleSplit() { 298 String simple = "a,b,c"; 299 Iterable<String> letters = Splitter.onPattern(",").split(simple); 300 assertThat(letters).containsExactly("a", "b", "c").inOrder(); 301 } 302 303 @J2ktIncompatible 304 @GwtIncompatible // Splitter.onPattern testPatternSimpleSplitWithNoDelimiter()305 public void testPatternSimpleSplitWithNoDelimiter() { 306 String simple = "a,b,c"; 307 Iterable<String> letters = Splitter.onPattern("foo").split(simple); 308 assertThat(letters).containsExactly("a,b,c").inOrder(); 309 } 310 311 @J2ktIncompatible 312 @GwtIncompatible // Splitter.onPattern testPatternSplitWithDoubleDelimiter()313 public void testPatternSplitWithDoubleDelimiter() { 314 String doubled = "a,,b,c"; 315 Iterable<String> letters = Splitter.onPattern(",").split(doubled); 316 assertThat(letters).containsExactly("a", "", "b", "c").inOrder(); 317 } 318 319 @J2ktIncompatible 320 @GwtIncompatible // Splitter.onPattern testPatternSplitWithDoubleDelimiterAndSpace()321 public void testPatternSplitWithDoubleDelimiterAndSpace() { 322 String doubled = "a,, b,c"; 323 Iterable<String> letters = Splitter.onPattern(",").split(doubled); 324 assertThat(letters).containsExactly("a", "", " b", "c").inOrder(); 325 } 326 327 @J2ktIncompatible 328 @GwtIncompatible // Splitter.onPattern testPatternSplitWithTrailingDelimiter()329 public void testPatternSplitWithTrailingDelimiter() { 330 String trailing = "a,b,c,"; 331 Iterable<String> letters = Splitter.onPattern(",").split(trailing); 332 assertThat(letters).containsExactly("a", "b", "c", "").inOrder(); 333 } 334 335 @J2ktIncompatible 336 @GwtIncompatible // Splitter.onPattern testPatternSplitWithLeadingDelimiter()337 public void testPatternSplitWithLeadingDelimiter() { 338 String leading = ",a,b,c"; 339 Iterable<String> letters = Splitter.onPattern(",").split(leading); 340 assertThat(letters).containsExactly("", "a", "b", "c").inOrder(); 341 } 342 343 // TODO(kevinb): the name of this method suggests it might not actually be testing what it 344 // intends to be testing? 345 @J2ktIncompatible 346 @GwtIncompatible // Splitter.onPattern testPatternSplitWithMultipleLetters()347 public void testPatternSplitWithMultipleLetters() { 348 Iterable<String> testPatterningMotto = 349 Splitter.onPattern("-").split("Testing-rocks-Debugging-sucks"); 350 assertThat(testPatterningMotto) 351 .containsExactly("Testing", "rocks", "Debugging", "sucks") 352 .inOrder(); 353 } 354 355 @J2ktIncompatible 356 @GwtIncompatible // java.util.regex.Pattern literalDotPattern()357 private static Pattern literalDotPattern() { 358 return Pattern.compile("\\."); 359 } 360 361 @J2ktIncompatible 362 @GwtIncompatible // java.util.regex.Pattern testPatternSplitWithDoubleDelimiterOmitEmptyStrings()363 public void testPatternSplitWithDoubleDelimiterOmitEmptyStrings() { 364 String doubled = "a..b.c"; 365 Iterable<String> letters = Splitter.on(literalDotPattern()).omitEmptyStrings().split(doubled); 366 assertThat(letters).containsExactly("a", "b", "c").inOrder(); 367 } 368 369 @J2ktIncompatible 370 @GwtIncompatible // java.util.regex.Pattern 371 @AndroidIncompatible // Bug in older versions of Android we test against, since fixed. testPatternSplitLookBehind()372 public void testPatternSplitLookBehind() { 373 if (!CommonPattern.isPcreLike()) { 374 return; 375 } 376 String toSplit = ":foo::barbaz:"; 377 String regexPattern = "(?<=:)"; 378 Iterable<String> split = Splitter.onPattern(regexPattern).split(toSplit); 379 assertThat(split).containsExactly(":", "foo:", ":", "barbaz:").inOrder(); 380 // splits into chunks ending in : 381 } 382 383 @J2ktIncompatible 384 @GwtIncompatible // java.util.regex.Pattern 385 @AndroidIncompatible // Bug in older versions of Android we test against, since fixed. testPatternSplitWordBoundary()386 public void testPatternSplitWordBoundary() { 387 String string = "foo<bar>bletch"; 388 Iterable<String> words = Splitter.on(Pattern.compile("\\b")).split(string); 389 assertThat(words).containsExactly("foo", "<", "bar", ">", "bletch").inOrder(); 390 } 391 392 @J2ktIncompatible 393 @GwtIncompatible // java.util.regex.Pattern testPatternSplitWordBoundary_singleCharInput()394 public void testPatternSplitWordBoundary_singleCharInput() { 395 String string = "f"; 396 Iterable<String> words = Splitter.on(Pattern.compile("\\b")).split(string); 397 assertThat(words).containsExactly("f").inOrder(); 398 } 399 400 @AndroidIncompatible // Apparently Gingerbread's regex API is buggy. 401 @J2ktIncompatible 402 @GwtIncompatible // java.util.regex.Pattern testPatternSplitWordBoundary_singleWordInput()403 public void testPatternSplitWordBoundary_singleWordInput() { 404 String string = "foo"; 405 Iterable<String> words = Splitter.on(Pattern.compile("\\b")).split(string); 406 assertThat(words).containsExactly("foo").inOrder(); 407 } 408 409 @J2ktIncompatible 410 @GwtIncompatible // java.util.regex.Pattern testPatternSplitEmptyToken()411 public void testPatternSplitEmptyToken() { 412 String emptyToken = "a. .c"; 413 Iterable<String> letters = Splitter.on(literalDotPattern()).trimResults().split(emptyToken); 414 assertThat(letters).containsExactly("a", "", "c").inOrder(); 415 } 416 417 @J2ktIncompatible 418 @GwtIncompatible // java.util.regex.Pattern testPatternSplitEmptyTokenOmitEmptyStrings()419 public void testPatternSplitEmptyTokenOmitEmptyStrings() { 420 String emptyToken = "a. .c"; 421 Iterable<String> letters = 422 Splitter.on(literalDotPattern()).omitEmptyStrings().trimResults().split(emptyToken); 423 assertThat(letters).containsExactly("a", "c").inOrder(); 424 } 425 426 @J2ktIncompatible 427 @GwtIncompatible // java.util.regex.Pattern testPatternSplitOnOnlyDelimiter()428 public void testPatternSplitOnOnlyDelimiter() { 429 Iterable<String> blankblank = Splitter.on(literalDotPattern()).split("."); 430 431 assertThat(blankblank).containsExactly("", "").inOrder(); 432 } 433 434 @J2ktIncompatible 435 @GwtIncompatible // java.util.regex.Pattern testPatternSplitOnOnlyDelimitersOmitEmptyStrings()436 public void testPatternSplitOnOnlyDelimitersOmitEmptyStrings() { 437 Iterable<String> empty = Splitter.on(literalDotPattern()).omitEmptyStrings().split("..."); 438 assertThat(empty).isEmpty(); 439 } 440 441 @J2ktIncompatible 442 @GwtIncompatible // java.util.regex.Pattern testPatternSplitMatchingIsGreedy()443 public void testPatternSplitMatchingIsGreedy() { 444 String longDelimiter = "a, b, c"; 445 Iterable<String> letters = Splitter.on(Pattern.compile(",\\s*")).split(longDelimiter); 446 assertThat(letters).containsExactly("a", "b", "c").inOrder(); 447 } 448 449 @J2ktIncompatible 450 @GwtIncompatible // java.util.regex.Pattern testPatternSplitWithLongLeadingDelimiter()451 public void testPatternSplitWithLongLeadingDelimiter() { 452 String longDelimiter = ", a, b, c"; 453 Iterable<String> letters = Splitter.on(Pattern.compile(", ")).split(longDelimiter); 454 assertThat(letters).containsExactly("", "a", "b", "c").inOrder(); 455 } 456 457 @J2ktIncompatible 458 @GwtIncompatible // java.util.regex.Pattern testPatternSplitWithLongTrailingDelimiter()459 public void testPatternSplitWithLongTrailingDelimiter() { 460 String longDelimiter = "a, b, c/ "; 461 Iterable<String> letters = Splitter.on(Pattern.compile("[,/]\\s")).split(longDelimiter); 462 assertThat(letters).containsExactly("a", "b", "c", "").inOrder(); 463 } 464 465 @J2ktIncompatible 466 @GwtIncompatible // java.util.regex.Pattern testPatternSplitInvalidPattern()467 public void testPatternSplitInvalidPattern() { 468 assertThrows(IllegalArgumentException.class, () -> Splitter.on(Pattern.compile("a*"))); 469 } 470 471 @J2ktIncompatible 472 @GwtIncompatible // java.util.regex.Pattern testPatternSplitWithTrim()473 public void testPatternSplitWithTrim() { 474 String jacksons = 475 "arfo(Marlon)aorf, (Michael)orfa, afro(Jackie)orfa, " + "ofar(Jemaine), aff(Tito)"; 476 Iterable<String> family = 477 Splitter.on(Pattern.compile(",")) 478 .trimResults(CharMatcher.anyOf("afro").or(CharMatcher.whitespace())) 479 .split(jacksons); 480 assertThat(family) 481 .containsExactly("(Marlon)", "(Michael)", "(Jackie)", "(Jemaine)", "(Tito)") 482 .inOrder(); 483 } 484 testSplitterIterableIsUnmodifiable_char()485 public void testSplitterIterableIsUnmodifiable_char() { 486 assertIteratorIsUnmodifiable(COMMA_SPLITTER.split("a,b").iterator()); 487 } 488 testSplitterIterableIsUnmodifiable_string()489 public void testSplitterIterableIsUnmodifiable_string() { 490 assertIteratorIsUnmodifiable(Splitter.on(",").split("a,b").iterator()); 491 } 492 493 @J2ktIncompatible 494 @GwtIncompatible // java.util.regex.Pattern testSplitterIterableIsUnmodifiable_pattern()495 public void testSplitterIterableIsUnmodifiable_pattern() { 496 assertIteratorIsUnmodifiable(Splitter.on(Pattern.compile(",")).split("a,b").iterator()); 497 } 498 assertIteratorIsUnmodifiable(Iterator<?> iterator)499 private void assertIteratorIsUnmodifiable(Iterator<?> iterator) { 500 iterator.next(); 501 try { 502 iterator.remove(); 503 fail(); 504 } catch (UnsupportedOperationException expected) { 505 } 506 } 507 testSplitterIterableIsLazy_char()508 public void testSplitterIterableIsLazy_char() { 509 assertSplitterIterableIsLazy(COMMA_SPLITTER); 510 } 511 testSplitterIterableIsLazy_string()512 public void testSplitterIterableIsLazy_string() { 513 assertSplitterIterableIsLazy(Splitter.on(",")); 514 } 515 516 @J2ktIncompatible 517 @GwtIncompatible // java.util.regex.Pattern 518 @AndroidIncompatible // not clear that j.u.r.Matcher promises to handle mutations during use testSplitterIterableIsLazy_pattern()519 public void testSplitterIterableIsLazy_pattern() { 520 if (!CommonPattern.isPcreLike()) { 521 return; 522 } 523 assertSplitterIterableIsLazy(Splitter.onPattern(",")); 524 } 525 526 /** 527 * This test really pushes the boundaries of what we support. In general the splitter's behaviour 528 * is not well defined if the char sequence it's splitting is mutated during iteration. 529 */ assertSplitterIterableIsLazy(Splitter splitter)530 private void assertSplitterIterableIsLazy(Splitter splitter) { 531 StringBuilder builder = new StringBuilder(); 532 Iterator<String> iterator = splitter.split(builder).iterator(); 533 534 builder.append("A,"); 535 assertEquals("A", iterator.next()); 536 builder.append("B,"); 537 assertEquals("B", iterator.next()); 538 builder.append("C"); 539 assertEquals("C", iterator.next()); 540 assertFalse(iterator.hasNext()); 541 } 542 testFixedLengthSimpleSplit()543 public void testFixedLengthSimpleSplit() { 544 String simple = "abcde"; 545 Iterable<String> letters = Splitter.fixedLength(2).split(simple); 546 assertThat(letters).containsExactly("ab", "cd", "e").inOrder(); 547 } 548 testFixedLengthSplitEqualChunkLength()549 public void testFixedLengthSplitEqualChunkLength() { 550 String simple = "abcdef"; 551 Iterable<String> letters = Splitter.fixedLength(2).split(simple); 552 assertThat(letters).containsExactly("ab", "cd", "ef").inOrder(); 553 } 554 testFixedLengthSplitOnlyOneChunk()555 public void testFixedLengthSplitOnlyOneChunk() { 556 String simple = "abc"; 557 Iterable<String> letters = Splitter.fixedLength(3).split(simple); 558 assertThat(letters).containsExactly("abc").inOrder(); 559 } 560 testFixedLengthSplitSmallerString()561 public void testFixedLengthSplitSmallerString() { 562 String simple = "ab"; 563 Iterable<String> letters = Splitter.fixedLength(3).split(simple); 564 assertThat(letters).containsExactly("ab").inOrder(); 565 } 566 testFixedLengthSplitEmptyString()567 public void testFixedLengthSplitEmptyString() { 568 String simple = ""; 569 Iterable<String> letters = Splitter.fixedLength(3).split(simple); 570 assertThat(letters).containsExactly("").inOrder(); 571 } 572 testFixedLengthSplitEmptyStringWithOmitEmptyStrings()573 public void testFixedLengthSplitEmptyStringWithOmitEmptyStrings() { 574 assertThat(Splitter.fixedLength(3).omitEmptyStrings().split("")).isEmpty(); 575 } 576 testFixedLengthSplitIntoChars()577 public void testFixedLengthSplitIntoChars() { 578 String simple = "abcd"; 579 Iterable<String> letters = Splitter.fixedLength(1).split(simple); 580 assertThat(letters).containsExactly("a", "b", "c", "d").inOrder(); 581 } 582 testFixedLengthSplitZeroChunkLen()583 public void testFixedLengthSplitZeroChunkLen() { 584 try { 585 Splitter.fixedLength(0); 586 fail(); 587 } catch (IllegalArgumentException expected) { 588 } 589 } 590 testFixedLengthSplitNegativeChunkLen()591 public void testFixedLengthSplitNegativeChunkLen() { 592 try { 593 Splitter.fixedLength(-1); 594 fail(); 595 } catch (IllegalArgumentException expected) { 596 } 597 } 598 testLimitLarge()599 public void testLimitLarge() { 600 String simple = "abcd"; 601 Iterable<String> letters = Splitter.fixedLength(1).limit(100).split(simple); 602 assertThat(letters).containsExactly("a", "b", "c", "d").inOrder(); 603 } 604 testLimitOne()605 public void testLimitOne() { 606 String simple = "abcd"; 607 Iterable<String> letters = Splitter.fixedLength(1).limit(1).split(simple); 608 assertThat(letters).containsExactly("abcd").inOrder(); 609 } 610 testLimitFixedLength()611 public void testLimitFixedLength() { 612 String simple = "abcd"; 613 Iterable<String> letters = Splitter.fixedLength(1).limit(2).split(simple); 614 assertThat(letters).containsExactly("a", "bcd").inOrder(); 615 } 616 testLimit1Separator()617 public void testLimit1Separator() { 618 String simple = "a,b,c,d"; 619 Iterable<String> items = COMMA_SPLITTER.limit(1).split(simple); 620 assertThat(items).containsExactly("a,b,c,d").inOrder(); 621 } 622 testLimitSeparator()623 public void testLimitSeparator() { 624 String simple = "a,b,c,d"; 625 Iterable<String> items = COMMA_SPLITTER.limit(2).split(simple); 626 assertThat(items).containsExactly("a", "b,c,d").inOrder(); 627 } 628 testLimitExtraSeparators()629 public void testLimitExtraSeparators() { 630 String text = "a,,,b,,c,d"; 631 Iterable<String> items = COMMA_SPLITTER.limit(2).split(text); 632 assertThat(items).containsExactly("a", ",,b,,c,d").inOrder(); 633 } 634 testLimitExtraSeparatorsOmitEmpty()635 public void testLimitExtraSeparatorsOmitEmpty() { 636 String text = "a,,,b,,c,d"; 637 Iterable<String> items = COMMA_SPLITTER.limit(2).omitEmptyStrings().split(text); 638 assertThat(items).containsExactly("a", "b,,c,d").inOrder(); 639 } 640 testLimitExtraSeparatorsOmitEmpty3()641 public void testLimitExtraSeparatorsOmitEmpty3() { 642 String text = "a,,,b,,c,d"; 643 Iterable<String> items = COMMA_SPLITTER.limit(3).omitEmptyStrings().split(text); 644 assertThat(items).containsExactly("a", "b", "c,d").inOrder(); 645 } 646 testLimitExtraSeparatorsTrim()647 public void testLimitExtraSeparatorsTrim() { 648 String text = ",,a,, , b ,, c,d "; 649 Iterable<String> items = COMMA_SPLITTER.limit(2).omitEmptyStrings().trimResults().split(text); 650 assertThat(items).containsExactly("a", "b ,, c,d").inOrder(); 651 } 652 testLimitExtraSeparatorsTrim3()653 public void testLimitExtraSeparatorsTrim3() { 654 String text = ",,a,, , b ,, c,d "; 655 Iterable<String> items = COMMA_SPLITTER.limit(3).omitEmptyStrings().trimResults().split(text); 656 assertThat(items).containsExactly("a", "b", "c,d").inOrder(); 657 } 658 testLimitExtraSeparatorsTrim1()659 public void testLimitExtraSeparatorsTrim1() { 660 String text = ",,a,, , b ,, c,d "; 661 Iterable<String> items = COMMA_SPLITTER.limit(1).omitEmptyStrings().trimResults().split(text); 662 assertThat(items).containsExactly("a,, , b ,, c,d").inOrder(); 663 } 664 testLimitExtraSeparatorsTrim1NoOmit()665 public void testLimitExtraSeparatorsTrim1NoOmit() { 666 String text = ",,a,, , b ,, c,d "; 667 Iterable<String> items = COMMA_SPLITTER.limit(1).trimResults().split(text); 668 assertThat(items).containsExactly(",,a,, , b ,, c,d").inOrder(); 669 } 670 testLimitExtraSeparatorsTrim1Empty()671 public void testLimitExtraSeparatorsTrim1Empty() { 672 String text = ""; 673 Iterable<String> items = COMMA_SPLITTER.limit(1).split(text); 674 assertThat(items).containsExactly("").inOrder(); 675 } 676 testLimitExtraSeparatorsTrim1EmptyOmit()677 public void testLimitExtraSeparatorsTrim1EmptyOmit() { 678 String text = ""; 679 Iterable<String> items = COMMA_SPLITTER.omitEmptyStrings().limit(1).split(text); 680 assertThat(items).isEmpty(); 681 } 682 testInvalidZeroLimit()683 public void testInvalidZeroLimit() { 684 try { 685 COMMA_SPLITTER.limit(0); 686 fail(); 687 } catch (IllegalArgumentException expected) { 688 } 689 } 690 691 @J2ktIncompatible 692 @GwtIncompatible // NullPointerTester testNullPointers()693 public void testNullPointers() { 694 NullPointerTester tester = new NullPointerTester(); 695 tester.testAllPublicStaticMethods(Splitter.class); 696 tester.testAllPublicInstanceMethods(COMMA_SPLITTER); 697 tester.testAllPublicInstanceMethods(COMMA_SPLITTER.trimResults()); 698 } 699 testMapSplitter_trimmedBoth()700 public void testMapSplitter_trimmedBoth() { 701 Map<String, String> m = 702 COMMA_SPLITTER 703 .trimResults() 704 .withKeyValueSeparator(Splitter.on(':').trimResults()) 705 .split("boy : tom , girl: tina , cat : kitty , dog: tommy "); 706 ImmutableMap<String, String> expected = 707 ImmutableMap.of("boy", "tom", "girl", "tina", "cat", "kitty", "dog", "tommy"); 708 assertThat(m).isEqualTo(expected); 709 assertThat(m.entrySet()).containsExactlyElementsIn(expected.entrySet()).inOrder(); 710 } 711 testMapSplitter_trimmedEntries()712 public void testMapSplitter_trimmedEntries() { 713 Map<String, String> m = 714 COMMA_SPLITTER 715 .trimResults() 716 .withKeyValueSeparator(":") 717 .split("boy : tom , girl: tina , cat : kitty , dog: tommy "); 718 ImmutableMap<String, String> expected = 719 ImmutableMap.of("boy ", " tom", "girl", " tina", "cat ", " kitty", "dog", " tommy"); 720 721 assertThat(m).isEqualTo(expected); 722 assertThat(m.entrySet()).containsExactlyElementsIn(expected.entrySet()).inOrder(); 723 } 724 testMapSplitter_trimmedKeyValue()725 public void testMapSplitter_trimmedKeyValue() { 726 Map<String, String> m = 727 COMMA_SPLITTER 728 .withKeyValueSeparator(Splitter.on(':').trimResults()) 729 .split("boy : tom , girl: tina , cat : kitty , dog: tommy "); 730 ImmutableMap<String, String> expected = 731 ImmutableMap.of("boy", "tom", "girl", "tina", "cat", "kitty", "dog", "tommy"); 732 assertThat(m).isEqualTo(expected); 733 assertThat(m.entrySet()).containsExactlyElementsIn(expected.entrySet()).inOrder(); 734 } 735 testMapSplitter_notTrimmed()736 public void testMapSplitter_notTrimmed() { 737 Map<String, String> m = 738 COMMA_SPLITTER 739 .withKeyValueSeparator(":") 740 .split(" boy:tom , girl: tina , cat :kitty , dog: tommy "); 741 ImmutableMap<String, String> expected = 742 ImmutableMap.of(" boy", "tom ", " girl", " tina ", " cat ", "kitty ", " dog", " tommy "); 743 assertThat(m).isEqualTo(expected); 744 assertThat(m.entrySet()).containsExactlyElementsIn(expected.entrySet()).inOrder(); 745 } 746 testMapSplitter_CharacterSeparator()747 public void testMapSplitter_CharacterSeparator() { 748 // try different delimiters. 749 Map<String, String> m = 750 Splitter.on(",").withKeyValueSeparator(':').split("boy:tom,girl:tina,cat:kitty,dog:tommy"); 751 ImmutableMap<String, String> expected = 752 ImmutableMap.of("boy", "tom", "girl", "tina", "cat", "kitty", "dog", "tommy"); 753 754 assertThat(m).isEqualTo(expected); 755 assertThat(m.entrySet()).containsExactlyElementsIn(expected.entrySet()).inOrder(); 756 } 757 testMapSplitter_multiCharacterSeparator()758 public void testMapSplitter_multiCharacterSeparator() { 759 // try different delimiters. 760 Map<String, String> m = 761 Splitter.on(",") 762 .withKeyValueSeparator(":^&") 763 .split("boy:^&tom,girl:^&tina,cat:^&kitty,dog:^&tommy"); 764 ImmutableMap<String, String> expected = 765 ImmutableMap.of("boy", "tom", "girl", "tina", "cat", "kitty", "dog", "tommy"); 766 767 assertThat(m).isEqualTo(expected); 768 assertThat(m.entrySet()).containsExactlyElementsIn(expected.entrySet()).inOrder(); 769 } 770 testMapSplitter_emptySeparator()771 public void testMapSplitter_emptySeparator() { 772 try { 773 COMMA_SPLITTER.withKeyValueSeparator(""); 774 fail(); 775 } catch (IllegalArgumentException expected) { 776 } 777 } 778 testMapSplitter_malformedEntry()779 public void testMapSplitter_malformedEntry() { 780 try { 781 COMMA_SPLITTER.withKeyValueSeparator("=").split("a=1,b,c=2"); 782 fail(); 783 } catch (IllegalArgumentException expected) { 784 } 785 } 786 787 /** 788 * Testing the behavior in https://github.com/google/guava/issues/1900 - this behavior may want to 789 * be changed? 790 */ testMapSplitter_extraValueDelimiter()791 public void testMapSplitter_extraValueDelimiter() { 792 try { 793 COMMA_SPLITTER.withKeyValueSeparator("=").split("a=1,c=2="); 794 fail(); 795 } catch (IllegalArgumentException expected) { 796 } 797 } 798 testMapSplitter_orderedResults()799 public void testMapSplitter_orderedResults() { 800 Map<String, String> m = 801 COMMA_SPLITTER.withKeyValueSeparator(":").split("boy:tom,girl:tina,cat:kitty,dog:tommy"); 802 803 assertThat(m.keySet()).containsExactly("boy", "girl", "cat", "dog").inOrder(); 804 assertThat(m) 805 .isEqualTo(ImmutableMap.of("boy", "tom", "girl", "tina", "cat", "kitty", "dog", "tommy")); 806 807 // try in a different order 808 m = COMMA_SPLITTER.withKeyValueSeparator(":").split("girl:tina,boy:tom,dog:tommy,cat:kitty"); 809 810 assertThat(m.keySet()).containsExactly("girl", "boy", "dog", "cat").inOrder(); 811 assertThat(m) 812 .isEqualTo(ImmutableMap.of("boy", "tom", "girl", "tina", "cat", "kitty", "dog", "tommy")); 813 } 814 testMapSplitter_duplicateKeys()815 public void testMapSplitter_duplicateKeys() { 816 try { 817 COMMA_SPLITTER.withKeyValueSeparator(":").split("a:1,b:2,a:3"); 818 fail(); 819 } catch (IllegalArgumentException expected) { 820 } 821 } 822 testMapSplitter_varyingTrimLevels()823 public void testMapSplitter_varyingTrimLevels() { 824 MapSplitter splitter = COMMA_SPLITTER.trimResults().withKeyValueSeparator(Splitter.on("->")); 825 Map<String, String> split = splitter.split(" x -> y, z-> a "); 826 assertThat(split).containsEntry("x ", " y"); 827 assertThat(split).containsEntry("z", " a"); 828 } 829 } 830