11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2009 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.base;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
190888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static org.truth0.Truth.ASSERT;
200888a09821a98ac0680fad765217302858e70fa4Paul Duffin
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ImmutableList;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ImmutableMap;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
270888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase;
280888a09821a98ac0680fad765217302858e70fa4Paul Duffin
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.regex.Pattern;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Julien Silland
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class SplitterTest extends TestCase {
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Splitter COMMA_SPLITTER = Splitter.on(',');
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSplitNullString() {
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      COMMA_SPLITTER.split(null);
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharacterSimpleSplit() {
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String simple = "a,b,c";
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = COMMA_SPLITTER.split(simple);
540888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "b", "c");
550888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
560888a09821a98ac0680fad765217302858e70fa4Paul Duffin
570888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
580888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * All of the infrastructure of split and splitToString is identical, so we
590888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * do one test of splitToString. All other cases should be covered by testing
600888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * of split.
610888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
620888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * <p>TODO(user): It would be good to make all the relevant tests run on
630888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * both split and splitToString automatically.
640888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
650888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testCharacterSimpleSplitToList() {
660888a09821a98ac0680fad765217302858e70fa4Paul Duffin    String simple = "a,b,c";
670888a09821a98ac0680fad765217302858e70fa4Paul Duffin    List<String> letters = COMMA_SPLITTER.splitToList(simple);
680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "b", "c");
697dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
707dd252788645e940eada959bdde927426e2531c9Paul Duffin
717dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testToString() {
727dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals("[]", Splitter.on(',').split("").toString());
737dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals("[a, b, c]", Splitter.on(',').split("a,b,c").toString());
747dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals("[yam, bam, jam, ham]", Splitter.on(", ").split("yam, bam, jam, ham").toString());
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharacterSimpleSplitWithNoDelimiter() {
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String simple = "a,b,c";
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.on('.').split(simple);
800888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a,b,c");
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharacterSplitWithDoubleDelimiter() {
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String doubled = "a,,b,c";
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = COMMA_SPLITTER.split(doubled);
860888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "", "b", "c");
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharacterSplitWithDoubleDelimiterAndSpace() {
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String doubled = "a,, b,c";
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = COMMA_SPLITTER.split(doubled);
920888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "", " b", "c");
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharacterSplitWithTrailingDelimiter() {
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String trailing = "a,b,c,";
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = COMMA_SPLITTER.split(trailing);
980888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "b", "c", "");
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharacterSplitWithLeadingDelimiter() {
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String leading = ",a,b,c";
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = COMMA_SPLITTER.split(leading);
1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("", "a", "b", "c");
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharacterSplitWithMulitpleLetters() {
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> testCharacteringMotto = Splitter.on('-').split(
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "Testing-rocks-Debugging-sucks");
1100888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(testCharacteringMotto).iteratesOverSequence(
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "Testing", "rocks", "Debugging", "sucks");
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharacterSplitWithMatcherDelimiter() {
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> testCharacteringMotto = Splitter
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .on(CharMatcher.WHITESPACE)
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .split("Testing\nrocks\tDebugging sucks");
1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(testCharacteringMotto).iteratesOverSequence(
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "Testing", "rocks", "Debugging", "sucks");
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharacterSplitWithDoubleDelimiterOmitEmptyStrings() {
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String doubled = "a..b.c";
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.on('.')
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .omitEmptyStrings().split(doubled);
1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "b", "c");
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharacterSplitEmptyToken() {
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String emptyToken = "a. .c";
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.on('.').trimResults()
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .split(emptyToken);
1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "", "c");
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharacterSplitEmptyTokenOmitEmptyStrings() {
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String emptyToken = "a. .c";
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.on('.')
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .omitEmptyStrings().trimResults().split(emptyToken);
1400888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "c");
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharacterSplitOnEmptyString() {
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> nothing = Splitter.on('.').split("");
1450888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(nothing).iteratesOverSequence("");
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharacterSplitOnEmptyStringOmitEmptyStrings() {
1490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(Splitter.on('.').omitEmptyStrings().split("")).isEmpty();
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharacterSplitOnOnlyDelimiter() {
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> blankblank = Splitter.on('.').split(".");
1540888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(blankblank).iteratesOverSequence("", "");
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharacterSplitOnOnlyDelimitersOmitEmptyStrings() {
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> empty = Splitter.on('.').omitEmptyStrings().split("...");
1590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(empty).isEmpty();
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharacterSplitWithTrim() {
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String jacksons = "arfo(Marlon)aorf, (Michael)orfa, afro(Jackie)orfa, "
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        + "ofar(Jemaine), aff(Tito)";
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> family = COMMA_SPLITTER
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .trimResults(CharMatcher.anyOf("afro").or(CharMatcher.WHITESPACE))
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .split(jacksons);
1680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(family).iteratesOverSequence(
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "(Marlon)", "(Michael)", "(Jackie)", "(Jemaine)", "(Tito)");
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSimpleSplit() {
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String simple = "a,b,c";
1747dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterable<String> letters = Splitter.on(',').split(simple);
1750888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "b", "c");
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSimpleSplitWithNoDelimiter() {
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String simple = "a,b,c";
1807dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterable<String> letters = Splitter.on('.').split(simple);
1810888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a,b,c");
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSplitWithDoubleDelimiter() {
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String doubled = "a,,b,c";
1867dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterable<String> letters = Splitter.on(',').split(doubled);
1870888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "", "b", "c");
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSplitWithDoubleDelimiterAndSpace() {
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String doubled = "a,, b,c";
1927dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterable<String> letters = Splitter.on(',').split(doubled);
1930888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "", " b", "c");
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSplitWithTrailingDelimiter() {
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String trailing = "a,b,c,";
1987dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterable<String> letters = Splitter.on(',').split(trailing);
1990888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "b", "c", "");
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSplitWithLeadingDelimiter() {
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String leading = ",a,b,c";
2047dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterable<String> letters = Splitter.on(',').split(leading);
2050888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("", "a", "b", "c");
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSplitWithMultipleLetters() {
2097dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterable<String> testStringingMotto = Splitter.on('-').split(
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "Testing-rocks-Debugging-sucks");
2110888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(testStringingMotto).iteratesOverSequence(
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "Testing", "rocks", "Debugging", "sucks");
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSplitWithDoubleDelimiterOmitEmptyStrings() {
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String doubled = "a..b.c";
2177dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterable<String> letters = Splitter.on('.')
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .omitEmptyStrings().split(doubled);
2190888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "b", "c");
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSplitEmptyToken() {
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String emptyToken = "a. .c";
2247dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterable<String> letters = Splitter.on('.').trimResults()
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .split(emptyToken);
2260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "", "c");
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSplitEmptyTokenOmitEmptyStrings() {
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String emptyToken = "a. .c";
2317dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterable<String> letters = Splitter.on('.')
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .omitEmptyStrings().trimResults().split(emptyToken);
2330888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "c");
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSplitWithLongDelimiter() {
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String longDelimiter = "a, b, c";
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.on(", ").split(longDelimiter);
2390888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "b", "c");
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSplitWithLongLeadingDelimiter() {
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String longDelimiter = ", a, b, c";
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.on(", ").split(longDelimiter);
2450888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("", "a", "b", "c");
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSplitWithLongTrailingDelimiter() {
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String longDelimiter = "a, b, c, ";
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.on(", ").split(longDelimiter);
2510888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "b", "c", "");
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSplitWithDelimiterSubstringInValue() {
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String fourCommasAndFourSpaces = ",,,,    ";
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> threeCommasThenThreeSpaces = Splitter.on(", ").split(
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fourCommasAndFourSpaces);
2580888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(threeCommasThenThreeSpaces).iteratesOverSequence(",,,", "   ");
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSplitWithEmptyString() {
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Splitter.on("");
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSplitOnEmptyString() {
2707dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterable<String> notMuch = Splitter.on('.').split("");
2710888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(notMuch).iteratesOverSequence("");
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSplitOnEmptyStringOmitEmptyString() {
2750888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(Splitter.on('.').omitEmptyStrings().split("")).isEmpty();
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSplitOnOnlyDelimiter() {
2797dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterable<String> blankblank = Splitter.on('.').split(".");
2800888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(blankblank).iteratesOverSequence("", "");
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSplitOnOnlyDelimitersOmitEmptyStrings() {
2847dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterable<String> empty = Splitter.on('.').omitEmptyStrings().split("...");
2850888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(empty).isEmpty();
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStringSplitWithTrim() {
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String jacksons = "arfo(Marlon)aorf, (Michael)orfa, afro(Jackie)orfa, "
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        + "ofar(Jemaine), aff(Tito)";
2917dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterable<String> family = Splitter.on(',')
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .trimResults(CharMatcher.anyOf("afro").or(CharMatcher.WHITESPACE))
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .split(jacksons);
2940888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(family).iteratesOverSequence(
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "(Marlon)", "(Michael)", "(Jackie)", "(Jemaine)", "(Tito)");
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Splitter.onPattern")
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPatternSimpleSplit() {
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String simple = "a,b,c";
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.onPattern(",").split(simple);
3020888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "b", "c");
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Splitter.onPattern")
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPatternSimpleSplitWithNoDelimiter() {
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String simple = "a,b,c";
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.onPattern("foo").split(simple);
3090888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a,b,c");
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Splitter.onPattern")
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPatternSplitWithDoubleDelimiter() {
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String doubled = "a,,b,c";
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.onPattern(",").split(doubled);
3160888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "", "b", "c");
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Splitter.onPattern")
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPatternSplitWithDoubleDelimiterAndSpace() {
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String doubled = "a,, b,c";
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.onPattern(",").split(doubled);
3230888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "", " b", "c");
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Splitter.onPattern")
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPatternSplitWithTrailingDelimiter() {
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String trailing = "a,b,c,";
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.onPattern(",").split(trailing);
3300888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "b", "c", "");
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Splitter.onPattern")
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPatternSplitWithLeadingDelimiter() {
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String leading = ",a,b,c";
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.onPattern(",").split(leading);
3370888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("", "a", "b", "c");
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO(kevinb): the name of this method suggests it might not actually be testing what it
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // intends to be testing?
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Splitter.onPattern")
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPatternSplitWithMultipleLetters() {
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> testPatterningMotto = Splitter.onPattern("-").split(
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "Testing-rocks-Debugging-sucks");
3460888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(testPatterningMotto).iteratesOverSequence("Testing", "rocks", "Debugging", "sucks");
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("java.util.regex.Pattern")
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static Pattern literalDotPattern() {
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Pattern.compile("\\.");
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("java.util.regex.Pattern")
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPatternSplitWithDoubleDelimiterOmitEmptyStrings() {
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String doubled = "a..b.c";
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.on(literalDotPattern())
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .omitEmptyStrings().split(doubled);
3590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "b", "c");
3607dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
3617dd252788645e940eada959bdde927426e2531c9Paul Duffin
3627dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("java.util.regex.Pattern")
3637dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testPatternSplitLookBehind() {
3647dd252788645e940eada959bdde927426e2531c9Paul Duffin    String toSplit = ":foo::barbaz:";
3657dd252788645e940eada959bdde927426e2531c9Paul Duffin    String regexPattern = "(?<=:)";
3667dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterable<String> split = Splitter.onPattern(regexPattern).split(toSplit);
3670888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(split).iteratesOverSequence(":", "foo:", ":", "barbaz:");
3687dd252788645e940eada959bdde927426e2531c9Paul Duffin    // splits into chunks ending in :
3697dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
3707dd252788645e940eada959bdde927426e2531c9Paul Duffin
3717dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("java.util.regex.Pattern")
3727dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testPatternSplitWordBoundary() {
3737dd252788645e940eada959bdde927426e2531c9Paul Duffin    String string = "foo<bar>bletch";
3747dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterable<String> words = Splitter.on(Pattern.compile("\\b")).split(string);
3750888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(words).iteratesOverSequence("foo", "<", "bar", ">", "bletch");
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("java.util.regex.Pattern")
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPatternSplitEmptyToken() {
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String emptyToken = "a. .c";
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.on(literalDotPattern()).trimResults().split(emptyToken);
3820888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "", "c");
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("java.util.regex.Pattern")
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPatternSplitEmptyTokenOmitEmptyStrings() {
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String emptyToken = "a. .c";
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.on(literalDotPattern())
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .omitEmptyStrings().trimResults().split(emptyToken);
3900888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "c");
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("java.util.regex.Pattern")
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPatternSplitOnOnlyDelimiter() {
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> blankblank = Splitter.on(literalDotPattern()).split(".");
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3970888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(blankblank).iteratesOverSequence("", "");
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("java.util.regex.Pattern")
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPatternSplitOnOnlyDelimitersOmitEmptyStrings() {
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> empty = Splitter.on(literalDotPattern()).omitEmptyStrings()
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .split("...");
4040888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(empty).isEmpty();
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("java.util.regex.Pattern")
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPatternSplitMatchingIsGreedy() {
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String longDelimiter = "a, b,   c";
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.on(Pattern.compile(",\\s*"))
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .split(longDelimiter);
4120888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "b", "c");
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("java.util.regex.Pattern")
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPatternSplitWithLongLeadingDelimiter() {
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String longDelimiter = ", a, b, c";
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.on(Pattern.compile(", "))
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .split(longDelimiter);
4200888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("", "a", "b", "c");
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("java.util.regex.Pattern")
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPatternSplitWithLongTrailingDelimiter() {
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String longDelimiter = "a, b, c/ ";
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.on(Pattern.compile("[,/]\\s"))
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .split(longDelimiter);
4280888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "b", "c", "");
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("java.util.regex.Pattern")
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPatternSplitInvalidPattern() {
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Splitter.on(Pattern.compile("a*"));
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("java.util.regex.Pattern")
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPatternSplitWithTrim() {
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String jacksons = "arfo(Marlon)aorf, (Michael)orfa, afro(Jackie)orfa, "
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        + "ofar(Jemaine), aff(Tito)";
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> family = Splitter.on(Pattern.compile(","))
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .trimResults(CharMatcher.anyOf("afro").or(CharMatcher.WHITESPACE))
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .split(jacksons);
4470888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(family).iteratesOverSequence(
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "(Marlon)", "(Michael)", "(Jackie)", "(Jemaine)", "(Tito)");
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSplitterIterableIsUnmodifiable_char() {
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertIteratorIsUnmodifiable(COMMA_SPLITTER.split("a,b").iterator());
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSplitterIterableIsUnmodifiable_string() {
4567dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertIteratorIsUnmodifiable(Splitter.on(',').split("a,b").iterator());
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("java.util.regex.Pattern")
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSplitterIterableIsUnmodifiable_pattern() {
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertIteratorIsUnmodifiable(
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Splitter.on(Pattern.compile(",")).split("a,b").iterator());
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void assertIteratorIsUnmodifiable(Iterator<?> iterator) {
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.next();
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.remove();
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSplitterIterableIsLazy_char() {
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSplitterIterableIsLazy(COMMA_SPLITTER);
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSplitterIterableIsLazy_string() {
4797dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertSplitterIterableIsLazy(Splitter.on(','));
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("java.util.regex.Pattern")
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSplitterIterableIsLazy_pattern() {
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSplitterIterableIsLazy(Splitter.onPattern(","));
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * This test really pushes the boundaries of what we support. In general the
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * splitter's behaviour is not well defined if the char sequence it's
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * splitting is mutated during iteration.
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void assertSplitterIterableIsLazy(Splitter splitter) {
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    StringBuilder builder = new StringBuilder();
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = splitter.split(builder).iterator();
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.append("A,");
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("A", iterator.next());
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.append("B,");
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("B", iterator.next());
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.append("C");
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("C", iterator.next());
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5057dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFixedLengthSimpleSplit() {
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String simple = "abcde";
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.fixedLength(2).split(simple);
5080888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("ab", "cd", "e");
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5117dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFixedLengthSplitEqualChunkLength() {
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String simple = "abcdef";
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.fixedLength(2).split(simple);
5140888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("ab", "cd", "ef");
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5177dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFixedLengthSplitOnlyOneChunk() {
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String simple = "abc";
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.fixedLength(3).split(simple);
5200888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("abc");
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5237dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFixedLengthSplitSmallerString() {
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String simple = "ab";
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.fixedLength(3).split(simple);
5260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("ab");
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5297dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFixedLengthSplitEmptyString() {
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String simple = "";
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.fixedLength(3).split(simple);
5320888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("");
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5357dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFixedLengthSplitEmptyStringWithOmitEmptyStrings() {
5360888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(Splitter.fixedLength(3).omitEmptyStrings().split("")).isEmpty();
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5397dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFixedLengthSplitIntoChars() {
5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String simple = "abcd";
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.fixedLength(1).split(simple);
5420888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "b", "c", "d");
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5457dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFixedLengthSplitZeroChunkLen() {
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Splitter.fixedLength(0);
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5537dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFixedLengthSplitNegativeChunkLen() {
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Splitter.fixedLength(-1);
5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLimitLarge() {
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String simple = "abcd";
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.fixedLength(1).limit(100).split(simple);
5640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "b", "c", "d");
5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLimitOne() {
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String simple = "abcd";
5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.fixedLength(1).limit(1).split(simple);
5700888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("abcd");
5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLimitFixedLength() {
5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String simple = "abcd";
5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> letters = Splitter.fixedLength(1).limit(2).split(simple);
5760888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(letters).iteratesOverSequence("a", "bcd");
5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLimitSeparator() {
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String simple = "a,b,c,d";
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> items = COMMA_SPLITTER.limit(2).split(simple);
5820888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(items).iteratesOverSequence("a", "b,c,d");
5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLimitExtraSeparators() {
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String text = "a,,,b,,c,d";
5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> items = COMMA_SPLITTER.limit(2).split(text);
5880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(items).iteratesOverSequence("a", ",,b,,c,d");
5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLimitExtraSeparatorsOmitEmpty() {
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String text = "a,,,b,,c,d";
5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> items = COMMA_SPLITTER.limit(2).omitEmptyStrings().split(text);
5940888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(items).iteratesOverSequence("a", "b,,c,d");
5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLimitExtraSeparatorsOmitEmpty3() {
5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String text = "a,,,b,,c,d";
5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> items = COMMA_SPLITTER.limit(3).omitEmptyStrings().split(text);
6000888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(items).iteratesOverSequence("a", "b", "c,d");
6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLimitExtraSeparatorsTrim() {
6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String text = ",,a,,  , b ,, c,d ";
6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> items = COMMA_SPLITTER.limit(2).omitEmptyStrings().trimResults().split(text);
6060888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(items).iteratesOverSequence("a", "b ,, c,d");
6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLimitExtraSeparatorsTrim3() {
6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String text = ",,a,,  , b ,, c,d ";
6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> items = COMMA_SPLITTER.limit(3).omitEmptyStrings().trimResults().split(text);
6120888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(items).iteratesOverSequence("a", "b", "c,d");
6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLimitExtraSeparatorsTrim1() {
6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String text = ",,a,,  , b ,, c,d ";
6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> items = COMMA_SPLITTER.limit(1).omitEmptyStrings().trimResults().split(text);
6180888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(items).iteratesOverSequence("a,,  , b ,, c,d");
6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLimitExtraSeparatorsTrim1NoOmit() {
6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String text = ",,a,,  , b ,, c,d ";
6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> items = COMMA_SPLITTER.limit(1).trimResults().split(text);
6240888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(items).iteratesOverSequence(",,a,,  , b ,, c,d");
6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLimitExtraSeparatorsTrim1Empty() {
6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String text = "";
6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> items = COMMA_SPLITTER.limit(1).split(text);
6300888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(items).iteratesOverSequence("");
6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLimitExtraSeparatorsTrim1EmptyOmit() {
6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String text = "";
6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> items = COMMA_SPLITTER.omitEmptyStrings().limit(1).split(text);
6360888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(items).isEmpty();
6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6390888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @SuppressWarnings("ReturnValueIgnored") // testing for exception
6401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testInvalidZeroLimit() {
6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
6421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      COMMA_SPLITTER.limit(0);
6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
6497dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testNullPointers() {
6501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester tester = new NullPointerTester();
6511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicStaticMethods(Splitter.class);
6527dd252788645e940eada959bdde927426e2531c9Paul Duffin    tester.testAllPublicInstanceMethods(Splitter.on(','));
6537dd252788645e940eada959bdde927426e2531c9Paul Duffin    tester.testAllPublicInstanceMethods(Splitter.on(',').trimResults());
6541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6560888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static <E> List<E> asList(Collection<E> collection) {
6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ImmutableList.copyOf(collection);
6581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMapSplitter_trimmedBoth() {
6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, String> m = COMMA_SPLITTER
6621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .trimResults()
6631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withKeyValueSeparator(Splitter.on(':').trimResults())
6641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .split("boy  : tom , girl: tina , cat  : kitty , dog: tommy ");
6651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMap<String, String> expected =
6661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableMap.of("boy", "tom", "girl", "tina", "cat", "kitty", "dog", "tommy");
6670888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(m).isEqualTo(expected);
6680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(asList(m.entrySet())).is(asList(expected.entrySet()));
6691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMapSplitter_trimmedEntries() {
6721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, String> m = COMMA_SPLITTER
6731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .trimResults()
6741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withKeyValueSeparator(":")
6751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .split("boy  : tom , girl: tina , cat  : kitty , dog: tommy ");
6761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMap<String, String> expected =
6771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableMap.of("boy  ", " tom", "girl", " tina", "cat  ", " kitty", "dog", " tommy");
6781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6790888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(m).isEqualTo(expected);
6800888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(asList(m.entrySet())).is(asList(expected.entrySet()));
6811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMapSplitter_trimmedKeyValue() {
6841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, String> m =
6851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        COMMA_SPLITTER.withKeyValueSeparator(Splitter.on(':').trimResults()).split(
6861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            "boy  : tom , girl: tina , cat  : kitty , dog: tommy ");
6871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMap<String, String> expected =
6881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableMap.of("boy", "tom", "girl", "tina", "cat", "kitty", "dog", "tommy");
6890888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(m).isEqualTo(expected);
6900888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(asList(m.entrySet())).is(asList(expected.entrySet()));
6911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMapSplitter_notTrimmed() {
6941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, String> m = COMMA_SPLITTER.withKeyValueSeparator(":").split(
6951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        " boy:tom , girl: tina , cat :kitty , dog:  tommy ");
6961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMap<String, String> expected =
6971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableMap.of(" boy", "tom ", " girl", " tina ", " cat ", "kitty ", " dog", "  tommy ");
6980888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(m).isEqualTo(expected);
6990888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(asList(m.entrySet())).is(asList(expected.entrySet()));
7007dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
7017dd252788645e940eada959bdde927426e2531c9Paul Duffin
7027dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testMapSplitter_CharacterSeparator() {
7037dd252788645e940eada959bdde927426e2531c9Paul Duffin    // try different delimiters.
7047dd252788645e940eada959bdde927426e2531c9Paul Duffin    Map<String, String> m = Splitter
7057dd252788645e940eada959bdde927426e2531c9Paul Duffin        .on(",")
7067dd252788645e940eada959bdde927426e2531c9Paul Duffin        .withKeyValueSeparator(':')
7077dd252788645e940eada959bdde927426e2531c9Paul Duffin        .split("boy:tom,girl:tina,cat:kitty,dog:tommy");
7087dd252788645e940eada959bdde927426e2531c9Paul Duffin    ImmutableMap<String, String> expected =
7097dd252788645e940eada959bdde927426e2531c9Paul Duffin        ImmutableMap.of("boy", "tom", "girl", "tina", "cat", "kitty", "dog", "tommy");
7107dd252788645e940eada959bdde927426e2531c9Paul Duffin
7110888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(m).isEqualTo(expected);
7120888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(asList(m.entrySet())).is(asList(expected.entrySet()));
7131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMapSplitter_multiCharacterSeparator() {
7161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // try different delimiters.
7171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, String> m = Splitter
7181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .on(",")
7191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withKeyValueSeparator(":^&")
7201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .split("boy:^&tom,girl:^&tina,cat:^&kitty,dog:^&tommy");
7211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMap<String, String> expected =
7221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableMap.of("boy", "tom", "girl", "tina", "cat", "kitty", "dog", "tommy");
7231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7240888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(m).isEqualTo(expected);
7250888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(asList(m.entrySet())).is(asList(expected.entrySet()));
7261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7280888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @SuppressWarnings("ReturnValueIgnored") // testing for exception
7291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMapSplitter_emptySeparator() {
7301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
7311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      COMMA_SPLITTER.withKeyValueSeparator("");
7321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
7331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
7341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMapSplitter_malformedEntry() {
7381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
7391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      COMMA_SPLITTER.withKeyValueSeparator("=").split("a=1,b,c=2");
7401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
7410888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IllegalArgumentException expected) {
7421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMapSplitter_orderedResults() {
7467dd252788645e940eada959bdde927426e2531c9Paul Duffin    Map<String, String> m = Splitter.on(',')
7471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withKeyValueSeparator(":")
7481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .split("boy:tom,girl:tina,cat:kitty,dog:tommy");
7491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7500888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(m.keySet()).iteratesOverSequence("boy", "girl", "cat", "dog");
7510888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(m).isEqualTo(
7521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableMap.of("boy", "tom", "girl", "tina", "cat", "kitty", "dog", "tommy"));
7531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // try in a different order
7557dd252788645e940eada959bdde927426e2531c9Paul Duffin    m = Splitter.on(',')
7561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withKeyValueSeparator(":")
7571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .split("girl:tina,boy:tom,dog:tommy,cat:kitty");
7581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(m.keySet()).iteratesOverSequence("girl", "boy", "dog", "cat");
7600888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(m).isEqualTo(
7611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableMap.of("boy", "tom", "girl", "tina", "cat", "kitty", "dog", "tommy"));
7621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMapSplitter_duplicateKeys() {
7651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
7667dd252788645e940eada959bdde927426e2531c9Paul Duffin      Splitter.on(',').withKeyValueSeparator(":").split("a:1,b:2,a:3");
7671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
7681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
7691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
772