package com.tngtech.archunit.library.dependencies; import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Pattern; import com.google.common.collect.ImmutableSet; import com.tngtech.archunit.base.DescribedIterable; import com.tngtech.archunit.core.domain.Dependency; import com.tngtech.archunit.core.domain.JavaClasses; import com.tngtech.archunit.core.domain.JavaMethod; import org.junit.Test; import static com.google.common.collect.Iterables.getOnlyElement; import static com.tngtech.archunit.core.domain.TestUtils.dependencyFrom; import static com.tngtech.archunit.core.domain.TestUtils.javaClassesViaReflection; import static com.tngtech.archunit.core.domain.TestUtils.javaMethodViaReflection; import static com.tngtech.archunit.core.domain.TestUtils.simulateCall; import static org.assertj.core.api.Assertions.assertThat; public class SlicesTest { @Test public void matches_slices() { JavaClasses classes = javaClassesViaReflection(Object.class, String.class, List.class, Set.class, Pattern.class); assertThat(Slices.matching("java.(*)..").transform(classes)).hasSize(2); assertThat(Slices.matching("(**)").transform(classes)).hasSize(3); assertThat(Slices.matching("java.(**)").transform(classes)).hasSize(3); assertThat(Slices.matching("java.(*).(*)").transform(classes)).hasSize(1); } @Test public void default_naming_slices() { JavaClasses classes = javaClassesViaReflection(Object.class, String.class, Pattern.class); DescribedIterable<Slice> slices = Slices.matching("java.(*)..").transform(classes); assertThat(slices).extractingResultOf("getDescription").containsOnly("Slice lang", "Slice util"); } @Test public void renaming_slices() { JavaClasses classes = javaClassesViaReflection(Object.class, String.class, Pattern.class); DescribedIterable<Slice> slices = Slices.matching("java.(*)..").namingSlices("Hallo $1").transform(classes); assertThat(slices).extractingResultOf("getDescription").containsOnly("Hallo lang", "Hallo util"); } @Test public void name_parts_are_resolved_correctly() { JavaClasses classes = javaClassesViaReflection(Object.class); DescribedIterable<Slice> slices = Slices.matching("(*).(*)..").transform(classes); assertThat(getOnlyElement(slices).getNamePart(1)).isEqualTo("java"); assertThat(getOnlyElement(slices).getNamePart(2)).isEqualTo("lang"); } @Test public void slices_of_dependencies() { JavaMethod methodThatCallsJavaUtil = javaMethodViaReflection(Object.class, "toString"); JavaMethod methodThatCallsJavaLang = javaMethodViaReflection(Map.class, "put", Object.class, Object.class); simulateCall().from(methodThatCallsJavaUtil, 5).to(methodThatCallsJavaLang); simulateCall().from(methodThatCallsJavaLang, 1).to(methodThatCallsJavaUtil); Dependency first = dependencyFrom(getOnlyElement(methodThatCallsJavaUtil.getMethodCallsFromSelf())); Dependency second = dependencyFrom(getOnlyElement(methodThatCallsJavaLang.getMethodCallsFromSelf())); Slices slices = Slices.matching("java.(*)..").transform(ImmutableSet.of(first, second)); assertThat(slices).extractingResultOf("getDescription").containsOnly("Slice lang", "Slice util"); } }