You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by mi...@apache.org on 2019/05/12 18:54:03 UTC

[maven-resolver] 01/01: [MRESOLVER-12] Addition of unit tests for the various DependencySelector implementations to test things are working as documented.

This is an automated email from the ASF dual-hosted git repository.

michaelo pushed a commit to branch MRESOLVER-12
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git

commit 1acaa3d50d4dea46f2d61abc35f3bb23c3a592d6
Author: Christian Schulte <cs...@schulte.it>
AuthorDate: Sun Oct 22 05:15:43 2017 +0200

    [MRESOLVER-12] Addition of unit tests for the various DependencySelector implementations to test things are working as documented.
    
    Two tests fail because they rely on behavior previously defined:
    [ERROR] Failures:
    [ERROR]   DefaultDependencyCollectorTest.testDependencyManagement_DependencySelectorProcessesManagedState:555->assertEqualSubtree:122->assertEqualSubtree:152->assertEqualSubtree:152->assertEqualSubtree:144 path: [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)], expected: [], actual: [gid:transitive-of-transitive-of-root:ext:ver (managed)] expected:<0> but was:<1>
    [ERROR]   DefaultDependencyCollectorTest.testSelectionWithScopeDependencySelector:729->assertEqualSubtree:122->assertEqualSubtree:144 path: [gid:root:ext:ver (root-scope)], expected: [gid:direct:ext:ver (direct-scope)], actual: [] expected:<1> but was:<0>
    [INFO]
    [ERROR] Tests run: 192, Failures: 2, Errors: 0, Skipped: 0
---
 .../collect/DefaultDependencyCollectorTest.java    | 284 +++++++++++++++++++++
 .../selection/managed/all-nodes.txt                |   4 +
 .../selection/managed/direct-of-root.txt           |   1 +
 .../selection/managed/gid_direct-of-root_ver.ini   |   2 +
 .../selection/managed/gid_root_ver.ini             |   2 +
 .../managed/gid_transitive-of-root_ver.ini         |   2 +
 .../gid_transitive-of-transitive-of-root_ver.ini   |   1 +
 .../selection/managed/transitive-of-root.txt       |   2 +
 .../managed/transitive-of-transitive-of-root.txt   |   3 +
 .../selection/optional/all-nodes.txt               |   4 +
 .../selection/optional/gid_direct_ver.ini          |   2 +
 .../selection/optional/gid_root_ver.ini            |   2 +
 .../selection/optional/gid_transitive-1_ver.ini    |   2 +
 .../selection/optional/gid_transitive-2_ver.ini    |   1 +
 .../optional-transitive-exclusion-tree.txt         |   2 +
 .../selection/scope/all-nodes.txt                  |   4 +
 .../selection/scope/gid_direct_ver.ini             |   2 +
 .../selection/scope/gid_root_ver.ini               |   2 +
 .../selection/scope/gid_transitive-1_ver.ini       |   2 +
 .../selection/scope/gid_transitive-2_ver.ini       |   1 +
 .../scope/transitive-1-exclusion-tree.txt          |   2 +
 .../scope/transitive-2-exclusion-tree.txt          |   3 +
 22 files changed, 330 insertions(+)

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 94c504e..a3cd188 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
@@ -21,6 +21,7 @@ package org.eclipse.aether.internal.impl.collect;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -47,6 +48,8 @@ import org.eclipse.aether.collection.DependencyCollectionContext;
 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;
 import org.eclipse.aether.graph.DependencyNode;
@@ -64,6 +67,7 @@ import org.eclipse.aether.resolution.ArtifactDescriptorResult;
 import org.eclipse.aether.util.artifact.ArtifactIdUtils;
 import org.eclipse.aether.util.graph.manager.ClassicDependencyManager;
 import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
+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;
@@ -178,6 +182,24 @@ public class DefaultDependencyCollectorTest
         }
     }
 
+    private DependencyNode toDependencyResult( final DependencyNode root, final String rootScope,
+                                               final Boolean optional )
+    {
+        // Make the root artifact resultion result a dependency resolution result for the subtree check.
+        assertNull( "Expected root artifact resolution result.", root.getDependency() );
+        final DefaultDependencyNode defaultNode =
+                new DefaultDependencyNode( new Dependency( root.getArtifact(), rootScope ) );
+
+        defaultNode.setChildren( root.getChildren() );
+
+        if ( optional != null )
+        {
+            defaultNode.setOptional( optional );
+        }
+
+        return defaultNode;
+    }
+
     @Test
     public void testSimpleCollection()
         throws IOException, DependencyCollectionException
@@ -488,6 +510,142 @@ public class DefaultDependencyCollectorTest
     }
 
     @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 testVersionFilter()
         throws Exception
     {
@@ -535,6 +693,132 @@ public class DefaultDependencyCollectorTest
         assertEquals( 0, childLevel1.getChildren().size() );
     }
 
+    @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, this.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, this.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, this.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, this.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, this.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, this.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, this.toDependencyResult( result.getRoot(), "root-scope",
+                                                                                                        true ) );
+    }
+
     static class TestDependencyManager
         implements DependencyManager
     {
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