package net.bytebuddy.implementation.bind;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.test.utility.ObjectPropertyAssertion;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Mockito.*;
public class DeclaringTypeResolverTest extends AbstractAmbiguityResolverTest {
@Mock
private TypeDescription leftType, rightType;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
when(leftMethod.getDeclaringType()).thenReturn(leftType);
when(rightMethod.getDeclaringType()).thenReturn(rightType);
when(leftType.asErasure()).thenReturn(leftType);
when(rightType.asErasure()).thenReturn(rightType);
}
@Test
public void testEquals() throws Exception {
when(leftType.isAssignableFrom(rightType)).thenReturn(true);
assertThat(DeclaringTypeResolver.INSTANCE.resolve(source, left, left), is(MethodDelegationBinder.AmbiguityResolver.Resolution.AMBIGUOUS));
verify(leftType, times(2)).asErasure();
verifyNoMoreInteractions(leftType);
}
@Test
public void testLeftAssignable() throws Exception {
when(leftType.isAssignableFrom(rightType)).thenReturn(true);
assertThat(DeclaringTypeResolver.INSTANCE.resolve(source, left, right), is(MethodDelegationBinder.AmbiguityResolver.Resolution.RIGHT));
verify(leftType).isAssignableFrom(rightType);
verify(leftType).asErasure();
verifyNoMoreInteractions(leftType);
verify(rightType).asErasure();
verifyNoMoreInteractions(rightType);
}
@Test
public void testRightAssignable() throws Exception {
when(leftType.isAssignableTo(rightType)).thenReturn(true);
assertThat(DeclaringTypeResolver.INSTANCE.resolve(source, left, right), is(MethodDelegationBinder.AmbiguityResolver.Resolution.LEFT));
verify(leftType).isAssignableFrom(rightType);
verify(leftType).isAssignableTo(rightType);
verify(leftType).asErasure();
verifyNoMoreInteractions(leftType);
verify(rightType).asErasure();
verifyNoMoreInteractions(rightType);
}
@Test
public void testNonAssignable() throws Exception {
assertThat(DeclaringTypeResolver.INSTANCE.resolve(source, left, right), is(MethodDelegationBinder.AmbiguityResolver.Resolution.AMBIGUOUS));
verify(leftType).isAssignableFrom(rightType);
verify(leftType).isAssignableTo(rightType);
verify(leftType).asErasure();
verifyNoMoreInteractions(leftType);
verify(rightType).asErasure();
verifyNoMoreInteractions(rightType);
}
@Test
public void testObjectProperties() throws Exception {
ObjectPropertyAssertion.of(DeclaringTypeResolver.class).apply();
}
}