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.collect;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
197dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static org.truth0.Truth.ASSERT;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Joiner;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ImmutableSortedMap.Builder;
257dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.ListTestSuiteBuilder;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.SortedMapInterfaceTest;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
297dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.google.SortedMapGenerators.ImmutableSortedMapEntryListGenerator;
307dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.google.SortedMapGenerators.ImmutableSortedMapKeyListGenerator;
317dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.google.SortedMapGenerators.ImmutableSortedMapValueListGenerator;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.Test;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestSuite;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.Serializable;
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Comparator;
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.LinkedHashMap;
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry;
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.SortedMap;
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@link ImmutableSortedMap}.
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jesse Wilson
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ImmutableSortedMapTest extends TestCase {
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO: Avoid duplicating code in ImmutableMapTest
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("suite")
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Test suite() {
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TestSuite suite = new TestSuite();
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(ImmutableSortedMapTest.class);
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
637dd252788645e940eada959bdde927426e2531c9Paul Duffin    suite.addTest(ListTestSuiteBuilder.using(
647dd252788645e940eada959bdde927426e2531c9Paul Duffin        new ImmutableSortedMapEntryListGenerator())
657dd252788645e940eada959bdde927426e2531c9Paul Duffin        .named("ImmutableSortedMap.entrySet.asList")
667dd252788645e940eada959bdde927426e2531c9Paul Duffin        .withFeatures(CollectionSize.ANY,
677dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.SERIALIZABLE,
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.REJECTS_DUPLICATES_AT_CREATION,
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
70dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin        .createTestSuite());
71dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin
727dd252788645e940eada959bdde927426e2531c9Paul Duffin    suite.addTest(ListTestSuiteBuilder.using(
737dd252788645e940eada959bdde927426e2531c9Paul Duffin        new ImmutableSortedMapKeyListGenerator())
747dd252788645e940eada959bdde927426e2531c9Paul Duffin        .named("ImmutableSortedMap.keySet.asList")
757dd252788645e940eada959bdde927426e2531c9Paul Duffin        .withFeatures(CollectionSize.ANY,
767dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.SERIALIZABLE,
77dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin            CollectionFeature.REJECTS_DUPLICATES_AT_CREATION,
78dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin            CollectionFeature.ALLOWS_NULL_QUERIES)
79dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin        .createTestSuite());
80dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin
817dd252788645e940eada959bdde927426e2531c9Paul Duffin    suite.addTest(ListTestSuiteBuilder.using(
827dd252788645e940eada959bdde927426e2531c9Paul Duffin        new ImmutableSortedMapValueListGenerator())
837dd252788645e940eada959bdde927426e2531c9Paul Duffin        .named("ImmutableSortedMap.values.asList")
847dd252788645e940eada959bdde927426e2531c9Paul Duffin        .withFeatures(CollectionSize.ANY,
857dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.SERIALIZABLE,
86dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin            CollectionFeature.REJECTS_DUPLICATES_AT_CREATION,
87dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin            CollectionFeature.ALLOWS_NULL_QUERIES)
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return suite;
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public abstract static class AbstractMapTests<K, V>
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      extends SortedMapInterfaceTest<K, V> {
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public AbstractMapTests() {
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, false, false, false);
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected SortedMap<K, V> makeEmptyMap() {
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static final Joiner joiner = Joiner.on(", ");
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected void assertMoreInvariants(Map<K, V> map) {
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // TODO: can these be moved to MapInterfaceTest?
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (Entry<K, V> entry : map.entrySet()) {
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(entry.getKey() + "=" + entry.getValue(),
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            entry.toString());
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("{" + joiner.join(map.entrySet()) + "}",
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          map.toString());
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("[" + joiner.join(map.entrySet()) + "]",
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          map.entrySet().toString());
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("[" + joiner.join(map.keySet()) + "]",
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          map.keySet().toString());
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("[" + joiner.join(map.values()) + "]",
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          map.values().toString());
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Sets.newHashSet(map.entrySet()), map.entrySet());
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Sets.newHashSet(map.keySet()), map.keySet());
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class MapTests extends AbstractMapTests<String, Integer> {
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected SortedMap<String, Integer> makeEmptyMap() {
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableSortedMap.of();
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected SortedMap<String, Integer> makePopulatedMap() {
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableSortedMap.of("one", 1, "two", 2, "three", 3);
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "minus one";
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Integer getValueNotInPopulatedMap() {
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return -1;
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class SingletonMapTests
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      extends AbstractMapTests<String, Integer> {
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected SortedMap<String, Integer> makePopulatedMap() {
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableSortedMap.of("one", 1);
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "minus one";
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Integer getValueNotInPopulatedMap() {
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return -1;
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class ReserializedMapTests
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      extends AbstractMapTests<String, Integer> {
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected SortedMap<String, Integer> makePopulatedMap() {
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return SerializableTester.reserialize(
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableSortedMap.of("one", 1, "two", 2, "three", 3));
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "minus one";
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Integer getValueNotInPopulatedMap() {
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return -1;
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class HeadMapTests extends AbstractMapTests<String, Integer> {
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected SortedMap<String, Integer> makePopulatedMap() {
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableSortedMap.of("a", 1, "b", 2, "c", 3, "d", 4, "e", 5)
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .headMap("d");
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "d";
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Integer getValueNotInPopulatedMap() {
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return 4;
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class HeadMapInclusiveTests extends AbstractMapTests<String, Integer> {
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected SortedMap<String, Integer> makePopulatedMap() {
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableSortedMap.of("a", 1, "b", 2, "c", 3, "d", 4, "e", 5)
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .headMap("c", true);
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "d";
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Integer getValueNotInPopulatedMap() {
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return 4;
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2057dd252788645e940eada959bdde927426e2531c9Paul Duffin
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TailMapTests extends AbstractMapTests<String, Integer> {
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected SortedMap<String, Integer> makePopulatedMap() {
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableSortedMap.of("a", 1, "b", 2, "c", 3, "d", 4, "e", 5)
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .tailMap("b");
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "a";
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Integer getValueNotInPopulatedMap() {
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return 1;
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TailExclusiveMapTests extends AbstractMapTests<String, Integer> {
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected SortedMap<String, Integer> makePopulatedMap() {
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableSortedMap.of("a", 1, "b", 2, "c", 3, "d", 4, "e", 5)
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .tailMap("a", false);
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "a";
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Integer getValueNotInPopulatedMap() {
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return 1;
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class SubMapTests extends AbstractMapTests<String, Integer> {
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected SortedMap<String, Integer> makePopulatedMap() {
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableSortedMap.of("a", 1, "b", 2, "c", 3, "d", 4, "e", 5)
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .subMap("b", "d");
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "a";
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Integer getValueNotInPopulatedMap() {
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return 4;
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class CreationTests extends TestCase {
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testEmptyBuilder() {
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMap<String, Integer> map
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = ImmutableSortedMap.<String, Integer>naturalOrder().build();
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Collections.<String, Integer>emptyMap(), map);
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testSingletonBuilder() {
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMap<String, Integer> map
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = ImmutableSortedMap.<String, Integer>naturalOrder()
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put("one", 1)
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .build();
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(map, "one", 1);
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilder() {
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMap<String, Integer> map
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = ImmutableSortedMap.<String, Integer>naturalOrder()
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put("one", 1)
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put("two", 2)
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put("three", 3)
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put("four", 4)
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put("five", 5)
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .build();
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(map,
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "five", 5, "four", 4, "one", 1, "three", 3, "two", 2);
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilder_withImmutableEntry() {
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMap<String, Integer> map =
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableSortedMap.<String, Integer>naturalOrder()
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put(Maps.immutableEntry("one", 1))
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .build();
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(map, "one", 1);
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilder_withImmutableEntryAndNullContents() {
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Builder<String, Integer> builder =
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableSortedMap.naturalOrder();
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.put(Maps.immutableEntry("one", (Integer) null));
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.put(Maps.immutableEntry((String) null, 1));
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static class StringHolder {
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      String string;
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilder_withMutableEntry() {
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMap.Builder<String, Integer> builder =
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableSortedMap.naturalOrder();
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      final StringHolder holder = new StringHolder();
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      holder.string = "one";
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Entry<String, Integer> entry = new AbstractMapEntry<String, Integer>() {
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override public String getKey() {
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          return holder.string;
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override public Integer getValue() {
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          return 1;
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      };
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.put(entry);
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      holder.string = "two";
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(builder.build(), "one", 1);
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderPutAllWithEmptyMap() {
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMap<String, Integer> map
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = ImmutableSortedMap.<String, Integer>naturalOrder()
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .putAll(Collections.<String, Integer>emptyMap())
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .build();
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Collections.<String, Integer>emptyMap(), map);
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderPutAll() {
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Map<String, Integer> toPut = new LinkedHashMap<String, Integer>();
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      toPut.put("one", 1);
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      toPut.put("two", 2);
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      toPut.put("three", 3);
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Map<String, Integer> moreToPut = new LinkedHashMap<String, Integer>();
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      moreToPut.put("four", 4);
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      moreToPut.put("five", 5);
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMap<String, Integer> map
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = ImmutableSortedMap.<String, Integer>naturalOrder()
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .putAll(toPut)
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .putAll(moreToPut)
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .build();
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(map,
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "five", 5, "four", 4, "one", 1, "three", 3, "two", 2);
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderReuse() {
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Builder<String, Integer> builder = ImmutableSortedMap.naturalOrder();
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMap<String, Integer> mapOne = builder
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .put("one", 1)
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .put("two", 2)
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .build();
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMap<String, Integer> mapTwo = builder
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .put("three", 3)
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .put("four", 4)
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .build();
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(mapOne, "one", 1, "two", 2);
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(mapTwo, "four", 4, "one", 1, "three", 3, "two", 2);
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderPutNullKey() {
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Builder<String, Integer> builder = ImmutableSortedMap.naturalOrder();
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.put(null, 1);
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderPutNullValue() {
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Builder<String, Integer> builder = ImmutableSortedMap.naturalOrder();
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.put("one", null);
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderPutNullKeyViaPutAll() {
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Builder<String, Integer> builder = ImmutableSortedMap.naturalOrder();
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.putAll(Collections.<String, Integer>singletonMap(null, 1));
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderPutNullValueViaPutAll() {
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Builder<String, Integer> builder = ImmutableSortedMap.naturalOrder();
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.putAll(Collections.<String, Integer>singletonMap("one", null));
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testPuttingTheSameKeyTwiceThrowsOnBuild() {
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Builder<String, Integer> builder
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = ImmutableSortedMap.<String, Integer>naturalOrder()
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put("one", 1)
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put("one", 2); // throwing on this line would be even better
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.build();
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalArgumentException expected) {
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testOf() {
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableSortedMap.of("one", 1),
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "one", 1);
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableSortedMap.of("one", 1, "two", 2),
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "one", 1, "two", 2);
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableSortedMap.of("one", 1, "two", 2, "three", 3),
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "one", 1, "three", 3, "two", 2);
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableSortedMap.of("one", 1, "two", 2, "three", 3, "four", 4),
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "four", 4, "one", 1, "three", 3, "two", 2);
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableSortedMap.of(
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              "one", 1, "two", 2, "three", 3, "four", 4, "five", 5),
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "five", 5, "four", 4, "one", 1, "three", 3, "two", 2);
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testOfNullKey() {
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Integer n = null;
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSortedMap.of(n, 1);
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSortedMap.of("one", 1, null, 2);
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testOfNullValue() {
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSortedMap.of("one", null);
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSortedMap.of("one", 1, "two", null);
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testOfWithDuplicateKey() {
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSortedMap.of("one", 1, "one", 1);
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalArgumentException expected) {
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOfEmptyMap() {
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMap<String, Integer> copy
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = ImmutableSortedMap.copyOf(Collections.<String, Integer>emptyMap());
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Collections.<String, Integer>emptyMap(), copy);
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(copy, ImmutableSortedMap.copyOf(copy));
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(Ordering.natural(), copy.comparator());
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOfSingletonMap() {
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMap<String, Integer> copy
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = ImmutableSortedMap.copyOf(Collections.singletonMap("one", 1));
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(copy, "one", 1);
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(copy, ImmutableSortedMap.copyOf(copy));
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(Ordering.natural(), copy.comparator());
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf() {
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Map<String, Integer> original = new LinkedHashMap<String, Integer>();
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      original.put("one", 1);
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      original.put("two", 2);
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      original.put("three", 3);
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMap<String, Integer> copy
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = ImmutableSortedMap.copyOf(original);
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(copy, "one", 1, "three", 3, "two", 2);
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(copy, ImmutableSortedMap.copyOf(copy));
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(Ordering.natural(), copy.comparator());
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOfExplicitComparator() {
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Comparator<String> comparator = Ordering.natural().reverse();
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Map<String, Integer> original = new LinkedHashMap<String, Integer>();
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      original.put("one", 1);
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      original.put("two", 2);
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      original.put("three", 3);
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMap<String, Integer> copy
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = ImmutableSortedMap.copyOf(original, comparator);
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(copy, "two", 2, "three", 3, "one", 1);
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(copy, ImmutableSortedMap.copyOf(copy, comparator));
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(comparator, copy.comparator());
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOfImmutableSortedSetDifferentComparator() {
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Comparator<String> comparator = Ordering.natural().reverse();
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Map<String, Integer> original
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = ImmutableSortedMap.of("one", 1, "two", 2, "three", 3);
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMap<String, Integer> copy
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = ImmutableSortedMap.copyOf(original, comparator);
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(copy, "two", 2, "three", 3, "one", 1);
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(copy, ImmutableSortedMap.copyOf(copy, comparator));
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(comparator, copy.comparator());
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOfSortedNatural() {
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      SortedMap<String, Integer> original = Maps.newTreeMap();
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      original.put("one", 1);
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      original.put("two", 2);
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      original.put("three", 3);
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMap<String, Integer> copy
5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = ImmutableSortedMap.copyOfSorted(original);
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(copy, "one", 1, "three", 3, "two", 2);
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(copy, ImmutableSortedMap.copyOfSorted(copy));
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(Ordering.natural(), copy.comparator());
5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOfSortedExplicit() {
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Comparator<String> comparator = Ordering.natural().reverse();
5400888a09821a98ac0680fad765217302858e70fa4Paul Duffin      SortedMap<String, Integer> original = Maps.newTreeMap(comparator);
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      original.put("one", 1);
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      original.put("two", 2);
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      original.put("three", 3);
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMap<String, Integer> copy
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = ImmutableSortedMap.copyOfSorted(original);
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(copy, "two", 2, "three", 3, "one", 1);
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(copy, ImmutableSortedMap.copyOfSorted(copy));
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(comparator, copy.comparator());
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static class IntegerDiv10 implements Comparable<IntegerDiv10> {
5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      final int value;
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      IntegerDiv10(int value) {
5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        this.value = value;
5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      public int compareTo(IntegerDiv10 o) {
5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return value / 10 - o.value / 10;
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public String toString() {
5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Integer.toString(value);
5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOfDuplicateKey() {
5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Map<IntegerDiv10, String> original = ImmutableMap.of(
5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          new IntegerDiv10(3), "three",
5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          new IntegerDiv10(20), "twenty",
5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          new IntegerDiv10(11), "eleven",
5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          new IntegerDiv10(35), "thirty five",
5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          new IntegerDiv10(12), "twelve"
5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      );
5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSortedMap.copyOf(original);
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected IllegalArgumentException");
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalArgumentException expected) {
5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testImmutableMapCopyOfImmutableSortedMap() {
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      IntegerDiv10 three = new IntegerDiv10(3);
5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      IntegerDiv10 eleven = new IntegerDiv10(11);
5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      IntegerDiv10 twelve = new IntegerDiv10(12);
5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      IntegerDiv10 twenty = new IntegerDiv10(20);
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Map<IntegerDiv10, String> original = ImmutableSortedMap.of(
5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          three, "three", eleven, "eleven", twenty, "twenty");
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Map<IntegerDiv10, String> copy = ImmutableMap.copyOf(original);
5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(original.containsKey(twelve));
5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(copy.containsKey(twelve));
5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderReverseOrder() {
5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMap<String, Integer> map
5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = ImmutableSortedMap.<String, Integer>reverseOrder()
6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put("one", 1)
6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put("two", 2)
6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put("three", 3)
6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put("four", 4)
6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put("five", 5)
6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .build();
6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(map,
6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "two", 2, "three", 3, "one", 1, "four", 4, "five", 5);
6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Ordering.natural().reverse(), map.comparator());
6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderComparator() {
6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Comparator<String> comparator = Ordering.natural().reverse();
6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMap<String, Integer> map
6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = new ImmutableSortedMap.Builder<String, Integer>(comparator)
6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put("one", 1)
6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put("two", 2)
6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put("three", 3)
6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put("four", 4)
6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .put("five", 5)
6201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              .build();
6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(map,
6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "two", 2, "three", 3, "one", 1, "four", 4, "five", 5);
6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(comparator, map.comparator());
6241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNullGet() {
6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSortedMap<String, Integer> map = ImmutableSortedMap.of("one", 1);
6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(map.get(null));
6301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
6337dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testNullPointers() {
6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester tester = new NullPointerTester();
6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicStaticMethods(ImmutableSortedMap.class);
6361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicInstanceMethods(
6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSortedMap.<String, Integer>naturalOrder());
6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicInstanceMethods(ImmutableSortedMap.of());
6391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicInstanceMethods(ImmutableSortedMap.of("one", 1));
6401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicInstanceMethods(
6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSortedMap.of("one", 1, "two", 2, "three", 3));
6421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static <K, V> void assertMapEquals(Map<K, V> map,
6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Object... alternatingKeysAndValues) {
6461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(map.size(), alternatingKeysAndValues.length / 2);
6471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int i = 0;
6481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (Entry<K, V> entry : map.entrySet()) {
6491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(alternatingKeysAndValues[i++], entry.getKey());
6501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(alternatingKeysAndValues[i++], entry.getValue());
6511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class IntHolder implements Serializable {
6551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public int value;
6561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public IntHolder(int value) {
6581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.value = value;
6591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean equals(Object o) {
6621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return (o instanceof IntHolder) && ((IntHolder) o).value == value;
6631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public int hashCode() {
6661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return value;
6671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static final long serialVersionUID = 5;
6701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMutableValues() {
6731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    IntHolder holderA = new IntHolder(1);
6741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    IntHolder holderB = new IntHolder(2);
6751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, IntHolder> map
6761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableSortedMap.of("a", holderA, "b", holderB);
6771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    holderA.value = 3;
6787dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertTrue(map.entrySet().contains(Maps.immutableEntry("a", new IntHolder(3))));
6791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> intMap
6801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableSortedMap.of("a", 3, "b", 2);
6811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(intMap.hashCode(), map.entrySet().hashCode());
6821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(intMap.hashCode(), map.hashCode());
6831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
6861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testViewSerialization() {
6871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> map
6881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableSortedMap.of("one", 1, "two", 2, "three", 3);
6891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(map.entrySet());
6901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(map.keySet());
6911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Lists.newArrayList(map.values()),
6921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Lists.newArrayList(SerializableTester.reserialize(map.values())));
6931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked") // varargs
6961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testHeadMapInclusive() {
6971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> map =
6981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSortedMap.of("one", 1, "two", 2, "three", 3).headMap("three", true);
6990888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(map.entrySet()).has().exactly(
7007dd252788645e940eada959bdde927426e2531c9Paul Duffin        Maps.immutableEntry("one", 1),
7017dd252788645e940eada959bdde927426e2531c9Paul Duffin        Maps.immutableEntry("three", 3)).inOrder();
7021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked") // varargs
7051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testHeadMapExclusive() {
7061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> map =
7071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSortedMap.of("one", 1, "two", 2, "three", 3).headMap("three", false);
7080888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(map.entrySet()).has().exactly(Maps.immutableEntry("one", 1)).inOrder();
7091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked") // varargs
7121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTailMapInclusive() {
7131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> map =
7141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSortedMap.of("one", 1, "two", 2, "three", 3).tailMap("three", true);
7150888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(map.entrySet()).has().exactly(Maps.immutableEntry("three", 3),
7167dd252788645e940eada959bdde927426e2531c9Paul Duffin        Maps.immutableEntry("two", 2)).inOrder();
7171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked") // varargs
7201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTailMapExclusive() {
7211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> map =
7221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSortedMap.of("one", 1, "two", 2, "three", 3).tailMap("three", false);
7230888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(map.entrySet()).has().exactly(Maps.immutableEntry("two", 2)).inOrder();
7241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked") // varargs
7271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSubMapExclusiveExclusive() {
7281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> map =
7291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSortedMap.of("one", 1, "two", 2, "three", 3).subMap("one", false, "two", false);
7300888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(map.entrySet()).has().exactly(Maps.immutableEntry("three", 3)).inOrder();
7311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked") // varargs
7341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSubMapInclusiveExclusive() {
7351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> map =
7361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSortedMap.of("one", 1, "two", 2, "three", 3).subMap("one", true, "two", false);
7370888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(map.entrySet()).has().exactly(Maps.immutableEntry("one", 1),
7387dd252788645e940eada959bdde927426e2531c9Paul Duffin        Maps.immutableEntry("three", 3)).inOrder();
7391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked") // varargs
7421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSubMapExclusiveInclusive() {
7431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> map =
7441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSortedMap.of("one", 1, "two", 2, "three", 3).subMap("one", false, "two", true);
7450888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(map.entrySet()).has().exactly(Maps.immutableEntry("three", 3),
7467dd252788645e940eada959bdde927426e2531c9Paul Duffin        Maps.immutableEntry("two", 2)).inOrder();
7471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked") // varargs
7501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSubMapInclusiveInclusive() {
7511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> map =
7521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSortedMap.of("one", 1, "two", 2, "three", 3).subMap("one", true, "two", true);
7530888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(map.entrySet()).has().exactly(Maps.immutableEntry("one", 1),
7547dd252788645e940eada959bdde927426e2531c9Paul Duffin        Maps.immutableEntry("three", 3), Maps.immutableEntry("two", 2)).inOrder();
7557dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
7567dd252788645e940eada959bdde927426e2531c9Paul Duffin
7577dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static class SelfComparableExample implements Comparable<SelfComparableExample> {
7587dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
7597dd252788645e940eada959bdde927426e2531c9Paul Duffin    public int compareTo(SelfComparableExample o) {
7607dd252788645e940eada959bdde927426e2531c9Paul Duffin      return 0;
7617dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
7627dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
7637dd252788645e940eada959bdde927426e2531c9Paul Duffin
7647dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testBuilderGenerics_SelfComparable() {
7657dd252788645e940eada959bdde927426e2531c9Paul Duffin    ImmutableSortedMap.Builder<SelfComparableExample, Object> natural =
7667dd252788645e940eada959bdde927426e2531c9Paul Duffin        ImmutableSortedMap.naturalOrder();
7677dd252788645e940eada959bdde927426e2531c9Paul Duffin
7687dd252788645e940eada959bdde927426e2531c9Paul Duffin    ImmutableSortedMap.Builder<SelfComparableExample, Object> reverse =
7697dd252788645e940eada959bdde927426e2531c9Paul Duffin        ImmutableSortedMap.reverseOrder();
7707dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
7717dd252788645e940eada959bdde927426e2531c9Paul Duffin
7727dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static class SuperComparableExample extends SelfComparableExample {}
7737dd252788645e940eada959bdde927426e2531c9Paul Duffin
7747dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testBuilderGenerics_SuperComparable() {
7757dd252788645e940eada959bdde927426e2531c9Paul Duffin    ImmutableSortedMap.Builder<SuperComparableExample, Object> natural =
7767dd252788645e940eada959bdde927426e2531c9Paul Duffin        ImmutableSortedMap.naturalOrder();
7777dd252788645e940eada959bdde927426e2531c9Paul Duffin
7787dd252788645e940eada959bdde927426e2531c9Paul Duffin    ImmutableSortedMap.Builder<SuperComparableExample, Object> reverse =
7797dd252788645e940eada959bdde927426e2531c9Paul Duffin        ImmutableSortedMap.reverseOrder();
7807dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
7811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
782