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 
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).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    */
testCharacterSimpleSplitToList()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 
testToString()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 
testCharacterSimpleSplitWithNoDelimiter()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 
testCharacterSplitWithDoubleDelimiter()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 
testCharacterSplitWithDoubleDelimiterAndSpace()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 
testCharacterSplitWithTrailingDelimiter()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 
testCharacterSplitWithLeadingDelimiter()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 
testCharacterSplitWithMulitpleLetters()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 
testCharacterSplitWithMatcherDelimiter()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 
testCharacterSplitWithDoubleDelimiterOmitEmptyStrings()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 
testCharacterSplitEmptyToken()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 
testCharacterSplitEmptyTokenOmitEmptyStrings()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 
testCharacterSplitOnEmptyString()143   public void testCharacterSplitOnEmptyString() {
144     Iterable<String> nothing = Splitter.on('.').split("");
145     assertThat(nothing).iteratesAs("");
146   }
147 
testCharacterSplitOnEmptyStringOmitEmptyStrings()148   public void testCharacterSplitOnEmptyStringOmitEmptyStrings() {
149     assertThat(Splitter.on('.').omitEmptyStrings().split("")).isEmpty();
150   }
151 
testCharacterSplitOnOnlyDelimiter()152   public void testCharacterSplitOnOnlyDelimiter() {
153     Iterable<String> blankblank = Splitter.on('.').split(".");
154     assertThat(blankblank).iteratesAs("", "");
155   }
156 
testCharacterSplitOnOnlyDelimitersOmitEmptyStrings()157   public void testCharacterSplitOnOnlyDelimitersOmitEmptyStrings() {
158     Iterable<String> empty = Splitter.on('.').omitEmptyStrings().split("...");
159     assertThat(empty).isEmpty();
160   }
161 
testCharacterSplitWithTrim()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 
testStringSimpleSplit()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 
testStringSimpleSplitWithNoDelimiter()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 
testStringSplitWithDoubleDelimiter()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 
testStringSplitWithDoubleDelimiterAndSpace()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 
testStringSplitWithTrailingDelimiter()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 
testStringSplitWithLeadingDelimiter()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 
testStringSplitWithMultipleLetters()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 
testStringSplitWithDoubleDelimiterOmitEmptyStrings()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 
testStringSplitEmptyToken()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 
testStringSplitEmptyTokenOmitEmptyStrings()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 
testStringSplitWithLongDelimiter()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 
testStringSplitWithLongLeadingDelimiter()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 
testStringSplitWithLongTrailingDelimiter()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 
testStringSplitWithDelimiterSubstringInValue()254   public void testStringSplitWithDelimiterSubstringInValue() {
255     String fourCommasAndFourSpaces = ",,,,    ";
256     Iterable<String> threeCommasThenThreeSpaces = Splitter.on(", ").split(
257         fourCommasAndFourSpaces);
258     assertThat(threeCommasThenThreeSpaces).iteratesAs(",,,", "   ");
259   }
260 
testStringSplitWithEmptyString()261   public void testStringSplitWithEmptyString() {
262     try {
263       Splitter.on("");
264       fail();
265     } catch (IllegalArgumentException expected) {
266     }
267   }
268 
testStringSplitOnEmptyString()269   public void testStringSplitOnEmptyString() {
270     Iterable<String> notMuch = Splitter.on('.').split("");
271     assertThat(notMuch).iteratesAs("");
272   }
273 
testStringSplitOnEmptyStringOmitEmptyString()274   public void testStringSplitOnEmptyStringOmitEmptyString() {
275     assertThat(Splitter.on('.').omitEmptyStrings().split("")).isEmpty();
276   }
277 
testStringSplitOnOnlyDelimiter()278   public void testStringSplitOnOnlyDelimiter() {
279     Iterable<String> blankblank = Splitter.on('.').split(".");
280     assertThat(blankblank).iteratesAs("", "");
281   }
282 
testStringSplitOnOnlyDelimitersOmitEmptyStrings()283   public void testStringSplitOnOnlyDelimitersOmitEmptyStrings() {
284     Iterable<String> empty = Splitter.on('.').omitEmptyStrings().split("...");
285     assertThat(empty).isEmpty();
286   }
287 
testStringSplitWithTrim()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")
testPatternSimpleSplit()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")
testPatternSimpleSplitWithNoDelimiter()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")
testPatternSplitWithDoubleDelimiter()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")
testPatternSplitWithDoubleDelimiterAndSpace()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")
testPatternSplitWithTrailingDelimiter()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")
testPatternSplitWithLeadingDelimiter()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")
testPatternSplitWithMultipleLetters()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")
literalDotPattern()350   private static Pattern literalDotPattern() {
351     return Pattern.compile("\\.");
352   }
353 
354   @GwtIncompatible("java.util.regex.Pattern")
testPatternSplitWithDoubleDelimiterOmitEmptyStrings()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")
testPatternSplitLookBehind()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")
testPatternSplitWordBoundary()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")
testPatternSplitEmptyToken()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")
testPatternSplitEmptyTokenOmitEmptyStrings()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")
testPatternSplitOnOnlyDelimiter()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")
testPatternSplitOnOnlyDelimitersOmitEmptyStrings()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")
testPatternSplitMatchingIsGreedy()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")
testPatternSplitWithLongLeadingDelimiter()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")
testPatternSplitWithLongTrailingDelimiter()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")
testPatternSplitInvalidPattern()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")
testPatternSplitWithTrim()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 
testSplitterIterableIsUnmodifiable_char()451   public void testSplitterIterableIsUnmodifiable_char() {
452     assertIteratorIsUnmodifiable(COMMA_SPLITTER.split("a,b").iterator());
453   }
454 
testSplitterIterableIsUnmodifiable_string()455   public void testSplitterIterableIsUnmodifiable_string() {
456     assertIteratorIsUnmodifiable(Splitter.on(',').split("a,b").iterator());
457   }
458 
459   @GwtIncompatible("java.util.regex.Pattern")
testSplitterIterableIsUnmodifiable_pattern()460   public void testSplitterIterableIsUnmodifiable_pattern() {
461     assertIteratorIsUnmodifiable(
462         Splitter.on(Pattern.compile(",")).split("a,b").iterator());
463   }
464 
assertIteratorIsUnmodifiable(Iterator<?> iterator)465   private void assertIteratorIsUnmodifiable(Iterator<?> iterator) {
466     iterator.next();
467     try {
468       iterator.remove();
469       fail();
470     } catch (UnsupportedOperationException expected) {
471     }
472   }
473 
testSplitterIterableIsLazy_char()474   public void testSplitterIterableIsLazy_char() {
475     assertSplitterIterableIsLazy(COMMA_SPLITTER);
476   }
477 
testSplitterIterableIsLazy_string()478   public void testSplitterIterableIsLazy_string() {
479     assertSplitterIterableIsLazy(Splitter.on(','));
480   }
481 
482   @GwtIncompatible("java.util.regex.Pattern")
testSplitterIterableIsLazy_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    */
assertSplitterIterableIsLazy(Splitter splitter)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 
testFixedLengthSimpleSplit()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 
testFixedLengthSplitEqualChunkLength()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 
testFixedLengthSplitOnlyOneChunk()517   public void testFixedLengthSplitOnlyOneChunk() {
518     String simple = "abc";
519     Iterable<String> letters = Splitter.fixedLength(3).split(simple);
520     assertThat(letters).iteratesAs("abc");
521   }
522 
testFixedLengthSplitSmallerString()523   public void testFixedLengthSplitSmallerString() {
524     String simple = "ab";
525     Iterable<String> letters = Splitter.fixedLength(3).split(simple);
526     assertThat(letters).iteratesAs("ab");
527   }
528 
testFixedLengthSplitEmptyString()529   public void testFixedLengthSplitEmptyString() {
530     String simple = "";
531     Iterable<String> letters = Splitter.fixedLength(3).split(simple);
532     assertThat(letters).iteratesAs("");
533   }
534 
testFixedLengthSplitEmptyStringWithOmitEmptyStrings()535   public void testFixedLengthSplitEmptyStringWithOmitEmptyStrings() {
536     assertThat(Splitter.fixedLength(3).omitEmptyStrings().split("")).isEmpty();
537   }
538 
testFixedLengthSplitIntoChars()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 
testFixedLengthSplitZeroChunkLen()545   public void testFixedLengthSplitZeroChunkLen() {
546     try {
547       Splitter.fixedLength(0);
548       fail();
549     } catch (IllegalArgumentException expected) {
550     }
551   }
552 
testFixedLengthSplitNegativeChunkLen()553   public void testFixedLengthSplitNegativeChunkLen() {
554     try {
555       Splitter.fixedLength(-1);
556       fail();
557     } catch (IllegalArgumentException expected) {
558     }
559   }
560 
testLimitLarge()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 
testLimitOne()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 
testLimitFixedLength()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 
testLimitSeparator()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 
testLimitExtraSeparators()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 
testLimitExtraSeparatorsOmitEmpty()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 
testLimitExtraSeparatorsOmitEmpty3()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 
testLimitExtraSeparatorsTrim()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 
testLimitExtraSeparatorsTrim3()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 
testLimitExtraSeparatorsTrim1()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 
testLimitExtraSeparatorsTrim1NoOmit()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 
testLimitExtraSeparatorsTrim1Empty()627   public void testLimitExtraSeparatorsTrim1Empty() {
628     String text = "";
629     Iterable<String> items = COMMA_SPLITTER.limit(1).split(text);
630     assertThat(items).iteratesAs("");
631   }
632 
testLimitExtraSeparatorsTrim1EmptyOmit()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
testInvalidZeroLimit()640   public void testInvalidZeroLimit() {
641     try {
642       COMMA_SPLITTER.limit(0);
643       fail();
644     } catch (IllegalArgumentException expected) {
645     }
646   }
647 
648   @GwtIncompatible("NullPointerTester")
testNullPointers()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 
asList(Collection<E> collection)656   private static <E> List<E> asList(Collection<E> collection) {
657     return ImmutableList.copyOf(collection);
658   }
659 
testMapSplitter_trimmedBoth()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 
testMapSplitter_trimmedEntries()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 
testMapSplitter_trimmedKeyValue()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 
testMapSplitter_notTrimmed()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 
testMapSplitter_CharacterSeparator()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 
testMapSplitter_multiCharacterSeparator()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
testMapSplitter_emptySeparator()729   public void testMapSplitter_emptySeparator() {
730     try {
731       COMMA_SPLITTER.withKeyValueSeparator("");
732       fail();
733     } catch (IllegalArgumentException expected) {
734     }
735   }
736 
testMapSplitter_malformedEntry()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 
testMapSplitter_orderedResults()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 
testMapSplitter_duplicateKeys()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