Home | History | Annotate | Download | only in collections
      1 /*
      2  * Copyright (c) 2007 Mockito contributors
      3  * This program is made available under the terms of the MIT License.
      4  */
      5 package org.mockito.internal.util.collections;
      6 
      7 import static org.assertj.core.api.Assertions.assertThat;
      8 import static org.mockito.Mockito.mock;
      9 
     10 import java.util.HashSet;
     11 import java.util.Iterator;
     12 import java.util.LinkedList;
     13 import java.util.List;
     14 import java.util.Observer;
     15 
     16 import org.junit.Rule;
     17 import org.junit.Test;
     18 import org.mockito.Mock;
     19 import org.mockito.junit.MockitoJUnit;
     20 import org.mockito.junit.MockitoRule;
     21 
     22 public class HashCodeAndEqualsSafeSetTest {
     23 
     24     @Rule
     25     public MockitoRule r = MockitoJUnit.rule();
     26     @Mock
     27     private UnmockableHashCodeAndEquals mock1;
     28 
     29     @Test
     30     public void can_add_mock_that_have_failing_hashCode_method() throws Exception {
     31         new HashCodeAndEqualsSafeSet().add(mock1);
     32     }
     33 
     34     @Test
     35     public void mock_with_failing_hashCode_method_can_be_added() throws Exception {
     36         new HashCodeAndEqualsSafeSet().add(mock1);
     37     }
     38 
     39     @Test
     40     public void mock_with_failing_equals_method_can_be_used() throws Exception {
     41         HashCodeAndEqualsSafeSet mocks = new HashCodeAndEqualsSafeSet();
     42         mocks.add(mock1);
     43 
     44         assertThat(mocks.contains(mock1)).isTrue();
     45 
     46         UnmockableHashCodeAndEquals mock2 = mock(UnmockableHashCodeAndEquals.class);
     47         assertThat(mocks.contains(mock2)).isFalse();
     48     }
     49 
     50     @Test
     51     public void can_remove() throws Exception {
     52         HashCodeAndEqualsSafeSet mocks = new HashCodeAndEqualsSafeSet();
     53         UnmockableHashCodeAndEquals mock = mock1;
     54         mocks.add(mock);
     55         mocks.remove(mock);
     56 
     57         assertThat(mocks.isEmpty()).isTrue();
     58     }
     59 
     60 
     61     @Test
     62     public void can_add_a_collection() throws Exception {
     63         HashCodeAndEqualsSafeSet mocks = HashCodeAndEqualsSafeSet.of(
     64                 mock1,
     65                 mock(Observer.class));
     66 
     67         HashCodeAndEqualsSafeSet workingSet = new HashCodeAndEqualsSafeSet();
     68 
     69         workingSet.addAll(mocks);
     70 
     71         assertThat(workingSet.containsAll(mocks)).isTrue();
     72     }
     73 
     74     @Test
     75     public void can_retain_a_collection() throws Exception {
     76         HashCodeAndEqualsSafeSet mocks = HashCodeAndEqualsSafeSet.of(
     77                 mock1,
     78                 mock(Observer.class));
     79 
     80         HashCodeAndEqualsSafeSet workingSet = new HashCodeAndEqualsSafeSet();
     81 
     82         workingSet.addAll(mocks);
     83         workingSet.add(mock(List.class));
     84 
     85         assertThat(workingSet.retainAll(mocks)).isTrue();
     86         assertThat(workingSet.containsAll(mocks)).isTrue();
     87     }
     88 
     89     @Test
     90     public void can_remove_a_collection() throws Exception {
     91         HashCodeAndEqualsSafeSet mocks = HashCodeAndEqualsSafeSet.of(
     92                 mock1,
     93                 mock(Observer.class));
     94 
     95         HashCodeAndEqualsSafeSet workingSet = new HashCodeAndEqualsSafeSet();
     96 
     97         workingSet.addAll(mocks);
     98         workingSet.add(mock(List.class));
     99 
    100         assertThat(workingSet.removeAll(mocks)).isTrue();
    101         assertThat(workingSet.containsAll(mocks)).isFalse();
    102     }
    103 
    104     @Test
    105     public void can_iterate() throws Exception {
    106         HashCodeAndEqualsSafeSet mocks = HashCodeAndEqualsSafeSet.of(
    107                 mock1,
    108                 mock(Observer.class));
    109 
    110         LinkedList<Object> accumulator = new LinkedList<Object>();
    111         for (Object mock : mocks) {
    112             accumulator.add(mock);
    113         }
    114         assertThat(accumulator).isNotEmpty();
    115     }
    116 
    117     @Test
    118     public void toArray_just_work() throws Exception {
    119         HashCodeAndEqualsSafeSet mocks = HashCodeAndEqualsSafeSet.of(mock1);
    120 
    121         assertThat(mocks.toArray()[0]).isSameAs(mock1);
    122 
    123         assertThat(mocks.toArray(new UnmockableHashCodeAndEquals[0])[0]).isSameAs(mock1);
    124     }
    125 
    126     @Test(expected=CloneNotSupportedException.class)
    127     public void cloneIsNotSupported() throws CloneNotSupportedException{
    128         HashCodeAndEqualsSafeSet.of().clone();
    129     }
    130 
    131     @Test
    132     public void isEmptyAfterClear() throws Exception {
    133         HashCodeAndEqualsSafeSet set = HashCodeAndEqualsSafeSet.of(mock1);
    134         set.clear();
    135 
    136         assertThat(set).isEmpty();
    137     }
    138 
    139     @Test
    140     public void isEqualToItself(){
    141         HashCodeAndEqualsSafeSet set = HashCodeAndEqualsSafeSet.of(mock1);
    142         assertThat(set).isEqualTo(set);
    143     }
    144 
    145     @Test
    146     public void isNotEqualToAnOtherTypeOfSetWithSameContent(){
    147         HashCodeAndEqualsSafeSet set = HashCodeAndEqualsSafeSet.of();
    148         assertThat(set).isNotEqualTo(new HashSet<Object>());
    149     }
    150 
    151     @Test
    152     public void isNotEqualWhenContentIsDifferent(){
    153 
    154         HashCodeAndEqualsSafeSet set = HashCodeAndEqualsSafeSet.of(mock1);
    155         assertThat(set).isNotEqualTo(HashCodeAndEqualsSafeSet.of());
    156     }
    157 
    158     @Test
    159     public void hashCodeIsEqualIfContentIsEqual(){
    160         HashCodeAndEqualsSafeSet set = HashCodeAndEqualsSafeSet.of(mock1);
    161         assertThat(set.hashCode()).isEqualTo(HashCodeAndEqualsSafeSet.of(mock1).hashCode());
    162     }
    163 
    164     @Test
    165     public void toStringIsNotNullOrEmpty() throws Exception {
    166         HashCodeAndEqualsSafeSet set = HashCodeAndEqualsSafeSet.of(mock1);
    167         assertThat(set.toString()).isNotEmpty();
    168     }
    169 
    170     @Test
    171     public void removeByIterator() throws Exception {
    172         HashCodeAndEqualsSafeSet set = HashCodeAndEqualsSafeSet.of(mock1);
    173         Iterator<Object> iterator = set.iterator();
    174         iterator.next();
    175         iterator.remove();
    176 
    177         assertThat(set).isEmpty();
    178     }
    179 
    180     private static class UnmockableHashCodeAndEquals {
    181         @Override public final int hashCode() {
    182             throw new NullPointerException("I'm failing on hashCode and I don't care");
    183         }
    184 
    185         @Override public final boolean equals(Object obj) {
    186             throw new NullPointerException("I'm failing on equals and I don't care");
    187         }
    188     }
    189 }
    190