package net.bytebuddy.implementation; import net.bytebuddy.description.ModifierReviewable; import net.bytebuddy.description.modifier.*; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.objectweb.asm.Opcodes; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @RunWith(Parameterized.class) public class ModifierReviewableTest { private final SimpleModifierReviewable simpleModifierReviewable; private final Method method; private final Object expected; public ModifierReviewableTest(int modifiers, String methodName, Object expected) throws Exception { simpleModifierReviewable = new SimpleModifierReviewable(modifiers); method = ModifierReviewable.AbstractBase.class.getMethod(methodName); this.expected = expected; } @Parameterized.Parameters public static Collection<Object[]> data() { return Arrays.asList(new Object[][]{ {Opcodes.ACC_ABSTRACT, "isAbstract", true}, {Opcodes.ACC_ANNOTATION, "isAnnotation", true}, {Opcodes.ACC_BRIDGE, "isBridge", true}, {Opcodes.ACC_DEPRECATED, "isDeprecated", true}, {Opcodes.ACC_ENUM, "isEnum", true}, {Opcodes.ACC_FINAL, "isFinal", true}, {Opcodes.ACC_INTERFACE, "isInterface", true}, {Opcodes.ACC_MANDATED, "isMandated", true}, {Opcodes.ACC_NATIVE, "isNative", true}, {Opcodes.ACC_PRIVATE, "isPrivate", true}, {Opcodes.ACC_PROTECTED, "isProtected", true}, {Opcodes.ACC_PUBLIC, "isPublic", true}, {Opcodes.ACC_STATIC, "isStatic", true}, {Opcodes.ACC_STRICT, "isStrict", true}, {Opcodes.ACC_SYNCHRONIZED, "isSynchronized", true}, {Opcodes.ACC_SYNTHETIC, "isSynthetic", true}, {Opcodes.ACC_TRANSIENT, "isTransient", true}, {Opcodes.ACC_VARARGS, "isVarArgs", true}, {Opcodes.ACC_VOLATILE, "isVolatile", true}, {ModifierReviewable.EMPTY_MASK, "isPackagePrivate", true}, {Opcodes.ACC_SYNTHETIC, "getSyntheticState", SyntheticState.SYNTHETIC}, {ModifierReviewable.EMPTY_MASK, "getSyntheticState", SyntheticState.PLAIN}, {Opcodes.ACC_PUBLIC, "getVisibility", Visibility.PUBLIC}, {ModifierReviewable.EMPTY_MASK, "getVisibility", Visibility.PACKAGE_PRIVATE}, {Opcodes.ACC_PROTECTED, "getVisibility", Visibility.PROTECTED}, {Opcodes.ACC_PRIVATE, "getVisibility", Visibility.PRIVATE}, {Opcodes.ACC_STATIC, "getOwnership", Ownership.STATIC}, {ModifierReviewable.EMPTY_MASK, "getOwnership", Ownership.MEMBER}, {Opcodes.ACC_ENUM, "getEnumerationState", EnumerationState.ENUMERATION}, {ModifierReviewable.EMPTY_MASK, "getEnumerationState", EnumerationState.PLAIN}, {Opcodes.ACC_ABSTRACT, "getTypeManifestation", TypeManifestation.ABSTRACT}, {Opcodes.ACC_FINAL, "getTypeManifestation", TypeManifestation.FINAL}, {Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE, "getTypeManifestation", TypeManifestation.INTERFACE}, {Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE | Opcodes.ACC_ANNOTATION, "getTypeManifestation", TypeManifestation.ANNOTATION}, {ModifierReviewable.EMPTY_MASK, "getTypeManifestation", TypeManifestation.PLAIN}, {Opcodes.ACC_FINAL, "getFieldManifestation", FieldManifestation.FINAL}, {Opcodes.ACC_VOLATILE, "getFieldManifestation", FieldManifestation.VOLATILE}, {Opcodes.ACC_TRANSIENT, "getFieldPersistence", FieldPersistence.TRANSIENT}, {ModifierReviewable.EMPTY_MASK, "getFieldPersistence", FieldPersistence.PLAIN}, {Opcodes.ACC_SYNCHRONIZED, "getSynchronizationState", SynchronizationState.SYNCHRONIZED}, {ModifierReviewable.EMPTY_MASK, "getSynchronizationState", SynchronizationState.PLAIN}, {Opcodes.ACC_FINAL, "getParameterManifestation", ParameterManifestation.FINAL}, {ModifierReviewable.EMPTY_MASK, "getParameterManifestation", ParameterManifestation.PLAIN}, {Opcodes.ACC_MANDATED, "getProvisioningState", ProvisioningState.MANDATED}, {ModifierReviewable.EMPTY_MASK, "getProvisioningState", ProvisioningState.PLAIN}, {Opcodes.ACC_BRIDGE, "getMethodManifestation", MethodManifestation.BRIDGE}, {Opcodes.ACC_ABSTRACT, "getMethodManifestation", MethodManifestation.ABSTRACT}, {Opcodes.ACC_FINAL, "getMethodManifestation", MethodManifestation.FINAL}, {Opcodes.ACC_NATIVE, "getMethodManifestation", MethodManifestation.NATIVE}, {Opcodes.ACC_NATIVE | Opcodes.ACC_FINAL, "getMethodManifestation", MethodManifestation.FINAL_NATIVE}, {Opcodes.ACC_BRIDGE | Opcodes.ACC_FINAL, "getMethodManifestation", MethodManifestation.FINAL_BRIDGE}, {ModifierReviewable.EMPTY_MASK, "getMethodManifestation", MethodManifestation.PLAIN}, {Opcodes.ACC_STRICT, "getMethodStrictness", MethodStrictness.STRICT}, {ModifierReviewable.EMPTY_MASK, "getMethodStrictness", MethodStrictness.PLAIN} }); } @Test public void testModifierProperty() throws Exception { assertThat(method.invoke(simpleModifierReviewable), is(expected)); } private static class SimpleModifierReviewable extends ModifierReviewable.AbstractBase { private final int modifiers; private SimpleModifierReviewable(int modifiers) { this.modifiers = modifiers; } @Override public int getModifiers() { return modifiers; } } }