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