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