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