package net.bytebuddy.implementation.bind; import net.bytebuddy.description.method.ParameterDescription; import net.bytebuddy.description.method.ParameterList; import net.bytebuddy.description.type.TypeDescription; import org.junit.Before; import org.mockito.ArgumentMatcher; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import java.util.*; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.when; public class AbstractArgumentTypeResolverTest extends AbstractAmbiguityResolverTest { @Mock protected ParameterList<?> sourceParameterList, leftParameterList, rightParameterList; @Mock protected TypeDescription sourceType; @Mock protected TypeDescription.Generic genericSourceType; @Mock private ParameterDescription sourceParameter; protected static ArgumentMatcher<? super ArgumentTypeResolver.ParameterIndexToken> describesArgument(final int... index) { return new ArgumentMatcher<ArgumentTypeResolver.ParameterIndexToken>() { @Override public boolean matches(ArgumentTypeResolver.ParameterIndexToken parameterIndexToken) { for (int anIndex : index) { if (parameterIndexToken.equals(new ArgumentTypeResolver.ParameterIndexToken(anIndex))) { return true; } } return false; } }; } @Override @Before @SuppressWarnings("unchecked") public void setUp() throws Exception { super.setUp(); when(source.getParameters()).thenReturn((ParameterList) sourceParameterList); when(sourceParameterList.get(anyInt())).thenReturn(sourceParameter); when(sourceParameter.getType()).thenReturn(genericSourceType); when(genericSourceType.asErasure()).thenReturn(sourceType); when(leftMethod.getParameters()).thenReturn((ParameterList) leftParameterList); when(rightMethod.getParameters()).thenReturn((ParameterList) rightParameterList); } protected static class TokenAnswer implements Answer<Integer> { private final Map<ArgumentTypeResolver.ParameterIndexToken, Integer> indexMapping; protected TokenAnswer(int[][] mapping) { Map<ArgumentTypeResolver.ParameterIndexToken, Integer> indexMapping = new HashMap<ArgumentTypeResolver.ParameterIndexToken, Integer>(); for (int[] entry : mapping) { assert entry.length == 2; assert entry[0] >= 0; assert entry[1] >= 0; Object override = indexMapping.put(new ArgumentTypeResolver.ParameterIndexToken(entry[0]), entry[1]); assert override == null; } this.indexMapping = Collections.unmodifiableMap(indexMapping); } @Override public Integer answer(InvocationOnMock invocation) throws Throwable { assert invocation.getArguments().length == 1; return indexMapping.get((ArgumentTypeResolver.ParameterIndexToken) invocation.getArguments()[0]); } } }