1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.graph;
20
21 import java.io.File;
22 import java.nio.file.Paths;
23 import java.util.ArrayList;
24 import java.util.Arrays;
25 import java.util.Collection;
26 import java.util.List;
27 import java.util.Map;
28 import java.util.stream.Collectors;
29 import java.util.stream.Stream;
30
31 import org.apache.maven.MavenExecutionException;
32 import org.apache.maven.api.services.model.ModelProcessor;
33 import org.apache.maven.execution.BuildResumptionDataRepository;
34 import org.apache.maven.execution.MavenExecutionRequest;
35 import org.apache.maven.execution.MavenSession;
36 import org.apache.maven.execution.ProjectActivation;
37 import org.apache.maven.execution.ProjectDependencyGraph;
38 import org.apache.maven.impl.model.DefaultModelProcessor;
39 import org.apache.maven.model.Dependency;
40 import org.apache.maven.model.Parent;
41 import org.apache.maven.model.building.Result;
42 import org.apache.maven.project.MavenProject;
43 import org.apache.maven.project.ProjectBuilder;
44 import org.apache.maven.project.ProjectBuildingException;
45 import org.apache.maven.project.ProjectBuildingRequest;
46 import org.apache.maven.project.ProjectBuildingResult;
47 import org.apache.maven.project.collector.DefaultProjectsSelector;
48 import org.apache.maven.project.collector.MultiModuleCollectionStrategy;
49 import org.apache.maven.project.collector.PomlessCollectionStrategy;
50 import org.apache.maven.project.collector.ProjectsSelector;
51 import org.apache.maven.project.collector.RequestPomCollectionStrategy;
52 import org.junit.jupiter.api.BeforeEach;
53 import org.junit.jupiter.api.Test;
54 import org.junit.jupiter.params.ParameterizedTest;
55 import org.junit.jupiter.params.provider.Arguments;
56 import org.junit.jupiter.params.provider.MethodSource;
57
58 import static java.util.Arrays.asList;
59 import static java.util.Collections.emptyList;
60 import static java.util.Collections.singletonList;
61 import static java.util.function.Function.identity;
62 import static java.util.stream.Collectors.toList;
63 import static org.apache.maven.execution.MavenExecutionRequest.REACTOR_MAKE_DOWNSTREAM;
64 import static org.apache.maven.execution.MavenExecutionRequest.REACTOR_MAKE_UPSTREAM;
65 import static org.apache.maven.graph.DefaultGraphBuilderTest.ScenarioBuilder.scenario;
66 import static org.assertj.core.api.Assertions.assertThat;
67 import static org.junit.jupiter.api.Assertions.assertEquals;
68 import static org.mockito.ArgumentMatchers.any;
69 import static org.mockito.ArgumentMatchers.anyBoolean;
70 import static org.mockito.ArgumentMatchers.anyList;
71 import static org.mockito.Mockito.mock;
72 import static org.mockito.Mockito.when;
73
74 class DefaultGraphBuilderTest {
75
76
77
78
79
80
81
82
83
84
85
86
87 private static final String GROUP_ID = "unittest";
88 private static final String PARENT_MODULE = "module-parent";
89 private static final String INDEPENDENT_MODULE = "module-independent";
90 private static final String MODULE_A = "module-a";
91 private static final String MODULE_B = "module-b";
92 private static final String MODULE_C = "module-c";
93 private static final String MODULE_D = "module-d";
94 private static final String MODULE_C_1 = "module-c-1";
95 private static final String MODULE_C_2 = "module-c-2";
96
97 private DefaultGraphBuilder graphBuilder;
98
99 private final ProjectBuilder projectBuilder = mock(ProjectBuilder.class);
100 private final MavenSession session = mock(MavenSession.class);
101 private final MavenExecutionRequest mavenExecutionRequest = mock(MavenExecutionRequest.class);
102
103 private final ProjectsSelector projectsSelector = new DefaultProjectsSelector(projectBuilder);
104
105
106
107 private final ModelProcessor modelProcessor = new DefaultModelProcessor(null, List.of());
108 private final PomlessCollectionStrategy pomlessCollectionStrategy = new PomlessCollectionStrategy(projectBuilder);
109 private final MultiModuleCollectionStrategy multiModuleCollectionStrategy =
110 new MultiModuleCollectionStrategy(modelProcessor, projectsSelector);
111 private final RequestPomCollectionStrategy requestPomCollectionStrategy =
112 new RequestPomCollectionStrategy(projectsSelector);
113
114 private Map<String, MavenProject> artifactIdProjectMap;
115
116 public static Stream<Arguments> parameters() {
117 return Stream.of(
118 scenario("Full reactor in order")
119 .expectResult(
120 PARENT_MODULE,
121 MODULE_C,
122 MODULE_C_1,
123 MODULE_A,
124 MODULE_B,
125 MODULE_C_2,
126 INDEPENDENT_MODULE),
127 scenario("Selected project").activeRequiredProjects(MODULE_B).expectResult(MODULE_B),
128 scenario("Selected aggregator project (including child modules)")
129 .activeRequiredProjects(MODULE_C)
130 .expectResult(MODULE_C, MODULE_C_1, MODULE_C_2),
131 scenario("Selected aggregator project with non-recursive")
132 .activeRequiredProjects(MODULE_C)
133 .nonRecursive()
134 .expectResult(MODULE_C),
135 scenario("Selected optional project")
136 .activeOptionalProjects(MODULE_B)
137 .expectResult(MODULE_B),
138 scenario("Selected missing optional project")
139 .activeOptionalProjects("non-existing-module")
140 .expectResult(
141 PARENT_MODULE,
142 MODULE_C,
143 MODULE_C_1,
144 MODULE_A,
145 MODULE_B,
146 MODULE_C_2,
147 INDEPENDENT_MODULE),
148 scenario("Selected missing optional and required project")
149 .activeOptionalProjects("non-existing-module")
150 .activeRequiredProjects(MODULE_B)
151 .expectResult(MODULE_B),
152 scenario("Excluded project")
153 .inactiveRequiredProjects(MODULE_B)
154 .expectResult(PARENT_MODULE, MODULE_C, MODULE_C_1, MODULE_A, MODULE_C_2, INDEPENDENT_MODULE),
155 scenario("Excluded optional project")
156 .inactiveOptionalProjects(MODULE_B)
157 .expectResult(PARENT_MODULE, MODULE_C, MODULE_C_1, MODULE_A, MODULE_C_2, INDEPENDENT_MODULE),
158 scenario("Excluded missing optional project")
159 .inactiveOptionalProjects("non-existing-module")
160 .expectResult(
161 PARENT_MODULE,
162 MODULE_C,
163 MODULE_C_1,
164 MODULE_A,
165 MODULE_B,
166 MODULE_C_2,
167 INDEPENDENT_MODULE),
168 scenario("Excluded missing optional and required project")
169 .inactiveOptionalProjects("non-existing-module")
170 .inactiveRequiredProjects(MODULE_B)
171 .expectResult(PARENT_MODULE, MODULE_C, MODULE_C_1, MODULE_A, MODULE_C_2, INDEPENDENT_MODULE),
172 scenario("Excluded aggregator project with non-recursive")
173 .inactiveRequiredProjects(MODULE_C)
174 .nonRecursive()
175 .expectResult(PARENT_MODULE, MODULE_C_1, MODULE_A, MODULE_B, MODULE_C_2, INDEPENDENT_MODULE),
176 scenario("Selected and excluded same project")
177 .activeRequiredProjects(MODULE_A)
178 .inactiveRequiredProjects(MODULE_A)
179 .expectResult(MavenExecutionException.class, "empty reactor"),
180 scenario("Excluded aggregator, but selected child")
181 .activeRequiredProjects(MODULE_C_1)
182 .inactiveRequiredProjects(MODULE_C)
183 .expectResult(MavenExecutionException.class, "empty reactor"),
184 scenario("Project selected with different selector resolves to same project")
185 .activeRequiredProjects(GROUP_ID + ":" + MODULE_A)
186 .inactiveRequiredProjects(MODULE_A)
187 .expectResult(MavenExecutionException.class, "empty reactor"),
188 scenario("Selected and excluded same project, but also selected another project")
189 .activeRequiredProjects(MODULE_A, MODULE_B)
190 .inactiveRequiredProjects(MODULE_A)
191 .expectResult(MODULE_B),
192 scenario("Selected missing project as required and as optional")
193 .activeRequiredProjects("non-existing-module")
194 .activeOptionalProjects("non-existing-module")
195 .expectResult(MavenExecutionException.class, "do not exist"),
196 scenario("Resuming from project")
197 .resumeFrom(MODULE_B)
198 .expectResult(MODULE_B, MODULE_C_2, INDEPENDENT_MODULE),
199 scenario("Selected project with also make dependencies")
200 .activeRequiredProjects(MODULE_C_2)
201 .makeBehavior(REACTOR_MAKE_UPSTREAM)
202 .expectResult(PARENT_MODULE, MODULE_C, MODULE_A, MODULE_B, MODULE_C_2),
203 scenario("Selected project with also make dependents")
204 .activeRequiredProjects(MODULE_B)
205 .makeBehavior(REACTOR_MAKE_DOWNSTREAM)
206 .expectResult(MODULE_B, MODULE_C_2),
207 scenario("Resuming from project with also make dependencies")
208 .makeBehavior(REACTOR_MAKE_UPSTREAM)
209 .resumeFrom(MODULE_C_2)
210 .expectResult(PARENT_MODULE, MODULE_C, MODULE_A, MODULE_B, MODULE_C_2, INDEPENDENT_MODULE),
211 scenario("Selected project with resume from and also make dependency (MNG-4960 IT#1)")
212 .activeRequiredProjects(MODULE_C_2)
213 .resumeFrom(MODULE_B)
214 .makeBehavior(REACTOR_MAKE_UPSTREAM)
215 .expectResult(PARENT_MODULE, MODULE_C, MODULE_A, MODULE_B, MODULE_C_2),
216 scenario("Selected project with resume from and also make dependent (MNG-4960 IT#2)")
217 .activeRequiredProjects(MODULE_B)
218 .resumeFrom(MODULE_C_2)
219 .makeBehavior(REACTOR_MAKE_DOWNSTREAM)
220 .expectResult(MODULE_C_2),
221 scenario("Excluding an also make dependency from selectedProject does take its transitive dependency")
222 .activeRequiredProjects(MODULE_C_2)
223 .inactiveRequiredProjects(MODULE_B)
224 .makeBehavior(REACTOR_MAKE_UPSTREAM)
225 .expectResult(PARENT_MODULE, MODULE_C, MODULE_A, MODULE_C_2),
226 scenario("Excluding a project also excludes its children")
227 .inactiveRequiredProjects(MODULE_C)
228 .expectResult(PARENT_MODULE, MODULE_A, MODULE_B, INDEPENDENT_MODULE),
229 scenario("Excluding an also make dependency from resumeFrom does take its transitive dependency")
230 .resumeFrom(MODULE_C_2)
231 .inactiveRequiredProjects(MODULE_B)
232 .makeBehavior(REACTOR_MAKE_UPSTREAM)
233 .expectResult(PARENT_MODULE, MODULE_C, MODULE_A, MODULE_C_2, INDEPENDENT_MODULE),
234 scenario("Resume from exclude project downstream")
235 .resumeFrom(MODULE_A)
236 .inactiveRequiredProjects(MODULE_B)
237 .expectResult(MODULE_A, MODULE_C_2, INDEPENDENT_MODULE),
238 scenario("Exclude the project we are resuming from (as proposed in MNG-6676)")
239 .resumeFrom(MODULE_B)
240 .inactiveRequiredProjects(MODULE_B)
241 .expectResult(MODULE_C_2, INDEPENDENT_MODULE),
242 scenario("Selected projects in wrong order are resumed correctly in order")
243 .activeRequiredProjects(MODULE_C_2, MODULE_B, MODULE_A)
244 .resumeFrom(MODULE_B)
245 .expectResult(MODULE_B, MODULE_C_2),
246 scenario("Duplicate projects are filtered out")
247 .activeRequiredProjects(MODULE_A, MODULE_A)
248 .expectResult(MODULE_A),
249 scenario("Select reactor by specific pom")
250 .requestedPom(MODULE_C)
251 .expectResult(MODULE_C, MODULE_C_1, MODULE_C_2),
252 scenario("Select reactor by specific pom with also make dependencies")
253 .requestedPom(MODULE_C)
254 .makeBehavior(REACTOR_MAKE_UPSTREAM)
255 .expectResult(PARENT_MODULE, MODULE_C, MODULE_C_1, MODULE_A, MODULE_B, MODULE_C_2),
256 scenario("Select reactor by specific pom with also make dependents")
257 .requestedPom(MODULE_B)
258 .makeBehavior(REACTOR_MAKE_DOWNSTREAM)
259 .expectResult(MODULE_B, MODULE_C_2));
260 }
261
262 interface ExpectedResult {}
263
264 static class SelectedProjectsResult implements ExpectedResult {
265 final List<String> projectNames;
266
267 public SelectedProjectsResult(List<String> projectSelectors) {
268 this.projectNames = projectSelectors;
269 }
270 }
271
272 static class ExceptionThrown implements ExpectedResult {
273 final Class<? extends Throwable> expected;
274 final String partOfMessage;
275
276 public ExceptionThrown(final Class<? extends Throwable> expected, final String partOfMessage) {
277 this.expected = expected;
278 this.partOfMessage = partOfMessage;
279 }
280 }
281
282 @ParameterizedTest
283 @MethodSource("parameters")
284 void testGetReactorProjects(
285 String parameterDescription,
286 List<String> parameterActiveRequiredProjects,
287 List<String> parameterActiveOptionalProjects,
288 List<String> parameterInactiveRequiredProjects,
289 List<String> parameterInactiveOptionalProjects,
290 String parameterResumeFrom,
291 String parameterMakeBehavior,
292 ExpectedResult parameterExpectedResult,
293 File parameterRequestedPom,
294 boolean parameterRecursive) {
295
296 ProjectActivation projectActivation = new ProjectActivation();
297 parameterActiveRequiredProjects.forEach(projectActivation::activateRequiredProject);
298 parameterActiveOptionalProjects.forEach(projectActivation::activateOptionalProject);
299 parameterInactiveRequiredProjects.forEach(projectActivation::deactivateRequiredProject);
300 parameterInactiveOptionalProjects.forEach(projectActivation::deactivateOptionalProject);
301
302 when(mavenExecutionRequest.getRootDirectory()).thenReturn(Paths.get("."));
303 when(mavenExecutionRequest.getProjectActivation()).thenReturn(projectActivation);
304 when(mavenExecutionRequest.getMakeBehavior()).thenReturn(parameterMakeBehavior);
305 when(mavenExecutionRequest.getPom()).thenReturn(parameterRequestedPom);
306 when(mavenExecutionRequest.isRecursive()).thenReturn(parameterRecursive);
307 if (parameterResumeFrom != null && !parameterResumeFrom.isEmpty()) {
308 when(mavenExecutionRequest.getResumeFrom()).thenReturn(":" + parameterResumeFrom);
309 }
310
311
312 Result<ProjectDependencyGraph> result = graphBuilder.build(session);
313
314
315 if (parameterExpectedResult instanceof SelectedProjectsResult selectedProjectsResult) {
316 assertThat(result.hasErrors())
317 .withFailMessage("Expected result not to have errors")
318 .isFalse();
319 List<String> expectedProjectNames = selectedProjectsResult.projectNames;
320 List<MavenProject> actualReactorProjects = result.get().getSortedProjects();
321 List<MavenProject> expectedReactorProjects =
322 expectedProjectNames.stream().map(artifactIdProjectMap::get).collect(toList());
323 assertEquals(expectedReactorProjects, actualReactorProjects, parameterDescription);
324 } else {
325 assertThat(result.hasErrors())
326 .withFailMessage("Expected result to have errors")
327 .isTrue();
328 Class<? extends Throwable> expectedException = ((ExceptionThrown) parameterExpectedResult).expected;
329 String partOfMessage = ((ExceptionThrown) parameterExpectedResult).partOfMessage;
330
331 assertThat(result.getProblems()).hasSize(1);
332 result.getProblems().forEach(p -> assertThat(p.getException())
333 .isInstanceOf(expectedException)
334 .hasMessageContaining(partOfMessage));
335 }
336 }
337
338 @Test
339 void testProcessPackagingAttribute() throws ProjectBuildingException {
340 graphBuilder = new DefaultGraphBuilder(
341 mock(BuildResumptionDataRepository.class),
342 pomlessCollectionStrategy,
343 multiModuleCollectionStrategy,
344 requestPomCollectionStrategy);
345
346
347 MavenProject projectParent = getMavenProject(PARENT_MODULE);
348 MavenProject projectModuleD = getMavenProject(MODULE_D, projectParent, "bom");
349
350 projectParent.setCollectedProjects(singletonList(projectModuleD));
351
352
353 when(session.getRequest()).thenReturn(mavenExecutionRequest);
354 when(session.getProjects()).thenReturn(null);
355 when(mavenExecutionRequest.getProjectBuildingRequest()).thenReturn(mock(ProjectBuildingRequest.class));
356 List<ProjectBuildingResult> projectBuildingResults =
357 createProjectBuildingResultMocks(Stream.of(projectParent, projectModuleD)
358 .collect(Collectors.toMap(MavenProject::getArtifactId, identity()))
359 .values());
360 when(projectBuilder.build(anyList(), anyBoolean(), any(ProjectBuildingRequest.class)))
361 .thenReturn(projectBuildingResults);
362
363 ProjectActivation projectActivation = new ProjectActivation();
364
365 when(mavenExecutionRequest.getProjectActivation()).thenReturn(projectActivation);
366 when(mavenExecutionRequest.getPom()).thenReturn(new File(PARENT_MODULE, "pom.xml"));
367
368 Result<ProjectDependencyGraph> result = graphBuilder.build(session);
369
370 assertThat(result.hasErrors())
371 .withFailMessage("Expected result not to have errors")
372 .isFalse();
373 List<MavenProject> actualReactorProjects = result.get().getSortedProjects();
374 assertEquals(2, actualReactorProjects.size());
375 assertEquals("pom", actualReactorProjects.get(1).getPackaging());
376 }
377
378 @BeforeEach
379 void before() throws Exception {
380 graphBuilder = new DefaultGraphBuilder(
381 mock(BuildResumptionDataRepository.class),
382 pomlessCollectionStrategy,
383 multiModuleCollectionStrategy,
384 requestPomCollectionStrategy);
385
386
387 MavenProject projectParent = getMavenProject(PARENT_MODULE);
388 MavenProject projectIndependentModule = getMavenProject(INDEPENDENT_MODULE);
389 MavenProject projectModuleA = getMavenProject(MODULE_A, projectParent);
390 MavenProject projectModuleB = getMavenProject(MODULE_B, projectParent);
391 MavenProject projectModuleC = getMavenProject(MODULE_C, projectParent);
392 MavenProject projectModuleC1 = getMavenProject(MODULE_C_1, projectModuleC);
393 MavenProject projectModuleC2 = getMavenProject(MODULE_C_2, projectModuleC);
394
395 artifactIdProjectMap = Stream.of(
396 projectParent,
397 projectIndependentModule,
398 projectModuleA,
399 projectModuleB,
400 projectModuleC,
401 projectModuleC1,
402 projectModuleC2)
403 .collect(Collectors.toMap(MavenProject::getArtifactId, identity()));
404
405
406 projectModuleB.setDependencies(singletonList(toDependency(projectModuleA)));
407 projectModuleC2.setDependencies(singletonList(toDependency(projectModuleB)));
408 projectParent.setCollectedProjects(asList(
409 projectIndependentModule,
410 projectModuleA,
411 projectModuleB,
412 projectModuleC,
413 projectModuleC1,
414 projectModuleC2));
415 projectModuleC.setCollectedProjects(asList(projectModuleC1, projectModuleC2));
416
417
418 when(session.getRequest()).thenReturn(mavenExecutionRequest);
419 when(session.getProjects()).thenReturn(null);
420 when(mavenExecutionRequest.getProjectBuildingRequest()).thenReturn(mock(ProjectBuildingRequest.class));
421 List<ProjectBuildingResult> projectBuildingResults =
422 createProjectBuildingResultMocks(artifactIdProjectMap.values());
423 when(projectBuilder.build(anyList(), anyBoolean(), any(ProjectBuildingRequest.class)))
424 .thenReturn(projectBuildingResults);
425 when(mavenExecutionRequest.getRootDirectory()).thenReturn(null);
426 }
427
428 private MavenProject getMavenProject(String artifactId, MavenProject parentProject) {
429 MavenProject project = getMavenProject(artifactId);
430 Parent parent = new Parent();
431 parent.setGroupId(parentProject.getGroupId());
432 parent.setArtifactId(parentProject.getArtifactId());
433 project.getModel().setParent(parent);
434 return project;
435 }
436
437 private MavenProject getMavenProject(String artifactId) {
438 MavenProject mavenProject = new MavenProject();
439 mavenProject.setGroupId(GROUP_ID);
440 mavenProject.setArtifactId(artifactId);
441 mavenProject.setVersion("1.0");
442 mavenProject.setPomFile(new File(artifactId, "pom.xml"));
443 mavenProject.setCollectedProjects(new ArrayList<>());
444 return mavenProject;
445 }
446
447 private MavenProject getMavenProject(String artifactId, MavenProject parentProject, String packaging) {
448 MavenProject project = getMavenProject(artifactId);
449 Parent parent = new Parent();
450 parent.setGroupId(parentProject.getGroupId());
451 parent.setArtifactId(parentProject.getArtifactId());
452 project.getModel().setParent(parent);
453 project.setPackaging(packaging);
454 return project;
455 }
456
457 private Dependency toDependency(MavenProject mavenProject) {
458 Dependency dependency = new Dependency();
459 dependency.setGroupId(mavenProject.getGroupId());
460 dependency.setArtifactId(mavenProject.getArtifactId());
461 dependency.setVersion(mavenProject.getVersion());
462 return dependency;
463 }
464
465 private List<ProjectBuildingResult> createProjectBuildingResultMocks(Collection<MavenProject> projects) {
466 return projects.stream()
467 .map(project -> {
468 ProjectBuildingResult result = mock(ProjectBuildingResult.class);
469 when(result.getProject()).thenReturn(project);
470 return result;
471 })
472 .collect(toList());
473 }
474
475 static class ScenarioBuilder {
476 private String description;
477 private List<String> activeRequiredProjects = emptyList();
478 private List<String> activeOptionalProjects = emptyList();
479 private List<String> inactiveRequiredProjects = emptyList();
480 private List<String> inactiveOptionalProjects = emptyList();
481 private String resumeFrom = "";
482 private String makeBehavior = "";
483 private File requestedPom = new File(PARENT_MODULE, "pom.xml");
484 private boolean recursive = true;
485
486 private ScenarioBuilder() {}
487
488 public static ScenarioBuilder scenario(String description) {
489 ScenarioBuilder scenarioBuilder = new ScenarioBuilder();
490 scenarioBuilder.description = description;
491 return scenarioBuilder;
492 }
493
494 public ScenarioBuilder activeRequiredProjects(String... activeRequiredProjects) {
495 this.activeRequiredProjects = prependWithColonIfNeeded(activeRequiredProjects);
496 return this;
497 }
498
499 public ScenarioBuilder activeOptionalProjects(String... activeOptionalProjects) {
500 this.activeOptionalProjects = prependWithColonIfNeeded(activeOptionalProjects);
501 return this;
502 }
503
504 public ScenarioBuilder inactiveRequiredProjects(String... inactiveRequiredProjects) {
505 this.inactiveRequiredProjects = prependWithColonIfNeeded(inactiveRequiredProjects);
506 return this;
507 }
508
509 public ScenarioBuilder inactiveOptionalProjects(String... inactiveOptionalProjects) {
510 this.inactiveOptionalProjects = prependWithColonIfNeeded(inactiveOptionalProjects);
511 return this;
512 }
513
514 public ScenarioBuilder resumeFrom(String resumeFrom) {
515 this.resumeFrom = resumeFrom;
516 return this;
517 }
518
519 public ScenarioBuilder makeBehavior(String makeBehavior) {
520 this.makeBehavior = makeBehavior;
521 return this;
522 }
523
524 public ScenarioBuilder requestedPom(String requestedPom) {
525 this.requestedPom = new File(requestedPom, "pom.xml");
526 return this;
527 }
528
529 public ScenarioBuilder nonRecursive() {
530 this.recursive = false;
531 return this;
532 }
533
534 public Arguments expectResult(String... expectedReactorProjects) {
535 ExpectedResult expectedResult = new SelectedProjectsResult(asList(expectedReactorProjects));
536 return createTestArguments(expectedResult);
537 }
538
539 public Arguments expectResult(Class<? extends Exception> expected, final String partOfMessage) {
540 ExpectedResult expectedResult = new ExceptionThrown(expected, partOfMessage);
541 return createTestArguments(expectedResult);
542 }
543
544 private Arguments createTestArguments(ExpectedResult expectedResult) {
545 return Arguments.arguments(
546 description,
547 activeRequiredProjects,
548 activeOptionalProjects,
549 inactiveRequiredProjects,
550 inactiveOptionalProjects,
551 resumeFrom,
552 makeBehavior,
553 expectedResult,
554 requestedPom,
555 recursive);
556 }
557
558 private List<String> prependWithColonIfNeeded(String[] selectors) {
559 return Arrays.stream(selectors).map(this::prependWithColonIfNeeded).collect(toList());
560 }
561
562 private String prependWithColonIfNeeded(String selector) {
563 return selector.indexOf(':') == -1 ? ":" + selector : selector;
564 }
565 }
566 }