001/*
002 * Copyright (C) 2008 The Guava Authors
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017package com.google.common.collect.testing.testers;
018
019import static com.google.common.collect.testing.Helpers.getMethod;
020import static com.google.common.collect.testing.features.CollectionFeature.ALLOWS_NULL_VALUES;
021
022import com.google.common.annotations.GwtCompatible;
023import com.google.common.annotations.GwtIncompatible;
024import com.google.common.annotations.J2ktIncompatible;
025import com.google.common.collect.testing.features.CollectionFeature;
026import com.google.common.collect.testing.features.CollectionSize;
027import java.lang.reflect.Method;
028import java.util.Collection;
029
030/**
031 * Tests {@link java.util.Set#hashCode}.
032 *
033 * @author George van den Driessche
034 */
035@GwtCompatible
036public class SetHashCodeTester<E> extends AbstractSetTester<E> {
037  public void testHashCode() {
038    int expectedHashCode = 0;
039    for (E element : getSampleElements()) {
040      expectedHashCode += (element == null) ? 0 : element.hashCode();
041    }
042    assertEquals(
043        "A Set's hashCode() should be the sum of those of its elements.",
044        expectedHashCode,
045        getSet().hashCode());
046  }
047
048  @CollectionSize.Require(absent = CollectionSize.ZERO)
049  @CollectionFeature.Require(ALLOWS_NULL_VALUES)
050  public void testHashCode_containingNull() {
051    Collection<E> elements = getSampleElements(getNumElements() - 1);
052    int expectedHashCode = 0;
053    for (E element : elements) {
054      expectedHashCode += (element == null) ? 0 : element.hashCode();
055    }
056
057    elements.add(null);
058    collection = getSubjectGenerator().create(elements.toArray());
059    assertEquals(
060        "A Set's hashCode() should be the sum of those of its elements (with "
061            + "a null element counting as having a hash of zero).",
062        expectedHashCode,
063        getSet().hashCode());
064  }
065
066  /**
067   * Returns the {@link Method} instances for the test methods in this class which call {@code
068   * hashCode()} on the set values so that set tests on unhashable objects can suppress it with
069   * {@code FeatureSpecificTestSuiteBuilder.suppressing()}.
070   */
071  @J2ktIncompatible
072  @GwtIncompatible // reflection
073  public static Method[] getHashCodeMethods() {
074    return new Method[] {
075      getMethod(SetHashCodeTester.class, "testHashCode"),
076      getMethod(SetHashCodeTester.class, "testHashCode_containingNull")
077    };
078  }
079}