package net.bytebuddy.implementation.bind.annotation;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
import net.bytebuddy.implementation.MethodDelegation;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;
import java.util.Collection;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
@RunWith(Parameterized.class)
public class TargetMethodAnnotationDriverBinderParameterBinderForFixedValueOfConstantTest {
private static final String FOO = "foo";
private static final byte NUMERIC_VALUE = 42;
@Parameterized.Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{true},
{NUMERIC_VALUE},
{(short) NUMERIC_VALUE},
{(char) NUMERIC_VALUE},
{(int) NUMERIC_VALUE},
{(long) NUMERIC_VALUE},
{(float) NUMERIC_VALUE},
{(double) NUMERIC_VALUE},
{FOO},
{Object.class}
});
}
private final Object value;
public TargetMethodAnnotationDriverBinderParameterBinderForFixedValueOfConstantTest(Object value) {
this.value = value;
}
@Test
public void testConstant() throws Exception {
assertThat(new ByteBuddy()
.subclass(Foo.class)
.method(named(FOO))
.intercept(MethodDelegation.withDefaultConfiguration()
.withBinders(TargetMethodAnnotationDrivenBinder.ParameterBinder.ForFixedValue.OfConstant.of(Bar.class, value))
.to(Foo.class))
.make()
.load(Foo.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded()
.getDeclaredConstructor()
.newInstance()
.foo(), is(value));
}
public static class Foo {
public static Object intercept(@Bar Object value) {
return value;
}
public Object foo() {
throw new AssertionError();
}
}
@Retention(RetentionPolicy.RUNTIME)
public @interface Bar {
/* empty */
}
}