package cn.yunzhixue.ability.center.architecture; import com.tngtech.archunit.core.domain.JavaClass; import com.tngtech.archunit.core.importer.ImportOption; import com.tngtech.archunit.junit.AnalyzeClasses; import com.tngtech.archunit.junit.ArchTest; import com.tngtech.archunit.lang.ArchRule; import com.tngtech.archunit.base.DescribedPredicate; import java.util.Set; import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses; @AnalyzeClasses( packages = "cn.yunzhixue.ability.center.examsprint", importOptions = ImportOption.DoNotIncludeTests.class) class ExamSprintArchitectureTest { private static final Set CURRENT_DOMAIN_CONTRACT_DEBT = Set.of( "ExamSprintReport", "ExamSprintReportRenderer", "ExamSprintReportStorage"); private static final Set CURRENT_DOMAIN_JACKSON_DEBT = Set.of( "ExamSprintReport", "ExamSprintReportRenderer"); @ArchTest static final ArchRule contracts_should_not_depend_on_inner_layers = noClasses() .that().resideInAPackage("..contracts..") .should().dependOnClassesThat().resideInAnyPackage( "..domain..", "..application..", "..infrastructure..", "..adapter.." ); @ArchTest static final ArchRule infrastructure_should_not_depend_on_runtime_adapters = noClasses() .that().resideInAPackage("..infrastructure..") .should().dependOnClassesThat().resideInAnyPackage( "..adapter..", "..configuration.." ); @ArchTest static final ArchRule new_domain_classes_should_not_depend_on_contracts = noClasses() .that().resideInAPackage("..domain..") .and(areNotNamed(CURRENT_DOMAIN_CONTRACT_DEBT)) .should().dependOnClassesThat().resideInAPackage("..contracts.."); @ArchTest static final ArchRule new_domain_classes_should_not_depend_on_jackson = noClasses() .that().resideInAPackage("..domain..") .and(areNotNamed(CURRENT_DOMAIN_JACKSON_DEBT)) .should().dependOnClassesThat().resideInAnyPackage( "com.fasterxml.jackson.." ); private static DescribedPredicate areNotNamed(Set simpleNames) { return new DescribedPredicate<>("are not named " + simpleNames) { @Override public boolean test(JavaClass input) { return !simpleNames.contains(input.getSimpleName()); } }; } }