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 org.junit.contrib.truth.Truth.ASSERT; 20 21 import com.google.common.annotations.GwtCompatible; 22 import com.google.common.annotations.GwtIncompatible; 23 import com.google.common.collect.ImmutableList; 24 import com.google.common.collect.ImmutableMap; 25 import com.google.common.testing.NullPointerTester; 26 27 import junit.framework.TestCase; 28 29 import java.util.Collection; 30 import java.util.Iterator; 31 import java.util.List; 32 import java.util.Map; 33 import java.util.regex.Pattern; 34 35 /** 36 * @author Julien Silland 37 */ 38 @GwtCompatible(emulated = true) 39 public class SplitterTest extends TestCase { 40 41 private static final Splitter COMMA_SPLITTER = Splitter.on(','); 42 43 public void testSplitNullString() { 44 try { 45 COMMA_SPLITTER.split(null); 46 fail(); 47 } catch (NullPointerException expected) { 48 } 49 } 50 51 public void testCharacterSimpleSplit() { 52 String simple = "a,b,c"; 53 Iterable<String> letters = COMMA_SPLITTER.split(simple); 54 ASSERT.that(letters).hasContentsInOrder("a", "b", "c"); 55 } 56 57 public void testCharacterSimpleSplitWithNoDelimiter() { 58 String simple = "a,b,c"; 59 Iterable<String> letters = Splitter.on('.').split(simple); 60 ASSERT.that(letters).hasContentsInOrder("a,b,c"); 61 } 62 63 public void testCharacterSplitWithDoubleDelimiter() { 64 String doubled = "a,,b,c"; 65 Iterable<String> letters = COMMA_SPLITTER.split(doubled); 66 ASSERT.that(letters).hasContentsInOrder("a", "", "b", "c"); 67 } 68 69 public void testCharacterSplitWithDoubleDelimiterAndSpace() { 70 String doubled = "a,, b,c"; 71 Iterable<String> letters = COMMA_SPLITTER.split(doubled); 72 ASSERT.that(letters).hasContentsInOrder("a", "", " b", "c"); 73 } 74 75 public void testCharacterSplitWithTrailingDelimiter() { 76 String trailing = "a,b,c,"; 77 Iterable<String> letters = COMMA_SPLITTER.split(trailing); 78 ASSERT.that(letters).hasContentsInOrder("a", "b", "c", ""); 79 } 80 81 public void testCharacterSplitWithLeadingDelimiter() { 82 String leading = ",a,b,c"; 83 Iterable<String> letters = COMMA_SPLITTER.split(leading); 84 ASSERT.that(letters).hasContentsInOrder("", "a", "b", "c"); 85 } 86 87 public void testCharacterSplitWithMulitpleLetters() { 88 Iterable<String> testCharacteringMotto = Splitter.on('-').split( 89 "Testing-rocks-Debugging-sucks"); 90 ASSERT.that(testCharacteringMotto).hasContentsInOrder( 91 "Testing", "rocks", "Debugging", "sucks"); 92 } 93 94 public void testCharacterSplitWithMatcherDelimiter() { 95 Iterable<String> testCharacteringMotto = Splitter 96 .on(CharMatcher.WHITESPACE) 97 .split("Testing\nrocks\tDebugging sucks"); 98 ASSERT.that(testCharacteringMotto).hasContentsInOrder( 99 "Testing", "rocks", "Debugging", "sucks"); 100 } 101 102 public void testCharacterSplitWithDoubleDelimiterOmitEmptyStrings() { 103 String doubled = "a..b.c"; 104 Iterable<String> letters = Splitter.on('.') 105 .omitEmptyStrings().split(doubled); 106 ASSERT.that(letters).hasContentsInOrder("a", "b", "c"); 107 } 108 109 public void testCharacterSplitEmptyToken() { 110 String emptyToken = "a. .c"; 111 Iterable<String> letters = Splitter.on('.').trimResults() 112 .split(emptyToken); 113 ASSERT.that(letters).hasContentsInOrder("a", "", "c"); 114 } 115 116 public void testCharacterSplitEmptyTokenOmitEmptyStrings() { 117 String emptyToken = "a. .c"; 118 Iterable<String> letters = Splitter.on('.') 119 .omitEmptyStrings().trimResults().split(emptyToken); 120 ASSERT.that(letters).hasContentsInOrder("a", "c"); 121 } 122 123 public void testCharacterSplitOnEmptyString() { 124 Iterable<String> nothing = Splitter.on('.').split(""); 125 ASSERT.that(nothing).hasContentsInOrder(""); 126 } 127 128 public void testCharacterSplitOnEmptyStringOmitEmptyStrings() { 129 ASSERT.that(Splitter.on('.').omitEmptyStrings().split("")).isEmpty(); 130 } 131 132 public void testCharacterSplitOnOnlyDelimiter() { 133 Iterable<String> blankblank = Splitter.on('.').split("."); 134 ASSERT.that(blankblank).hasContentsInOrder("", ""); 135 } 136 137 public void testCharacterSplitOnOnlyDelimitersOmitEmptyStrings() { 138 Iterable<String> empty = Splitter.on('.').omitEmptyStrings().split("..."); 139 ASSERT.that(empty); 140 } 141 142 public void testCharacterSplitWithTrim() { 143 String jacksons = "arfo(Marlon)aorf, (Michael)orfa, afro(Jackie)orfa, " 144 + "ofar(Jemaine), aff(Tito)"; 145 Iterable<String> family = COMMA_SPLITTER 146 .trimResults(CharMatcher.anyOf("afro").or(CharMatcher.WHITESPACE)) 147 .split(jacksons); 148 ASSERT.that(family).hasContentsInOrder( 149 "(Marlon)", "(Michael)", "(Jackie)", "(Jemaine)", "(Tito)"); 150 } 151 152 public void testStringSimpleSplit() { 153 String simple = "a,b,c"; 154 Iterable<String> letters = Splitter.on(",").split(simple); 155 ASSERT.that(letters).hasContentsInOrder("a", "b", "c"); 156 } 157 158 public void testStringSimpleSplitWithNoDelimiter() { 159 String simple = "a,b,c"; 160 Iterable<String> letters = Splitter.on(".").split(simple); 161 ASSERT.that(letters).hasContentsInOrder("a,b,c"); 162 } 163 164 public void testStringSplitWithDoubleDelimiter() { 165 String doubled = "a,,b,c"; 166 Iterable<String> letters = Splitter.on(",").split(doubled); 167 ASSERT.that(letters).hasContentsInOrder("a", "", "b", "c"); 168 } 169 170 public void testStringSplitWithDoubleDelimiterAndSpace() { 171 String doubled = "a,, b,c"; 172 Iterable<String> letters = Splitter.on(",").split(doubled); 173 ASSERT.that(letters).hasContentsInOrder("a", "", " b", "c"); 174 } 175 176 public void testStringSplitWithTrailingDelimiter() { 177 String trailing = "a,b,c,"; 178 Iterable<String> letters = Splitter.on(",").split(trailing); 179 ASSERT.that(letters).hasContentsInOrder("a", "b", "c", ""); 180 } 181 182 public void testStringSplitWithLeadingDelimiter() { 183 String leading = ",a,b,c"; 184 Iterable<String> letters = Splitter.on(",").split(leading); 185 ASSERT.that(letters).hasContentsInOrder("", "a", "b", "c"); 186 } 187 188 public void testStringSplitWithMultipleLetters() { 189 Iterable<String> testStringingMotto = Splitter.on("-").split( 190 "Testing-rocks-Debugging-sucks"); 191 ASSERT.that(testStringingMotto).hasContentsInOrder( 192 "Testing", "rocks", "Debugging", "sucks"); 193 } 194 195 public void testStringSplitWithDoubleDelimiterOmitEmptyStrings() { 196 String doubled = "a..b.c"; 197 Iterable<String> letters = Splitter.on(".") 198 .omitEmptyStrings().split(doubled); 199 ASSERT.that(letters).hasContentsInOrder("a", "b", "c"); 200 } 201 202 public void testStringSplitEmptyToken() { 203 String emptyToken = "a. .c"; 204 Iterable<String> letters = Splitter.on(".").trimResults() 205 .split(emptyToken); 206 ASSERT.that(letters).hasContentsInOrder("a", "", "c"); 207 } 208 209 public void testStringSplitEmptyTokenOmitEmptyStrings() { 210 String emptyToken = "a. .c"; 211 Iterable<String> letters = Splitter.on(".") 212 .omitEmptyStrings().trimResults().split(emptyToken); 213 ASSERT.that(letters).hasContentsInOrder("a", "c"); 214 } 215 216 public void testStringSplitWithLongDelimiter() { 217 String longDelimiter = "a, b, c"; 218 Iterable<String> letters = Splitter.on(", ").split(longDelimiter); 219 ASSERT.that(letters).hasContentsInOrder("a", "b", "c"); 220 } 221 222 public void testStringSplitWithLongLeadingDelimiter() { 223 String longDelimiter = ", a, b, c"; 224 Iterable<String> letters = Splitter.on(", ").split(longDelimiter); 225 ASSERT.that(letters).hasContentsInOrder("", "a", "b", "c"); 226 } 227 228 public void testStringSplitWithLongTrailingDelimiter() { 229 String longDelimiter = "a, b, c, "; 230 Iterable<String> letters = Splitter.on(", ").split(longDelimiter); 231 ASSERT.that(letters).hasContentsInOrder("a", "b", "c", ""); 232 } 233 234 public void testStringSplitWithDelimiterSubstringInValue() { 235 String fourCommasAndFourSpaces = ",,,, "; 236 Iterable<String> threeCommasThenThreeSpaces = Splitter.on(", ").split( 237 fourCommasAndFourSpaces); 238 ASSERT.that(threeCommasThenThreeSpaces).hasContentsInOrder(",,,", " "); 239 } 240 241 public void testStringSplitWithEmptyString() { 242 try { 243 Splitter.on(""); 244 fail(); 245 } catch (IllegalArgumentException expected) { 246 } 247 } 248 249 public void testStringSplitOnEmptyString() { 250 Iterable<String> notMuch = Splitter.on(".").split(""); 251 ASSERT.that(notMuch).hasContentsInOrder(""); 252 } 253 254 public void testStringSplitOnEmptyStringOmitEmptyString() { 255 ASSERT.that(Splitter.on(".").omitEmptyStrings().split("")).isEmpty(); 256 } 257 258 public void testStringSplitOnOnlyDelimiter() { 259 Iterable<String> blankblank = Splitter.on(".").split("."); 260 ASSERT.that(blankblank).hasContentsInOrder("", ""); 261 } 262 263 public void testStringSplitOnOnlyDelimitersOmitEmptyStrings() { 264 Iterable<String> empty = Splitter.on(".").omitEmptyStrings().split("..."); 265 ASSERT.that(empty).isEmpty(); 266 } 267 268 public void testStringSplitWithTrim() { 269 String jacksons = "arfo(Marlon)aorf, (Michael)orfa, afro(Jackie)orfa, " 270 + "ofar(Jemaine), aff(Tito)"; 271 Iterable<String> family = Splitter.on(",") 272 .trimResults(CharMatcher.anyOf("afro").or(CharMatcher.WHITESPACE)) 273 .split(jacksons); 274 ASSERT.that(family).hasContentsInOrder( 275 "(Marlon)", "(Michael)", "(Jackie)", "(Jemaine)", "(Tito)"); 276 } 277 278 @GwtIncompatible("Splitter.onPattern") 279 public void testPatternSimpleSplit() { 280 String simple = "a,b,c"; 281 Iterable<String> letters = Splitter.onPattern(",").split(simple); 282 ASSERT.that(letters).hasContentsInOrder("a", "b", "c"); 283 } 284 285 @GwtIncompatible("Splitter.onPattern") 286 public void testPatternSimpleSplitWithNoDelimiter() { 287 String simple = "a,b,c"; 288 Iterable<String> letters = Splitter.onPattern("foo").split(simple); 289 ASSERT.that(letters).hasContentsInOrder("a,b,c"); 290 } 291 292 @GwtIncompatible("Splitter.onPattern") 293 public void testPatternSplitWithDoubleDelimiter() { 294 String doubled = "a,,b,c"; 295 Iterable<String> letters = Splitter.onPattern(",").split(doubled); 296 ASSERT.that(letters).hasContentsInOrder("a", "", "b", "c"); 297 } 298 299 @GwtIncompatible("Splitter.onPattern") 300 public void testPatternSplitWithDoubleDelimiterAndSpace() { 301 String doubled = "a,, b,c"; 302 Iterable<String> letters = Splitter.onPattern(",").split(doubled); 303 ASSERT.that(letters).hasContentsInOrder("a", "", " b", "c"); 304 } 305 306 @GwtIncompatible("Splitter.onPattern") 307 public void testPatternSplitWithTrailingDelimiter() { 308 String trailing = "a,b,c,"; 309 Iterable<String> letters = Splitter.onPattern(",").split(trailing); 310 ASSERT.that(letters).hasContentsInOrder("a", "b", "c", ""); 311 } 312 313 @GwtIncompatible("Splitter.onPattern") 314 public void testPatternSplitWithLeadingDelimiter() { 315 String leading = ",a,b,c"; 316 Iterable<String> letters = Splitter.onPattern(",").split(leading); 317 ASSERT.that(letters).hasContentsInOrder("", "a", "b", "c"); 318 } 319 320 // TODO(kevinb): the name of this method suggests it might not actually be testing what it 321 // intends to be testing? 322 @GwtIncompatible("Splitter.onPattern") 323 public void testPatternSplitWithMultipleLetters() { 324 Iterable<String> testPatterningMotto = Splitter.onPattern("-").split( 325 "Testing-rocks-Debugging-sucks"); 326 ASSERT.that(testPatterningMotto).hasContentsInOrder("Testing", "rocks", "Debugging", "sucks"); 327 } 328 329 @GwtIncompatible("java.util.regex.Pattern") 330 private static Pattern literalDotPattern() { 331 return Pattern.compile("\\."); 332 } 333 334 @GwtIncompatible("java.util.regex.Pattern") 335 public void testPatternSplitWithDoubleDelimiterOmitEmptyStrings() { 336 String doubled = "a..b.c"; 337 Iterable<String> letters = Splitter.on(literalDotPattern()) 338 .omitEmptyStrings().split(doubled); 339 ASSERT.that(letters).hasContentsInOrder("a", "b", "c"); 340 } 341 342 @GwtIncompatible("java.util.regex.Pattern") 343 public void testPatternSplitEmptyToken() { 344 String emptyToken = "a. .c"; 345 Iterable<String> letters = Splitter.on(literalDotPattern()).trimResults().split(emptyToken); 346 ASSERT.that(letters).hasContentsInOrder("a", "", "c"); 347 } 348 349 @GwtIncompatible("java.util.regex.Pattern") 350 public void testPatternSplitEmptyTokenOmitEmptyStrings() { 351 String emptyToken = "a. .c"; 352 Iterable<String> letters = Splitter.on(literalDotPattern()) 353 .omitEmptyStrings().trimResults().split(emptyToken); 354 ASSERT.that(letters).hasContentsInOrder("a", "c"); 355 } 356 357 @GwtIncompatible("java.util.regex.Pattern") 358 public void testPatternSplitOnOnlyDelimiter() { 359 Iterable<String> blankblank = Splitter.on(literalDotPattern()).split("."); 360 361 ASSERT.that(blankblank).hasContentsInOrder("", ""); 362 } 363 364 @GwtIncompatible("java.util.regex.Pattern") 365 public void testPatternSplitOnOnlyDelimitersOmitEmptyStrings() { 366 Iterable<String> empty = Splitter.on(literalDotPattern()).omitEmptyStrings() 367 .split("..."); 368 ASSERT.that(empty).isEmpty(); 369 } 370 371 @GwtIncompatible("java.util.regex.Pattern") 372 public void testPatternSplitMatchingIsGreedy() { 373 String longDelimiter = "a, b, c"; 374 Iterable<String> letters = Splitter.on(Pattern.compile(",\\s*")) 375 .split(longDelimiter); 376 ASSERT.that(letters).hasContentsInOrder("a", "b", "c"); 377 } 378 379 @GwtIncompatible("java.util.regex.Pattern") 380 public void testPatternSplitWithLongLeadingDelimiter() { 381 String longDelimiter = ", a, b, c"; 382 Iterable<String> letters = Splitter.on(Pattern.compile(", ")) 383 .split(longDelimiter); 384 ASSERT.that(letters).hasContentsInOrder("", "a", "b", "c"); 385 } 386 387 @GwtIncompatible("java.util.regex.Pattern") 388 public void testPatternSplitWithLongTrailingDelimiter() { 389 String longDelimiter = "a, b, c/ "; 390 Iterable<String> letters = Splitter.on(Pattern.compile("[,/]\\s")) 391 .split(longDelimiter); 392 ASSERT.that(letters).hasContentsInOrder("a", "b", "c", ""); 393 } 394 395 @GwtIncompatible("java.util.regex.Pattern") 396 public void testPatternSplitInvalidPattern() { 397 try { 398 Splitter.on(Pattern.compile("a*")); 399 fail(); 400 } catch (IllegalArgumentException expected) { 401 } 402 } 403 404 @GwtIncompatible("java.util.regex.Pattern") 405 public void testPatternSplitWithTrim() { 406 String jacksons = "arfo(Marlon)aorf, (Michael)orfa, afro(Jackie)orfa, " 407 + "ofar(Jemaine), aff(Tito)"; 408 Iterable<String> family = Splitter.on(Pattern.compile(",")) 409 .trimResults(CharMatcher.anyOf("afro").or(CharMatcher.WHITESPACE)) 410 .split(jacksons); 411 ASSERT.that(family).hasContentsInOrder( 412 "(Marlon)", "(Michael)", "(Jackie)", "(Jemaine)", "(Tito)"); 413 } 414 415 public void testSplitterIterableIsUnmodifiable_char() { 416 assertIteratorIsUnmodifiable(COMMA_SPLITTER.split("a,b").iterator()); 417 } 418 419 public void testSplitterIterableIsUnmodifiable_string() { 420 assertIteratorIsUnmodifiable(Splitter.on(",").split("a,b").iterator()); 421 } 422 423 @GwtIncompatible("java.util.regex.Pattern") 424 public void testSplitterIterableIsUnmodifiable_pattern() { 425 assertIteratorIsUnmodifiable( 426 Splitter.on(Pattern.compile(",")).split("a,b").iterator()); 427 } 428 429 private void assertIteratorIsUnmodifiable(Iterator<?> iterator) { 430 iterator.next(); 431 try { 432 iterator.remove(); 433 fail(); 434 } catch (UnsupportedOperationException expected) { 435 } 436 } 437 438 public void testSplitterIterableIsLazy_char() { 439 assertSplitterIterableIsLazy(COMMA_SPLITTER); 440 } 441 442 public void testSplitterIterableIsLazy_string() { 443 assertSplitterIterableIsLazy(Splitter.on(",")); 444 } 445 446 @GwtIncompatible("java.util.regex.Pattern") 447 public void testSplitterIterableIsLazy_pattern() { 448 assertSplitterIterableIsLazy(Splitter.onPattern(",")); 449 } 450 451 /** 452 * This test really pushes the boundaries of what we support. In general the 453 * splitter's behaviour is not well defined if the char sequence it's 454 * splitting is mutated during iteration. 455 */ 456 private void assertSplitterIterableIsLazy(Splitter splitter) { 457 StringBuilder builder = new StringBuilder(); 458 Iterator<String> iterator = splitter.split(builder).iterator(); 459 460 builder.append("A,"); 461 assertEquals("A", iterator.next()); 462 builder.append("B,"); 463 assertEquals("B", iterator.next()); 464 builder.append("C"); 465 assertEquals("C", iterator.next()); 466 assertFalse(iterator.hasNext()); 467 } 468 469 public void testAtEachSimpleSplit() { 470 String simple = "abcde"; 471 Iterable<String> letters = Splitter.fixedLength(2).split(simple); 472 ASSERT.that(letters).hasContentsInOrder("ab", "cd", "e"); 473 } 474 475 public void testAtEachSplitEqualChunkLength() { 476 String simple = "abcdef"; 477 Iterable<String> letters = Splitter.fixedLength(2).split(simple); 478 ASSERT.that(letters).hasContentsInOrder("ab", "cd", "ef"); 479 } 480 481 public void testAtEachSplitOnlyOneChunk() { 482 String simple = "abc"; 483 Iterable<String> letters = Splitter.fixedLength(3).split(simple); 484 ASSERT.that(letters).hasContentsInOrder("abc"); 485 } 486 487 public void testAtEachSplitSmallerString() { 488 String simple = "ab"; 489 Iterable<String> letters = Splitter.fixedLength(3).split(simple); 490 ASSERT.that(letters).hasContentsInOrder("ab"); 491 } 492 493 public void testAtEachSplitEmptyString() { 494 String simple = ""; 495 Iterable<String> letters = Splitter.fixedLength(3).split(simple); 496 ASSERT.that(letters).hasContentsInOrder(""); 497 } 498 499 public void testAtEachSplitEmptyStringWithOmitEmptyStrings() { 500 ASSERT.that(Splitter.fixedLength(3).omitEmptyStrings().split("")).isEmpty(); 501 } 502 503 public void testAtEachSplitIntoChars() { 504 String simple = "abcd"; 505 Iterable<String> letters = Splitter.fixedLength(1).split(simple); 506 ASSERT.that(letters).hasContentsInOrder("a", "b", "c", "d"); 507 } 508 509 public void testAtEachSplitZeroChunkLen() { 510 try { 511 Splitter.fixedLength(0); 512 fail(); 513 } catch (IllegalArgumentException expected) { 514 } 515 } 516 517 public void testAtEachSplitNegativeChunkLen() { 518 try { 519 Splitter.fixedLength(-1); 520 fail(); 521 } catch (IllegalArgumentException expected) { 522 } 523 } 524 525 public void testLimitLarge() { 526 String simple = "abcd"; 527 Iterable<String> letters = Splitter.fixedLength(1).limit(100).split(simple); 528 ASSERT.that(letters).hasContentsInOrder("a", "b", "c", "d"); 529 } 530 531 public void testLimitOne() { 532 String simple = "abcd"; 533 Iterable<String> letters = Splitter.fixedLength(1).limit(1).split(simple); 534 ASSERT.that(letters).hasContentsInOrder("abcd"); 535 } 536 537 public void testLimitFixedLength() { 538 String simple = "abcd"; 539 Iterable<String> letters = Splitter.fixedLength(1).limit(2).split(simple); 540 ASSERT.that(letters).hasContentsInOrder("a", "bcd"); 541 } 542 543 public void testLimitSeparator() { 544 String simple = "a,b,c,d"; 545 Iterable<String> items = COMMA_SPLITTER.limit(2).split(simple); 546 ASSERT.that(items).hasContentsInOrder("a", "b,c,d"); 547 } 548 549 public void testLimitExtraSeparators() { 550 String text = "a,,,b,,c,d"; 551 Iterable<String> items = COMMA_SPLITTER.limit(2).split(text); 552 ASSERT.that(items).hasContentsInOrder("a", ",,b,,c,d"); 553 } 554 555 public void testLimitExtraSeparatorsOmitEmpty() { 556 String text = "a,,,b,,c,d"; 557 Iterable<String> items = COMMA_SPLITTER.limit(2).omitEmptyStrings().split(text); 558 ASSERT.that(items).hasContentsInOrder("a", "b,,c,d"); 559 } 560 561 public void testLimitExtraSeparatorsOmitEmpty3() { 562 String text = "a,,,b,,c,d"; 563 Iterable<String> items = COMMA_SPLITTER.limit(3).omitEmptyStrings().split(text); 564 ASSERT.that(items).hasContentsInOrder("a", "b", "c,d"); 565 } 566 567 public void testLimitExtraSeparatorsTrim() { 568 String text = ",,a,, , b ,, c,d "; 569 Iterable<String> items = COMMA_SPLITTER.limit(2).omitEmptyStrings().trimResults().split(text); 570 ASSERT.that(items).hasContentsInOrder("a", "b ,, c,d"); 571 } 572 573 public void testLimitExtraSeparatorsTrim3() { 574 String text = ",,a,, , b ,, c,d "; 575 Iterable<String> items = COMMA_SPLITTER.limit(3).omitEmptyStrings().trimResults().split(text); 576 ASSERT.that(items).hasContentsInOrder("a", "b", "c,d"); 577 } 578 579 public void testLimitExtraSeparatorsTrim1() { 580 String text = ",,a,, , b ,, c,d "; 581 Iterable<String> items = COMMA_SPLITTER.limit(1).omitEmptyStrings().trimResults().split(text); 582 ASSERT.that(items).hasContentsInOrder("a,, , b ,, c,d"); 583 } 584 585 public void testLimitExtraSeparatorsTrim1NoOmit() { 586 String text = ",,a,, , b ,, c,d "; 587 Iterable<String> items = COMMA_SPLITTER.limit(1).trimResults().split(text); 588 ASSERT.that(items).hasContentsInOrder(",,a,, , b ,, c,d"); 589 } 590 591 public void testLimitExtraSeparatorsTrim1Empty() { 592 String text = ""; 593 Iterable<String> items = COMMA_SPLITTER.limit(1).split(text); 594 ASSERT.that(items).hasContentsInOrder(""); 595 } 596 597 public void testLimitExtraSeparatorsTrim1EmptyOmit() { 598 String text = ""; 599 Iterable<String> items = COMMA_SPLITTER.omitEmptyStrings().limit(1).split(text); 600 ASSERT.that(items).isEmpty(); 601 } 602 603 public void testInvalidZeroLimit() { 604 try { 605 COMMA_SPLITTER.limit(0); 606 fail(); 607 } catch (IllegalArgumentException expected) { 608 } 609 } 610 611 @GwtIncompatible("NullPointerTester") 612 public void testNullPointers() throws Exception { 613 NullPointerTester tester = new NullPointerTester(); 614 tester.testAllPublicStaticMethods(Splitter.class); 615 tester.testAllPublicInstanceMethods(Splitter.on(",")); 616 tester.testAllPublicInstanceMethods(Splitter.on(",").trimResults()); 617 } 618 619 private static <E> List<E> asList(Collection<E> collection){ 620 return ImmutableList.copyOf(collection); 621 } 622 623 public void testMapSplitter_trimmedBoth() { 624 Map<String, String> m = COMMA_SPLITTER 625 .trimResults() 626 .withKeyValueSeparator(Splitter.on(':').trimResults()) 627 .split("boy : tom , girl: tina , cat : kitty , dog: tommy "); 628 ImmutableMap<String, String> expected = 629 ImmutableMap.of("boy", "tom", "girl", "tina", "cat", "kitty", "dog", "tommy"); 630 ASSERT.that(m).isEqualTo(expected); 631 ASSERT.that(asList(m.entrySet())).is(asList(expected.entrySet())); 632 } 633 634 public void testMapSplitter_trimmedEntries() { 635 Map<String, String> m = COMMA_SPLITTER 636 .trimResults() 637 .withKeyValueSeparator(":") 638 .split("boy : tom , girl: tina , cat : kitty , dog: tommy "); 639 ImmutableMap<String, String> expected = 640 ImmutableMap.of("boy ", " tom", "girl", " tina", "cat ", " kitty", "dog", " tommy"); 641 642 ASSERT.that(m).isEqualTo(expected); 643 ASSERT.that(asList(m.entrySet())).is(asList(expected.entrySet())); 644 } 645 646 public void testMapSplitter_trimmedKeyValue() { 647 Map<String, String> m = 648 COMMA_SPLITTER.withKeyValueSeparator(Splitter.on(':').trimResults()).split( 649 "boy : tom , girl: tina , cat : kitty , dog: tommy "); 650 ImmutableMap<String, String> expected = 651 ImmutableMap.of("boy", "tom", "girl", "tina", "cat", "kitty", "dog", "tommy"); 652 ASSERT.that(m).isEqualTo(expected); 653 ASSERT.that(asList(m.entrySet())).is(asList(expected.entrySet())); 654 } 655 656 public void testMapSplitter_notTrimmed() { 657 Map<String, String> m = COMMA_SPLITTER.withKeyValueSeparator(":").split( 658 " boy:tom , girl: tina , cat :kitty , dog: tommy "); 659 ImmutableMap<String, String> expected = 660 ImmutableMap.of(" boy", "tom ", " girl", " tina ", " cat ", "kitty ", " dog", " tommy "); 661 ASSERT.that(m).isEqualTo(expected); 662 ASSERT.that(asList(m.entrySet())).is(asList(expected.entrySet())); 663 } 664 665 public void testMapSplitter_multiCharacterSeparator() { 666 // try different delimiters. 667 Map<String, String> m = Splitter 668 .on(",") 669 .withKeyValueSeparator(":^&") 670 .split("boy:^&tom,girl:^&tina,cat:^&kitty,dog:^&tommy"); 671 ImmutableMap<String, String> expected = 672 ImmutableMap.of("boy", "tom", "girl", "tina", "cat", "kitty", "dog", "tommy"); 673 674 ASSERT.that(m).isEqualTo(expected); 675 ASSERT.that(asList(m.entrySet())).is(asList(expected.entrySet())); 676 } 677 678 public void testMapSplitter_emptySeparator() { 679 try { 680 COMMA_SPLITTER.withKeyValueSeparator(""); 681 fail(); 682 } catch (IllegalArgumentException expected) { 683 } 684 } 685 686 public void testMapSplitter_malformedEntry() { 687 try { 688 COMMA_SPLITTER.withKeyValueSeparator("=").split("a=1,b,c=2"); 689 fail(); 690 } catch(IllegalArgumentException expected) { 691 } 692 } 693 694 public void testMapSplitter_orderedResults() { 695 Map<String, String> m = Splitter.on(",") 696 .withKeyValueSeparator(":") 697 .split("boy:tom,girl:tina,cat:kitty,dog:tommy"); 698 699 ASSERT.that(m.keySet()).hasContentsInOrder("boy", "girl", "cat", "dog"); 700 ASSERT.that(m).isEqualTo( 701 ImmutableMap.of("boy", "tom", "girl", "tina", "cat", "kitty", "dog", "tommy")); 702 703 // try in a different order 704 m = Splitter.on(",") 705 .withKeyValueSeparator(":") 706 .split("girl:tina,boy:tom,dog:tommy,cat:kitty"); 707 708 ASSERT.that(m.keySet()).hasContentsInOrder("girl", "boy", "dog", "cat"); 709 ASSERT.that(m).isEqualTo( 710 ImmutableMap.of("boy", "tom", "girl", "tina", "cat", "kitty", "dog", "tommy")); 711 } 712 713 public void testMapSplitter_duplicateKeys() { 714 try { 715 Splitter.on(",").withKeyValueSeparator(":").split("a:1,b:2,a:3"); 716 fail(); 717 } catch (IllegalArgumentException expected) { 718 } 719 } 720 } 721