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 Bringertimport static org.easymock.EasyMock.anyObject; 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static org.easymock.EasyMock.createMock; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static org.easymock.EasyMock.expect; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static org.easymock.EasyMock.expectLastCall; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static org.easymock.EasyMock.replay; 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static org.easymock.EasyMock.verify; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.MapTestSuiteBuilder; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.TestStringMapGenerator; 277dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.CollectionFeature; 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize; 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.MapFeature; 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 310888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.Test; 320888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestSuite; 330888a09821a98ac0680fad765217302858e70fa4Paul Duffin 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.lang.reflect.InvocationTargetException; 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection; 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.HashMap; 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator; 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map; 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry; 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set; 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit test for {@link ForwardingMap}. 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Hayward Chan 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ForwardingMapTest extends ForwardingTestCase { 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static class StandardImplForwardingMap<K, V> extends ForwardingMap<K, V> { 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private final Map<K, V> backingMap; 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StandardImplForwardingMap(Map<K, V> backingMap) { 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.backingMap = backingMap; 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Map<K, V> delegate() { 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return backingMap; 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean containsKey(Object key) { 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return standardContainsKey(key); 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean containsValue(Object value) { 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return standardContainsValue(value); 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public void putAll(Map<? extends K, ? extends V> map) { 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert standardPutAll(map); 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public V remove(Object object) { 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return standardRemove(object); 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean equals(Object object) { 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return standardEquals(object); 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int hashCode() { 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return standardHashCode(); 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Set<K> keySet() { 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new StandardKeySet(); 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Collection<V> values() { 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new StandardValues(); 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public String toString() { 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return standardToString(); 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Set<Entry<K, V>> entrySet() { 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new StandardEntrySet() { 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Iterator<Entry<K, V>> iterator() { 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate() 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .entrySet() 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .iterator(); 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public void clear() { 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert standardClear(); 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean isEmpty() { 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return standardIsEmpty(); 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<String, Boolean> forward; 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static Test suite() { 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert TestSuite suite = new TestSuite(); 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert suite.addTestSuite(ForwardingMapTest.class); 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert suite.addTest(MapTestSuiteBuilder.using(new TestStringMapGenerator() { 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Map<String, String> create( 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<String, String>[] entries) { 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<String, String> map = Maps.newLinkedHashMap(); 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Entry<String, String> entry : entries) { 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.put(entry.getKey(), entry.getValue()); 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new StandardImplForwardingMap<String, String>(map); 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }).named("ForwardingMap[LinkedHashMap] with standard implementations") 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .withFeatures(CollectionSize.ANY, MapFeature.ALLOWS_NULL_VALUES, 1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin MapFeature.ALLOWS_NULL_KEYS, MapFeature.ALLOWS_ANY_NULL_QUERIES, 1360888a09821a98ac0680fad765217302858e70fa4Paul Duffin MapFeature.GENERAL_PURPOSE, 1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin CollectionFeature.SUPPORTS_ITERATOR_REMOVE, CollectionFeature.KNOWN_ORDER) 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .createTestSuite()); 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert suite.addTest(MapTestSuiteBuilder.using(new TestStringMapGenerator() { 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Map<String, String> create( 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<String, String>[] entries) { 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap.Builder<String, String> builder = ImmutableMap.builder(); 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Entry<String, String> entry : entries) { 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert builder.put(entry.getKey(), entry.getValue()); 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new StandardImplForwardingMap<String, String>(builder.build()); 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }).named("ForwardingMap[ImmutableMap] with standard implementations") 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .withFeatures( 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionSize.ANY, MapFeature.REJECTS_DUPLICATES_AT_CREATION, 1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin MapFeature.ALLOWS_ANY_NULL_QUERIES, 1540888a09821a98ac0680fad765217302858e70fa4Paul Duffin CollectionFeature.KNOWN_ORDER) 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .createTestSuite()); 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return suite; 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public void setUp() throws Exception { 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super.setUp(); 1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /* 1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Class parameters must be raw, so we can't create a proxy with generic 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * type arguments. The created proxy only records calls and returns null, so 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the type is irrelevant at runtime. 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<String, Boolean> map = createProxyInstance(Map.class); 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forward = new ForwardingMap<String, Boolean>() { 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Map<String, Boolean> delegate() { 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map; 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSize() { 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forward().size(); 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[size]", getCalls()); 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testIsEmpty() { 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forward().isEmpty(); 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[isEmpty]", getCalls()); 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRemove() { 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forward().remove(null); 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[remove(Object)]", getCalls()); 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testClear() { 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forward().clear(); 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[clear]", getCalls()); 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testContainsKey() { 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forward().containsKey("asdf"); 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[containsKey(Object)]", getCalls()); 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testContainsValue() { 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forward().containsValue(false); 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[containsValue(Object)]", getCalls()); 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testGet_Object() { 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forward().get("asdf"); 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[get(Object)]", getCalls()); 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPut_Key_Value() { 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forward().put("key", false); 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[put(Object,Object)]", getCalls()); 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPutAll_Map() { 2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forward().putAll(new HashMap<String, Boolean>()); 2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[putAll(Map)]", getCalls()); 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testKeySet() { 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forward().keySet(); 2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[keySet]", getCalls()); 2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testValues() { 2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forward().values(); 2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[values]", getCalls()); 2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySet() { 2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forward().entrySet(); 2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[entrySet]", getCalls()); 2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testToString() { 2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forward().toString(); 2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[toString]", getCalls()); 2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEquals_Object() { 2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forward().equals("asdf"); 2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[equals(Object)]", getCalls()); 2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testHashCode() { 2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forward().hashCode(); 2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[hashCode]", getCalls()); 2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2507dd252788645e940eada959bdde927426e2531c9Paul Duffin 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testStandardEntrySet() throws InvocationTargetException { 2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<String, Boolean> map = createMock(Map.class); 2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Set<Map.Entry<String, Boolean>> entrySet = createMock(Set.class); 2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expect(map.containsKey(anyObject())).andReturn(false).anyTimes(); 2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expect(map.get(anyObject())).andReturn(null).anyTimes(); 2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expect(map.isEmpty()).andReturn(true).anyTimes(); 2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expect(map.remove(anyObject())).andReturn(null).anyTimes(); 2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expect(map.size()).andReturn(0).anyTimes(); 2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expect(entrySet.iterator()) 2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .andReturn(Iterators.<Entry<String, Boolean>>emptyIterator()) 2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .anyTimes(); 2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.clear(); 2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expectLastCall().anyTimes(); 2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert replay(map, entrySet); 2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<String, Boolean> forward = new ForwardingMap<String, Boolean>() { 2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Map<String, Boolean> delegate() { 2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map; 2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Set<Entry<String, Boolean>> entrySet() { 2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new StandardEntrySet() { 2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Iterator<Entry<String, Boolean>> iterator() { 2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return entrySet.iterator(); 2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert callAllPublicMethods(Set.class, forward.entrySet()); 2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verify(map, entrySet); 2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2877dd252788645e940eada959bdde927426e2531c9Paul Duffin 2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testStandardKeySet() throws InvocationTargetException { 2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<String, Boolean>> entrySet = createMock(Set.class); 2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expect(entrySet.iterator()).andReturn( 2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Iterators.<Entry<String, Boolean>>emptyIterator()).anyTimes(); 2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<String, Boolean> map = createMock(Map.class); 2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expect(map.containsKey(anyObject())).andReturn(false).anyTimes(); 2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expect(map.isEmpty()).andReturn(true).anyTimes(); 2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expect(map.remove(anyObject())).andReturn(null).anyTimes(); 2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expect(map.size()).andReturn(0).anyTimes(); 3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expect(map.entrySet()).andReturn(entrySet).anyTimes(); 3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.clear(); 3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expectLastCall().anyTimes(); 3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert replay(entrySet, map); 3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<String, Boolean> forward = new ForwardingMap<String, Boolean>() { 3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Map<String, Boolean> delegate() { 3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map; 3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Set<String> keySet() { 3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new StandardKeySet(); 3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert callAllPublicMethods(Set.class, forward.keySet()); 3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verify(entrySet, map); 3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3197dd252788645e940eada959bdde927426e2531c9Paul Duffin 3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testStandardValues() throws InvocationTargetException { 3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<String, Boolean>> entrySet = createMock(Set.class); 3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expect(entrySet.iterator()).andReturn( 3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Iterators.<Entry<String, Boolean>>emptyIterator()).anyTimes(); 3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<String, Boolean> map = createMock(Map.class); 3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expect(map.containsValue(anyObject())).andReturn(false).anyTimes(); 3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expect(map.isEmpty()).andReturn(true).anyTimes(); 3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expect(map.size()).andReturn(0).anyTimes(); 3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expect(map.entrySet()).andReturn(entrySet).anyTimes(); 3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.clear(); 3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expectLastCall().anyTimes(); 3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert replay(entrySet, map); 3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<String, Boolean> forward = new ForwardingMap<String, Boolean>() { 3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Map<String, Boolean> delegate() { 3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map; 3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Collection<Boolean> values() { 3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new StandardValues(); 3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert callAllPublicMethods(Collection.class, forward.values()); 3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verify(entrySet, map); 3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3517dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testToStringWithNullKeys() throws Exception { 3527dd252788645e940eada959bdde927426e2531c9Paul Duffin Map<String, String> hashmap = Maps.newHashMap(); 3537dd252788645e940eada959bdde927426e2531c9Paul Duffin hashmap.put("foo", "bar"); 3547dd252788645e940eada959bdde927426e2531c9Paul Duffin hashmap.put(null, "baz"); 3557dd252788645e940eada959bdde927426e2531c9Paul Duffin 3567dd252788645e940eada959bdde927426e2531c9Paul Duffin StandardImplForwardingMap<String, String> forwardingMap = 3577dd252788645e940eada959bdde927426e2531c9Paul Duffin new StandardImplForwardingMap<String, String>( 3587dd252788645e940eada959bdde927426e2531c9Paul Duffin Maps.<String, String>newHashMap()); 3597dd252788645e940eada959bdde927426e2531c9Paul Duffin forwardingMap.put("foo", "bar"); 3607dd252788645e940eada959bdde927426e2531c9Paul Duffin forwardingMap.put(null, "baz"); 3617dd252788645e940eada959bdde927426e2531c9Paul Duffin 3627dd252788645e940eada959bdde927426e2531c9Paul Duffin assertEquals(hashmap.toString(), forwardingMap.toString()); 3637dd252788645e940eada959bdde927426e2531c9Paul Duffin } 3647dd252788645e940eada959bdde927426e2531c9Paul Duffin 3657dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testToStringWithNullValues() throws Exception { 3667dd252788645e940eada959bdde927426e2531c9Paul Duffin Map<String, String> hashmap = Maps.newHashMap(); 3677dd252788645e940eada959bdde927426e2531c9Paul Duffin hashmap.put("foo", "bar"); 3687dd252788645e940eada959bdde927426e2531c9Paul Duffin hashmap.put("baz", null); 3697dd252788645e940eada959bdde927426e2531c9Paul Duffin 3707dd252788645e940eada959bdde927426e2531c9Paul Duffin StandardImplForwardingMap<String, String> forwardingMap = 3717dd252788645e940eada959bdde927426e2531c9Paul Duffin new StandardImplForwardingMap<String, String>( 3727dd252788645e940eada959bdde927426e2531c9Paul Duffin Maps.<String, String>newHashMap()); 3737dd252788645e940eada959bdde927426e2531c9Paul Duffin forwardingMap.put("foo", "bar"); 3747dd252788645e940eada959bdde927426e2531c9Paul Duffin forwardingMap.put("baz", null); 3757dd252788645e940eada959bdde927426e2531c9Paul Duffin 3767dd252788645e940eada959bdde927426e2531c9Paul Duffin assertEquals(hashmap.toString(), forwardingMap.toString()); 3777dd252788645e940eada959bdde927426e2531c9Paul Duffin } 3787dd252788645e940eada959bdde927426e2531c9Paul Duffin 3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<String, Boolean> forward() { 3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return forward; 3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 383