package net.bytebuddy;
import net.bytebuddy.description.type.TypeDescription;
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.hamcrest.core.StringStartsWith.startsWith;
import static org.mockito.Mockito.*;
public class NamingStrategyTest {
private static final String FOO = "foo", BAR = "bar", JAVA_QUX = "java.qux";
@Rule
public TestRule mockitoRule = new MockitoRule(this);
@Mock
private NamingStrategy.SuffixingRandom.BaseNameResolver baseNameResolver;
@Mock
private TypeDescription.Generic typeDescription;
@Mock
private TypeDescription rawTypeDescription;
@Before
public void setUp() throws Exception {
when(typeDescription.asErasure()).thenReturn(rawTypeDescription);
}
@Test
public void testSuffixingRandomSubclassNonConflictingPackage() throws Exception {
when(rawTypeDescription.getName()).thenReturn(FOO);
NamingStrategy namingStrategy = new NamingStrategy.SuffixingRandom(BAR);
assertThat(namingStrategy.subclass(typeDescription), startsWith(FOO + "$" + BAR + "$"));
verify(typeDescription, atLeast(1)).asErasure();
verifyNoMoreInteractions(typeDescription);
verify(rawTypeDescription).getName();
verifyNoMoreInteractions(rawTypeDescription);
}
@Test
public void testSuffixingRandomSubclassConflictingPackage() throws Exception {
when(baseNameResolver.resolve(rawTypeDescription)).thenReturn(JAVA_QUX);
NamingStrategy namingStrategy = new NamingStrategy.SuffixingRandom(FOO, baseNameResolver, BAR);
assertThat(namingStrategy.subclass(typeDescription), startsWith(BAR + "." + JAVA_QUX + "$" + FOO + "$"));
verify(typeDescription).asErasure();
verifyNoMoreInteractions(typeDescription);
verifyZeroInteractions(rawTypeDescription);
verify(baseNameResolver).resolve(rawTypeDescription);
verifyNoMoreInteractions(baseNameResolver);
}
@Test
public void testSuffixingRandomSubclassConflictingPackageDisabled() throws Exception {
when(baseNameResolver.resolve(rawTypeDescription)).thenReturn(JAVA_QUX);
NamingStrategy namingStrategy = new NamingStrategy.SuffixingRandom(FOO, baseNameResolver, NamingStrategy.SuffixingRandom.NO_PREFIX);
assertThat(namingStrategy.subclass(typeDescription), startsWith(JAVA_QUX + "$" + FOO + "$"));
verify(typeDescription).asErasure();
verifyNoMoreInteractions(typeDescription);
verifyZeroInteractions(rawTypeDescription);
verify(baseNameResolver).resolve(rawTypeDescription);
verifyNoMoreInteractions(baseNameResolver);
}
@Test
public void testSuffixingRandomRebase() throws Exception {
when(rawTypeDescription.getName()).thenReturn(FOO);
NamingStrategy namingStrategy = new NamingStrategy.SuffixingRandom(BAR);
assertThat(namingStrategy.rebase(rawTypeDescription), is(FOO));
verify(rawTypeDescription).getName();
verifyNoMoreInteractions(rawTypeDescription);
}
@Test
public void testSuffixingRandomRedefine() throws Exception {
when(rawTypeDescription.getName()).thenReturn(FOO);
NamingStrategy namingStrategy = new NamingStrategy.SuffixingRandom(BAR);
assertThat(namingStrategy.redefine(rawTypeDescription), is(FOO));
verify(rawTypeDescription).getName();
verifyNoMoreInteractions(rawTypeDescription);
}
@Test
public void testBaseNameResolvers() throws Exception {
assertThat(new NamingStrategy.SuffixingRandom.BaseNameResolver.ForFixedValue(FOO).resolve(rawTypeDescription), is(FOO));
when(rawTypeDescription.getName()).thenReturn(FOO);
assertThat(new NamingStrategy.SuffixingRandom.BaseNameResolver.ForGivenType(rawTypeDescription).resolve(rawTypeDescription), is(FOO));
assertThat(NamingStrategy.SuffixingRandom.BaseNameResolver.ForUnnamedType.INSTANCE.resolve(rawTypeDescription), is(FOO));
}
@Test
public void testSuffixingRandomObjectProperties() throws Exception {
ObjectPropertyAssertion.of(NamingStrategy.SuffixingRandom.class).apply();
ObjectPropertyAssertion.of(NamingStrategy.SuffixingRandom.BaseNameResolver.ForGivenType.class).apply();
ObjectPropertyAssertion.of(NamingStrategy.SuffixingRandom.BaseNameResolver.ForUnnamedType.class).apply();
ObjectPropertyAssertion.of(NamingStrategy.SuffixingRandom.BaseNameResolver.ForFixedValue.class).apply();
}
@Test
public void testPrefixingRandom() throws Exception {
when(rawTypeDescription.getName()).thenReturn(BAR);
NamingStrategy namingStrategy = new NamingStrategy.PrefixingRandom(FOO);
assertThat(namingStrategy.subclass(typeDescription), startsWith(FOO + "." + BAR));
verify(typeDescription).asErasure();
verifyNoMoreInteractions(typeDescription);
verify(rawTypeDescription).getName();
verifyNoMoreInteractions(rawTypeDescription);
}
@Test
public void testPrefixingRandomRebase() throws Exception {
when(rawTypeDescription.getName()).thenReturn(FOO);
NamingStrategy namingStrategy = new NamingStrategy.PrefixingRandom(BAR);
assertThat(namingStrategy.rebase(rawTypeDescription), is(FOO));
verify(rawTypeDescription).getName();
verifyNoMoreInteractions(rawTypeDescription);
}
@Test
public void testPrefixingRandomRedefine() throws Exception {
when(rawTypeDescription.getName()).thenReturn(FOO);
NamingStrategy namingStrategy = new NamingStrategy.PrefixingRandom(BAR);
assertThat(namingStrategy.redefine(rawTypeDescription), is(FOO));
verify(rawTypeDescription).getName();
verifyNoMoreInteractions(rawTypeDescription);
}
@Test
public void testPrefixingRandomEqualsHashCode() throws Exception {
ObjectPropertyAssertion.of(NamingStrategy.PrefixingRandom.class).apply();
}
}