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