package com.tngtech.archunit.junit;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.util.Collection;
import com.tngtech.archunit.junit.ReflectionUtils.Predicate;
import org.junit.Test;
import static com.tngtech.archunit.testutil.ReflectionTestUtils.field;
import static com.tngtech.archunit.testutil.ReflectionTestUtils.method;
import static org.assertj.core.api.Assertions.assertThat;
public class ReflectionUtilsTest {
@Test
public void getAllFields() {
Collection<Field> fields = ReflectionUtils.getAllFields(Child.class, named("field"));
assertThat(fields).containsOnly(
field(Child.class, "field"),
field(UpperMiddle.class, "field"),
field(LowerMiddle.class, "field"),
field(Parent.class, "field")
);
}
@Test
public void getAllMethods() {
Collection<Method> methods = ReflectionUtils.getAllMethods(Child.class, named("overrideMe"));
assertThat(methods).containsOnly(
method(Child.class, "overrideMe"),
method(UpperMiddle.class, "overrideMe"),
method(LowerMiddle.class, "overrideMe"),
method(Parent.class, "overrideMe")
);
}
@Test
public void getAllSupertypes() {
assertThat(ReflectionUtils.getAllSuperTypes(Child.class)).containsOnly(
Child.class, ChildInterface.class, UpperMiddle.class, LowerMiddle.class, Parent.class,
SomeInterface.class, OtherInterface.class, Object.class
);
}
@Test
public void getAllMethods_of_interface() {
assertThat(ReflectionUtils.getAllMethods(SubInterface.class, always(true)))
.containsOnly(
method(SomeInterface.class, "foo"),
method(OtherInterface.class, "bar"));
}
private <T> Predicate<T> always(final boolean bool) {
return new Predicate<T>() {
@Override
public boolean apply(T input) {
return bool;
}
};
}
@Test
public void getAllFields_of_interface() {
assertThat(ReflectionUtils.getAllFields(SubInterface.class, always(true)))
.containsOnly(
field(SomeInterface.class, "SOME_CONSTANT"),
field(OtherInterface.class, "OTHER_CONSTANT"));
}
private Predicate<Member> named(final String name) {
return new Predicate<Member>() {
@Override
public boolean apply(Member input) {
return input.getName().equals(name);
}
};
}
private static class Parent {
private int field;
private String other;
public Parent() {
}
void overrideMe() {
}
String someMethod(int param) {
return null;
}
}
private static class LowerMiddle extends Parent implements SomeInterface {
private int field;
public LowerMiddle() {
}
@Override
public void overrideMe() {
}
@Override
public void foo() {
}
}
private static class UpperMiddle extends LowerMiddle implements OtherInterface {
private int field;
private String other;
public UpperMiddle() {
}
@Override
public void overrideMe() {
}
@Override
String someMethod(int param) {
return null;
}
@Override
public void bar() {
}
}
private static class Child extends UpperMiddle implements ChildInterface {
private int field;
private String another;
public Child() {
}
@Override
public void overrideMe() {
}
@Override
public void child() {
}
}
private interface ChildInterface {
void child();
}
private interface SomeInterface {
String SOME_CONSTANT = "SOME";
void foo();
}
private interface OtherInterface {
String OTHER_CONSTANT = "OTHER";
void bar();
}
private interface SubInterface extends SomeInterface, OtherInterface {
}
}