package net.bytebuddy.asm; import net.bytebuddy.ByteBuddy; import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; 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 AdviceSizeConversionTest { private static final String FOO = "foo"; private static final int NUMERIC = 42; private final Class<?> target, parameter; private final Object input, output; public AdviceSizeConversionTest(Class<?> target, Class<?> parameter, Object input, Object output) { this.target = target; this.parameter = parameter; this.input = input; this.output = output; } @Parameterized.Parameters public static Collection<Object[]> data() { return Arrays.asList(new Object[][]{ {IntToFloat.class, int.class, NUMERIC, (float) NUMERIC}, {IntToLong.class, int.class, NUMERIC, (long) NUMERIC}, {IntToDouble.class, int.class, NUMERIC, (double) NUMERIC}, {FloatToInt.class, float.class, (float) NUMERIC, NUMERIC}, {FloatToLong.class, float.class, (float) NUMERIC, (long) NUMERIC}, {FloatToDouble.class, float.class, (float) NUMERIC, (double) NUMERIC}, {LongToInt.class, long.class, (long) NUMERIC, NUMERIC}, {LongToFloat.class, long.class, (long) NUMERIC, (float) NUMERIC}, {LongToDouble.class, long.class, (long) NUMERIC, (double) NUMERIC}, {DoubleToInt.class, double.class, (double) NUMERIC, NUMERIC}, {DoubleToLong.class, double.class, (double) NUMERIC, (long) NUMERIC}, {DoubleToFloat.class, double.class, (double) NUMERIC, (float) NUMERIC}, }); } @Test public void testAdvice() throws Exception { Class<?> type = new ByteBuddy() .redefine(target) .visit(Advice.to(AdviceSizeConversionTest.class).on(named(FOO))) .make() .load(ClassLoadingStrategy.BOOTSTRAP_LOADER, ClassLoadingStrategy.Default.WRAPPER) .getLoaded(); assertThat(type.getDeclaredMethod(FOO, parameter).invoke(type.getDeclaredConstructor().newInstance(), input), is(output)); } @Advice.OnMethodExit private static void exit() { /* empty */ } public static class IntToFloat { public float foo(int value) { return (float) value; } } public static class IntToLong { public long foo(int value) { return (long) value; } } public static class IntToDouble { public double foo(int value) { return (double) value; } } public static class FloatToInt { public int foo(float value) { return (int) value; } } public static class FloatToLong { public long foo(float value) { return (long) value; } } public static class FloatToDouble { public double foo(float value) { return (double) value; } } public static class LongToInt { public int foo(long value) { return (int) value; } } public static class LongToFloat { public float foo(long value) { return (float) value; } } public static class LongToDouble { public double foo(long value) { return (double) value; } } public static class DoubleToInt { public int foo(double value) { return (int) value; } } public static class DoubleToFloat { public float foo(double value) { return (float) value; } } public static class DoubleToLong { public long foo(double value) { return (long) value; } } }