package net.bytebuddy.dynamic;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
import net.bytebuddy.implementation.LoadedTypeInitializer;
import net.bytebuddy.test.utility.MockitoRule;
import net.bytebuddy.test.utility.ObjectPropertyAssertion;
import org.hamcrest.CoreMatchers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import org.mockito.Mock;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Mockito.*;
public class DynamicTypeDefaultUnloadedTest {
private static final Class<?> MAIN_TYPE = Void.class, AUXILIARY_TYPE = Object.class;
@Rule
public TestRule mockitoRule = new MockitoRule(this);
@Mock
private LoadedTypeInitializer mainLoadedTypeInitializer, auxiliaryLoadedTypeInitializer;
@Mock
private DynamicType auxiliaryType;
@Mock
private ClassLoader classLoader;
@Mock
private ClassLoadingStrategy<ClassLoader> classLoadingStrategy;
@Mock
private TypeResolutionStrategy.Resolved typeResolutionStrategy;
@Mock
private TypeDescription typeDescription, auxiliaryTypeDescription;
private byte[] binaryRepresentation, auxiliaryTypeByte;
private DynamicType.Unloaded<?> unloaded;
@Before
@SuppressWarnings("unchecked")
public void setUp() throws Exception {
binaryRepresentation = new byte[]{0, 1, 2};
auxiliaryTypeByte = new byte[]{4, 5, 6};
unloaded = new DynamicType.Default.Unloaded<Object>(typeDescription,
binaryRepresentation,
mainLoadedTypeInitializer,
Collections.singletonList(auxiliaryType),
typeResolutionStrategy);
Map<TypeDescription, Class<?>> loadedTypes = new HashMap<TypeDescription, Class<?>>();
loadedTypes.put(typeDescription, MAIN_TYPE);
loadedTypes.put(auxiliaryTypeDescription, AUXILIARY_TYPE);
when(auxiliaryType.getTypeDescription()).thenReturn(auxiliaryTypeDescription);
when(auxiliaryType.getBytes()).thenReturn(auxiliaryTypeByte);
when(auxiliaryType.getLoadedTypeInitializers()).thenReturn(Collections.singletonMap(auxiliaryTypeDescription, auxiliaryLoadedTypeInitializer));
when(auxiliaryType.getAuxiliaryTypes()).thenReturn(Collections.<TypeDescription, byte[]>emptyMap());
when(typeResolutionStrategy.initialize(unloaded, classLoader, classLoadingStrategy)).thenReturn(loadedTypes);
when(typeDescription.getName()).thenReturn(MAIN_TYPE.getName());
when(auxiliaryTypeDescription.getName()).thenReturn(AUXILIARY_TYPE.getName());
}
@Test
public void testQueries() throws Exception {
DynamicType.Loaded<?> loaded = unloaded.load(classLoader, classLoadingStrategy);
assertThat(loaded.getTypeDescription(), is(typeDescription));
assertThat(loaded.getBytes(), is(binaryRepresentation));
assertThat(loaded.getAuxiliaryTypes(), is(Collections.singletonMap(auxiliaryTypeDescription, auxiliaryTypeByte)));
}
@Test
public void testTypeLoading() throws Exception {
DynamicType.Loaded<?> loaded = unloaded.load(classLoader, classLoadingStrategy);
assertThat(loaded.getLoaded(), CoreMatchers.<Class<?>>is(MAIN_TYPE));
assertThat(loaded.getLoadedAuxiliaryTypes().size(), is(1));
assertThat(loaded.getLoadedAuxiliaryTypes().get(auxiliaryTypeDescription), CoreMatchers.<Class<?>>is(AUXILIARY_TYPE));
verify(typeResolutionStrategy).initialize(unloaded, classLoader, classLoadingStrategy);
verifyNoMoreInteractions(typeResolutionStrategy);
}
@Test
public void testTypeInclusion() throws Exception {
DynamicType additionalType = mock(DynamicType.class);
TypeDescription additionalTypeDescription = mock(TypeDescription.class);
when(additionalType.getTypeDescription()).thenReturn(additionalTypeDescription);
DynamicType.Unloaded<?> dynamicType = unloaded.include(additionalType);
assertThat(dynamicType.getAuxiliaryTypes().size(), is(2));
assertThat(dynamicType.getAuxiliaryTypes().containsKey(additionalTypeDescription), is(true));
assertThat(dynamicType.getAuxiliaryTypes().containsKey(auxiliaryTypeDescription), is(true));
}
@Test
public void testObjectProperties() throws Exception {
ObjectPropertyAssertion.of(DynamicType.Default.Unloaded.class).apply();
}
}