/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockito.internal.util.collections;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Observer;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
public class HashCodeAndEqualsSafeSetTest {
@Rule
public MockitoRule r = MockitoJUnit.rule();
@Mock
private UnmockableHashCodeAndEquals mock1;
@Test
public void can_add_mock_that_have_failing_hashCode_method() throws Exception {
new HashCodeAndEqualsSafeSet().add(mock1);
}
@Test
public void mock_with_failing_hashCode_method_can_be_added() throws Exception {
new HashCodeAndEqualsSafeSet().add(mock1);
}
@Test
public void mock_with_failing_equals_method_can_be_used() throws Exception {
HashCodeAndEqualsSafeSet mocks = new HashCodeAndEqualsSafeSet();
mocks.add(mock1);
assertThat(mocks.contains(mock1)).isTrue();
UnmockableHashCodeAndEquals mock2 = mock(UnmockableHashCodeAndEquals.class);
assertThat(mocks.contains(mock2)).isFalse();
}
@Test
public void can_remove() throws Exception {
HashCodeAndEqualsSafeSet mocks = new HashCodeAndEqualsSafeSet();
UnmockableHashCodeAndEquals mock = mock1;
mocks.add(mock);
mocks.remove(mock);
assertThat(mocks.isEmpty()).isTrue();
}
@Test
public void can_add_a_collection() throws Exception {
HashCodeAndEqualsSafeSet mocks = HashCodeAndEqualsSafeSet.of(
mock1,
mock(Observer.class));
HashCodeAndEqualsSafeSet workingSet = new HashCodeAndEqualsSafeSet();
workingSet.addAll(mocks);
assertThat(workingSet.containsAll(mocks)).isTrue();
}
@Test
public void can_retain_a_collection() throws Exception {
HashCodeAndEqualsSafeSet mocks = HashCodeAndEqualsSafeSet.of(
mock1,
mock(Observer.class));
HashCodeAndEqualsSafeSet workingSet = new HashCodeAndEqualsSafeSet();
workingSet.addAll(mocks);
workingSet.add(mock(List.class));
assertThat(workingSet.retainAll(mocks)).isTrue();
assertThat(workingSet.containsAll(mocks)).isTrue();
}
@Test
public void can_remove_a_collection() throws Exception {
HashCodeAndEqualsSafeSet mocks = HashCodeAndEqualsSafeSet.of(
mock1,
mock(Observer.class));
HashCodeAndEqualsSafeSet workingSet = new HashCodeAndEqualsSafeSet();
workingSet.addAll(mocks);
workingSet.add(mock(List.class));
assertThat(workingSet.removeAll(mocks)).isTrue();
assertThat(workingSet.containsAll(mocks)).isFalse();
}
@Test
public void can_iterate() throws Exception {
HashCodeAndEqualsSafeSet mocks = HashCodeAndEqualsSafeSet.of(
mock1,
mock(Observer.class));
LinkedList<Object> accumulator = new LinkedList<Object>();
for (Object mock : mocks) {
accumulator.add(mock);
}
assertThat(accumulator).isNotEmpty();
}
@Test
public void toArray_just_work() throws Exception {
HashCodeAndEqualsSafeSet mocks = HashCodeAndEqualsSafeSet.of(mock1);
assertThat(mocks.toArray()[0]).isSameAs(mock1);
assertThat(mocks.toArray(new UnmockableHashCodeAndEquals[0])[0]).isSameAs(mock1);
}
@Test(expected=CloneNotSupportedException.class)
public void cloneIsNotSupported() throws CloneNotSupportedException{
HashCodeAndEqualsSafeSet.of().clone();
}
@Test
public void isEmptyAfterClear() throws Exception {
HashCodeAndEqualsSafeSet set = HashCodeAndEqualsSafeSet.of(mock1);
set.clear();
assertThat(set).isEmpty();
}
@Test
public void isEqualToItself(){
HashCodeAndEqualsSafeSet set = HashCodeAndEqualsSafeSet.of(mock1);
assertThat(set).isEqualTo(set);
}
@Test
public void isNotEqualToAnOtherTypeOfSetWithSameContent(){
HashCodeAndEqualsSafeSet set = HashCodeAndEqualsSafeSet.of();
assertThat(set).isNotEqualTo(new HashSet<Object>());
}
@Test
public void isNotEqualWhenContentIsDifferent(){
HashCodeAndEqualsSafeSet set = HashCodeAndEqualsSafeSet.of(mock1);
assertThat(set).isNotEqualTo(HashCodeAndEqualsSafeSet.of());
}
@Test
public void hashCodeIsEqualIfContentIsEqual(){
HashCodeAndEqualsSafeSet set = HashCodeAndEqualsSafeSet.of(mock1);
assertThat(set.hashCode()).isEqualTo(HashCodeAndEqualsSafeSet.of(mock1).hashCode());
}
@Test
public void toStringIsNotNullOrEmpty() throws Exception {
HashCodeAndEqualsSafeSet set = HashCodeAndEqualsSafeSet.of(mock1);
assertThat(set.toString()).isNotEmpty();
}
@Test
public void removeByIterator() throws Exception {
HashCodeAndEqualsSafeSet set = HashCodeAndEqualsSafeSet.of(mock1);
Iterator<Object> iterator = set.iterator();
iterator.next();
iterator.remove();
assertThat(set).isEmpty();
}
private static class UnmockableHashCodeAndEquals {
@Override public final int hashCode() {
throw new NullPointerException("I'm failing on hashCode and I don't care");
}
@Override public final boolean equals(Object obj) {
throw new NullPointerException("I'm failing on equals and I don't care");
}
}
}