11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2008 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 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Joiner.MapJoiner; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ImmutableMap; 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ImmutableMultimap; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ImmutableSet; 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.Iterators; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.Lists; 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.Maps; 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester; 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase; 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.IOException; 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays; 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator; 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map; 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set; 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit test for {@link Joiner}. 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true) 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class JoinerTest extends TestCase { 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Joiner J = Joiner.on("-"); 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // <Integer> needed to prevent warning :( 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Iterable<Integer> ITERABLE_ = Arrays.<Integer>asList(); 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Iterable<Integer> ITERABLE_1 = Arrays.asList(1); 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Iterable<Integer> ITERABLE_12 = Arrays.asList(1, 2); 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Iterable<Integer> ITERABLE_123 = Arrays.asList(1, 2, 3); 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Iterable<Integer> ITERABLE_NULL = Arrays.asList((Integer) null); 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Iterable<Integer> ITERABLE_NULL_NULL 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert = Arrays.asList((Integer) null, null); 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Iterable<Integer> ITERABLE_NULL_1 = Arrays.asList(null, 1); 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Iterable<Integer> ITERABLE_1_NULL = Arrays.asList(1, null); 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Iterable<Integer> ITERABLE_1_NULL_2 = Arrays.asList(1, null, 2); 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Iterable<Integer> ITERABLE_FOUR_NULLS 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert = Arrays.asList((Integer) null, null, null, null); 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNoSpecialNullBehavior() { 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNoOutput(J, ITERABLE_); 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(J, ITERABLE_1, "1"); 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(J, ITERABLE_12, "1-2"); 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(J, ITERABLE_123, "1-2-3"); 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert J.join(ITERABLE_NULL); 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert J.join(ITERABLE_1_NULL_2); 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert J.join(ITERABLE_NULL.iterator()); 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert J.join(ITERABLE_1_NULL_2.iterator()); 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testOnCharOverride() { 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Joiner onChar = Joiner.on('-'); 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNoOutput(onChar, ITERABLE_); 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(onChar, ITERABLE_1, "1"); 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(onChar, ITERABLE_12, "1-2"); 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(onChar, ITERABLE_123, "1-2-3"); 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSkipNulls() { 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Joiner skipNulls = J.skipNulls(); 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNoOutput(skipNulls, ITERABLE_); 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNoOutput(skipNulls, ITERABLE_NULL); 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNoOutput(skipNulls, ITERABLE_NULL_NULL); 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNoOutput(skipNulls, ITERABLE_FOUR_NULLS); 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(skipNulls, ITERABLE_1, "1"); 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(skipNulls, ITERABLE_12, "1-2"); 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(skipNulls, ITERABLE_123, "1-2-3"); 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(skipNulls, ITERABLE_NULL_1, "1"); 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(skipNulls, ITERABLE_1_NULL, "1"); 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(skipNulls, ITERABLE_1_NULL_2, "1-2"); 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testUseForNull() { 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Joiner zeroForNull = J.useForNull("0"); 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNoOutput(zeroForNull, ITERABLE_); 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(zeroForNull, ITERABLE_1, "1"); 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(zeroForNull, ITERABLE_12, "1-2"); 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(zeroForNull, ITERABLE_123, "1-2-3"); 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(zeroForNull, ITERABLE_NULL, "0"); 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(zeroForNull, ITERABLE_NULL_NULL, "0-0"); 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(zeroForNull, ITERABLE_NULL_1, "0-1"); 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(zeroForNull, ITERABLE_1_NULL, "1-0"); 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(zeroForNull, ITERABLE_1_NULL_2, "1-0-2"); 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkResult(zeroForNull, ITERABLE_FOUR_NULLS, "0-0-0-0"); 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static void checkNoOutput(Joiner joiner, Iterable<Integer> set) { 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("", joiner.join(set)); 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("", joiner.join(set.iterator())); 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object[] array = Lists.newArrayList(set).toArray(new Integer[0]); 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("", joiner.join(array)); 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringBuilder sb1FromIterable = new StringBuilder(); 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertSame(sb1FromIterable, joiner.appendTo(sb1FromIterable, set)); 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(0, sb1FromIterable.length()); 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringBuilder sb1FromIterator = new StringBuilder(); 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertSame(sb1FromIterator, joiner.appendTo(sb1FromIterator, set)); 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(0, sb1FromIterator.length()); 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringBuilder sb2 = new StringBuilder(); 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertSame(sb2, joiner.appendTo(sb2, array)); 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(0, sb2.length()); 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert joiner.appendTo(NASTY_APPENDABLE, set); 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IOException e) { 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new AssertionError(e); 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert joiner.appendTo(NASTY_APPENDABLE, set.iterator()); 1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IOException e) { 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new AssertionError(e); 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert joiner.appendTo(NASTY_APPENDABLE, array); 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IOException e) { 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new AssertionError(e); 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Appendable NASTY_APPENDABLE = new Appendable() { 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Appendable append(CharSequence csq) throws IOException { 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new IOException(); 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Appendable append(CharSequence csq, int start, int end) throws IOException { 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new IOException(); 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Appendable append(char c) throws IOException { 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new IOException(); 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static void checkResult(Joiner joiner, Iterable<Integer> parts, String expected) { 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected, joiner.join(parts)); 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected, joiner.join(parts.iterator())); 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringBuilder sb1FromIterable = new StringBuilder().append('x'); 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert joiner.appendTo(sb1FromIterable, parts); 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("x" + expected, sb1FromIterable.toString()); 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringBuilder sb1FromIterator = new StringBuilder().append('x'); 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert joiner.appendTo(sb1FromIterator, parts.iterator()); 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("x" + expected, sb1FromIterator.toString()); 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Integer[] partsArray = Lists.newArrayList(parts).toArray(new Integer[0]); 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected, joiner.join(partsArray)); 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringBuilder sb2 = new StringBuilder().append('x'); 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert joiner.appendTo(sb2, partsArray); 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("x" + expected, sb2.toString()); 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int num = partsArray.length - 2; 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (num >= 0) { 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object[] rest = new Integer[num]; 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = 0; i < num; i++) { 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert rest[i] = partsArray[i + 2]; 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected, joiner.join(partsArray[0], partsArray[1], rest)); 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringBuilder sb3 = new StringBuilder().append('x'); 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert joiner.appendTo(sb3, partsArray[0], partsArray[1], rest); 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("x" + expected, sb3.toString()); 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testIterableIterator() { 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Joiner onChar = Joiner.on('-'); 2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkIterableIterator(onChar, "1-2-3-4"); 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Joiner skipNulls = J.skipNulls(); 2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkIterableIterator(skipNulls, "1-2-3-4"); 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Joiner zeroForNull = J.useForNull("0"); 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkIterableIterator(zeroForNull, "1-2-3-4"); 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static void checkIterableIterator(Joiner joiner, String expected) { 2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected, joiner.join(new IterableIterator())); 2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringBuilder sb1 = new StringBuilder().append('x'); 2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert joiner.appendTo(sb1, new IterableIterator()); 2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("x" + expected, sb1.toString()); 2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Integer[] partsArray = 2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Lists.newArrayList(new IterableIterator().iterator()).toArray(new Integer[0]); 2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected, joiner.join(partsArray)); 2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringBuilder sb2 = new StringBuilder().append('x'); 2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert joiner.appendTo(sb2, partsArray); 2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("x" + expected, sb2.toString()); 2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int num = partsArray.length - 2; 2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (num >= 0) { 2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object[] rest = new Integer[num]; 2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = 0; i < num; i++) { 2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert rest[i] = partsArray[i + 2]; 2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected, joiner.join(partsArray[0], partsArray[1], rest)); 2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringBuilder sb3 = new StringBuilder().append('x'); 2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert joiner.appendTo(sb3, partsArray[0], partsArray[1], rest); 2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("x" + expected, sb3.toString()); 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void test_useForNull_skipNulls() { 2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Joiner j = Joiner.on("x").useForNull("y"); 2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert j.skipNulls(); 2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException expected) { 2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void test_skipNulls_useForNull() { 2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Joiner j = Joiner.on("x").skipNulls(); 2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert j.useForNull("y"); 2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException expected) { 2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void test_useForNull_twice() { 2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Joiner j = Joiner.on("x").useForNull("y"); 2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert j.useForNull("y"); 2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException expected) { 2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testMap() { 2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert MapJoiner j = Joiner.on(";").withKeyValueSeparator(":"); 2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("", j.join(ImmutableMap.of())); 2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(":", j.join(ImmutableMap.of("", ""))); 2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<String, String> mapWithNulls = Maps.newLinkedHashMap(); 2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert mapWithNulls.put("a", null); 2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert mapWithNulls.put(null, "b"); 2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert j.join(mapWithNulls); 2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("a:00;00:b", j.useForNull("00").join(mapWithNulls)); 2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringBuilder sb = new StringBuilder(); 2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert j.appendTo(sb, ImmutableMap.of(1, 2, 3, 4, 5, 6)); 3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("1:2;3:4;5:6", sb.toString()); 3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntries() { 3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert MapJoiner j = Joiner.on(";").withKeyValueSeparator(":"); 3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("", j.join(ImmutableMultimap.of().entries())); 3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("", j.join(ImmutableMultimap.of().entries().iterator())); 3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(":", j.join(ImmutableMultimap.of("", "").entries())); 3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(":", j.join(ImmutableMultimap.of("", "").entries().iterator())); 3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("1:a;1:b", j.join(ImmutableMultimap.of("1", "a", "1", "b").entries())); 3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("1:a;1:b", j.join(ImmutableMultimap.of("1", "a", "1", "b").entries().iterator())); 3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<String, String> mapWithNulls = Maps.newLinkedHashMap(); 3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert mapWithNulls.put("a", null); 3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert mapWithNulls.put(null, "b"); 3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Map.Entry<String, String>> entriesWithNulls = mapWithNulls.entrySet(); 3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert j.join(entriesWithNulls); 3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert j.join(entriesWithNulls.iterator()); 3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("a:00;00:b", j.useForNull("00").join(entriesWithNulls)); 3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("a:00;00:b", j.useForNull("00").join(entriesWithNulls.iterator())); 3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringBuilder sb1 = new StringBuilder(); 3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert j.appendTo(sb1, ImmutableMultimap.of(1, 2, 3, 4, 5, 6, 1, 3, 5, 10).entries()); 3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("1:2;1:3;3:4;5:6;5:10", sb1.toString()); 3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringBuilder sb2 = new StringBuilder(); 3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert j.appendTo(sb2, ImmutableMultimap.of(1, 2, 3, 4, 5, 6, 1, 3, 5, 10).entries().iterator()); 3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("1:2;1:3;3:4;5:6;5:10", sb2.toString()); 3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void test_skipNulls_onMap() { 3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Joiner j = Joiner.on(",").skipNulls(); 3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert j.withKeyValueSeparator("/"); 3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException expected) { 3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class DontStringMeBro implements CharSequence { 3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public int length() { 3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return 3; 3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public char charAt(int index) { 3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return "foo".charAt(index); 3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public CharSequence subSequence(int start, int end) { 3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return "foo".subSequence(start, end); 3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public String toString() { 3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("shouldn't be invoked"); 3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return null; 3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Don't do this. 3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class IterableIterator implements Iterable<Integer>, Iterator<Integer> { 3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final ImmutableSet<Integer> INTEGERS = ImmutableSet.of(1, 2, 3, 4); 3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private final Iterator<Integer> iterator; 3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public IterableIterator() { 3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.iterator = iterator(); 3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Iterator<Integer> iterator() { 3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return INTEGERS.iterator(); 3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean hasNext() { 3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return iterator.hasNext(); 3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Integer next() { 3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return iterator.next(); 3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public void remove() { 3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert iterator.remove(); 3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("StringBuilder.append in GWT invokes Object.toString(), unlike the JRE version.") 3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testDontConvertCharSequenceToString() { 3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("foo,foo", Joiner.on(",").join( 3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new DontStringMeBro(), new DontStringMeBro())); 3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("foo,bar,foo", Joiner.on(",").useForNull("bar").join( 3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new DontStringMeBro(), null, new DontStringMeBro())); 3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("NullPointerTester") 3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNullPointers() throws Exception { 4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert NullPointerTester tester = new NullPointerTester(); 4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.setDefault(StringBuilder.class, new StringBuilder()); 4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // This is necessary because of the generics hackery we have to temporarily support parameters 4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // which implement both Iterator and Iterable. 4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.setDefault(Object.class, Iterators.emptyIterator()); 4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.testAllPublicStaticMethods(Joiner.class); 4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.testAllPublicInstanceMethods(Joiner.on(",")); 4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.testAllPublicInstanceMethods(Joiner.on(",").skipNulls()); 4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.testAllPublicInstanceMethods(Joiner.on(",").useForNull("x")); 4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.testAllPublicInstanceMethods( 4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Joiner.on(",").withKeyValueSeparator("=")); 4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 413