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
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.MapTestSuiteBuilder;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.SampleElements;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.TestMapGenerator;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.MapFeature;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
260888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.Test;
270888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase;
280888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestSuite;
290888a09821a98ac0680fad765217302858e70fa4Paul Duffin
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit test for {@link ImmutableClassToInstanceMap}.
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ImmutableClassToInstanceMapTest extends TestCase {
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Test suite() {
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TestSuite suite = new TestSuite();
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(ImmutableClassToInstanceMapTest.class);
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(MapTestSuiteBuilder
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .using(new TestClassToInstanceMapGenerator() {
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          // Other tests will verify what real, warning-free usage looks like
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          // but here we have to do some serious fudging
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @SuppressWarnings("unchecked")
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public Map<Class, Number> create(Object... elements) {
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            ImmutableClassToInstanceMap.Builder<Number> builder
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                = ImmutableClassToInstanceMap.builder();
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            for (Object object : elements) {
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Entry<Class, Number> entry = (Entry<Class, Number>) object;
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              builder.put(entry.getKey(), entry.getValue());
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return (Map) builder.build();
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableClassToInstanceMap")
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            MapFeature.REJECTS_DUPLICATES_AT_CREATION,
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            MapFeature.RESTRICTS_KEYS,
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER,
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ANY,
670888a09821a98ac0680fad765217302858e70fa4Paul Duffin            MapFeature.ALLOWS_ANY_NULL_QUERIES,
680888a09821a98ac0680fad765217302858e70fa4Paul Duffin            CollectionFeature.SERIALIZABLE)
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return suite;
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_map_empty() {
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Class<?>, Object> in = Collections.emptyMap();
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ClassToInstanceMap<Object> map = ImmutableClassToInstanceMap.copyOf(in);
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(map.isEmpty());
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(map, ImmutableClassToInstanceMap.copyOf(map));
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_map_valid() {
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Class<? extends Number>, Number> in = Maps.newHashMap();
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    in.put(Number.class, 0);
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    in.put(Double.class, Math.PI);
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ClassToInstanceMap<Number> map = ImmutableClassToInstanceMap.copyOf(in);
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, map.size());
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Number zero = map.getInstance(Number.class);
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, zero);
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Double pi = map.getInstance(Double.class);
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Math.PI, pi, 0.0);
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(map, ImmutableClassToInstanceMap.copyOf(map));
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_map_nulls() {
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Class<? extends Number>, Number> nullKey = Collections.singletonMap(
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        null, (Number) 1.0);
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableClassToInstanceMap.copyOf(nullKey);
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<? extends Class<? extends Number>, Number> nullValue
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = Collections.singletonMap(Number.class, null);
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableClassToInstanceMap.copyOf(nullValue);
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_imap_empty() {
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Class<?>, Object> in = Collections.emptyMap();
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ClassToInstanceMap<Object> map = ImmutableClassToInstanceMap.copyOf(in);
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(map.isEmpty());
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_imap_valid() {
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMap<Class<? extends Number>, ? extends Number> in
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableMap.of(Number.class, 0, Double.class, Math.PI);
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ClassToInstanceMap<Number> map = ImmutableClassToInstanceMap.copyOf(in);
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, map.size());
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Number zero = map.getInstance(Number.class);
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, zero);
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Double pi = map.getInstance(Double.class);
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Math.PI, pi, 0.0);
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPrimitiveAndWrapper() {
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableClassToInstanceMap<Number> ictim
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = new ImmutableClassToInstanceMap.Builder<Number>()
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .put(Integer.class, 0)
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .put(int.class, 1)
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .build();
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, ictim.size());
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, (int) ictim.getInstance(Integer.class));
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, (int) ictim.getInstance(int.class));
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  abstract static class TestClassToInstanceMapGenerator
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      implements TestMapGenerator<Class, Number> {
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Class[] createKeyArray(int length) {
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return new Class[length];
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Number[] createValueArray(int length) {
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return new Number[length];
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public SampleElements<Entry<Class, Number>> samples() {
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Entry<Class, Number> entry1 =
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Maps.immutableEntry((Class) Integer.class, (Number) 0);
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Entry<Class, Number> entry2 =
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Maps.immutableEntry((Class) Number.class, (Number) 1);
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Entry<Class, Number> entry3 =
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Maps.immutableEntry((Class) Double.class, (Number) 2.0);
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Entry<Class, Number> entry4 =
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Maps.immutableEntry((Class) Byte.class, (Number) (byte) 0x03);
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Entry<Class, Number> entry5 =
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Maps.immutableEntry((Class) Long.class, (Number) 0x0FF1C1AL);
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return new SampleElements<Entry<Class, Number>>(
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          entry1, entry2, entry3, entry4, entry5
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      );
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("unchecked")
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Entry<Class, Number>[] createArray(int length) {
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return new Entry[length];
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Iterable<Entry<Class, Number>> order(
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        List<Entry<Class, Number>> insertionOrder) {
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return insertionOrder;
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
190