1 package org.apache.maven.shared.dependency.tree;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.ArrayList;
23 import java.util.Arrays;
24 import java.util.Collections;
25 import java.util.HashMap;
26 import java.util.Iterator;
27 import java.util.LinkedHashSet;
28 import java.util.List;
29 import java.util.Map;
30 import java.util.Set;
31
32 import junit.framework.AssertionFailedError;
33
34 import org.apache.maven.artifact.Artifact;
35 import org.apache.maven.artifact.DefaultArtifact;
36 import org.apache.maven.artifact.factory.ArtifactFactory;
37 import org.apache.maven.artifact.handler.DefaultArtifactHandler;
38 import org.apache.maven.artifact.repository.ArtifactRepository;
39 import org.apache.maven.artifact.repository.DefaultArtifactRepository;
40 import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
41 import org.apache.maven.artifact.resolver.ArtifactCollector;
42 import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
43 import org.apache.maven.artifact.resolver.ResolutionNode;
44 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
45 import org.apache.maven.artifact.versioning.ArtifactVersion;
46 import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
47 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
48 import org.apache.maven.artifact.versioning.VersionRange;
49 import org.apache.maven.project.MavenProject;
50 import org.codehaus.plexus.PlexusTestCase;
51
52
53
54
55
56
57
58
59 public class DefaultDependencyTreeBuilderTest
60 extends PlexusTestCase
61 {
62
63
64 private DefaultDependencyTreeBuilder builder;
65
66 private ArtifactRepository artifactRepository;
67
68 private ArtifactFactory artifactFactory;
69
70 private ArtifactMetadataSourceStub artifactMetadataSource;
71
72 private ArtifactCollector artifactCollector;
73
74
75
76
77
78
79 protected void setUp()
80 throws Exception
81 {
82 super.setUp();
83
84 builder = (DefaultDependencyTreeBuilder) lookup( DependencyTreeBuilder.ROLE );
85
86 String repositoryURL = getTestFile( "target/local-repo" ).toURI().toString();
87 artifactRepository = new DefaultArtifactRepository( "local", repositoryURL, new DefaultRepositoryLayout() );
88
89 artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.ROLE );
90 artifactMetadataSource = new ArtifactMetadataSourceStub();
91 artifactCollector = (ArtifactCollector) lookup( ArtifactCollector.class.getName() );
92 }
93
94
95
96
97 protected void tearDown()
98 throws Exception
99 {
100 super.tearDown();
101
102 builder = null;
103 }
104
105
106
107
108
109
110
111
112
113
114
115
116
117 public void testProjectWithDependency()
118 throws DependencyTreeBuilderException
119 {
120 Artifact projectArtifact = createArtifact( "g:p:t:1" );
121 Artifact childArtifact = createArtifact( "g:a:t:1" );
122
123 MavenProject project = createProject( projectArtifact, new Artifact[] { childArtifact } );
124
125 DependencyNode expectedRootNode = createNode( "g:p:t:1" );
126 expectedRootNode.addChild( createNode( "g:a:t:1" ) );
127
128 assertDependencyTree( expectedRootNode, project );
129 }
130
131
132
133
134
135
136
137
138
139
140
141
142 public void testProjectWithTransitiveDependency()
143 throws DependencyTreeBuilderException
144 {
145 Artifact projectArtifact = createArtifact( "g:p:t:1" );
146 Artifact childArtifact = createArtifact( "g:a:t:1" );
147 Artifact transitiveArtifact = createArtifact( "g:b:t:1" );
148 addArtifactMetadata( childArtifact, transitiveArtifact );
149
150 MavenProject project = createProject( projectArtifact, new Artifact[] { childArtifact } );
151
152 DependencyNode expectedRootNode = createNode( "g:p:t:1" );
153 DependencyNode childArtifactNode = createNode( "g:a:t:1" );
154 expectedRootNode.addChild( childArtifactNode );
155 childArtifactNode.addChild( createNode( "g:b:t:1" ) );
156
157 assertDependencyTree( expectedRootNode, project );
158 }
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173 public void testProjectWithDuplicateDependency()
174 throws DependencyTreeBuilderException
175 {
176 Artifact projectArtifact = createArtifact( "g:p:t:1" );
177 Artifact child1Artifact = createArtifact( "g:a:t:1" );
178 Artifact transitiveArtifact = createArtifact( "g:c:t:1" );
179 Artifact child2Artifact = createArtifact( "g:b:t:1" );
180 Artifact duplicateTransitiveArtifact = createArtifact( "g:c:t:1" );
181 addArtifactMetadata( child1Artifact, transitiveArtifact );
182 addArtifactMetadata( child2Artifact, duplicateTransitiveArtifact );
183
184 MavenProject project = createProject( projectArtifact, new Artifact[] { child1Artifact, child2Artifact } );
185
186 DependencyNode expectedRootNode = createNode( "g:p:t:1" );
187 DependencyNode child1ArtifactNode = createNode( "g:a:t:1" );
188 expectedRootNode.addChild( child1ArtifactNode );
189 DependencyNode transitiveArtifactNode = createNode( "g:c:t:1" );
190 child1ArtifactNode.addChild( transitiveArtifactNode );
191 DependencyNode child2ArtifactNode = createNode( "g:b:t:1" );
192 expectedRootNode.addChild( child2ArtifactNode );
193 child2ArtifactNode.addChild( createNode( "g:c:t:1", DependencyNode.OMITTED_FOR_DUPLICATE,
194 transitiveArtifactNode.getArtifact() ) );
195
196 assertDependencyTree( expectedRootNode, project );
197 }
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212 public void testProjectWithConflictDependencyVersionFirstWins()
213 throws DependencyTreeBuilderException
214 {
215 Artifact projectArtifact = createArtifact( "g:p:t:1" );
216 Artifact nearestArtifact = createArtifact( "g:a:t:1" );
217 Artifact childArtifact = createArtifact( "g:b:t:1" );
218 Artifact farthestArtifact = createArtifact( "g:a:t:2" );
219 addArtifactMetadata( childArtifact, farthestArtifact );
220
221 MavenProject project = createProject( projectArtifact, new Artifact[] { nearestArtifact, childArtifact } );
222
223 DependencyNode expectedRootNode = createNode( "g:p:t:1" );
224 DependencyNode nearestArtifactNode = createNode( "g:a:t:1" );
225 expectedRootNode.addChild( nearestArtifactNode );
226 DependencyNode childArtifactNode = createNode( "g:b:t:1" );
227 expectedRootNode.addChild( childArtifactNode );
228 childArtifactNode.addChild( createNode( "g:a:t:2", DependencyNode.OMITTED_FOR_CONFLICT,
229 nearestArtifactNode.getArtifact() ) );
230
231 assertDependencyTree( expectedRootNode, project );
232 }
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247 public void testProjectWithConflictDependencyVersionLastWins()
248 throws DependencyTreeBuilderException
249 {
250 Artifact projectArtifact = createArtifact( "g:p:t:1" );
251 Artifact childArtifact = createArtifact( "g:a:t:1" );
252 Artifact farthestArtifact = createArtifact( "g:b:t:2" );
253 Artifact nearestArtifact = createArtifact( "g:b:t:1" );
254 addArtifactMetadata( childArtifact, farthestArtifact );
255
256 MavenProject project = createProject( projectArtifact, new Artifact[] { childArtifact, nearestArtifact } );
257
258 DependencyNode expectedRootNode = createNode( "g:p:t:1" );
259 DependencyNode childArtifactNode = createNode( "g:a:t:1" );
260 expectedRootNode.addChild( childArtifactNode );
261 DependencyNode farthestArtifactNode = createNode( "g:b:t:1" );
262 expectedRootNode.addChild( farthestArtifactNode );
263 childArtifactNode.addChild( createNode( "g:b:t:2", DependencyNode.OMITTED_FOR_CONFLICT,
264 farthestArtifactNode.getArtifact() ) );
265
266 assertDependencyTree( expectedRootNode, project );
267 }
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282 public void testProjectWithConflictDependencyScopeCurrentPom()
283 throws DependencyTreeBuilderException
284 {
285 Artifact projectArtifact = createArtifact( "g:p:t:1" );
286 Artifact nearestArtifact = createArtifact( "g:b:t:1:test" );
287 Artifact childArtifact = createArtifact( "g:a:t:1" );
288 Artifact farthestArtifact = createArtifact( "g:b:t:1:compile" );
289 addArtifactMetadata( childArtifact, farthestArtifact );
290
291 MavenProject project = createProject( projectArtifact, new Artifact[] { nearestArtifact, childArtifact } );
292
293 DependencyNode expectedRootNode = createNode( "g:p:t:1" );
294 DependencyNode nearestArtifactNode = createNode( "g:b:t:1:test" );
295 nearestArtifactNode.setFailedUpdateScope( "compile" );
296 expectedRootNode.addChild( nearestArtifactNode );
297 DependencyNode childArtifactNode = createNode( "g:a:t:1" );
298 expectedRootNode.addChild( childArtifactNode );
299 childArtifactNode.addChild( createNode( "g:b:t:1:compile", DependencyNode.OMITTED_FOR_DUPLICATE,
300 nearestArtifactNode.getArtifact() ) );
301
302 assertDependencyTree( expectedRootNode, project );
303 }
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319 public void testProjectWithConflictDependencyScopeFirstWins()
320 throws DependencyTreeBuilderException
321 {
322 Artifact projectArtifact = createArtifact( "g:p:t:1" );
323 Artifact childArtifact = createArtifact( "g:a:t:1" );
324 Artifact grandchildArtifact = createArtifact( "g:b:t:1" );
325 Artifact farthestArtifact = createArtifact( "g:c:t:1:compile" );
326 Artifact nearestArtifact = createArtifact( "g:c:t:1:test" );
327 addArtifactMetadata( childArtifact, new Artifact[] { grandchildArtifact, nearestArtifact } );
328 addArtifactMetadata( grandchildArtifact, farthestArtifact );
329
330 MavenProject project = createProject( projectArtifact, new Artifact[] { childArtifact } );
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348 DependencyNode expectedRootNode = createNode( "g:p:t:1" );
349 DependencyNode childArtifactNode = createNode( "g:a:t:1" );
350 expectedRootNode.addChild( childArtifactNode );
351 DependencyNode grandchildArtifactNode = createNode( "g:b:t:1" );
352 childArtifactNode.addChild( grandchildArtifactNode );
353 DependencyNode farthestArtifactNode = createNode( "g:c:t:1:compile" );
354 grandchildArtifactNode.addChild( farthestArtifactNode );
355 DependencyNode nearestArtifactNode =
356 createNode( "g:c:t:1:compile", DependencyNode.OMITTED_FOR_DUPLICATE, farthestArtifactNode.getArtifact() );
357 nearestArtifactNode.setOriginalScope( "test" );
358 childArtifactNode.addChild( nearestArtifactNode );
359
360 assertDependencyTree( expectedRootNode, project );
361 }
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377 public void testProjectWithConflictDependencyScopeLastWins()
378 throws DependencyTreeBuilderException
379 {
380 Artifact projectArtifact = createArtifact( "g:p:t:1" );
381 Artifact childArtifact = createArtifact( "g:a:t:1" );
382 Artifact nearestArtifact = createArtifact( "g:c:t:1:test" );
383 Artifact grandchildArtifact = createArtifact( "g:b:t:1" );
384 Artifact farthestArtifact = createArtifact( "g:c:t:1:compile" );
385 addArtifactMetadata( childArtifact, new Artifact[] { nearestArtifact, grandchildArtifact } );
386 addArtifactMetadata( grandchildArtifact, farthestArtifact );
387
388 MavenProject project = createProject( projectArtifact, new Artifact[] { childArtifact } );
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405 DependencyNode expectedRootNode = createNode( "g:p:t:1" );
406 DependencyNode childArtifactNode = createNode( "g:a:t:1" );
407 expectedRootNode.addChild( childArtifactNode );
408 DependencyNode farthestArtifactNode = createNode( "g:c:t:1:compile" );
409 DependencyNode nearestArtifactNode =
410 createNode( "g:c:t:1:compile", DependencyNode.OMITTED_FOR_DUPLICATE, farthestArtifactNode.getArtifact() );
411 nearestArtifactNode.setOriginalScope( "test" );
412 childArtifactNode.addChild( nearestArtifactNode );
413 DependencyNode grandchildArtifactNode = createNode( "g:b:t:1" );
414 childArtifactNode.addChild( grandchildArtifactNode );
415 grandchildArtifactNode.addChild( farthestArtifactNode );
416
417 assertDependencyTree( expectedRootNode, project );
418 }
419
420
421
422
423
424
425
426
427
428
429
430
431
432 public void testProjectWithManagedTransitiveDependencyVersion()
433 throws DependencyTreeBuilderException
434 {
435 Artifact projectArtifact = createArtifact( "g:p:t:1" );
436 Artifact childArtifact = createArtifact( "g:a:t:1" );
437 Artifact transitiveArtifact = createArtifact( "g:b:t:1" );
438 Artifact managedTransitiveArtifact = createArtifact( "g:b:t:2" );
439 addArtifactMetadata( childArtifact, transitiveArtifact );
440
441 MavenProject project = createProject( projectArtifact, new Artifact[] { childArtifact } );
442 setManagedVersionMap( project, Collections.singleton( managedTransitiveArtifact ) );
443
444 DependencyNode expectedRootNode = createNode( "g:p:t:1" );
445 DependencyNode childArtifactNode = createNode( "g:a:t:1" );
446 expectedRootNode.addChild( childArtifactNode );
447 DependencyNode managedTransitiveArtifactNode = createNode( "g:b:t:2" );
448 managedTransitiveArtifactNode.setPremanagedVersion( "1" );
449 childArtifactNode.addChild( managedTransitiveArtifactNode );
450
451 assertDependencyTree( expectedRootNode, project );
452 }
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500 public void testProjectWithManagedTransitiveDependencyScope()
501 throws DependencyTreeBuilderException
502 {
503 Artifact projectArtifact = createArtifact( "g:p:t:1" );
504 Artifact childArtifact = createArtifact( "g:a:t:1" );
505 Artifact transitiveArtifact = createArtifact( "g:b:t:1:compile" );
506 Artifact managedTransitiveArtifact = createArtifact( "g:b:t:1:test" );
507 addArtifactMetadata( childArtifact, transitiveArtifact );
508
509 MavenProject project = createProject( projectArtifact, new Artifact[] { childArtifact } );
510 setManagedVersionMap( project, Collections.singleton( managedTransitiveArtifact ) );
511
512 DependencyNode expectedRootNode = createNode( "g:p:t:1" );
513 DependencyNode childArtifactNode = createNode( "g:a:t:1" );
514 expectedRootNode.addChild( childArtifactNode );
515 DependencyNode managedTransitiveArtifactNode = createNode( "g:b:t:1:test" );
516 managedTransitiveArtifactNode.setPremanagedScope( "compile" );
517 childArtifactNode.addChild( managedTransitiveArtifactNode );
518
519 assertDependencyTree( expectedRootNode, project );
520 }
521
522
523
524
525
526
527
528
529
530
531
532
533
534 public void testProjectWithManagedTransitiveDependencyVersionAndScope()
535 throws DependencyTreeBuilderException
536 {
537 Artifact projectArtifact = createArtifact( "g:p:t:1" );
538 Artifact childArtifact = createArtifact( "g:a:t:1" );
539 Artifact transitiveArtifact = createArtifact( "g:b:t:1:compile" );
540 Artifact managedTransitiveArtifact = createArtifact( "g:b:t:2:test" );
541 addArtifactMetadata( childArtifact, transitiveArtifact );
542
543 MavenProject project = createProject( projectArtifact, new Artifact[] { childArtifact } );
544 setManagedVersionMap( project, Collections.singleton( managedTransitiveArtifact ) );
545
546 DependencyNode expectedRootNode = createNode( "g:p:t:1" );
547 DependencyNode childArtifactNode = createNode( "g:a:t:1" );
548 expectedRootNode.addChild( childArtifactNode );
549 DependencyNode managedTransitiveArtifactNode = createNode( "g:b:t:2:test" );
550 managedTransitiveArtifactNode.setPremanagedVersion( "1" );
551 managedTransitiveArtifactNode.setPremanagedScope( "compile" );
552 childArtifactNode.addChild( managedTransitiveArtifactNode );
553
554 assertDependencyTree( expectedRootNode, project );
555 }
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570 public void testProjectWithManagedTransitiveDependencyVersionAndConflictDependencyVersion()
571 throws DependencyTreeBuilderException
572 {
573 Artifact projectArtifact = createArtifact( "g:p:t:1" );
574 Artifact nearestArtifact = createArtifact( "g:a:t:1" );
575 Artifact childArtifact = createArtifact( "g:b:t:1" );
576 Artifact farthestArtifact = createArtifact( "g:a:t:2" );
577 Artifact managedTransitiveArtifact = createArtifact( "g:a:t:3" );
578 addArtifactMetadata( childArtifact, farthestArtifact );
579
580 MavenProject project = createProject( projectArtifact, new Artifact[] { nearestArtifact, childArtifact } );
581 setManagedVersionMap( project, Collections.singleton( managedTransitiveArtifact ) );
582
583 DependencyNode expectedRootNode = createNode( "g:p:t:1" );
584 DependencyNode nearestArtifactNode = createNode( "g:a:t:1" );
585 expectedRootNode.addChild( nearestArtifactNode );
586 DependencyNode childArtifactNode = createNode( "g:b:t:1" );
587 expectedRootNode.addChild( childArtifactNode );
588 DependencyNode managedTransitiveArtifactNode =
589 createNode( "g:a:t:3", DependencyNode.OMITTED_FOR_CONFLICT, nearestArtifactNode.getArtifact() );
590 managedTransitiveArtifactNode.setPremanagedVersion( "2" );
591 childArtifactNode.addChild( managedTransitiveArtifactNode );
592
593 assertDependencyTree( expectedRootNode, project );
594 }
595
596
597
598
599
600
601
602
603
604
605
606
607 public void testProjectWithVersionRange()
608 throws InvalidVersionSpecificationException, DependencyTreeBuilderException
609 {
610 String range = "[1,2)";
611 Artifact projectArtifact = createArtifact( "g:p:t:1" );
612 Artifact childArtifact = createArtifact( "g:a:t:" + range );
613
614 MavenProject project = createProject( projectArtifact, new Artifact[] { childArtifact } );
615
616 ArtifactVersion version = new DefaultArtifactVersion( "1.0" );
617 List<ArtifactVersion> availableVersions = new ArrayList<ArtifactVersion>();
618 availableVersions.add( version );
619
620 DependencyNode expectedRootNode = createNode( "g:p:t:1" );
621 DependencyNode childNode = createNode( "g:a:t:1.0" );
622 childNode.setAvailableVersions( availableVersions );
623 childNode.setVersionSelectedFromRange( VersionRange.createFromVersionSpec( range ) );
624 expectedRootNode.addChild( childNode );
625
626 artifactMetadataSource.addAvailableVersions( childArtifact, availableVersions );
627 assertDependencyTree( expectedRootNode, project );
628 }
629
630
631
632
633
634
635
636
637
638
639
640
641
642 private DependencyNode createNode( String id )
643 {
644 return createNode( id, DependencyNode.INCLUDED, null );
645 }
646
647 private DependencyNode createNode( String id, int state, Artifact relatedArtifact )
648 {
649 return new DependencyNode( createArtifact( id ), state, relatedArtifact );
650 }
651
652 private Artifact createArtifact( String id )
653 {
654 String[] tokens = id.split( ":" );
655
656 String groupId = get( tokens, 0 );
657 String artifactId = get( tokens, 1 );
658 String type = get( tokens, 2, "jar" );
659 String version = get( tokens, 3 );
660 String scope = get( tokens, 4 );
661
662 VersionRange versionRange;
663 try
664 {
665 versionRange = VersionRange.createFromVersionSpec( version );
666 }
667 catch ( InvalidVersionSpecificationException e )
668 {
669 throw new RuntimeException( e );
670 }
671
672 return new DefaultArtifact( groupId, artifactId, versionRange, scope, type, null, new DefaultArtifactHandler() );
673 }
674
675 private MavenProject createProject( Artifact projectArtifact, Artifact[] dependencyArtifacts )
676 {
677 MavenProject project = new MavenProject();
678 project.setArtifact( projectArtifact );
679
680 project.setDependencyArtifacts( new LinkedHashSet<Artifact>( Arrays.asList( dependencyArtifacts ) ) );
681 project.setManagedVersionMap( new HashMap<String, Artifact>() );
682 project.setRemoteArtifactRepositories( Collections.EMPTY_LIST );
683 return project;
684 }
685
686 private void addArtifactMetadata( Artifact artifact, Artifact dependencyArtifact )
687 {
688 addArtifactMetadata( artifact, new Artifact[] { dependencyArtifact } );
689 }
690
691 private void addArtifactMetadata( Artifact artifact, Artifact[] dependencyArtifacts )
692 {
693 addArtifactMetadata( artifact, new LinkedHashSet<Artifact>( Arrays.asList( dependencyArtifacts ) ) );
694 }
695
696 private void addArtifactMetadata( Artifact artifact, Set<Artifact> dependencyArtifacts )
697 {
698 artifactMetadataSource.addArtifactMetadata( artifact, dependencyArtifacts );
699 }
700
701 private void setManagedVersionMap( MavenProject project, Set<Artifact> managedArtifacts )
702 {
703 Map<String, Artifact> managedVersionMap = new HashMap<String, Artifact>();
704
705 for ( Artifact artifact : managedArtifacts )
706 {
707 String managementKey = getManagementKey( artifact );
708
709 managedVersionMap.put( managementKey, artifact );
710 }
711
712 project.setManagedVersionMap( managedVersionMap );
713 }
714
715 private String getManagementKey( Artifact artifact )
716 {
717 return artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + artifact.getType()
718 + ( artifact.getClassifier() != null ? ":" + artifact.getClassifier() : "" );
719 }
720
721 private void assertDependencyTree( DependencyNode expectedRootNode, MavenProject project )
722 throws DependencyTreeBuilderException
723 {
724 assertDependencyTree( expectedRootNode, project, null );
725 }
726
727 private void assertDependencyTree( DependencyNode expectedRootNode, MavenProject project,
728 ArtifactFilter artifactFilter )
729 throws DependencyTreeBuilderException
730 {
731
732
733 DependencyNode actualRootNode =
734 builder.buildDependencyTree( project, artifactRepository, artifactFactory, artifactMetadataSource,
735 artifactFilter, artifactCollector );
736
737 assertEquals( "Dependency tree", expectedRootNode, actualRootNode );
738
739
740
741 ArtifactResolutionResult result = builder.getArtifactResolutionResult();
742
743 assertTreeEquals( expectedRootNode, project, result );
744 }
745
746 private void assertTreeEquals( DependencyNode dependencyNode, MavenProject project,
747 ArtifactResolutionResult resolutionResult )
748 {
749 List<ResolutionNode> rootChildrenResolutionNodes =
750 ResolutionNodeUtils.getRootChildrenResolutionNodes( project, resolutionResult );
751
752 try
753 {
754 assertEquals( "Root node artifact", dependencyNode.getArtifact(), project.getArtifact() );
755
756 assertNodesEquals( dependencyNode.getChildren(), rootChildrenResolutionNodes );
757 }
758 catch ( AssertionFailedError error )
759 {
760 StringBuffer buffer = new StringBuffer();
761
762 buffer.append( error.getMessage() ).append( "; " );
763 buffer.append( "expected dependency tree <" ).append( dependencyNode ).append( "> " );
764 buffer.append( "actual resolution tree <" );
765 ResolutionNodeUtils.append( buffer, project, resolutionResult );
766 buffer.append( ">" );
767
768 throw new AssertionFailedError( buffer.toString() );
769 }
770 }
771
772 private void assertNodesEquals( List<DependencyNode> dependencyNodes, List<ResolutionNode> resolutionNodes )
773 {
774 assertNodesEquals( dependencyNodes.iterator(), resolutionNodes.iterator() );
775 }
776
777 private void assertNodesEquals( Iterator<DependencyNode> dependencyNodesIterator,
778 Iterator<ResolutionNode> resolutionNodesIterator )
779 {
780 while ( dependencyNodesIterator.hasNext() && resolutionNodesIterator.hasNext() )
781 {
782 DependencyNode dependencyNode = dependencyNodesIterator.next();
783 ResolutionNode resolutionNode = resolutionNodesIterator.next();
784
785 assertNodeEquals( dependencyNode, resolutionNode );
786 }
787
788 if ( dependencyNodesIterator.hasNext() || resolutionNodesIterator.hasNext() )
789 {
790 fail( "Node list size differs" );
791 }
792 }
793
794 private void assertNodeEquals( DependencyNode dependencyNode, ResolutionNode resolutionNode )
795 {
796 assertEquals( "Node state", dependencyNode.getState() == DependencyNode.INCLUDED, resolutionNode.isActive() );
797
798 assertEquals( "Node artifact", dependencyNode.getArtifact(), resolutionNode.getArtifact() );
799
800 assertNodesEquals( dependencyNode.getChildren().iterator(), resolutionNode.getChildrenIterator() );
801 }
802
803 private String get( String[] array, int index )
804 {
805 return get( array, index, null );
806 }
807
808 private String get( String[] array, int index, String defaultValue )
809 {
810 return ( index < array.length ) ? array[index] : defaultValue;
811 }
812 }