package com.tngtech.archunit.core.domain;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.tngtech.archunit.base.DescribedPredicate;
import org.junit.Test;
import static com.tngtech.archunit.core.domain.TestUtils.javaClassViaReflection;
import static org.assertj.core.api.Assertions.assertThat;
public class JavaClassesTest {
private static final JavaClass SOME_CLASS = javaClassViaReflection(SomeClass.class);
private static final JavaClass SOME_OTHER_CLASS = javaClassViaReflection(SomeOtherClass.class);
private static final ImmutableMap<String, JavaClass> BY_TYPE_NAME = ImmutableMap.of(
SomeClass.class.getName(), SOME_CLASS,
SomeOtherClass.class.getName(), SOME_OTHER_CLASS);
public static final JavaClasses ALL_CLASSES = new JavaClasses(BY_TYPE_NAME, "classes");
@Test
public void restriction_on_classes_should_filter_the_elements() {
JavaClasses onlySomeClass = ALL_CLASSES.that(haveTheNameOf(SomeClass.class));
assertThat(onlySomeClass).containsExactly(SOME_CLASS);
}
@Test
public void restriction_on_classes_should_set_description() {
JavaClasses onlySomeClass = ALL_CLASSES.that(haveTheNameOf(SomeClass.class));
assertThat(onlySomeClass.getDescription()).
isEqualTo("classes that have the name " + SOME_CLASS.getSimpleName());
}
@Test
public void restriction_on_classes_with_undescribed_predicate_should_keep_the_old_description() {
JavaClasses allOriginalElements = ALL_CLASSES.that(EXIST);
assertThat(allOriginalElements.getDescription()).isEqualTo("classes that exist");
allOriginalElements = ALL_CLASSES.that(EXIST).as("customized");
assertThat(allOriginalElements.getDescription()).isEqualTo("customized");
}
@Test
public void contain_type() {
assertThat(ALL_CLASSES.contain(getClass())).isFalse();
assertThat(ALL_CLASSES.contain(SomeOtherClass.class)).isTrue();
}
@Test
public void get_returns_correct_JavaClass() {
assertThat(ALL_CLASSES.get(SomeOtherClass.class)).isEqualTo(SOME_OTHER_CLASS);
assertThat(ALL_CLASSES.get(SomeOtherClass.class.getName())).isEqualTo(SOME_OTHER_CLASS);
}
@Test
public void javaClasses_of_iterable() {
ImmutableSet<JavaClass> iterable = ImmutableSet.of(javaClassViaReflection(JavaClassesTest.class), javaClassViaReflection(JavaClass.class));
JavaClasses classes = JavaClasses.of(iterable);
assertThat(ImmutableSet.copyOf(classes)).isEqualTo(iterable);
}
private DescribedPredicate<JavaClass> haveTheNameOf(final Class<?> clazz) {
return new DescribedPredicate<JavaClass>("have the name " + clazz.getSimpleName()) {
@Override
public boolean apply(JavaClass input) {
return input.getName().equals(clazz.getName());
}
};
}
private static final DescribedPredicate<JavaClass> EXIST = new DescribedPredicate<JavaClass>("exist") {
@Override
public boolean apply(JavaClass input) {
return true;
}
};
private static class SomeClass {
}
private static class SomeOtherClass {
}
}