use of com.tngtech.archunit.core.domain.JavaAnnotation in project ArchUnit by TNG.
the class ClassFileImporterAnnotationsTest method imports_class_with_complex_annotations_correctly.
@Test
public void imports_class_with_complex_annotations_correctly() {
JavaClass clazz = new ClassFileImporter().importPackagesOf(ClassWithComplexAnnotations.class).get(ClassWithComplexAnnotations.class);
assertThat(clazz.getAnnotations()).as("annotations of " + clazz.getSimpleName()).hasSize(2);
JavaAnnotation<JavaClass> annotation = clazz.getAnnotationOfType(TypeAnnotationWithEnumAndArrayValue.class.getName());
assertThat((JavaEnumConstant) annotation.get("value").get()).isEquivalentTo(OTHER_VALUE);
assertThat((JavaEnumConstant) annotation.get("valueWithDefault").get()).isEquivalentTo(SOME_VALUE);
assertThat(((JavaEnumConstant[]) annotation.get("enumArray").get())).matches(SOME_VALUE, OTHER_VALUE);
assertThat(((JavaEnumConstant[]) annotation.get("enumArrayWithDefault").get())).matches(OTHER_VALUE);
JavaAnnotation<?> subAnnotation = (JavaAnnotation<?>) annotation.get("subAnnotation").get();
assertThat(subAnnotation.get("value").get()).isEqualTo("sub");
assertThat(subAnnotation.getOwner()).isEqualTo(annotation);
assertThat(subAnnotation.getAnnotatedElement()).isEqualTo(clazz);
assertThat(((JavaAnnotation<?>) annotation.get("subAnnotationWithDefault").get()).get("value").get()).isEqualTo("default");
JavaAnnotation<?>[] subAnnotationArray = (JavaAnnotation<?>[]) annotation.get("subAnnotationArray").get();
assertThat(subAnnotationArray[0].get("value").get()).isEqualTo("otherFirst");
assertThat(subAnnotationArray[0].getOwner()).isEqualTo(annotation);
assertThat(subAnnotationArray[0].getAnnotatedElement()).isEqualTo(clazz);
assertThat(((JavaAnnotation<?>[]) annotation.get("subAnnotationArrayWithDefault").get())[0].get("value").get()).isEqualTo("first");
assertThatType((JavaClass) annotation.get("clazz").get()).matches(Serializable.class);
assertThatType((JavaClass) annotation.get("clazzWithDefault").get()).matches(String.class);
assertThat((JavaClass[]) annotation.get("classes").get()).matchExactly(Serializable.class, String.class);
assertThat((JavaClass[]) annotation.get("classesWithDefault").get()).matchExactly(Serializable.class, List.class);
assertThatType(clazz).matches(ClassWithComplexAnnotations.class);
}
use of com.tngtech.archunit.core.domain.JavaAnnotation in project ArchUnit by TNG.
the class ClassFileImporterAnnotationsTest method imports_methods_with_complex_annotations_correctly.
@Test
public void imports_methods_with_complex_annotations_correctly() throws Exception {
JavaMethod method = new ClassFileImporter().importPackagesOf(ClassWithAnnotatedMethods.class).get(ClassWithAnnotatedMethods.class).getMethod(enumAndArrayAnnotatedMethod);
JavaAnnotation<?> annotation = method.getAnnotationOfType(ClassWithAnnotatedMethods.MethodAnnotationWithEnumAndArrayValue.class.getName());
assertThat((JavaEnumConstant) annotation.get("value").get()).isEquivalentTo(OTHER_VALUE);
assertThat((JavaEnumConstant) annotation.get("valueWithDefault").get()).isEquivalentTo(SOME_VALUE);
assertThat(((JavaEnumConstant[]) annotation.get("enumArray").get())).matches(SOME_VALUE, OTHER_VALUE);
assertThat(((JavaEnumConstant[]) annotation.get("enumArrayWithDefault").get())).matches(OTHER_VALUE);
JavaAnnotation<?> subAnnotation = (JavaAnnotation<?>) annotation.get("subAnnotation").get();
assertThat(subAnnotation.get("value").get()).isEqualTo("changed");
assertThat(subAnnotation.getOwner()).isEqualTo(annotation);
assertThat(subAnnotation.getAnnotatedElement()).isEqualTo(method);
assertThat(((JavaAnnotation<?>) annotation.get("subAnnotationWithDefault").get()).get("value").get()).isEqualTo("default");
JavaAnnotation<?>[] subAnnotationArray = (JavaAnnotation<?>[]) annotation.get("subAnnotationArray").get();
assertThat(subAnnotationArray[0].get("value").get()).isEqualTo("another");
assertThat(subAnnotationArray[0].getOwner()).isEqualTo(annotation);
assertThat(subAnnotationArray[0].getAnnotatedElement()).isEqualTo(method);
assertThat(((JavaAnnotation<?>[]) annotation.get("subAnnotationArrayWithDefault").get())[0].get("value").get()).isEqualTo("first");
assertThatType((JavaClass) annotation.get("clazz").get()).matches(Map.class);
assertThatType((JavaClass) annotation.get("clazzWithDefault").get()).matches(String.class);
assertThat((JavaClass[]) annotation.get("classes").get()).matchExactly(Object.class, Serializable.class);
assertThat((JavaClass[]) annotation.get("classesWithDefault").get()).matchExactly(Serializable.class, List.class);
assertThat(method).isEquivalentTo(ClassWithAnnotatedMethods.class.getMethod(enumAndArrayAnnotatedMethod));
}
use of com.tngtech.archunit.core.domain.JavaAnnotation in project ArchUnit by TNG.
the class ClassFileImporterAnnotationsTest method imports_method_with_one_parameter_with_one_annotation.
@Test
public void imports_method_with_one_parameter_with_one_annotation() {
JavaMethod method = new ClassFileImporter().importPackagesOf(ClassWithMethodWithAnnotatedParameters.class).get(ClassWithMethodWithAnnotatedParameters.class).getMethod(ClassWithMethodWithAnnotatedParameters.methodWithOneAnnotatedParameterWithOneAnnotation, String.class);
List<Set<JavaAnnotation<JavaParameter>>> parameterAnnotations = method.getParameterAnnotations();
JavaParameter parameter = getOnlyElement(method.getParameters());
JavaAnnotation<JavaParameter> annotation = getOnlyElement(getOnlyElement(parameterAnnotations));
assertThat((JavaEnumConstant) annotation.get("value").get()).isEquivalentTo(OTHER_VALUE);
assertThat((JavaEnumConstant) annotation.get("valueWithDefault").get()).isEquivalentTo(SOME_VALUE);
assertThat(((JavaEnumConstant[]) annotation.get("enumArray").get())).matches(SOME_VALUE, OTHER_VALUE);
assertThat(((JavaEnumConstant[]) annotation.get("enumArrayWithDefault").get())).matches(OTHER_VALUE);
JavaAnnotation<?> subAnnotation = (JavaAnnotation<?>) annotation.get("subAnnotation").get();
assertThat(subAnnotation.get("value").get()).isEqualTo("changed");
assertThat(subAnnotation.getOwner()).isEqualTo(annotation);
assertThat(subAnnotation.getAnnotatedElement()).isEqualTo(parameter);
assertThat(((JavaAnnotation<?>) annotation.get("subAnnotationWithDefault").get()).get("value").get()).isEqualTo("default");
JavaAnnotation<?>[] subAnnotationArray = (JavaAnnotation<?>[]) annotation.get("subAnnotationArray").get();
assertThat(subAnnotationArray[0].get("value").get()).isEqualTo("one");
assertThat(subAnnotationArray[0].getOwner()).isEqualTo(annotation);
assertThat(subAnnotationArray[0].getAnnotatedElement()).isEqualTo(parameter);
assertThat(subAnnotationArray[1].get("value").get()).isEqualTo("two");
assertThat(subAnnotationArray[1].getOwner()).isEqualTo(annotation);
assertThat(subAnnotationArray[1].getAnnotatedElement()).isEqualTo(parameter);
assertThat(((JavaAnnotation<?>[]) annotation.get("subAnnotationArrayWithDefault").get())[0].get("value").get()).isEqualTo("first");
assertThatType((JavaClass) annotation.get("clazz").get()).matches(Map.class);
assertThatType((JavaClass) annotation.get("clazzWithDefault").get()).matches(String.class);
assertThat((JavaClass[]) annotation.get("classes").get()).matchExactly(Object.class, Serializable.class);
assertThat((JavaClass[]) annotation.get("classesWithDefault").get()).matchExactly(Serializable.class, List.class);
assertThatAnnotation(getOnlyElement(parameter.getAnnotations())).matches(method.reflect().getParameterAnnotations()[0][0]);
assertThatAnnotation(annotation).matches(method.reflect().getParameterAnnotations()[0][0]);
}
use of com.tngtech.archunit.core.domain.JavaAnnotation in project ArchUnit by TNG.
the class ClassFileImporterAnnotationsTest method imports_fields_with_two_annotations_correctly.
@Test
public void imports_fields_with_two_annotations_correctly() throws Exception {
JavaField field = new ClassFileImporter().importPackagesOf(ClassWithAnnotatedFields.class).get(ClassWithAnnotatedFields.class).getField("stringAndIntAnnotatedField");
Set<JavaAnnotation<JavaField>> annotations = field.getAnnotations();
assertThat(annotations).hasSize(2);
assertThat(annotations).extractingResultOf("getOwner").containsOnly(field);
assertThat(annotations).extractingResultOf("getAnnotatedElement").containsOnly(field);
JavaAnnotation<JavaField> annotationWithString = field.getAnnotationOfType(ClassWithAnnotatedFields.FieldAnnotationWithStringValue.class.getName());
assertThat(annotationWithString.get("value").get()).isEqualTo("otherThing");
JavaAnnotation<JavaField> annotationWithInt = field.getAnnotationOfType(ClassWithAnnotatedFields.FieldAnnotationWithIntValue.class.getName());
assertThat(annotationWithInt.get("intValue").get()).as("Annotation value with default").isEqualTo(0);
assertThat(annotationWithInt.get("otherValue").get()).isEqualTo("overridden");
assertThat(field).isEquivalentTo(field.getOwner().reflect().getDeclaredField("stringAndIntAnnotatedField"));
}
use of com.tngtech.archunit.core.domain.JavaAnnotation in project ArchUnit by TNG.
the class ImportTestUtils method get.
private static Object get(Annotation annotation, Class<?> owner, String methodName, ImportContext importContext) {
try {
Method method = annotation.annotationType().getMethod(methodName);
method.setAccessible(true);
Object result = method.invoke(annotation);
if (result instanceof Class) {
return importContext.resolveClass(((Class<?>) result).getName());
}
if (result instanceof Class[]) {
List<JavaClass> classes = javaClassesFrom((Class<?>[]) result, importContext);
return classes.toArray(new JavaClass[0]);
}
if (result instanceof Enum<?>) {
return ImportTestUtils.enumConstant((Enum<?>) result);
}
if (result instanceof Enum[]) {
return enumConstants((Enum<?>[]) result);
}
if (result instanceof Annotation) {
return javaAnnotationFrom((Annotation) result, owner);
}
if (result instanceof Annotation[]) {
return javaAnnotationsFrom((Annotation[]) result, owner).toArray(new JavaAnnotation<?>[0]);
}
return result;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
Aggregations