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