package net.bytebuddy.matcher; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.*; public class CachingMatcherTest extends AbstractElementMatcherTest<CachingMatcher<?>> { @Mock private Object target; @Mock private ElementMatcher<? super Object> matcher; private ConcurrentMap<Object, Boolean> map; @SuppressWarnings("unchecked") public CachingMatcherTest() { super((Class<CachingMatcher<?>>) (Object) CachingMatcher.class, "cached"); } @Before public void setUp() throws Exception { map = new ConcurrentHashMap<Object, Boolean>(); when(matcher.matches(target)).thenReturn(true); } @Test public void testMatchCachesNoEviction() throws Exception { ElementMatcher<Object> matcher = new CachingMatcher<Object>(this.matcher, map); assertThat(matcher.matches(target), is(true)); assertThat(matcher.matches(target), is(true)); verify(this.matcher).matches(target); verifyNoMoreInteractions(this.matcher); verifyZeroInteractions(target); } @Test public void testMatchCachesEviction() throws Exception { ElementMatcher<Object> matcher = new CachingMatcher.WithInlineEviction<Object>(this.matcher, map, 1); Object other = mock(Object.class); assertThat(matcher.matches(target), is(true)); assertThat(matcher.matches(other), is(false)); assertThat(matcher.matches(other), is(false)); assertThat(matcher.matches(target), is(true)); verify(this.matcher, times(2)).matches(target); verify(this.matcher).matches(other); verifyNoMoreInteractions(this.matcher); verifyZeroInteractions(target); } @Test public void testMatchNoCachesEviction() throws Exception { ElementMatcher<Object> matcher = new CachingMatcher.WithInlineEviction<Object>(this.matcher, map, 2); Object other = mock(Object.class); assertThat(matcher.matches(target), is(true)); assertThat(matcher.matches(other), is(false)); assertThat(matcher.matches(other), is(false)); assertThat(matcher.matches(target), is(true)); verify(this.matcher).matches(target); verify(this.matcher).matches(other); verifyNoMoreInteractions(this.matcher); verifyZeroInteractions(target); } @Override @Test public void testObjectProperties() throws Exception { CachingMatcher<?> cachingMatcher = new CachingMatcher<Object>(matcher, map); assertThat(cachingMatcher.equals(cachingMatcher), is(true)); assertThat(cachingMatcher.equals(new CachingMatcher<Object>(matcher, new ConcurrentHashMap<Object, Boolean>())), is(true)); assertThat(cachingMatcher.equals(null), is(false)); assertThat(cachingMatcher.equals(new Object()), is(false)); assertThat(cachingMatcher.hashCode(), is(matcher.hashCode())); assertThat(cachingMatcher.toString().startsWith(startsWith), is(true)); } }