11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2008 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.testing;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.Feature;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.MapFeature;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.testers.MapClearTester;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.testers.MapContainsKeyTester;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.testers.MapContainsValueTester;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.testers.MapCreationTester;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.testers.MapEqualsTester;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.testers.MapGetTester;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.testers.MapHashCodeTester;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.testers.MapIsEmptyTester;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.testers.MapPutAllTester;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.testers.MapPutTester;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.testers.MapRemoveTester;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.testers.MapSizeTester;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestSuite;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ArrayList;
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays;
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.HashSet;
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry;
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates, based on your criteria, a JUnit test suite that exhaustively tests
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * a Map implementation.
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author George van den Driessche
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class MapTestSuiteBuilder<K, V>
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    extends PerCollectionSizeTestSuiteBuilder<
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        MapTestSuiteBuilder<K, V>,
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        TestMapGenerator<K, V>, Map<K, V>, Map.Entry<K, V>> {
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <K, V> MapTestSuiteBuilder<K, V> using(
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      TestMapGenerator<K, V> generator) {
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new MapTestSuiteBuilder<K, V>().usingGenerator(generator);
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked") // Class parameters must be raw.
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected List<Class<? extends AbstractTester>> getTesters() {
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Arrays.<Class<? extends AbstractTester>>asList(
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        MapClearTester.class,
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        MapContainsKeyTester.class,
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        MapContainsValueTester.class,
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        MapCreationTester.class,
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        MapEqualsTester.class,
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        MapGetTester.class,
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        MapHashCodeTester.class,
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        MapIsEmptyTester.class,
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        MapPutTester.class,
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        MapPutAllTester.class,
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        MapRemoveTester.class,
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        MapSizeTester.class
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    );
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override List<TestSuite> createDerivedSuites(
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      FeatureSpecificTestSuiteBuilder<
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ?,
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ? extends OneSizeTestContainerGenerator<Map<K, V>, Map.Entry<K, V>>>
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      parentBuilder) {
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // TODO: Once invariant support is added, supply invariants to each of the
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // derived suites, to check that mutations to the derived collections are
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // reflected in the underlying map.
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<TestSuite> derivedSuites = super.createDerivedSuites(parentBuilder);
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    derivedSuites.add(SetTestSuiteBuilder.using(
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            new MapEntrySetGenerator<K, V>(parentBuilder.getSubjectGenerator()))
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(computeEntrySetFeatures(parentBuilder.getFeatures()))
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named(parentBuilder.getName() + " entrySet")
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(parentBuilder.getSuppressedTests())
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    derivedSuites.add(createDerivedKeySetSuite(
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            new MapKeySetGenerator<K, V>(parentBuilder.getSubjectGenerator()))
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(computeKeySetFeatures(parentBuilder.getFeatures()))
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named(parentBuilder.getName() + " keys")
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(parentBuilder.getSuppressedTests())
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    derivedSuites.add(CollectionTestSuiteBuilder.using(
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            new MapValueCollectionGenerator<K, V>(
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                parentBuilder.getSubjectGenerator()))
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named(parentBuilder.getName() + " values")
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(computeValuesCollectionFeatures(
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            parentBuilder.getFeatures()))
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(parentBuilder.getSuppressedTests())
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return derivedSuites;
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected SetTestSuiteBuilder<K> createDerivedKeySetSuite(TestSetGenerator<K> keySetGenerator) {
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return SetTestSuiteBuilder.using(keySetGenerator);
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static Set<Feature<?>> computeEntrySetFeatures(
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Set<Feature<?>> mapFeatures) {
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Feature<?>> entrySetFeatures =
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        computeCommonDerivedCollectionFeatures(mapFeatures);
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entrySetFeatures.add(CollectionFeature.ALLOWS_NULL_QUERIES);
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return entrySetFeatures;
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static Set<Feature<?>> computeKeySetFeatures(
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Set<Feature<?>> mapFeatures) {
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Feature<?>> keySetFeatures =
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        computeCommonDerivedCollectionFeatures(mapFeatures);
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (mapFeatures.contains(MapFeature.ALLOWS_NULL_KEYS)) {
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      keySetFeatures.add(CollectionFeature.ALLOWS_NULL_VALUES);
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } else if (mapFeatures.contains(MapFeature.ALLOWS_NULL_QUERIES)) {
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      keySetFeatures.add(CollectionFeature.ALLOWS_NULL_QUERIES);
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return keySetFeatures;
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static Set<Feature<?>> computeValuesCollectionFeatures(
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Set<Feature<?>> mapFeatures) {
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Feature<?>> valuesCollectionFeatures =
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        computeCommonDerivedCollectionFeatures(mapFeatures);
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    valuesCollectionFeatures.add(CollectionFeature.ALLOWS_NULL_QUERIES);
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (mapFeatures.contains(MapFeature.ALLOWS_NULL_VALUES)) {
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      valuesCollectionFeatures.add(CollectionFeature.ALLOWS_NULL_VALUES);
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return valuesCollectionFeatures;
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static Set<Feature<?>> computeCommonDerivedCollectionFeatures(
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Set<Feature<?>> mapFeatures) {
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Feature<?>> derivedFeatures = new HashSet<Feature<?>>();
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (mapFeatures.contains(MapFeature.SUPPORTS_REMOVE)) {
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      derivedFeatures.add(CollectionFeature.SUPPORTS_REMOVE);
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      derivedFeatures.add(CollectionFeature.SUPPORTS_REMOVE_ALL);
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      derivedFeatures.add(CollectionFeature.SUPPORTS_RETAIN_ALL);
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (mapFeatures.contains(MapFeature.SUPPORTS_CLEAR)) {
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      derivedFeatures.add(CollectionFeature.SUPPORTS_CLEAR);
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (mapFeatures.contains(MapFeature.REJECTS_DUPLICATES_AT_CREATION)) {
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      derivedFeatures.add(CollectionFeature.REJECTS_DUPLICATES_AT_CREATION);
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // add the intersection of CollectionSize.values() and mapFeatures
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (CollectionSize size : CollectionSize.values()) {
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (mapFeatures.contains(size)) {
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        derivedFeatures.add(size);
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return derivedFeatures;
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class MapEntrySetGenerator<K, V>
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      implements TestSetGenerator<Map.Entry<K, V>> {
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private final OneSizeTestContainerGenerator<Map<K, V>, Map.Entry<K, V>>
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        mapGenerator;
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public MapEntrySetGenerator(
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        OneSizeTestContainerGenerator<
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Map<K, V>, Map.Entry<K, V>> mapGenerator) {
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.mapGenerator = mapGenerator;
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public SampleElements<Map.Entry<K, V>> samples() {
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return mapGenerator.samples();
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Set<Map.Entry<K, V>> create(Object... elements) {
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return mapGenerator.create(elements).entrySet();
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Map.Entry<K, V>[] createArray(int length) {
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return mapGenerator.createArray(length);
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Iterable<Map.Entry<K, V>> order(
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        List<Map.Entry<K, V>> insertionOrder) {
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return mapGenerator.order(insertionOrder);
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO: investigate some API changes to SampleElements that would tidy up
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // parts of the following classes.
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class MapKeySetGenerator<K, V> implements TestSetGenerator<K> {
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private final OneSizeTestContainerGenerator<Map<K, V>, Map.Entry<K, V>>
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        mapGenerator;
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private final SampleElements<K> samples;
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public MapKeySetGenerator(
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        OneSizeTestContainerGenerator<Map<K, V>, Map.Entry<K, V>>
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            mapGenerator) {
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.mapGenerator = mapGenerator;
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      final SampleElements<Map.Entry<K, V>> mapSamples =
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          this.mapGenerator.samples();
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.samples = new SampleElements<K>(
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          mapSamples.e0.getKey(),
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          mapSamples.e1.getKey(),
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          mapSamples.e2.getKey(),
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          mapSamples.e3.getKey(),
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          mapSamples.e4.getKey());
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public SampleElements<K> samples() {
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return samples;
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Set<K> create(Object... elements) {
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @SuppressWarnings("unchecked")
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      K[] keysArray = (K[]) elements;
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Start with a suitably shaped collection of entries
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<Map.Entry<K, V>> originalEntries =
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          mapGenerator.getSampleElements(elements.length);
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Create a copy of that, with the desired value for each key
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<Map.Entry<K, V>> entries =
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          new ArrayList<Entry<K, V>>(elements.length);
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int i = 0;
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (Map.Entry<K, V> entry : originalEntries) {
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        entries.add(Helpers.mapEntry(keysArray[i++], entry.getValue()));
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return mapGenerator.create(entries.toArray()).keySet();
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public K[] createArray(int length) {
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // TODO: with appropriate refactoring of OneSizeGenerator, we can perhaps
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // tidy this up and get rid of the casts here and in
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // MapValueCollectionGenerator.
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ((TestMapGenerator<K, V>) mapGenerator.getInnerGenerator())
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .createKeyArray(length);
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Iterable<K> order(List<K> insertionOrder) {
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return insertionOrder;
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class MapValueCollectionGenerator<K, V>
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      implements TestCollectionGenerator<V> {
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private final OneSizeTestContainerGenerator<Map<K, V>, Map.Entry<K, V>>
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        mapGenerator;
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private final SampleElements<V> samples;
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public MapValueCollectionGenerator(
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        OneSizeTestContainerGenerator<
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Map<K, V>, Map.Entry<K, V>> mapGenerator) {
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.mapGenerator = mapGenerator;
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      final SampleElements<Map.Entry<K, V>> mapSamples =
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          this.mapGenerator.samples();
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.samples = new SampleElements<V>(
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          mapSamples.e0.getValue(),
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          mapSamples.e1.getValue(),
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          mapSamples.e2.getValue(),
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          mapSamples.e3.getValue(),
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          mapSamples.e4.getValue());
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public SampleElements<V> samples() {
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return samples;
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Collection<V> create(Object... elements) {
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @SuppressWarnings("unchecked")
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      V[] valuesArray = (V[]) elements;
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Start with a suitably shaped collection of entries
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<Map.Entry<K, V>> originalEntries =
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          mapGenerator.getSampleElements(elements.length);
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Create a copy of that, with the desired value for each value
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<Map.Entry<K, V>> entries =
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          new ArrayList<Entry<K, V>>(elements.length);
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int i = 0;
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (Map.Entry<K, V> entry : originalEntries) {
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        entries.add(Helpers.mapEntry(entry.getKey(), valuesArray[i++]));
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return mapGenerator.create(entries.toArray()).values();
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public V[] createArray(int length) {
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      //noinspection UnnecessaryLocalVariable
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      final V[] vs = ((TestMapGenerator<K, V>) mapGenerator.getInnerGenerator())
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .createValueArray(length);
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return vs;
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Iterable<V> order(List<V> insertionOrder) {
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return insertionOrder;
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
334