package com.tngtech.archunit.lang.conditions;
import java.util.Set;
import com.google.common.collect.ImmutableSet;
import com.tngtech.archunit.core.domain.JavaClass;
import com.tngtech.archunit.lang.ArchCondition;
import com.tngtech.archunit.lang.ConditionEvents;
import com.tngtech.archunit.lang.conditions.testobjects.CallerClass;
import com.tngtech.archunit.lang.conditions.testobjects.TargetClass;
import org.junit.Test;
import static com.tngtech.archunit.core.domain.JavaCall.Predicates.target;
import static com.tngtech.archunit.core.domain.JavaClass.Predicates.type;
import static com.tngtech.archunit.core.domain.properties.HasName.Predicates.name;
import static com.tngtech.archunit.core.domain.properties.HasOwner.Predicates.With.owner;
import static com.tngtech.archunit.core.domain.properties.HasParameterTypes.Predicates.parameterTypes;
import static com.tngtech.archunit.lang.conditions.ArchConditions.callMethodWhere;
import static com.tngtech.archunit.lang.conditions.testobjects.TestObjects.CALLER_CLASS;
import static com.tngtech.archunit.testutil.Assertions.assertThat;
public class ClassCallsCodeUnitConditionTest {
private static final Set<String> VIOLATION_MESSAGE_PARTS = ImmutableSet.of(
CallerClass.methodThatCallsAppendString,
TargetClass.appendStringMethod,
CallerClass.callOfAppendStringLineNumber);
@Test
public void call_with_correct_name_and_params_matches() {
ConditionEvents events = checkCondition(
callMethodWhere(target(name(TargetClass.appendStringMethod))
.and(target(parameterTypes(TargetClass.appendStringParams)))
.and(target(owner(type(TargetClass.class))))));
assertThat(events).containNoViolation();
}
@Test
public void call_without_argument_doesnt_match() {
ConditionEvents events = checkCondition(callMethodWhere(
target(parameterTypes(new Class[0]))
.and(target(name(TargetClass.appendStringMethod))
.and(target(owner(type(TargetClass.class)))))));
assertThat(events).haveOneViolationMessageContaining(VIOLATION_MESSAGE_PARTS);
}
@Test
public void call_with_wrong_method_name_doesnt_match() {
ConditionEvents events = checkCondition(
callMethodWhere(target(name("wrong"))
.and(target(parameterTypes(TargetClass.appendStringParams)))
.and(target(owner(type(TargetClass.class))))));
assertThat(events).haveOneViolationMessageContaining(VIOLATION_MESSAGE_PARTS);
}
private ConditionEvents checkCondition(ArchCondition<JavaClass> condition) {
ConditionEvents events = new ConditionEvents();
condition.check(CALLER_CLASS, events);
return events;
}
}