[MRESOLVER-12] Addition of unit tests for DependencySelector implementations
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectorTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectorTest.java
index 88ced9f..87d887d 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectorTest.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectorTest.java
@@ -48,6 +48,7 @@
import org.eclipse.aether.collection.DependencyCollectionException;
import org.eclipse.aether.collection.DependencyManagement;
import org.eclipse.aether.collection.DependencyManager;
+import org.eclipse.aether.collection.DependencySelector;
import org.eclipse.aether.graph.DefaultDependencyNode;
import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.graph.DependencyCycle;
@@ -68,6 +69,7 @@
import org.eclipse.aether.util.graph.manager.DefaultDependencyManager;
import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
import org.eclipse.aether.util.graph.manager.TransitiveDependencyManager;
+import org.eclipse.aether.util.graph.selector.OptionalDependencySelector;
import org.eclipse.aether.util.graph.selector.ScopeDependencySelector;
import org.eclipse.aether.util.graph.version.HighestVersionFilter;
import org.junit.Before;
@@ -389,12 +391,14 @@
collector.setArtifactDescriptorReader( new ArtifactDescriptorReader()
{
+
public ArtifactDescriptorResult readArtifactDescriptor( RepositorySystemSession session,
ArtifactDescriptorRequest request )
{
repos.addAll( request.getRepositories() );
return new ArtifactDescriptorResult( request );
}
+
} );
List<Dependency> dependencies = Arrays.asList( newDep( "verrange:parent:jar:1[1,)", "compile" ) );
@@ -541,6 +545,268 @@
assertEqualSubtree( expectedTree, toDependencyResult( result.getRoot(), "compile", null ) );
}
+ @Test
+ public void testDependencyManagement_DependencySelectorProcessesManagedState()
+ throws DependencyCollectionException, IOException
+ {
+ collector.setArtifactDescriptorReader( newReader( "selection/managed/" ) );
+ parser = new DependencyGraphParser( "artifact-descriptions/selection/managed/" );
+
+ final Dependency root = newDep( "gid:root:ext:ver", "root-scope" );
+ CollectRequest request = new CollectRequest( root, Arrays.asList( repository ) );
+ CollectResult result = collector.collectDependencies( session, request );
+
+ DependencyNode expected = parser.parseResource( "all-nodes.txt" );
+ assertEqualSubtree( expected, result.getRoot() );
+
+ this.session.setDependencySelector( new DependencySelector()
+ {
+
+ public boolean selectDependency( final Dependency dependency )
+ {
+ return dependency != null
+ && !( "managed".equals( dependency.getScope() )
+ || "managed".equals( dependency.getArtifact().getVersion() )
+ || dependency.isOptional() );
+
+ }
+
+ public DependencySelector deriveChildSelector( final DependencyCollectionContext context )
+ {
+ return this;
+ }
+
+ } );
+
+ // Tests managed scope is processed by selector.
+ TestDependencyManager depMgmt = new TestDependencyManager();
+ depMgmt.scope( "gid:transitive-of-transitive-of-root:ext", "managed" );
+ session.setDependencyManager( depMgmt );
+
+ expected = parser.parseResource( "transitive-of-transitive-of-root.txt" );
+
+ request = new CollectRequest( root, Arrays.asList( repository ) );
+ result = collector.collectDependencies( session, request );
+
+ assertEqualSubtree( expected, result.getRoot() );
+
+ depMgmt = new TestDependencyManager();
+ depMgmt.scope( "gid:transitive-of-root:ext", "managed" );
+ session.setDependencyManager( depMgmt );
+
+ expected = parser.parseResource( "transitive-of-root.txt" );
+
+ request = new CollectRequest( root, Arrays.asList( repository ) );
+ result = collector.collectDependencies( session, request );
+
+ assertEqualSubtree( expected, result.getRoot() );
+
+ depMgmt = new TestDependencyManager();
+ depMgmt.scope( "gid:direct-of-root:ext", "managed" );
+ session.setDependencyManager( depMgmt );
+
+ expected = parser.parseResource( "direct-of-root.txt" );
+
+ request = new CollectRequest( root, Arrays.asList( repository ) );
+ result = collector.collectDependencies( session, request );
+
+ assertEqualSubtree( expected, result.getRoot() );
+
+ // Tests managed optionality is processed by selector.
+ depMgmt = new TestDependencyManager();
+ depMgmt.optional( "gid:transitive-of-transitive-of-root:ext", Boolean.TRUE );
+ session.setDependencyManager( depMgmt );
+
+ expected = parser.parseResource( "transitive-of-transitive-of-root.txt" );
+
+ request = new CollectRequest( root, Arrays.asList( repository ) );
+ result = collector.collectDependencies( session, request );
+
+ assertEqualSubtree( expected, result.getRoot() );
+
+ depMgmt = new TestDependencyManager();
+ depMgmt.optional( "gid:transitive-of-root:ext", Boolean.TRUE );
+ session.setDependencyManager( depMgmt );
+
+ expected = parser.parseResource( "transitive-of-root.txt" );
+
+ request = new CollectRequest( root, Arrays.asList( repository ) );
+ result = collector.collectDependencies( session, request );
+
+ assertEqualSubtree( expected, result.getRoot() );
+
+ depMgmt = new TestDependencyManager();
+ depMgmt.optional( "gid:direct-of-root:ext", Boolean.TRUE );
+ session.setDependencyManager( depMgmt );
+
+ expected = parser.parseResource( "direct-of-root.txt" );
+
+ request = new CollectRequest( root, Arrays.asList( repository ) );
+ result = collector.collectDependencies( session, request );
+
+ assertEqualSubtree( expected, result.getRoot() );
+
+ // Tests managed version is processed by selector.
+ depMgmt = new TestDependencyManager();
+ depMgmt.version( "gid:transitive-of-transitive-of-root:ext", "managed" );
+ session.setDependencyManager( depMgmt );
+
+ expected = parser.parseResource( "transitive-of-transitive-of-root.txt" );
+
+ request = new CollectRequest( root, Arrays.asList( repository ) );
+ result = collector.collectDependencies( session, request );
+
+ assertEqualSubtree( expected, result.getRoot() );
+
+ depMgmt = new TestDependencyManager();
+ depMgmt.version( "gid:transitive-of-root:ext", "managed" );
+ session.setDependencyManager( depMgmt );
+
+ expected = parser.parseResource( "transitive-of-root.txt" );
+
+ request = new CollectRequest( root, Arrays.asList( repository ) );
+ result = collector.collectDependencies( session, request );
+
+ assertEqualSubtree( expected, result.getRoot() );
+
+ depMgmt = new TestDependencyManager();
+ depMgmt.version( "gid:direct-of-root:ext", "managed" );
+ session.setDependencyManager( depMgmt );
+
+ expected = parser.parseResource( "direct-of-root.txt" );
+
+ request = new CollectRequest( root, Arrays.asList( repository ) );
+ result = collector.collectDependencies( session, request );
+
+ assertEqualSubtree( expected, result.getRoot() );
+ }
+
+ @Test
+ public void testSelectionWithScopeDependencySelector()
+ throws DependencyCollectionException, IOException
+ {
+ collector.setArtifactDescriptorReader( newReader( "selection/scope/" ) );
+ parser = new DependencyGraphParser( "artifact-descriptions/selection/scope/" );
+ session.setDependencySelector( null );
+
+ final DependencyNode allNodes = parser.parseResource( "all-nodes.txt" );
+ final DependencyNode transitive1ExclusionTree = parser.parseResource( "transitive-1-exclusion-tree.txt" );
+ final DependencyNode transitive2ExclusionTree = parser.parseResource( "transitive-2-exclusion-tree.txt" );
+ final Dependency root = newDep( "gid:root:ext:ver", "root-scope" );
+ final CollectRequest request = new CollectRequest( root, Arrays.asList( repository ) );
+ CollectResult result = collector.collectDependencies( session, request );
+ assertEqualSubtree( allNodes, result.getRoot() );
+
+ /*
+ A dependency selector that filters transitive dependencies based on their scope. Direct dependencies are always
+ included regardless of their scope.
+ */
+ // Include all.
+ this.session.setDependencySelector( new ScopeDependencySelector() );
+ result = collector.collectDependencies( session, request );
+ assertEqualSubtree( allNodes, result.getRoot() );
+
+ // Exclude root scope equals include all as the root is always included.
+ this.session.setDependencySelector( new ScopeDependencySelector( "root-scope" ) );
+ result = collector.collectDependencies( session, request );
+ assertEqualSubtree( allNodes, result.getRoot() );
+
+ // Exclude direct scope equals include all as direct dependencies are always included.
+ this.session.setDependencySelector( new ScopeDependencySelector( "direct-scope" ) );
+ result = collector.collectDependencies( session, request );
+ assertEqualSubtree( allNodes, result.getRoot() );
+
+ // Exclude scope of transitive of direct.
+ this.session.setDependencySelector( new ScopeDependencySelector( "transitive-1-scope" ) );
+ result = collector.collectDependencies( session, request );
+ assertEqualSubtree( transitive1ExclusionTree, result.getRoot() );
+
+ // Exclude scope of transitive of transitive of direct dependency.
+ this.session.setDependencySelector( new ScopeDependencySelector( "transitive-2-scope" ) );
+ result = collector.collectDependencies( session, request );
+ assertEqualSubtree( transitive2ExclusionTree, result.getRoot() );
+
+ // Same test as above but with root artifact instead of root dependency.
+ this.session.setDependencySelector( null );
+ final CollectRequest rootArtifactRequest = new CollectRequest();
+ rootArtifactRequest.setRootArtifact( new DefaultArtifact( "gid:root:ext:ver" ) );
+ rootArtifactRequest.addDependency( newDep( "gid:direct:ext:ver", "direct-scope" ) );
+ rootArtifactRequest.setRepositories( Arrays.asList( repository ) );
+
+ result = collector.collectDependencies( session, rootArtifactRequest );
+ assertNull( result.getRoot().getDependency() );
+ assertEqualSubtree( allNodes, toDependencyResult( result.getRoot(), "root-scope", null ) );
+
+ /*
+ A dependency selector that filters transitive dependencies based on their scope. Direct dependencies are always
+ included regardless of their scope.
+ */
+ // Include all.
+ this.session.setDependencySelector( new ScopeDependencySelector() );
+ result = collector.collectDependencies( session, rootArtifactRequest );
+ assertNull( result.getRoot().getDependency() );
+ assertEqualSubtree( allNodes, toDependencyResult( result.getRoot(), "root-scope", null ) );
+
+ // Exclude direct scope equals include all as direct dependencies are always included.
+ this.session.setDependencySelector( new ScopeDependencySelector( "direct-scope" ) );
+ result = collector.collectDependencies( session, rootArtifactRequest );
+ assertNull( result.getRoot().getDependency() );
+ assertEqualSubtree( allNodes, toDependencyResult( result.getRoot(), "root-scope", null ) );
+
+ // Exclude scope of transitive of direct.
+ this.session.setDependencySelector( new ScopeDependencySelector( "transitive-1-scope" ) );
+ result = collector.collectDependencies( session, rootArtifactRequest );
+ assertNull( result.getRoot().getDependency() );
+ assertEqualSubtree( transitive1ExclusionTree, toDependencyResult( result.getRoot(), "root-scope", null ) );
+
+ // Exclude scope of transitive of transitive of direct dependency.
+ this.session.setDependencySelector( new ScopeDependencySelector( "transitive-2-scope" ) );
+ result = collector.collectDependencies( session, rootArtifactRequest );
+ assertNull( result.getRoot().getDependency() );
+ assertEqualSubtree( transitive2ExclusionTree, toDependencyResult( result.getRoot(), "root-scope", null ) );
+ }
+
+ @Test
+ public void testSelectionWithOptionalDependencySelector()
+ throws DependencyCollectionException, IOException
+ {
+ collector.setArtifactDescriptorReader( newReader( "selection/optional/" ) );
+ parser = new DependencyGraphParser( "artifact-descriptions/selection/optional/" );
+ session.setDependencySelector( null );
+
+ final DependencyNode allNodes = parser.parseResource( "all-nodes.txt" );
+ final DependencyNode optionalTransitiveExclusionTree =
+ parser.parseResource( "optional-transitive-exclusion-tree.txt" );
+
+ final Dependency root = newDep( "gid:root:ext:ver", "root-scope" ).setOptional( true );
+ // No selector. Include all.
+ final CollectRequest request = new CollectRequest( root, Arrays.asList( repository ) );
+ CollectResult result = collector.collectDependencies( session, request );
+ assertEqualSubtree( allNodes, result.getRoot() );
+
+ // A dependency selector that excludes transitive optional dependencies.
+ this.session.setDependencySelector( new OptionalDependencySelector() );
+ result = collector.collectDependencies( session, request );
+ assertEqualSubtree( optionalTransitiveExclusionTree, result.getRoot() );
+
+ // Same test as above but with root artifact instead of root dependency.
+ this.session.setDependencySelector( null );
+ final Artifact rootArtifact = new DefaultArtifact( "gid:root:ext:ver" );
+ final CollectRequest rootArtifactRequest = new CollectRequest();
+ rootArtifactRequest.setRootArtifact( rootArtifact );
+ rootArtifactRequest.addDependency( newDep( "gid:direct:ext:ver", "direct-scope" ).setOptional( true ) );
+ result = collector.collectDependencies( session, rootArtifactRequest );
+ assertNull( result.getRoot().getDependency() );
+ assertEqualSubtree( allNodes, toDependencyResult( result.getRoot(), "root-scope", true ) );
+
+ // A dependency selector that excludes transitive optional dependencies.
+ this.session.setDependencySelector( new OptionalDependencySelector() );
+ result = collector.collectDependencies( session, rootArtifactRequest );
+ assertNull( result.getRoot().getDependency() );
+ assertEqualSubtree( optionalTransitiveExclusionTree,
+ toDependencyResult( result.getRoot(), "root-scope", true ) );
+ }
+
private DependencyNode toDependencyResult( final DependencyNode root, final String rootScope,
final Boolean optional )
{
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/all-nodes.txt b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/all-nodes.txt
new file mode 100644
index 0000000..6caeee1
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/all-nodes.txt
@@ -0,0 +1,4 @@
+gid:root:ext:ver root-scope
++- gid:direct-of-root:ext:ver direct-of-root-scope
+ +- gid:transitive-of-root:ext:ver transitive-of-root-scope
+ +- gid:transitive-of-transitive-of-root:ext:ver transitive-of-transitive-of-root-scope
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/direct-of-root.txt b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/direct-of-root.txt
new file mode 100644
index 0000000..e7b354d
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/direct-of-root.txt
@@ -0,0 +1 @@
+gid:root:ext:ver root-scope
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/gid_direct-of-root_ver.ini b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/gid_direct-of-root_ver.ini
new file mode 100644
index 0000000..a801f3f
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/gid_direct-of-root_ver.ini
@@ -0,0 +1,2 @@
+[dependencies]
+gid:transitive-of-root:ext:ver:transitive-of-root-scope
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/gid_root_ver.ini b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/gid_root_ver.ini
new file mode 100644
index 0000000..37fe9ac
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/gid_root_ver.ini
@@ -0,0 +1,2 @@
+[dependencies]
+gid:direct-of-root:ext:ver:direct-of-root-scope
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/gid_transitive-of-root_ver.ini b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/gid_transitive-of-root_ver.ini
new file mode 100644
index 0000000..e34fa04
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/gid_transitive-of-root_ver.ini
@@ -0,0 +1,2 @@
+[dependencies]
+gid:transitive-of-transitive-of-root:ext:ver:transitive-of-transitive-of-root-scope
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/gid_transitive-of-transitive-of-root_ver.ini b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/gid_transitive-of-transitive-of-root_ver.ini
new file mode 100644
index 0000000..61a252c
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/gid_transitive-of-transitive-of-root_ver.ini
@@ -0,0 +1 @@
+[dependencies]
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/transitive-of-root.txt b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/transitive-of-root.txt
new file mode 100644
index 0000000..dbee99b
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/transitive-of-root.txt
@@ -0,0 +1,2 @@
+gid:root:ext:ver root-scope
++- gid:direct-of-root:ext:ver direct-of-root-scope
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/transitive-of-transitive-of-root.txt b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/transitive-of-transitive-of-root.txt
new file mode 100644
index 0000000..ef3dc74
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/managed/transitive-of-transitive-of-root.txt
@@ -0,0 +1,3 @@
+gid:root:ext:ver root-scope
++- gid:direct-of-root:ext:ver direct-of-root-scope
+ +- gid:transitive-of-root:ext:ver transitive-of-root-scope
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/optional/all-nodes.txt b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/optional/all-nodes.txt
new file mode 100644
index 0000000..89de14f
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/optional/all-nodes.txt
@@ -0,0 +1,4 @@
+gid:root:ext:ver root-scope optional
++- gid:direct:ext:ver direct-scope optional
+ +- gid:transitive-1:ext:ver transitive-1-scope optional
+ +- gid:transitive-2:ext:ver transitive-2-scope optional
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/optional/gid_direct_ver.ini b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/optional/gid_direct_ver.ini
new file mode 100644
index 0000000..0bcf1f8
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/optional/gid_direct_ver.ini
@@ -0,0 +1,2 @@
+[dependencies]
+gid:transitive-1:ext:ver:transitive-1-scope:optional
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/optional/gid_root_ver.ini b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/optional/gid_root_ver.ini
new file mode 100644
index 0000000..a7e6ac1
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/optional/gid_root_ver.ini
@@ -0,0 +1,2 @@
+[dependencies]
+gid:direct:ext:ver:direct-scope:optional
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/optional/gid_transitive-1_ver.ini b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/optional/gid_transitive-1_ver.ini
new file mode 100644
index 0000000..7428741
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/optional/gid_transitive-1_ver.ini
@@ -0,0 +1,2 @@
+[dependencies]
+gid:transitive-2:ext:ver:transitive-2-scope:optional
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/optional/gid_transitive-2_ver.ini b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/optional/gid_transitive-2_ver.ini
new file mode 100644
index 0000000..61a252c
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/optional/gid_transitive-2_ver.ini
@@ -0,0 +1 @@
+[dependencies]
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/optional/optional-transitive-exclusion-tree.txt b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/optional/optional-transitive-exclusion-tree.txt
new file mode 100644
index 0000000..34fa909
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/optional/optional-transitive-exclusion-tree.txt
@@ -0,0 +1,2 @@
+gid:root:ext:ver root-scope optional
++- gid:direct:ext:ver direct-scope optional
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/all-nodes.txt b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/all-nodes.txt
new file mode 100644
index 0000000..8bec12e
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/all-nodes.txt
@@ -0,0 +1,4 @@
+gid:root:ext:ver root-scope
++- gid:direct:ext:ver direct-scope
+ +- gid:transitive-1:ext:ver transitive-1-scope
+ +- gid:transitive-2:ext:ver transitive-2-scope
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/gid_direct_ver.ini b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/gid_direct_ver.ini
new file mode 100644
index 0000000..aad5f7a
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/gid_direct_ver.ini
@@ -0,0 +1,2 @@
+[dependencies]
+gid:transitive-1:ext:ver:transitive-1-scope
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/gid_root_ver.ini b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/gid_root_ver.ini
new file mode 100644
index 0000000..175e571
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/gid_root_ver.ini
@@ -0,0 +1,2 @@
+[dependencies]
+gid:direct:ext:ver:direct-scope
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/gid_transitive-1_ver.ini b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/gid_transitive-1_ver.ini
new file mode 100644
index 0000000..56b4533
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/gid_transitive-1_ver.ini
@@ -0,0 +1,2 @@
+[dependencies]
+gid:transitive-2:ext:ver:transitive-2-scope
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/gid_transitive-2_ver.ini b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/gid_transitive-2_ver.ini
new file mode 100644
index 0000000..61a252c
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/gid_transitive-2_ver.ini
@@ -0,0 +1 @@
+[dependencies]
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/transitive-1-exclusion-tree.txt b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/transitive-1-exclusion-tree.txt
new file mode 100644
index 0000000..509afac
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/transitive-1-exclusion-tree.txt
@@ -0,0 +1,2 @@
+gid:root:ext:ver root-scope
++- gid:direct:ext:ver direct-scope
diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/transitive-2-exclusion-tree.txt b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/transitive-2-exclusion-tree.txt
new file mode 100644
index 0000000..b3b0563
--- /dev/null
+++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/selection/scope/transitive-2-exclusion-tree.txt
@@ -0,0 +1,3 @@
+gid:root:ext:ver root-scope
++- gid:direct:ext:ver direct-scope
+ +- gid:transitive-1:ext:ver transitive-1-scope