@@ -41,6 +41,14 @@ class DefaultProjectDependencyGraphTest {
4141
4242 private final MavenProject cProject = createProject (Arrays .asList (toDependency (bProject )), "cProject" );
4343
44+ private final MavenProject dProject = createProject (
45+ Arrays .asList (toDependency (aProject ), toDependency (bProject ), toDependency (cProject )), "dProject" );
46+
47+ private final MavenProject eProject = createProject (
48+ Arrays .asList (
49+ toDependency (aProject ), toDependency (bProject ), toDependency (cProject ), toDependency (dProject )),
50+ "eProject" );
51+
4452 private final MavenProject depender1 = createProject (Arrays .asList (toDependency (aProject )), "depender1" );
4553
4654 private final MavenProject depender2 = createProject (Arrays .asList (toDependency (aProject )), "depender2" );
@@ -64,6 +72,38 @@ void testNonTransitiveFiltering() throws DuplicateProjectException, CycleDetecte
6472 assertTrue (graph .getDownstreamProjects (aProject , false ).contains (cProject ));
6573 }
6674
75+ // Test verifying that getDownstreamProjects does not contain duplicates.
76+ // This is a regression test for https://github.com/apache/maven/issues/2487.
77+ //
78+ // The graph is:
79+ // aProject -> bProject
80+ // | -> dProject
81+ // | -> eProject
82+ // bProject -> cProject
83+ // | -> dProject
84+ // | -> eProject
85+ // cProject -> dProject
86+ // | -> eProject
87+ // dProject -> eProject
88+ //
89+ // When getting the non-transitive, downstream projects of aProject with a whitelist of aProject, dProject,
90+ // and eProject, we expect to get dProject, and eProject with no duplicates.
91+ // Before the fix, this would return dProject and eProject twice, once from bProject and once from cProject. As
92+ // aProject is whitelisted, it should not be returned as a downstream project for itself. bProject and cProject
93+ // are not whitelisted, so they should return their downstream projects, both have dProject and eProject as
94+ // downstream projects. Which would result in dProject and eProject being returned twice, but now the results are
95+ // made unique.
96+ @ Test
97+ public void testGetDownstreamDoesNotDuplicateProjects () throws CycleDetectedException , DuplicateProjectException {
98+ ProjectDependencyGraph graph =
99+ new DefaultProjectDependencyGraph (Arrays .asList (aProject , bProject , cProject , dProject , eProject ));
100+ graph = new FilteredProjectDependencyGraph (graph , Arrays .asList (aProject , dProject , eProject ));
101+ final List <MavenProject > downstreamProjects = graph .getDownstreamProjects (aProject , false );
102+ assertEquals (2 , downstreamProjects .size ());
103+ assertTrue (downstreamProjects .contains (dProject ));
104+ assertTrue (downstreamProjects .contains (eProject ));
105+ }
106+
67107 @ Test
68108 void testGetSortedProjects () throws DuplicateProjectException , CycleDetectedException {
69109 ProjectDependencyGraph graph = new DefaultProjectDependencyGraph (Arrays .asList (depender1 , aProject ));
0 commit comments