17dd252788645e940eada959bdde927426e2531c9Paul Duffin/* 27dd252788645e940eada959bdde927426e2531c9Paul Duffin * Copyright (C) 2008 The Guava Authors 37dd252788645e940eada959bdde927426e2531c9Paul Duffin * 47dd252788645e940eada959bdde927426e2531c9Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); 57dd252788645e940eada959bdde927426e2531c9Paul Duffin * you may not use this file except in compliance with the License. 67dd252788645e940eada959bdde927426e2531c9Paul Duffin * You may obtain a copy of the License at 77dd252788645e940eada959bdde927426e2531c9Paul Duffin * 87dd252788645e940eada959bdde927426e2531c9Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 97dd252788645e940eada959bdde927426e2531c9Paul Duffin * 107dd252788645e940eada959bdde927426e2531c9Paul Duffin * Unless required by applicable law or agreed to in writing, software 117dd252788645e940eada959bdde927426e2531c9Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS, 127dd252788645e940eada959bdde927426e2531c9Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137dd252788645e940eada959bdde927426e2531c9Paul Duffin * See the License for the specific language governing permissions and 147dd252788645e940eada959bdde927426e2531c9Paul Duffin * limitations under the License. 157dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 167dd252788645e940eada959bdde927426e2531c9Paul Duffin 177dd252788645e940eada959bdde927426e2531c9Paul Duffinpackage com.google.common.collect.testing; 187dd252788645e940eada959bdde927426e2531c9Paul Duffin 197dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.base.Preconditions.checkNotNull; 207dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_KEYS; 217dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_VALUES; 227dd252788645e940eada959bdde927426e2531c9Paul Duffin 237dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.Lists; 247dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.Maps; 250888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.testing.features.CollectionFeature; 267dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.CollectionSize; 277dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.Feature; 287dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.MapFeature; 297dd252788645e940eada959bdde927426e2531c9Paul Duffin 307dd252788645e940eada959bdde927426e2531c9Paul Duffinimport junit.framework.Test; 317dd252788645e940eada959bdde927426e2531c9Paul Duffinimport junit.framework.TestCase; 327dd252788645e940eada959bdde927426e2531c9Paul Duffinimport junit.framework.TestSuite; 337dd252788645e940eada959bdde927426e2531c9Paul Duffin 347dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.AbstractMap; 350888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Collections; 367dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.HashMap; 370888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.List; 387dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Map; 397dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Set; 407dd252788645e940eada959bdde927426e2531c9Paul Duffin 417dd252788645e940eada959bdde927426e2531c9Paul Duffin/** 427dd252788645e940eada959bdde927426e2531c9Paul Duffin * Tests {@link MapTestSuiteBuilder} by using it against maps that have various 437dd252788645e940eada959bdde927426e2531c9Paul Duffin * negative behaviors. 447dd252788645e940eada959bdde927426e2531c9Paul Duffin * 457dd252788645e940eada959bdde927426e2531c9Paul Duffin * @author George van den Driessche 467dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 477dd252788645e940eada959bdde927426e2531c9Paul Duffinpublic final class MapTestSuiteBuilderTests extends TestCase { 487dd252788645e940eada959bdde927426e2531c9Paul Duffin private MapTestSuiteBuilderTests() {} 497dd252788645e940eada959bdde927426e2531c9Paul Duffin 507dd252788645e940eada959bdde927426e2531c9Paul Duffin public static Test suite() { 517dd252788645e940eada959bdde927426e2531c9Paul Duffin TestSuite suite = new TestSuite( 527dd252788645e940eada959bdde927426e2531c9Paul Duffin MapTestSuiteBuilderTests.class.getSimpleName()); 537dd252788645e940eada959bdde927426e2531c9Paul Duffin suite.addTest(testsForHashMapNullKeysForbidden()); 547dd252788645e940eada959bdde927426e2531c9Paul Duffin suite.addTest(testsForHashMapNullValuesForbidden()); 557dd252788645e940eada959bdde927426e2531c9Paul Duffin return suite; 567dd252788645e940eada959bdde927426e2531c9Paul Duffin } 577dd252788645e940eada959bdde927426e2531c9Paul Duffin 587dd252788645e940eada959bdde927426e2531c9Paul Duffin private abstract static class WrappedHashMapGenerator 597dd252788645e940eada959bdde927426e2531c9Paul Duffin extends TestStringMapGenerator { 607dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override protected final Map<String, String> create( 617dd252788645e940eada959bdde927426e2531c9Paul Duffin Map.Entry<String, String>[] entries) { 627dd252788645e940eada959bdde927426e2531c9Paul Duffin HashMap<String, String> map = Maps.newHashMap(); 637dd252788645e940eada959bdde927426e2531c9Paul Duffin for (Map.Entry<String, String> entry : entries) { 647dd252788645e940eada959bdde927426e2531c9Paul Duffin map.put(entry.getKey(), entry.getValue()); 657dd252788645e940eada959bdde927426e2531c9Paul Duffin } 667dd252788645e940eada959bdde927426e2531c9Paul Duffin return wrap(map); 677dd252788645e940eada959bdde927426e2531c9Paul Duffin } 687dd252788645e940eada959bdde927426e2531c9Paul Duffin 697dd252788645e940eada959bdde927426e2531c9Paul Duffin abstract Map<String, String> wrap(HashMap<String, String> map); 707dd252788645e940eada959bdde927426e2531c9Paul Duffin } 717dd252788645e940eada959bdde927426e2531c9Paul Duffin 727dd252788645e940eada959bdde927426e2531c9Paul Duffin private static TestSuite wrappedHashMapTests( 737dd252788645e940eada959bdde927426e2531c9Paul Duffin WrappedHashMapGenerator generator, String name, Feature<?>... features) { 740888a09821a98ac0680fad765217302858e70fa4Paul Duffin List<Feature<?>> featuresList = Lists.newArrayList(features); 750888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collections.addAll(featuresList, 760888a09821a98ac0680fad765217302858e70fa4Paul Duffin MapFeature.GENERAL_PURPOSE, 770888a09821a98ac0680fad765217302858e70fa4Paul Duffin CollectionFeature.SUPPORTS_ITERATOR_REMOVE, 780888a09821a98ac0680fad765217302858e70fa4Paul Duffin CollectionSize.ANY); 797dd252788645e940eada959bdde927426e2531c9Paul Duffin return MapTestSuiteBuilder.using(generator) 807dd252788645e940eada959bdde927426e2531c9Paul Duffin .named(name) 810888a09821a98ac0680fad765217302858e70fa4Paul Duffin .withFeatures(featuresList) 827dd252788645e940eada959bdde927426e2531c9Paul Duffin .createTestSuite(); 837dd252788645e940eada959bdde927426e2531c9Paul Duffin } 847dd252788645e940eada959bdde927426e2531c9Paul Duffin 857dd252788645e940eada959bdde927426e2531c9Paul Duffin // TODO: consider being null-hostile in these tests 867dd252788645e940eada959bdde927426e2531c9Paul Duffin 877dd252788645e940eada959bdde927426e2531c9Paul Duffin private static Test testsForHashMapNullKeysForbidden() { 887dd252788645e940eada959bdde927426e2531c9Paul Duffin return wrappedHashMapTests(new WrappedHashMapGenerator() { 897dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override Map<String, String> wrap(final HashMap<String, String> map) { 907dd252788645e940eada959bdde927426e2531c9Paul Duffin if (map.containsKey(null)) { 917dd252788645e940eada959bdde927426e2531c9Paul Duffin throw new NullPointerException(); 927dd252788645e940eada959bdde927426e2531c9Paul Duffin } 937dd252788645e940eada959bdde927426e2531c9Paul Duffin return new AbstractMap<String, String>() { 947dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override public Set<Map.Entry<String, String>> entrySet() { 957dd252788645e940eada959bdde927426e2531c9Paul Duffin return map.entrySet(); 967dd252788645e940eada959bdde927426e2531c9Paul Duffin } 977dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override public String put(String key, String value) { 987dd252788645e940eada959bdde927426e2531c9Paul Duffin checkNotNull(key); 997dd252788645e940eada959bdde927426e2531c9Paul Duffin return map.put(key, value); 1007dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1017dd252788645e940eada959bdde927426e2531c9Paul Duffin }; 1027dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1037dd252788645e940eada959bdde927426e2531c9Paul Duffin }, "HashMap w/out null keys", ALLOWS_NULL_VALUES); 1047dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1057dd252788645e940eada959bdde927426e2531c9Paul Duffin 1067dd252788645e940eada959bdde927426e2531c9Paul Duffin private static Test testsForHashMapNullValuesForbidden() { 1077dd252788645e940eada959bdde927426e2531c9Paul Duffin return wrappedHashMapTests(new WrappedHashMapGenerator() { 1087dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override Map<String, String> wrap(final HashMap<String, String> map) { 1097dd252788645e940eada959bdde927426e2531c9Paul Duffin if (map.containsValue(null)) { 1107dd252788645e940eada959bdde927426e2531c9Paul Duffin throw new NullPointerException(); 1117dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1127dd252788645e940eada959bdde927426e2531c9Paul Duffin return new AbstractMap<String, String>() { 1137dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override public Set<Map.Entry<String, String>> entrySet() { 1147dd252788645e940eada959bdde927426e2531c9Paul Duffin return map.entrySet(); 1157dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1167dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override public String put(String key, String value) { 1177dd252788645e940eada959bdde927426e2531c9Paul Duffin checkNotNull(value); 1187dd252788645e940eada959bdde927426e2531c9Paul Duffin return map.put(key, value); 1197dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1207dd252788645e940eada959bdde927426e2531c9Paul Duffin }; 1217dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1227dd252788645e940eada959bdde927426e2531c9Paul Duffin }, "HashMap w/out null values", ALLOWS_NULL_KEYS); 1237dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1247dd252788645e940eada959bdde927426e2531c9Paul Duffin} 125