[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