package net.bytebuddy.description.type; import net.bytebuddy.description.TypeVariableSource; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.test.utility.MockitoRule; import net.bytebuddy.test.utility.ObjectPropertyAssertion; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestRule; import org.mockito.Mock; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.*; public class TypeDescriptionGenericVisitorSubstitutorForTypeVariableBindingTest { @Rule public TestRule mockitoRule = new MockitoRule(this); @Mock private TypeDescription.Generic parameterizedType, source, target, unknown, substituted; @Mock private TypeDescription.AbstractBase typeDefinition; @Mock private MethodDescription.AbstractBase methodDefinition; @Before @SuppressWarnings("unchecked") public void setUp() throws Exception { when(parameterizedType.findBindingOf(source)).thenReturn(target); when(typeDefinition.accept(any(TypeVariableSource.Visitor.class))).thenCallRealMethod(); when(methodDefinition.accept(any(TypeVariableSource.Visitor.class))).thenReturn(substituted); } @Test public void testSimpleType() throws Exception { assertThat(new TypeDescription.Generic.Visitor.Substitutor.ForTypeVariableBinding(parameterizedType).onSimpleType(source), is(source)); } @Test public void testNonGenericType() throws Exception { assertThat(new TypeDescription.Generic.Visitor.Substitutor.ForTypeVariableBinding(parameterizedType).onNonGenericType(source), is(source)); } @Test public void testTypeVariableKnownOnType() throws Exception { when(source.getTypeVariableSource()).thenReturn(typeDefinition); assertThat(new TypeDescription.Generic.Visitor.Substitutor.ForTypeVariableBinding(parameterizedType).onTypeVariable(source), is(target)); } @Test public void testTypeVariableUnknownOnType() throws Exception { when(unknown.getTypeVariableSource()).thenReturn(typeDefinition); TypeDescription.Generic rawType = mock(TypeDescription.Generic.class); when(unknown.asRawType()).thenReturn(rawType); assertThat(new TypeDescription.Generic.Visitor.Substitutor.ForTypeVariableBinding(parameterizedType).onTypeVariable(unknown), is(rawType)); } @Test public void testTypeVariableKnownOnMethod() throws Exception { when(source.getTypeVariableSource()).thenReturn(methodDefinition); assertThat(new TypeDescription.Generic.Visitor.Substitutor.ForTypeVariableBinding(parameterizedType).onTypeVariable(source), is(substituted)); } @Test public void testTypeVariableUnknownOnMethod() throws Exception { when(unknown.getTypeVariableSource()).thenReturn(methodDefinition); assertThat(new TypeDescription.Generic.Visitor.Substitutor.ForTypeVariableBinding(parameterizedType).onTypeVariable(unknown), is(substituted)); } @Test public void testUnequalVariablesAndParameters() throws Exception { TypeDescription.Generic typeDescription = mock(TypeDescription.Generic.class); when(typeDescription.getTypeArguments()).thenReturn(new TypeList.Generic.Explicit(mock(TypeDescription.Generic.class))); TypeDescription rawTypeDescription = mock(TypeDescription.class); when(typeDescription.asErasure()).thenReturn(rawTypeDescription); when(rawTypeDescription.getTypeVariables()).thenReturn(new TypeList.Generic.Empty()); } @Test public void testObjectProperties() throws Exception { ObjectPropertyAssertion.of(TypeDescription.Generic.Visitor.Substitutor.ForTypeVariableBinding.class).apply(); ObjectPropertyAssertion.of(TypeDescription.Generic.Visitor.Substitutor.ForTypeVariableBinding.TypeVariableSubstitutor.class).apply(); } }