11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 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.testers;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionSize.ONE;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionSize.ZERO;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_KEYS;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_VALUES;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.MapFeature.REJECTS_DUPLICATES_AT_CREATION;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.AbstractMapTester;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.MapFeature;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A generic JUnit test which tests creation (typically through a constructor or
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * static factory method) of a map. Can't be invoked directly; please see
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link com.google.common.collect.testing.MapTestSuiteBuilder}.
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>This class is GWT compatible.
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Chris Povirk
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class MapCreationTester<K, V> extends AbstractMapTester<K, V> {
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @MapFeature.Require(ALLOWS_NULL_KEYS)
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateWithNullKeySupported() {
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    initMapWithNullKey();
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectContents(createArrayWithNullKey());
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @MapFeature.Require(absent = ALLOWS_NULL_KEYS)
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateWithNullKeyUnsupported() {
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      initMapWithNullKey();
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("Creating a map containing a null key should fail");
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @MapFeature.Require(ALLOWS_NULL_VALUES)
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateWithNullValueSupported() {
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    initMapWithNullValue();
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectContents(createArrayWithNullValue());
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @MapFeature.Require(absent = ALLOWS_NULL_VALUES)
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateWithNullValueUnsupported() {
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      initMapWithNullValue();
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("Creating a map containing a null value should fail");
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @MapFeature.Require({ALLOWS_NULL_KEYS, ALLOWS_NULL_VALUES})
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateWithNullKeyAndValueSupported() {
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Entry<K, V>[] entries = createSamplesArray();
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entries[getNullLocation()] = entry(null, null);
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    resetMap(entries);
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectContents(entries);
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @MapFeature.Require(value = ALLOWS_NULL_KEYS,
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      absent = REJECTS_DUPLICATES_AT_CREATION)
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = {ZERO, ONE})
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateWithDuplicates_nullDuplicatesNotRejected() {
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectFirstRemoved(getEntriesMultipleNullKeys());
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @MapFeature.Require(absent = REJECTS_DUPLICATES_AT_CREATION)
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = {ZERO, ONE})
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateWithDuplicates_nonNullDuplicatesNotRejected() {
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectFirstRemoved(getEntriesMultipleNonNullKeys());
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @MapFeature.Require({ALLOWS_NULL_KEYS, REJECTS_DUPLICATES_AT_CREATION})
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = {ZERO, ONE})
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateWithDuplicates_nullDuplicatesRejected() {
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Entry<K, V>[] entries = getEntriesMultipleNullKeys();
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      resetMap(entries);
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("Should reject duplicate null elements at creation");
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @MapFeature.Require(REJECTS_DUPLICATES_AT_CREATION)
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = {ZERO, ONE})
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateWithDuplicates_nonNullDuplicatesRejected() {
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Entry<K, V>[] entries = getEntriesMultipleNonNullKeys();
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      resetMap(entries);
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("Should reject duplicate non-null elements at creation");
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Entry<K, V>[] getEntriesMultipleNullKeys() {
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Entry<K, V>[] entries = createArrayWithNullKey();
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entries[0] = entries[getNullLocation()];
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return entries;
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Entry<K, V>[] getEntriesMultipleNonNullKeys() {
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Entry<K, V>[] entries = createSamplesArray();
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entries[0] = samples.e1;
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return entries;
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void expectFirstRemoved(Entry<K, V>[] entries) {
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    resetMap(entries);
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Entry<K, V>> expectedWithDuplicateRemoved =
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Arrays.asList(entries).subList(1, getNumElements());
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectContents(expectedWithDuplicateRemoved);
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
142