11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 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.ImmutableClassToInstanceMapTest.TestClassToInstanceMapGenerator;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.MapTestSuiteBuilder;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.MapFeature;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.testers.MapPutTester;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.Test;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestSuite;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.lang.reflect.Method;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit test of {@link MutableClassToInstanceMap}.
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class MutableClassToInstanceMapTest extends TestCase {
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Test suite() {
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TestSuite suite = new TestSuite();
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(MutableClassToInstanceMapTest.class);
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Suppress this one because the tester framework doesn't understand that
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // *some* remappings will be allowed and others not.
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Method remapTest = null;
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      remapTest = MapPutTester.class.getMethod(
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "testPut_replaceNullValueWithNonNullSupported");
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchMethodException e) {
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new AssertionError();
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(MapTestSuiteBuilder
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .using(new TestClassToInstanceMapGenerator() {
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          // Other tests will verify what real, warning-free usage looks like
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          // but here we have to do some serious fudging
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @SuppressWarnings("unchecked")
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public Map<Class, Number> create(Object... elements) {
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            MutableClassToInstanceMap<Number> map
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                = MutableClassToInstanceMap.create();
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            for (Object object : elements) {
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Entry<Class, Number> entry = (Entry<Class, Number>) object;
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              map.putInstance(entry.getKey(), entry.getValue());
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return (Map) map;
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("MutableClassToInstanceMap")
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            MapFeature.GENERAL_PURPOSE,
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            MapFeature.RESTRICTS_KEYS,
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            MapFeature.ALLOWS_NULL_VALUES,
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ANY,
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            MapFeature.ALLOWS_NULL_QUERIES)
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(remapTest)
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return suite;
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private ClassToInstanceMap<Number> map;
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected void setUp() throws Exception {
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map = MutableClassToInstanceMap.create();
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConstraint() {
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /**
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * We'll give ourselves a pass on testing all the possible ways of
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * breaking the constraint, because we know that newClassMap() is
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * implemented using ConstrainedMap which is itself well-tested.
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * A purist would object to this, but what can I say, we're dirty
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * cheaters.
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put(Integer.class, new Integer(5));
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      map.put(Double.class, new Long(42));
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (ClassCastException expected) {
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Won't compile: map.put(String.class, "x");
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPutAndGetInstance() {
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(map.putInstance(Integer.class, new Integer(5)));
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Integer oldValue = map.putInstance(Integer.class, new Integer(7));
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, (int) oldValue);
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Integer newValue = map.getInstance(Integer.class);
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(7, (int) newValue);
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Won't compile: map.putInstance(Double.class, new Long(42));
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNull() {
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      map.put(null, new Integer(1));
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.putInstance(Integer.class, null);
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(map.get(Integer.class));
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(map.getInstance(Integer.class));
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put(Long.class, null);
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(map.get(Long.class));
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(map.getInstance(Long.class));
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPrimitiveAndWrapper() {
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(map.getInstance(int.class));
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(map.getInstance(Integer.class));
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(map.putInstance(int.class, 0));
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(map.putInstance(Integer.class, 1));
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, map.size());
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, (int) map.getInstance(int.class));
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, (int) map.getInstance(Integer.class));
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, (int) map.putInstance(int.class, null));
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, (int) map.putInstance(Integer.class, null));
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(map.getInstance(int.class));
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(map.getInstance(Integer.class));
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, map.size());
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
153