From ffe067a5435531fcaa5e9b91e258331c0e0ce062 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Gr=C3=A4ber?= Date: Fri, 10 Apr 2026 17:34:27 +0200 Subject: [PATCH] fix descriptions of targetOwner and originOwner predicates in JavaAccess MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit targetOwner and originOwner() were producing the same message as target() and origin() e.g. "access target where target is annotated with..." instead of "access target where target owner is annotated with..." The existing test is also updated to assert that the correct element is passed to the given predicate, for which new testUtils are introduced. Signed-off-by: Stefan Gräber --- .../archunit/core/domain/JavaAccess.java | 6 +-- .../archunit/core/domain/JavaAccessTest.java | 51 ++++++++++++++++--- .../archunit/core/domain/TestUtils.java | 47 ++++++++++++++++- 3 files changed, 91 insertions(+), 13 deletions(-) diff --git a/archunit/src/main/java/com/tngtech/archunit/core/domain/JavaAccess.java b/archunit/src/main/java/com/tngtech/archunit/core/domain/JavaAccess.java index c17f39c74f..fe81e0cd9a 100644 --- a/archunit/src/main/java/com/tngtech/archunit/core/domain/JavaAccess.java +++ b/archunit/src/main/java/com/tngtech/archunit/core/domain/JavaAccess.java @@ -25,13 +25,13 @@ import com.tngtech.archunit.core.Convertible; import com.tngtech.archunit.core.domain.properties.HasName; import com.tngtech.archunit.core.domain.properties.HasOwner; -import com.tngtech.archunit.core.domain.properties.HasOwner.Functions.Get; import com.tngtech.archunit.core.domain.properties.HasSourceCodeLocation; import com.tngtech.archunit.core.importer.DomainBuilders.JavaAccessBuilder; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.ImmutableSet.toImmutableSet; import static com.tngtech.archunit.PublicAPI.Usage.ACCESS; +import static com.tngtech.archunit.core.domain.properties.HasOwner.Predicates.With.owner; @PublicAPI(usage = ACCESS) public abstract class JavaAccess @@ -153,7 +153,7 @@ private Predicates() { @PublicAPI(usage = ACCESS) public static DescribedPredicate> originOwner(DescribedPredicate predicate) { - return origin(Get.owner().is(predicate)); + return origin(owner(predicate)); } @PublicAPI(usage = ACCESS) @@ -168,7 +168,7 @@ public static DescribedPredicate> originOwnerEqualsTargetOwner() { @PublicAPI(usage = ACCESS) public static DescribedPredicate> targetOwner(DescribedPredicate predicate) { - return target(Get.owner().is(predicate)); + return target(owner(predicate)); } @PublicAPI(usage = ACCESS) diff --git a/archunit/src/test/java/com/tngtech/archunit/core/domain/JavaAccessTest.java b/archunit/src/test/java/com/tngtech/archunit/core/domain/JavaAccessTest.java index d9e8c84014..69742144ed 100644 --- a/archunit/src/test/java/com/tngtech/archunit/core/domain/JavaAccessTest.java +++ b/archunit/src/test/java/com/tngtech/archunit/core/domain/JavaAccessTest.java @@ -1,13 +1,13 @@ package com.tngtech.archunit.core.domain; -import com.tngtech.archunit.base.DescribedPredicate; import com.tngtech.archunit.core.domain.AccessTarget.MethodCallTarget; import com.tngtech.archunit.core.domain.JavaAccess.Functions.Get; +import com.tngtech.archunit.core.domain.TestUtils.CapturingDescribedPredicate; import com.tngtech.archunit.core.importer.testexamples.SomeClass; import com.tngtech.archunit.core.importer.testexamples.SomeEnum; import org.junit.Test; -import static com.tngtech.archunit.base.DescribedPredicate.alwaysFalse; +import static com.tngtech.archunit.core.domain.TestUtils.alwaysTrueCapturingPredicateWithDescription; import static com.tngtech.archunit.core.domain.TestUtils.importClassWithContext; import static com.tngtech.archunit.core.domain.TestUtils.importClassesWithContext; import static com.tngtech.archunit.core.domain.TestUtils.newMethodCallBuilder; @@ -49,15 +49,50 @@ public void get_functions() { @Test public void origin_predicate() { - DescribedPredicate> predicate = - JavaAccess.Predicates.origin(DescribedPredicate.alwaysTrue().as("some text")); + TestJavaAccess testedAccess = anyAccess(); + CapturingDescribedPredicate nestedPredicate = alwaysTrueCapturingPredicateWithDescription("some text"); - assertThat(predicate) + assertThat(JavaAccess.Predicates.origin(nestedPredicate)) .hasDescription("origin some text") - .accepts(anyAccess()); + .accepts(testedAccess); - predicate = JavaAccess.Predicates.origin(alwaysFalse()); - assertThat(predicate).rejects(anyAccess()); + assertThat(nestedPredicate.getCapturedValue()).isEqualTo(testedAccess.getOrigin()); + } + + @Test + public void originOwner_predicate() { + TestJavaAccess testedAccess = anyAccess(); + CapturingDescribedPredicate nestedPredicate = alwaysTrueCapturingPredicateWithDescription("some text"); + + assertThat(JavaAccess.Predicates.originOwner(nestedPredicate)) + .hasDescription("origin owner some text") + .accepts(testedAccess); + + assertThat(nestedPredicate.getCapturedValue()).isEqualTo(testedAccess.getOriginOwner()); + } + + @Test + public void target_predicate() { + TestJavaAccess testedAccess = anyAccess(); + CapturingDescribedPredicate nestedPredicate = alwaysTrueCapturingPredicateWithDescription("some text"); + + assertThat(JavaAccess.Predicates.target(nestedPredicate)) + .hasDescription("target some text") + .accepts(testedAccess); + + assertThat(nestedPredicate.getCapturedValue()).isEqualTo(testedAccess.getTarget()); + } + + @Test + public void targetOwner_predicate() { + TestJavaAccess testedAccess = anyAccess(); + CapturingDescribedPredicate nestedPredicate = alwaysTrueCapturingPredicateWithDescription("some text"); + + assertThat(JavaAccess.Predicates.targetOwner(nestedPredicate)) + .hasDescription("target owner some text") + .accepts(testedAccess); + + assertThat(nestedPredicate.getCapturedValue()).isEqualTo(testedAccess.getTargetOwner()); } @Test diff --git a/archunit/src/test/java/com/tngtech/archunit/core/domain/TestUtils.java b/archunit/src/test/java/com/tngtech/archunit/core/domain/TestUtils.java index 7599b1807b..716aacce42 100644 --- a/archunit/src/test/java/com/tngtech/archunit/core/domain/TestUtils.java +++ b/archunit/src/test/java/com/tngtech/archunit/core/domain/TestUtils.java @@ -2,10 +2,13 @@ import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.function.Predicate; import com.google.common.collect.ImmutableSet; import com.google.common.io.Files; @@ -31,6 +34,7 @@ import static java.util.Arrays.stream; import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toSet; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.util.Files.newTemporaryFile; import static org.mockito.ArgumentMatchers.anySet; import static org.mockito.ArgumentMatchers.eq; @@ -102,8 +106,47 @@ public static AccessesSimulator simulateCall() { return new AccessesSimulator(); } - public static DescribedPredicate predicateWithDescription(String description) { - return DescribedPredicate.alwaysTrue().as(description); + public static DescribedPredicate predicateWithDescription(String description) { + return DescribedPredicate.alwaysTrue().as(description); + } + + public static CapturingDescribedPredicate alwaysFalseCapturingPredicateWithDescription(String description) { + return new CapturingDescribedPredicate(false, description); + } + + public static CapturingDescribedPredicate alwaysTrueCapturingPredicateWithDescription(String description) { + return new CapturingDescribedPredicate(true, description); + } + + public static class CapturingDescribedPredicate extends DescribedPredicate { + + private final List capturedValues; + private final Predicate check; + + public CapturingDescribedPredicate(boolean result, String description, Object... params) { + this(o -> result, description, params); + } + + public CapturingDescribedPredicate(Predicate check, String description, Object... params) { + super(description, params); + this.check = check; + this.capturedValues = new ArrayList<>(); + } + + @Override + public boolean test(T t) { + this.capturedValues.add(t); + return check.test(t); + } + + public List getCapturedValues() { + return Collections.unmodifiableList(new ArrayList<>(capturedValues)); + } + + public T getCapturedValue() { + assertThat(capturedValues).as("to get the captured value, exactly one value must have been captured").hasSize(1); + return capturedValues.get(0); + } } public static MethodCallTarget resolvedTargetFrom(JavaMethod target) {