diff --git a/archunit/src/test/java/com/tngtech/archunit/core/domain/JavaTypeTraversalTest.java b/archunit/src/test/java/com/tngtech/archunit/core/domain/JavaTypeTraversalTest.java index e26892cda..4e15daccb 100644 --- a/archunit/src/test/java/com/tngtech/archunit/core/domain/JavaTypeTraversalTest.java +++ b/archunit/src/test/java/com/tngtech/archunit/core/domain/JavaTypeTraversalTest.java @@ -1,6 +1,7 @@ package com.tngtech.archunit.core.domain; import java.io.File; +import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -350,6 +351,39 @@ > void method(Set param) { assertThat(traversedTypes).containsExactlyElementsOf(types); } + @Test + public void stops_depth_first_traversal_once_STOP_is_received() { + @SuppressWarnings("unused") + class SomeClass { + & Serializable> void method(T param) { + } + } + + JavaType type = new ClassFileImporter().importClass(SomeClass.class) + .getMethod("method", Map.class).getParameterTypes().get(0); + + ExpectedTypes types = new ExpectedTypes(); + JavaTypeVariable typeVariableT = types.expect(type); + types.expect(typeVariableT.getUpperBounds().get(0)); + + List traversedTypes = new ArrayList<>(); + type.traverseSignature(new AllRejectingSignatureVisitor() { + @Override + public Result visitTypeVariable(JavaTypeVariable type) { + traversedTypes.add(type); + return Result.CONTINUE; + } + + @Override + public Result visitParameterizedType(JavaParameterizedType type) { + traversedTypes.add(type); + return Result.STOP; + } + }); + + assertThat(traversedTypes).containsExactlyElementsOf(types); + } + private static JavaType.SignatureVisitor newTrackingVisitor(List traversedTypes) { return new JavaType.SignatureVisitor() { @Override