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