001package org.apache.maven.project;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 *   http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import java.io.File;
023import java.util.ArrayList;
024import java.util.Arrays;
025import java.util.List;
026import java.util.Map;
027import java.util.Properties;
028
029import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
030import org.apache.maven.model.Plugin;
031import org.apache.maven.model.PluginExecution;
032import org.apache.maven.model.building.ModelBuildingRequest;
033import org.apache.maven.project.harness.PomTestWrapper;
034import org.apache.maven.repository.RepositorySystem;
035import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
036import org.codehaus.plexus.ContainerConfiguration;
037import org.codehaus.plexus.PlexusTestCase;
038import org.eclipse.aether.DefaultRepositorySystemSession;
039import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
040import org.eclipse.aether.repository.LocalRepository;
041
042public class PomConstructionTest
043    extends PlexusTestCase
044{
045    private static String BASE_DIR = "src/test";
046
047    private static String BASE_POM_DIR = BASE_DIR + "/resources-project-builder";
048
049    private static String BASE_MIXIN_DIR = BASE_DIR + "/resources-mixins";
050
051    private DefaultProjectBuilder projectBuilder;
052    
053    private RepositorySystem repositorySystem;
054    
055    private File testDirectory;
056
057    @Override
058    protected void customizeContainerConfiguration( ContainerConfiguration containerConfiguration )
059    {
060        super.customizeContainerConfiguration( containerConfiguration );
061        containerConfiguration.setAutoWiring( true );
062    }
063
064    protected void setUp()
065        throws Exception
066    {
067        testDirectory = new File( getBasedir(), BASE_POM_DIR );
068        new File( getBasedir(), BASE_MIXIN_DIR );
069        projectBuilder = (DefaultProjectBuilder) lookup( ProjectBuilder.class );
070        repositorySystem = lookup( RepositorySystem.class );
071    }
072    
073    @Override
074    protected void tearDown()
075        throws Exception
076    {
077        projectBuilder = null;
078
079        super.tearDown();
080    }
081    
082    /**
083     * Will throw exception if url is empty. MNG-4050 
084     *
085     * @throws Exception
086     */
087 
088    public void testEmptyUrl()
089        throws Exception
090    {
091        buildPom( "empty-distMng-repo-url" );
092    }
093
094    /**
095     * Tests that modules is not overriden by profile
096     * 
097     * @throws Exception
098     */
099    /* MNG-786*/
100    public void testProfileModules()
101        throws Exception
102    {
103        PomTestWrapper pom = buildPom( "profile-module", "a" );
104        assertEquals( "test-prop", pom.getValue( "properties[1]/b" ) );// verifies profile applied
105        assertEquals( 4, ( (List<?>) pom.getValue( "modules" ) ).size() );
106        assertEquals( "module-2", pom.getValue( "modules[1]" ) );
107        assertEquals( "module-1", pom.getValue( "modules[2]" ) );
108        assertEquals( "module-3", pom.getValue( "modules[3]" ) );
109        assertEquals( "module-4", pom.getValue( "modules[4]" ) );
110    }
111
112    /**
113     * Will throw exception if doesn't find parent(s) in build
114     *
115     * @throws Exception
116     */
117    public void testParentInheritance()
118        throws Exception
119    {
120        buildPom( "parent-inheritance/sub" );
121    }
122
123    /*MNG-3995*/
124    public void testExecutionConfigurationJoin()
125       throws Exception
126    {
127        PomTestWrapper pom = buildPom( "execution-configuration-join" );
128        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins[1]/executions[1]/configuration[1]/fileset[1]" ) ).size() );
129    }
130
131    /*MNG-3803*/
132    public void testPluginConfigProperties()
133       throws Exception
134    {
135        PomTestWrapper pom = buildPom( "plugin-config-properties" );
136        assertEquals( "my.property", pom.getValue( "build/plugins[1]/configuration[1]/systemProperties[1]/property[1]/name" ) );
137    }
138    
139    /*MNG-3900*/
140    public void testProfilePropertiesInterpolation()
141        throws Exception 
142    {
143        PomTestWrapper pom = buildPom( "profile-properties-interpolation", "interpolation-profile" );
144        assertEquals( "PASSED", pom.getValue( "properties[1]/test" ) );
145        assertEquals( "PASSED", pom.getValue( "properties[1]/property" ) );
146    }
147
148
149    // Some better conventions for the test poms needs to be created and each of these tests
150    // that represent a verification of a specification item needs to be a couple lines at most.
151    // The expressions help a lot, but we need a clean to pick up a directory of POMs, automatically load
152    // them into a resolver, create the expression to extract the data to validate the Model, and the URI
153    // to validate the properties. We also need a way to navigate from the Tex specification documents to
154    // the test in question and vice versa. A little Eclipse plugin would do the trick.
155    public void testThatExecutionsWithoutIdsAreMergedAndTheChildWins()
156        throws Exception
157    {
158        PomTestWrapper tester = buildPom( "micromailer" );
159        assertModelEquals( tester, "child-descriptor", "build/plugins[1]/executions[1]/goals[1]" );
160    }
161
162    /*MNG-
163    public void testDependencyScope()
164        throws Exception
165    {
166        PomTestWrapper pom = buildPom( "dependency-scope/sub" );
167
168    }
169
170    /*MNG- 4010*/
171    public void testDuplicateExclusionsDependency()
172        throws Exception
173    {
174        PomTestWrapper pom = buildPom( "duplicate-exclusions-dependency/sub" );
175        assertEquals( 1, ( (List<?>) pom.getValue( "dependencies[1]/exclusions" ) ).size() );
176
177    }
178
179    /*MNG- 4008*/
180    public void testMultipleFilters()
181        throws Exception
182    {
183        PomTestWrapper pom = buildPom( "multiple-filters" );
184        assertEquals( 4, ( (List<?>) pom.getValue( "build/filters" ) ).size() );
185
186    }
187
188    /** MNG-4005: postponed to 3.1
189    public void testValidationErrorUponNonUniqueDependencyKey()
190        throws Exception
191    {
192        try
193        {
194            buildPom( "unique-dependency-key/deps" );
195            fail( "Non-unique dependency keys did not cause validation error" );
196        }
197        catch ( ProjectBuildingException e )
198        {
199            // expected
200        }
201    }
202
203    public void testValidationErrorUponNonUniqueDependencyManagementKey()
204        throws Exception
205    {
206        try
207        {
208            buildPom( "unique-dependency-key/dep-mngt" );
209            fail( "Non-unique dependency keys did not cause validation error" );
210        }
211        catch ( ProjectBuildingException e )
212        {
213            // expected
214        }
215    }
216
217    public void testValidationErrorUponNonUniqueDependencyKeyInProfile()
218        throws Exception
219    {
220        try
221        {
222            buildPom( "unique-dependency-key/deps-in-profile" );
223            fail( "Non-unique dependency keys did not cause validation error" );
224        }
225        catch ( ProjectBuildingException e )
226        {
227            // expected
228        }
229    }
230
231    public void testValidationErrorUponNonUniqueDependencyManagementKeyInProfile()
232        throws Exception
233    {
234        try
235        {
236            buildPom( "unique-dependency-key/dep-mngt-in-profile" );
237            fail( "Non-unique dependency keys did not cause validation error" );
238        }
239        catch ( ProjectBuildingException e )
240        {
241            // expected
242        }
243    }
244    */
245
246    public void testDuplicateDependenciesCauseLastDeclarationToBePickedInLenientMode()
247        throws Exception
248    {
249        PomTestWrapper pom = buildPom( "unique-dependency-key/deps", true, null );
250        assertEquals( 1, ( (List<?>) pom.getValue( "dependencies" ) ).size() );
251        assertEquals( "0.2", pom.getValue( "dependencies[1]/version" ) );
252    }
253
254    /* MNG-3567*/
255    public void testParentInterpolation()
256        throws Exception
257    {
258        PomTestWrapper pom = buildPom( "parent-interpolation/sub" );
259        pom = new PomTestWrapper( pom.getMavenProject().getParent() );
260        assertEquals( "1.3.0-SNAPSHOT", pom.getValue( "build/plugins[1]/version" ) );
261    }
262
263/*
264    public void testMaven()
265        throws Exception
266    {
267        PomTestWrapper pom =  buildPomFromMavenProject( "maven-build/sub/pom.xml", null );
268  
269        for( String s: pom.getMavenProject().getTestClasspathElements() ) 
270        {
271            System.out.println( s );
272        }
273        
274    }
275    */
276    
277    /* MNG-3567*/
278    public void testPluginManagementInherited()
279        throws Exception
280    {
281        PomTestWrapper pom = buildPom( "pluginmanagement-inherited/sub" );
282        assertEquals( "1.0-alpha-21", pom.getValue( "build/plugins[1]/version" ) );
283    }
284
285     /* MNG-2174*/
286    public void testPluginManagementDependencies()
287        throws Exception
288    {
289        PomTestWrapper pom = buildPom( "plugin-management-dependencies/sub", "test" );
290        assertEquals( "1.0-alpha-21", pom.getValue( "build/plugins[1]/version" ) );
291        assertEquals( "1.0", pom.getValue( "build/plugins[1]/dependencies[1]/version" ) );
292    }
293
294
295    /* MNG-3877*/
296    public void testReportingInterpolation()
297        throws Exception
298    {
299        PomTestWrapper pom = buildPom( "reporting-interpolation" );
300        assertEquals( createPath( Arrays.asList( System.getProperty( "user.dir" ), "src", "test",
301                                                 "resources-project-builder", "reporting-interpolation", "target",
302                                                 "site" ) ), pom.getValue( "reporting/outputDirectory" ) );
303    }
304
305
306    public void testPluginOrder()
307        throws Exception
308    {
309        PomTestWrapper pom = buildPom( "plugin-order" );
310        assertEquals( "plexus-component-metadata", pom.getValue( "build/plugins[1]/artifactId" ) );
311        assertEquals( "maven-surefire-plugin", pom.getValue( "build/plugins[2]/artifactId" ) );
312    }
313
314    public void testErroneousJoiningOfDifferentPluginsWithEqualDependencies()
315        throws Exception
316    {
317        PomTestWrapper pom = buildPom( "equal-plugin-deps" );
318        assertEquals( "maven-it-plugin-a", pom.getValue( "build/plugins[1]/artifactId" ) );
319        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/dependencies" ) ).size() );
320        assertEquals( "maven-it-plugin-b", pom.getValue( "build/plugins[2]/artifactId" ) );
321        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/dependencies" ) ).size() );
322    }
323
324    /** MNG-3821 */
325    public void testErroneousJoiningOfDifferentPluginsWithEqualExecutionIds()
326        throws Exception
327    {
328        PomTestWrapper pom = buildPom( "equal-plugin-exec-ids" );
329        assertEquals( "maven-it-plugin-a", pom.getValue( "build/plugins[1]/artifactId" ) );
330        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
331        assertEquals( "maven-it-plugin-b", pom.getValue( "build/plugins[2]/artifactId" ) );
332        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
333        assertEquals( "maven-it-plugin-a", pom.getValue( "reporting/plugins[1]/artifactId" ) );
334        assertEquals( 1, ( (List<?>) pom.getValue( "reporting/plugins[1]/reportSets" ) ).size() );
335        assertEquals( "maven-it-plugin-b", pom.getValue( "reporting/plugins[2]/artifactId" ) );
336        assertEquals( 1, ( (List<?>) pom.getValue( "reporting/plugins[1]/reportSets" ) ).size() );
337    }
338
339     /** MNG-3998 */
340    public void testExecutionConfiguration()
341        throws Exception
342    {
343        PomTestWrapper pom = buildPom( "execution-configuration" );
344        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
345        assertEquals( "src/main/mdo/nexus.xml",
346                      ( pom.getValue( "build/plugins[1]/executions[1]/configuration[1]/model" ) ) );
347        assertEquals( "src/main/mdo/security.xml",
348                      ( pom.getValue( "build/plugins[1]/executions[2]/configuration[1]/model" ) ) );
349    }
350    
351    /*
352    public void testPluginConfigDuplicate()
353    throws Exception
354{
355    PomTestWrapper pom = buildPom( "plugin-config-duplicate/dup" );
356} 
357*/
358
359
360    public void testSingleConfigurationInheritance()
361        throws Exception
362    {
363        PomTestWrapper pom = buildPom( "single-configuration-inheritance" );
364
365        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins[1]/executions[1]/configuration[1]/rules" ) ).size() );
366        assertEquals( "2.0.6",
367                      pom.getValue( "build/plugins[1]/executions[1]/configuration[1]/rules[1]/requireMavenVersion[1]/version" ) );
368        assertEquals( "[1.4,)",
369                      pom.getValue( "build/plugins[1]/executions[1]/configuration[1]/rules[1]/requireJavaVersion[1]/version" ) );
370    }
371
372    public void testConfigWithPluginManagement()
373        throws Exception
374    {
375        PomTestWrapper pom = buildPom( "config-with-plugin-mng" );
376        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
377        assertEquals( "src/main/mdo/security.xml", pom.getValue( "build/plugins[1]/executions[2]/configuration[1]/model" ) );
378        assertEquals( "1.0.8", pom.getValue( "build/plugins[1]/executions[1]/configuration[1]/version" ) );
379    }
380
381    /** MNG-3965 */
382    public void testExecutionConfigurationSubcollections()
383        throws Exception
384    {
385        PomTestWrapper pom = buildPom( "execution-configuration-subcollections" );
386        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins[1]/executions[1]/configuration[1]/rules[1]/bannedDependencies" ) ).size() );
387    }
388
389    /** MNG-3985 */
390    public void testMultipleRepositories()
391        throws Exception
392    {
393        PomTestWrapper pom = buildPom( "multiple-repos/sub" );
394        assertEquals( 3, ( (List<?>) pom.getValue( "repositories" ) ).size() );
395    }
396
397    /** MNG-3965 */
398    public void testMultipleExecutionIds()
399        throws Exception
400    {
401        PomTestWrapper pom = buildPom( "dual-execution-ids/sub" );
402        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
403    }
404
405    /** MNG-3997 */
406    public void testConsecutiveEmptyElements()
407        throws Exception
408    {
409        buildPom( "consecutive_empty_elements" );
410    }
411
412    public void testOrderOfGoalsFromPluginExecutionWithoutPluginManagement()
413        throws Exception
414    {
415        PomTestWrapper pom = buildPom( "plugin-exec-goals-order/wo-plugin-mngt" );
416        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/executions[1]/goals" ) ).size() );
417        assertEquals( "b", pom.getValue( "build/plugins[1]/executions[1]/goals[1]" ) );
418        assertEquals( "a", pom.getValue( "build/plugins[1]/executions[1]/goals[2]" ) );
419        assertEquals( "d", pom.getValue( "build/plugins[1]/executions[1]/goals[3]" ) );
420        assertEquals( "c", pom.getValue( "build/plugins[1]/executions[1]/goals[4]" ) );
421        assertEquals( "e", pom.getValue( "build/plugins[1]/executions[1]/goals[5]" ) );
422    }
423
424    /* MNG-3886*/
425    public void testOrderOfGoalsFromPluginExecutionWithPluginManagement()
426        throws Exception
427    {
428        PomTestWrapper pom = buildPom( "plugin-exec-goals-order/w-plugin-mngt" );
429        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/executions[1]/goals" ) ).size() );
430        assertEquals( "b", pom.getValue( "build/plugins[1]/executions[1]/goals[1]" ) );
431        assertEquals( "a", pom.getValue( "build/plugins[1]/executions[1]/goals[2]" ) );
432        assertEquals( "d", pom.getValue( "build/plugins[1]/executions[1]/goals[3]" ) );
433        assertEquals( "c", pom.getValue( "build/plugins[1]/executions[1]/goals[4]" ) );
434        assertEquals( "e", pom.getValue( "build/plugins[1]/executions[1]/goals[5]" ) );
435    }
436
437    public void testOrderOfPluginExecutionsWithoutPluginManagement()
438        throws Exception
439    {
440        PomTestWrapper pom = buildPom( "plugin-exec-order/wo-plugin-mngt" );
441        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
442        assertEquals( "b", pom.getValue( "build/plugins[1]/executions[1]/id" ) );
443        assertEquals( "a", pom.getValue( "build/plugins[1]/executions[2]/id" ) );
444        assertEquals( "d", pom.getValue( "build/plugins[1]/executions[3]/id" ) );
445        assertEquals( "c", pom.getValue( "build/plugins[1]/executions[4]/id" ) );
446        assertEquals( "e", pom.getValue( "build/plugins[1]/executions[5]/id" ) );
447    }
448
449    /* MNG-3887 */
450    public void testOrderOfPluginExecutionsWithPluginManagement()
451        throws Exception
452    {
453        PomTestWrapper pom = buildPom( "plugin-exec-order/w-plugin-mngt" );
454        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
455        assertEquals( "b", pom.getValue( "build/plugins[1]/executions[1]/id" ) );
456        assertEquals( "a", pom.getValue( "build/plugins[1]/executions[2]/id" ) );
457        assertEquals( "d", pom.getValue( "build/plugins[1]/executions[3]/id" ) );
458        assertEquals( "c", pom.getValue( "build/plugins[1]/executions[4]/id" ) );
459        assertEquals( "e", pom.getValue( "build/plugins[1]/executions[5]/id" ) );
460    }
461
462    public void testMergeOfPluginExecutionsWhenChildInheritsPluginVersion()
463        throws Exception
464    {
465        PomTestWrapper pom = buildPom( "plugin-exec-merging-wo-version/sub" );
466        assertEquals( 4, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
467    }
468
469    /* MNG-3943*/
470    public void testMergeOfPluginExecutionsWhenChildAndParentUseDifferentPluginVersions()
471        throws Exception
472    {
473        PomTestWrapper pom = buildPom( "plugin-exec-merging-version-insensitive/sub" );
474        assertEquals( 4, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
475    }
476
477
478    public void testInterpolationWithXmlMarkup()
479        throws Exception
480    {
481        PomTestWrapper pom = buildPom( "xml-markup-interpolation" );
482        assertEquals( "<?xml version='1.0'?>Tom&Jerry", pom.getValue( "properties/xmlTest" ) );
483    }
484
485    /* MNG-3925 */
486    public void testOrderOfMergedPluginExecutionsWithoutPluginManagement()
487        throws Exception
488    {
489        PomTestWrapper pom = buildPom( "merged-plugin-exec-order/wo-plugin-mngt/sub" );
490        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
491        assertEquals( "parent-1", pom.getValue( "build/plugins[1]/executions[1]/goals[1]" ) );
492        assertEquals( "parent-2", pom.getValue( "build/plugins[1]/executions[2]/goals[1]" ) );
493        assertEquals( "child-default", pom.getValue( "build/plugins[1]/executions[3]/goals[1]" ) );
494        assertEquals( "child-1", pom.getValue( "build/plugins[1]/executions[4]/goals[1]" ) );
495        assertEquals( "child-2", pom.getValue( "build/plugins[1]/executions[5]/goals[1]" ) );
496    }
497
498    public void testOrderOfMergedPluginExecutionsWithPluginManagement()
499        throws Exception
500    {
501        PomTestWrapper pom = buildPom( "merged-plugin-exec-order/w-plugin-mngt/sub" );
502        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
503        assertEquals( "parent-1", pom.getValue( "build/plugins[1]/executions[1]/goals[1]" ) );
504        assertEquals( "parent-2", pom.getValue( "build/plugins[1]/executions[2]/goals[1]" ) );
505        assertEquals( "child-default", pom.getValue( "build/plugins[1]/executions[3]/goals[1]" ) );
506        assertEquals( "child-1", pom.getValue( "build/plugins[1]/executions[4]/goals[1]" ) );
507        assertEquals( "child-2", pom.getValue( "build/plugins[1]/executions[5]/goals[1]" ) );
508    }
509
510    /* MNG-3984*/
511    public void testDifferentContainersWithSameId()
512        throws Exception
513    {
514        PomTestWrapper pom = buildPom( "join-different-containers-same-id" );
515        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/executions[1]/goals" ) ).size() );
516        assertEquals( 1, ( (List<?>) pom.getValue( "build/pluginManagement/plugins[@artifactId='maven-it-plugin-b']/executions[1]/goals" ) ).size() );
517    }
518
519    /* MNG-3937*/
520    public void testOrderOfMergedPluginExecutionGoalsWithoutPluginManagement()
521        throws Exception
522    {
523        PomTestWrapper pom = buildPom( "merged-plugin-exec-goals-order/wo-plugin-mngt/sub" );
524
525        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/executions[1]/goals" ) ).size() );
526        assertEquals( "child-a", pom.getValue( "build/plugins[1]/executions[1]/goals[1]" ) );
527        assertEquals( "merged", pom.getValue( "build/plugins[1]/executions[1]/goals[2]" ) );
528        assertEquals( "child-b", pom.getValue( "build/plugins[1]/executions[1]/goals[3]" ) );
529        assertEquals( "parent-b", pom.getValue( "build/plugins[1]/executions[1]/goals[4]" ) );
530        assertEquals( "parent-a", pom.getValue( "build/plugins[1]/executions[1]/goals[5]" ) );
531    }
532
533    public void testOrderOfMergedPluginExecutionGoalsWithPluginManagement()
534        throws Exception
535    {
536        PomTestWrapper pom = buildPom( "merged-plugin-exec-goals-order/w-plugin-mngt/sub" );
537        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/executions[1]/goals" ) ).size() );
538        assertEquals( "child-a", pom.getValue( "build/plugins[1]/executions[1]/goals[1]" ) );
539        assertEquals( "merged", pom.getValue( "build/plugins[1]/executions[1]/goals[2]" ) );
540        assertEquals( "child-b", pom.getValue( "build/plugins[1]/executions[1]/goals[3]" ) );
541        assertEquals( "parent-b", pom.getValue( "build/plugins[1]/executions[1]/goals[4]" ) );
542        assertEquals( "parent-a", pom.getValue( "build/plugins[1]/executions[1]/goals[5]" ) );
543    }
544
545    /*MNG-3938*/
546    public void testOverridingOfInheritedPluginExecutionsWithoutPluginManagement()
547        throws Exception
548    {
549        PomTestWrapper pom = buildPom( "plugin-exec-merging/wo-plugin-mngt/sub" );
550        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
551        assertEquals( "child-default", pom.getValue( "build/plugins[1]/executions[@id='default']/phase" ) );
552        assertEquals( "child-non-default", pom.getValue( "build/plugins[1]/executions[@id='non-default']/phase" ) );
553    }
554
555    /* MNG-3938 */
556    public void testOverridingOfInheritedPluginExecutionsWithPluginManagement()
557        throws Exception
558    {
559        PomTestWrapper pom = buildPom( "plugin-exec-merging/w-plugin-mngt/sub" );
560        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
561        assertEquals( "child-default", pom.getValue( "build/plugins[1]/executions[@id='default']/phase" ) );
562        assertEquals( "child-non-default", pom.getValue( "build/plugins[1]/executions[@id='non-default']/phase" ) );
563    }
564
565
566    /* MNG-3906*/
567    public void testOrderOfMergedPluginDependenciesWithoutPluginManagement()
568        throws Exception
569    {
570        PomTestWrapper pom = buildPom( "merged-plugin-class-path-order/wo-plugin-mngt/sub" );
571
572        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/dependencies" ) ).size() );
573        assertNotNull( pom.getValue( "build/plugins[1]/dependencies[1]" ) );
574        assertEquals( "c", pom.getValue( "build/plugins[1]/dependencies[1]/artifactId" ) );
575        assertEquals( "1", pom.getValue( "build/plugins[1]/dependencies[1]/version" ) );
576        assertEquals( "a", pom.getValue( "build/plugins[1]/dependencies[2]/artifactId" ) );
577        assertEquals( "2", pom.getValue( "build/plugins[1]/dependencies[2]/version" ) );
578        assertEquals( "b", pom.getValue( "build/plugins[1]/dependencies[3]/artifactId" ) );
579        assertEquals( "1", pom.getValue( "build/plugins[1]/dependencies[3]/version" ) );
580        assertEquals( "e", pom.getValue( "build/plugins[1]/dependencies[4]/artifactId" ) );
581        assertEquals( "1", pom.getValue( "build/plugins[1]/dependencies[4]/version" ) );
582        assertEquals( "d", pom.getValue( "build/plugins[1]/dependencies[5]/artifactId" ) );
583        assertEquals( "1", pom.getValue( "build/plugins[1]/dependencies[5]/version" ) );
584    }
585
586    public void testOrderOfMergedPluginDependenciesWithPluginManagement()
587        throws Exception
588    {
589        PomTestWrapper pom = buildPom( "merged-plugin-class-path-order/w-plugin-mngt/sub" );
590        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/dependencies" ) ).size() );
591        assertEquals( "c", pom.getValue( "build/plugins[1]/dependencies[1]/artifactId" ) );
592        assertEquals( "1", pom.getValue( "build/plugins[1]/dependencies[1]/version" ) );
593        assertEquals( "a", pom.getValue( "build/plugins[1]/dependencies[2]/artifactId" ) );
594        assertEquals( "2", pom.getValue( "build/plugins[1]/dependencies[2]/version" ) );
595        assertEquals( "b", pom.getValue( "build/plugins[1]/dependencies[3]/artifactId" ) );
596        assertEquals( "1", pom.getValue( "build/plugins[1]/dependencies[3]/version" ) );
597        assertEquals( "e", pom.getValue( "build/plugins[1]/dependencies[4]/artifactId" ) );
598        assertEquals( "1", pom.getValue( "build/plugins[1]/dependencies[4]/version" ) );
599        assertEquals( "d", pom.getValue( "build/plugins[1]/dependencies[5]/artifactId" ) );
600        assertEquals( "1", pom.getValue( "build/plugins[1]/dependencies[5]/version" ) );
601    }
602
603    public void testInterpolationOfNestedBuildDirectories()
604        throws Exception
605    {
606        PomTestWrapper pom = buildPom( "nested-build-dir-interpolation" );
607        assertEquals( new File( pom.getBasedir(), "target/classes/dir0" ),
608                      new File( (String) pom.getValue( "properties/dir0" ) ) );
609        assertEquals( new File( pom.getBasedir(), "src/test/dir1" ),
610                      new File( (String) pom.getValue( "properties/dir1" ) ) );
611        assertEquals( new File( pom.getBasedir(), "target/site/dir2" ),
612                      new File( (String) pom.getValue( "properties/dir2" ) ) );
613    }
614
615    public void testAppendArtifactIdOfChildToInheritedUrls()
616        throws Exception
617    {
618        PomTestWrapper pom = buildPom( "url-inheritance/sub" );
619        assertEquals( "http://parent.url/child", pom.getValue( "url" ) );
620        assertEquals( "http://parent.url/org", pom.getValue( "organization/url" ) );
621        assertEquals( "http://parent.url/license.txt", pom.getValue( "licenses[1]/url" ) );
622        assertEquals( "http://parent.url/viewvc/child", pom.getValue( "scm/url" ) );
623        assertEquals( "http://parent.url/scm/child", pom.getValue( "scm/connection" ) );
624        assertEquals( "https://parent.url/scm/child", pom.getValue( "scm/developerConnection" ) );
625        assertEquals( "http://parent.url/issues", pom.getValue( "issueManagement/url" ) );
626        assertEquals( "http://parent.url/ci", pom.getValue( "ciManagement/url" ) );
627        assertEquals( "http://parent.url/dist", pom.getValue( "distributionManagement/repository/url" ) );
628        assertEquals( "http://parent.url/snaps", pom.getValue( "distributionManagement/snapshotRepository/url" ) );
629        assertEquals( "http://parent.url/site/child", pom.getValue( "distributionManagement/site/url" ) );
630        assertEquals( "http://parent.url/download", pom.getValue( "distributionManagement/downloadUrl" ) );
631    }
632
633    /* MNG-3846*/
634    public void testAppendArtifactIdOfParentAndChildToInheritedUrls()
635        throws Exception
636    {
637        PomTestWrapper pom = buildPom( "url-inheritance/another-parent/sub" );
638        assertEquals( "http://parent.url/ap/child", pom.getValue( "url" ) );
639        assertEquals( "http://parent.url/org", pom.getValue( "organization/url" ) );
640        assertEquals( "http://parent.url/license.txt", pom.getValue( "licenses[1]/url" ) );
641        assertEquals( "http://parent.url/viewvc/ap/child", pom.getValue( "scm/url" ) );
642        assertEquals( "http://parent.url/scm/ap/child", pom.getValue( "scm/connection" ) );
643        assertEquals( "https://parent.url/scm/ap/child", pom.getValue( "scm/developerConnection" ) );
644        assertEquals( "http://parent.url/issues", pom.getValue( "issueManagement/url" ) );
645        assertEquals( "http://parent.url/ci", pom.getValue( "ciManagement/url" ) );
646        assertEquals( "http://parent.url/dist", pom.getValue( "distributionManagement/repository/url" ) );
647        assertEquals( "http://parent.url/snaps", pom.getValue( "distributionManagement/snapshotRepository/url" ) );
648        assertEquals( "http://parent.url/site/ap/child", pom.getValue( "distributionManagement/site/url" ) );
649        assertEquals( "http://parent.url/download", pom.getValue( "distributionManagement/downloadUrl" ) );
650    }
651    //*/
652
653    public void testNonInheritedElementsInSubtreesOverriddenByChild()
654        throws Exception
655    {
656        PomTestWrapper pom = buildPom( "limited-inheritance/child" );
657        assertEquals( null, pom.getValue( "organization/url" ) );
658        assertEquals( null, pom.getValue( "issueManagement/system" ) );
659        assertEquals( 0, ( (List<?>) pom.getValue( "ciManagement/notifiers" ) ).size() );
660        assertEquals( "child-distros", pom.getValue( "distributionManagement/repository/id" ) );
661        assertEquals( "ssh://child.url/distros", pom.getValue( "distributionManagement/repository/url" ) );
662        assertEquals( null, pom.getValue( "distributionManagement/repository/name" ) );
663        assertEquals( true, pom.getValue( "distributionManagement/repository/uniqueVersion" ) );
664        assertEquals( "default", pom.getValue( "distributionManagement/repository/layout" ) );
665        assertEquals( "child-snaps", pom.getValue( "distributionManagement/snapshotRepository/id" ) );
666        assertEquals( "ssh://child.url/snaps", pom.getValue( "distributionManagement/snapshotRepository/url" ) );
667        assertEquals( null, pom.getValue( "distributionManagement/snapshotRepository/name" ) );
668        assertEquals( true, pom.getValue( "distributionManagement/snapshotRepository/uniqueVersion" ) );
669        assertEquals( "default", pom.getValue( "distributionManagement/snapshotRepository/layout" ) );
670        assertEquals( "child-site", pom.getValue( "distributionManagement/site/id" ) );
671        assertEquals( "scp://child.url/site", pom.getValue( "distributionManagement/site/url" ) );
672        assertEquals( null, pom.getValue( "distributionManagement/site/name" ) );
673    }
674
675    public void testXmlTextCoalescing()
676        throws Exception
677    {
678        PomTestWrapper pom = buildPom( "xml-coalesce-text" );
679        assertEquals( "A  Test  Project Property", pom.getValue( "properties/prop0" ) );
680        assertEquals( "That's a test!", pom.getValue( "properties/prop1" ) );
681        assertEquals( 32 * 1024,
682                      pom.getValue( "properties/prop2" ).toString().trim().replaceAll( "[\n\r]", "" ).length() );
683    }
684
685    public void testFullInterpolationOfNestedExpressions()
686        throws Exception
687    {
688        PomTestWrapper pom = buildPom( "full-interpolation" );
689        for ( int i = 0; i < 24; i++ )
690        {
691            String index = ( ( i < 10 ) ? "0" : "" ) + i;
692            assertEquals( "PASSED", pom.getValue( "properties/property" + index ) );
693        }
694    }
695
696    public void testInterpolationOfLegacyExpressionsThatDontIncludeTheProjectPrefix()
697        throws Exception
698    {
699        PomTestWrapper pom = buildPom( "unprefixed-expression-interpolation/child" );
700
701        assertEquals( pom.getBasedir(), new File( pom.getValue( "properties/projectDir" ).toString() ) );
702
703        assertEquals( "org.apache.maven.its.mng3831.child", pom.getValue( "properties/projectGroupId" ) );
704        assertEquals( "child", pom.getValue( "properties/projectArtifactId" ) );
705        assertEquals( "2.0-alpha-1", pom.getValue( "properties/projectVersion" ) );
706        assertEquals( "jar", pom.getValue( "properties/projectPackaging" ) );
707
708        assertEquals( "child-name", pom.getValue( "properties/projectName" ) );
709        assertEquals( "child-desc", pom.getValue( "properties/projectDesc" ) );
710        assertEquals( "http://child.org/", pom.getValue( "properties/projectUrl" ) );
711        assertEquals( "2008", pom.getValue( "properties/projectYear" ) );
712        assertEquals( "child-org-name", pom.getValue( "properties/projectOrgName" ) );
713
714        assertEquals( "2.0.0", pom.getValue( "properties/projectPrereqMvn" ) );
715        assertEquals( "http://scm.org/", pom.getValue( "properties/projectScmUrl" ) );
716        assertEquals( "http://issue.org/", pom.getValue( "properties/projectIssueUrl" ) );
717        assertEquals( "http://ci.org/", pom.getValue( "properties/projectCiUrl" ) );
718        assertEquals( "child-dist-repo", pom.getValue( "properties/projectDistRepoName" ) );
719        assertEquals( "http://dist.org/", pom.getValue( "properties/projectDistRepoUrl" ) );
720        assertEquals( "http://site.org/", pom.getValue( "properties/projectDistSiteUrl" ) );
721
722        assertEquals( "org.apache.maven.its.mng3831", pom.getValue( "properties/parentGroupId" ) );
723        assertEquals( "parent", pom.getValue( "properties/parentArtifactId" ) );
724        assertEquals( "1.0", pom.getValue( "properties/parentVersion" ) );
725
726        assertTrue( pom.getValue( "properties/projectBuildOut" ).toString().endsWith( "bin" ) );
727        assertTrue( pom.getValue( "properties/projectSiteOut" ).toString().endsWith( "doc" ) );
728    }
729
730    public void testInterpolationWithBasedirAlignedDirectories()
731        throws Exception
732    {
733        PomTestWrapper pom = buildPom( "basedir-aligned-interpolation" );
734        assertEquals( new File( pom.getBasedir(), "src/main/java" ),
735                      new File( pom.getValue( "properties/buildMainSrc" ).toString() ) );
736        assertEquals( new File( pom.getBasedir(), "src/test/java" ),
737                      new File( pom.getValue( "properties/buildTestSrc" ).toString() ) );
738        assertEquals( new File( pom.getBasedir(), "src/main/scripts" ),
739                      new File( pom.getValue( "properties/buildScriptSrc" ).toString() ) );
740        assertEquals( new File( pom.getBasedir(), "target" ),
741                      new File( pom.getValue( "properties/buildOut" ).toString() ) );
742        assertEquals( new File( pom.getBasedir(), "target/classes" ),
743                      new File( pom.getValue( "properties/buildMainOut" ).toString() ) );
744        assertEquals( new File( pom.getBasedir(), "target/test-classes" ),
745                      new File( pom.getValue( "properties/buildTestOut" ).toString() ) );
746        assertEquals( new File( pom.getBasedir(), "target/site" ),
747                      new File( pom.getValue( "properties/siteOut" ).toString() ) );
748    }
749
750    /* MNG-3944*/
751    public void testInterpolationOfBasedirInPomWithUnusualName()
752        throws Exception
753    {
754        PomTestWrapper pom = buildPom( "basedir-interpolation/pom-with-unusual-name.xml" );
755        assertEquals( pom.getBasedir(), new File( pom.getValue( "properties/prop0" ).toString() ) );
756        assertEquals( pom.getBasedir(), new File( pom.getValue( "properties/prop1" ).toString() ) );
757    }
758
759    /* MNG-3979 */
760    public void testJoiningOfContainersWhenChildHasEmptyElements()
761        throws Exception
762    {
763        PomTestWrapper pom = buildPom( "id-container-joining-with-empty-elements/sub" );
764        assertNotNull( pom );
765    }
766
767    public void testOrderOfPluginConfigurationElementsWithoutPluginManagement()
768        throws Exception
769    {
770        PomTestWrapper pom = buildPom( "plugin-config-order/wo-plugin-mngt" );
771        assertEquals( "one", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[1]" ) );
772        assertEquals( "two", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[2]" ) );
773        assertEquals( "three", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[3]" ) );
774        assertEquals( "four", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[4]" ) );
775    }
776
777    /* MNG-3827*/
778    public void testOrderOfPluginConfigurationElementsWithPluginManagement()
779        throws Exception
780    {
781        PomTestWrapper pom = buildPom( "plugin-config-order/w-plugin-mngt" );
782        assertEquals( "one", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[1]" ) );
783        assertEquals( "two", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[2]" ) );
784        assertEquals( "three", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[3]" ) );
785        assertEquals( "four", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[4]" ) );
786    }
787
788    public void testOrderOfPluginExecutionConfigurationElementsWithoutPluginManagement()
789        throws Exception
790    {
791        PomTestWrapper pom = buildPom( "plugin-exec-config-order/wo-plugin-mngt" );
792        String prefix = "build/plugins[1]/executions[1]/configuration/";
793        assertEquals( "one", pom.getValue( prefix + "stringParams/stringParam[1]" ) );
794        assertEquals( "two", pom.getValue( prefix + "stringParams/stringParam[2]" ) );
795        assertEquals( "three", pom.getValue( prefix + "stringParams/stringParam[3]" ) );
796        assertEquals( "four", pom.getValue( prefix + "stringParams/stringParam[4]" ) );
797        assertEquals( "key1", pom.getValue( prefix + "propertiesParam/property[1]/name" ) );
798        assertEquals( "key2", pom.getValue( prefix + "propertiesParam/property[2]/name" ) );
799    }
800
801    /* MNG-3864*/
802    public void testOrderOfPluginExecutionConfigurationElementsWithPluginManagement()
803        throws Exception
804    {
805        PomTestWrapper pom = buildPom( "plugin-exec-config-order/w-plugin-mngt" );
806        String prefix = "build/plugins[1]/executions[1]/configuration/";
807        assertEquals( "one", pom.getValue( prefix + "stringParams/stringParam[1]" ) );
808        assertEquals( "two", pom.getValue( prefix + "stringParams/stringParam[2]" ) );
809        assertEquals( "three", pom.getValue( prefix + "stringParams/stringParam[3]" ) );
810        assertEquals( "four", pom.getValue( prefix + "stringParams/stringParam[4]" ) );
811        assertEquals( "key1", pom.getValue( prefix + "propertiesParam/property[1]/name" ) );
812        assertEquals( "key2", pom.getValue( prefix + "propertiesParam/property[2]/name" ) );
813    }
814
815    /* MNG-3836*/
816    public void testMergeOfInheritedPluginConfiguration()
817        throws Exception
818    {
819        PomTestWrapper pom = buildPom( "plugin-config-merging/child" );
820
821        String prefix = "build/plugins[1]/configuration/";
822        assertEquals( "PASSED", pom.getValue( prefix + "propertiesFile" ) );
823        assertEquals( "PASSED", pom.getValue( prefix + "parent" ) );
824        assertEquals( "PASSED-1", pom.getValue( prefix + "stringParams/stringParam[1]" ) );
825        assertEquals( "PASSED-3", pom.getValue( prefix + "stringParams/stringParam[2]" ) );
826        assertEquals( "PASSED-2", pom.getValue( prefix + "stringParams/stringParam[3]" ) );
827        assertEquals( "PASSED-4", pom.getValue( prefix + "stringParams/stringParam[4]" ) );
828        assertEquals( "PASSED-1", pom.getValue( prefix + "listParam/listParam[1]" ) );
829        assertEquals( "PASSED-3", pom.getValue( prefix + "listParam/listParam[2]" ) );
830        assertEquals( "PASSED-2", pom.getValue( prefix + "listParam/listParam[3]" ) );
831        assertEquals( "PASSED-4", pom.getValue( prefix + "listParam/listParam[4]" ) );
832    }
833
834    /* MNG-2591 */
835    public void testAppendOfInheritedPluginConfigurationWithNoProfile()
836        throws Exception
837    {
838        testAppendOfInheritedPluginConfiguration( "no-profile" );
839    }
840    
841    /* MNG-2591*/
842    public void testAppendOfInheritedPluginConfigurationWithActiveProfile()
843        throws Exception
844    {
845        testAppendOfInheritedPluginConfiguration( "with-profile" );
846    }
847 
848    private void testAppendOfInheritedPluginConfiguration( String test )
849        throws Exception
850    {
851        PomTestWrapper pom = buildPom( "plugin-config-append/" + test + "/subproject" );
852        String prefix = "build/plugins[1]/configuration/";
853        assertEquals( "PARENT-1", pom.getValue( prefix + "stringParams/stringParam[1]" ) );
854        assertEquals( "PARENT-3", pom.getValue( prefix + "stringParams/stringParam[2]" ) );
855        assertEquals( "PARENT-2", pom.getValue( prefix + "stringParams/stringParam[3]" ) );
856        assertEquals( "PARENT-4", pom.getValue( prefix + "stringParams/stringParam[4]" ) );
857        assertEquals( "CHILD-1", pom.getValue( prefix + "stringParams/stringParam[5]" ) );
858        assertEquals( "CHILD-3", pom.getValue( prefix + "stringParams/stringParam[6]" ) );
859        assertEquals( "CHILD-2", pom.getValue( prefix + "stringParams/stringParam[7]" ) );
860        assertEquals( "CHILD-4", pom.getValue( prefix + "stringParams/stringParam[8]" ) );
861        assertEquals( null, pom.getValue( prefix + "stringParams/stringParam[9]" ) );
862        assertEquals( "PARENT-1", pom.getValue( prefix + "listParam/listParam[1]" ) );
863        assertEquals( "PARENT-3", pom.getValue( prefix + "listParam/listParam[2]" ) );
864        assertEquals( "PARENT-2", pom.getValue( prefix + "listParam/listParam[3]" ) );
865        assertEquals( "PARENT-4", pom.getValue( prefix + "listParam/listParam[4]" ) );
866        assertEquals( "CHILD-1", pom.getValue( prefix + "listParam/listParam[5]" ) );
867        assertEquals( "CHILD-3", pom.getValue( prefix + "listParam/listParam[6]" ) );
868        assertEquals( "CHILD-2", pom.getValue( prefix + "listParam/listParam[7]" ) );
869        assertEquals( "CHILD-4", pom.getValue( prefix + "listParam/listParam[8]" ) );
870        assertEquals( null, pom.getValue( prefix + "listParam/listParam[9]" ) );
871    }
872
873    /* MNG-4000 */
874    public void testMultiplePluginExecutionsWithAndWithoutIdsWithoutPluginManagement()
875        throws Exception
876    {
877        PomTestWrapper pom = buildPom( "plugin-exec-w-and-wo-id/wo-plugin-mngt" );
878        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
879        assertEquals( "log-string", pom.getValue( "build/plugins[1]/executions[1]/goals[1]" ) );
880        assertEquals( "log-string", pom.getValue( "build/plugins[1]/executions[2]/goals[1]" ) );
881    }
882
883    public void testMultiplePluginExecutionsWithAndWithoutIdsWithPluginManagement()
884        throws Exception
885    {
886        PomTestWrapper pom = buildPom( "plugin-exec-w-and-wo-id/w-plugin-mngt" );
887        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
888        assertEquals( "log-string", pom.getValue( "build/plugins[1]/executions[1]/goals[1]" ) );
889        assertEquals( "log-string", pom.getValue( "build/plugins[1]/executions[2]/goals[1]" ) );
890    }
891
892    public void testDependencyOrderWithoutPluginManagement()
893        throws Exception
894    {
895        PomTestWrapper pom = buildPom( "dependency-order/wo-plugin-mngt" );
896        assertEquals( 4, ( (List<?>) pom.getValue( "dependencies" ) ).size() );
897        assertEquals( "a", pom.getValue( "dependencies[1]/artifactId" ) );
898        assertEquals( "c", pom.getValue( "dependencies[2]/artifactId" ) );
899        assertEquals( "b", pom.getValue( "dependencies[3]/artifactId" ) );
900        assertEquals( "d", pom.getValue( "dependencies[4]/artifactId" ) );
901    }
902
903    public void testDependencyOrderWithPluginManagement()
904        throws Exception
905    {
906        PomTestWrapper pom = buildPom( "dependency-order/w-plugin-mngt" );
907        assertEquals( 4, ( (List<?>) pom.getValue( "dependencies" ) ).size() );
908        assertEquals( "a", pom.getValue( "dependencies[1]/artifactId" ) );
909        assertEquals( "c", pom.getValue( "dependencies[2]/artifactId" ) );
910        assertEquals( "b", pom.getValue( "dependencies[3]/artifactId" ) );
911        assertEquals( "d", pom.getValue( "dependencies[4]/artifactId" ) );
912    }
913
914    public void testBuildDirectoriesUsePlatformSpecificFileSeparator()
915        throws Exception
916    {
917        PomTestWrapper pom = buildPom( "platform-file-separator" );
918        assertPathWithNormalizedFileSeparators( pom.getValue( "build/directory" ) );
919        assertPathWithNormalizedFileSeparators( pom.getValue( "build/outputDirectory" ) );
920        assertPathWithNormalizedFileSeparators( pom.getValue( "build/testOutputDirectory" ) );
921        assertPathWithNormalizedFileSeparators( pom.getValue( "build/sourceDirectory" ) );
922        assertPathWithNormalizedFileSeparators( pom.getValue( "build/testSourceDirectory" ) );
923        assertPathWithNormalizedFileSeparators( pom.getValue( "build/resources[1]/directory" ) );
924        assertPathWithNormalizedFileSeparators( pom.getValue( "build/testResources[1]/directory" ) );
925        assertPathWithNormalizedFileSeparators( pom.getValue( "build/filters[1]" ) );
926        assertPathWithNormalizedFileSeparators( pom.getValue( "reporting/outputDirectory" ) );
927    }
928
929    /* MNG-4008 */
930    public void testMergedFilterOrder()
931        throws Exception
932    {
933        PomTestWrapper pom = buildPom( "merged-filter-order/sub" );
934
935        assertEquals( 7, ( (List<?>) pom.getValue( "build/filters" ) ).size() );
936        assertTrue( pom.getValue( "build/filters[1]" ).toString().endsWith( "child-a.properties" ) );
937        assertTrue( pom.getValue( "build/filters[2]" ).toString().endsWith( "child-c.properties" ) );
938        assertTrue( pom.getValue( "build/filters[3]" ).toString().endsWith( "child-b.properties" ) );
939        assertTrue( pom.getValue( "build/filters[4]" ).toString().endsWith( "child-d.properties" ) );
940        assertTrue( pom.getValue( "build/filters[5]" ).toString().endsWith( "parent-c.properties" ) );
941        assertTrue( pom.getValue( "build/filters[6]" ).toString().endsWith( "parent-b.properties" ) );
942        assertTrue( pom.getValue( "build/filters[7]" ).toString().endsWith( "parent-d.properties" ) );
943    }
944
945    /** MNG-4027*/
946    public void testProfileInjectedDependencies()
947        throws Exception
948    {
949        PomTestWrapper pom = buildPom( "profile-injected-dependencies" );
950        assertEquals( 4, ( (List<?>) pom.getValue( "dependencies" ) ).size() );
951        assertEquals( "a", pom.getValue( "dependencies[1]/artifactId" ) );
952        assertEquals( "c", pom.getValue( "dependencies[2]/artifactId" ) );
953        assertEquals( "b", pom.getValue( "dependencies[3]/artifactId" ) );
954        assertEquals( "d", pom.getValue( "dependencies[4]/artifactId" ) );
955    }
956    
957    /** IT-0021*/
958    public void testProfileDependenciesMultipleProfiles()
959        throws Exception
960    {
961        PomTestWrapper pom = buildPom( "profile-dependencies-multiple-profiles", "profile-1", "profile-2" );
962        assertEquals(2,  ( (List<?>) pom.getValue( "dependencies" ) ).size() );
963    }    
964
965    public void testDependencyInheritance()
966        throws Exception
967    {
968        PomTestWrapper pom = buildPom( "dependency-inheritance/sub" );
969        assertEquals( 1, ( (List<?>) pom.getValue( "dependencies" ) ).size() );
970        assertEquals( "4.4", pom.getValue( "dependencies[1]/version" ) );
971    }
972
973    /** MNG-4034 */
974    public void testManagedProfileDependency()
975        throws Exception
976    {
977        PomTestWrapper pom = this.buildPom( "managed-profile-dependency/sub", "maven-core-it" );
978        assertEquals( 1, ( (List<?>) pom.getValue( "dependencies" ) ).size() );
979        assertEquals( "org.apache.maven.its", pom.getValue( "dependencies[1]/groupId" ) );
980        assertEquals( "maven-core-it-support", pom.getValue( "dependencies[1]/artifactId" ) );
981        assertEquals( "1.3", pom.getValue( "dependencies[1]/version" ) );
982        assertEquals( "runtime", pom.getValue( "dependencies[1]/scope" ) );
983        assertEquals( 1, ( (List<?>) pom.getValue( "dependencies[1]/exclusions" ) ).size() );
984        assertEquals( "commons-lang", pom.getValue( "dependencies[1]/exclusions[1]/groupId" ) );
985    }
986
987    /** MNG-4040 */
988    public void testProfileModuleInheritance()
989        throws Exception
990    {
991        PomTestWrapper pom = this.buildPom( "profile-module-inheritance/sub", "dist" );
992        assertEquals( 0, ( (List<?>) pom.getValue( "modules" ) ).size() );
993    }
994    
995    /** MNG-3621 */
996    public void testUncPath()
997        throws Exception
998    {
999        PomTestWrapper pom = this.buildPom( "unc-path/sub" );
1000        assertEquals( "file:////host/site/test-child", pom.getValue( "distributionManagement/site/url" ) );
1001    }
1002    
1003    /** MNG-2006 */
1004    public void testUrlAppendWithChildPathAdjustment()
1005        throws Exception
1006    {
1007        PomTestWrapper pom = this.buildPom( "url-append/child" );
1008        assertEquals( "http://project.url/child", pom.getValue( "url" ) );
1009        assertEquals( "http://viewvc.project.url/child", pom.getValue( "scm/url" ) );
1010        assertEquals( "http://scm.project.url/child", pom.getValue( "scm/connection" ) );
1011        assertEquals( "https://scm.project.url/child", pom.getValue( "scm/developerConnection" ) );
1012        assertEquals( "http://site.project.url/child", pom.getValue( "distributionManagement/site/url" ) );
1013    } 
1014
1015    /** MNG-0479 */
1016    public void testRepoInheritance()
1017        throws Exception
1018    {
1019        PomTestWrapper pom = this.buildPom( "repo-inheritance" );
1020        assertEquals( 1, ( (List<?>) pom.getValue( "repositories" ) ).size() );
1021        assertEquals( "it0043", pom.getValue( "repositories[1]/name" ) );
1022    }   
1023    
1024    public void testEmptyScm()
1025        throws Exception
1026    {
1027        PomTestWrapper pom = this.buildPom( "empty-scm" );
1028        assertNull( pom.getValue( "scm" ) );
1029    }       
1030    
1031    public void testPluginConfigurationUsingAttributesWithoutPluginManagement()
1032        throws Exception
1033    {
1034        PomTestWrapper pom = buildPom( "plugin-config-attributes/wo-plugin-mngt" );
1035        assertEquals( "src", pom.getValue( "build/plugins[1]/configuration/domParam/copy/@todir" ) );
1036        assertEquals( "true", pom.getValue( "build/plugins[1]/configuration/domParam/copy/@overwrite" ) );
1037        assertEquals( "target", pom.getValue( "build/plugins[1]/configuration/domParam/copy/fileset/@dir" ) );
1038        assertEquals( null, pom.getValue( "build/plugins[1]/configuration/domParam/copy/fileset/@todir" ) );
1039        assertEquals( null, pom.getValue( "build/plugins[1]/configuration/domParam/copy/fileset/@overwrite" ) );
1040    }
1041
1042    /** MNG-4053*/
1043    public void testPluginConfigurationUsingAttributesWithPluginManagement()
1044        throws Exception
1045    {
1046        PomTestWrapper pom = buildPom( "plugin-config-attributes/w-plugin-mngt" );
1047        assertEquals( "src", pom.getValue( "build/plugins[1]/configuration/domParam/copy/@todir" ) );
1048        assertEquals( "true", pom.getValue( "build/plugins[1]/configuration/domParam/copy/@overwrite" ) );
1049        assertEquals( "target", pom.getValue( "build/plugins[1]/configuration/domParam/copy/fileset/@dir" ) );
1050        assertEquals( null, pom.getValue( "build/plugins[1]/configuration/domParam/copy/fileset/@todir" ) );
1051        assertEquals( null, pom.getValue( "build/plugins[1]/configuration/domParam/copy/fileset/@overwrite" ) );
1052    }
1053
1054    public void testPluginConfigurationUsingAttributesWithPluginManagementAndProfile()
1055        throws Exception
1056    {
1057        PomTestWrapper pom = buildPom( "plugin-config-attributes/w-profile", "maven-core-it" );
1058        assertEquals( "src", pom.getValue( "build/plugins[1]/configuration/domParam/copy/@todir" ) );
1059        assertEquals( "true", pom.getValue( "build/plugins[1]/configuration/domParam/copy/@overwrite" ) );
1060        assertEquals( "target", pom.getValue( "build/plugins[1]/configuration/domParam/copy/fileset/@dir" ) );
1061        assertEquals( null, pom.getValue( "build/plugins[1]/configuration/domParam/copy/fileset/@todir" ) );
1062        assertEquals( null, pom.getValue( "build/plugins[1]/configuration/domParam/copy/fileset/@overwrite" ) );
1063    }
1064
1065    public void testPomEncoding()
1066        throws Exception
1067    {
1068        PomTestWrapper pom = buildPom( "pom-encoding/utf-8" );
1069        assertEquals( "TEST-CHARS: \u00DF\u0131\u03A3\u042F\u05D0\u20AC", pom.getValue( "description" ) );
1070        pom = buildPom( "pom-encoding/latin-1" );
1071        assertEquals( "TEST-CHARS: \u00C4\u00D6\u00DC\u00E4\u00F6\u00FC\u00DF", pom.getValue( "description" ) );
1072    }
1073
1074    /* MNG-4070 */
1075    public void testXmlWhitespaceHandling()
1076        throws Exception
1077    {
1078        PomTestWrapper pom = buildPom( "xml-whitespace/sub" );
1079        assertEquals( "org.apache.maven.its.mng4070", pom.getValue( "groupId" ) );
1080    }
1081
1082    /* MNG-3760*/
1083    public void testInterpolationOfBaseUrl()
1084        throws Exception
1085    {
1086        PomTestWrapper pom = buildPom( "baseurl-interpolation/pom.xml" );
1087        assertEquals( pom.getBasedir().toURI().toString(), pom.getValue( "properties/prop1" ).toString() );
1088    }
1089
1090    /* MNG-3811*/
1091    public void testReportingPluginConfig()
1092        throws Exception
1093    {
1094        PomTestWrapper pom = buildPom( "reporting-plugin-config/sub" );
1095
1096        assertEquals( 3, ( (List<?>) pom.getValue( "reporting/plugins[1]/configuration/stringParams" ) ).size() );
1097        assertEquals( "parentParam", pom.getValue( "reporting/plugins[1]/configuration/stringParams[1]/stringParam[1]" ) );
1098        assertEquals( "childParam", pom.getValue( "reporting/plugins[1]/configuration/stringParams[1]/stringParam[2]" ) );
1099        assertEquals( "  preserve space  ", pom.getValue( "reporting/plugins[1]/configuration/stringParams[1]/stringParam[3]" ) );
1100        assertEquals( "true", pom.getValue( "reporting/plugins[1]/configuration/booleanParam" ) );
1101    }    
1102    
1103    public void testPropertiesNoDuplication()
1104        throws Exception
1105    {
1106        PomTestWrapper pom = buildPom( "properties-no-duplication/sub" );       
1107        assertEquals( 1, ( (Properties) pom.getValue( "properties" ) ).size() );
1108        assertEquals( "child", pom.getValue( "properties/pomProfile" ) );
1109    }
1110
1111    public void testPomInheritance()
1112        throws Exception
1113    {
1114        PomTestWrapper pom = buildPom( "pom-inheritance/sub" );
1115        assertEquals( "parent-description", pom.getValue( "description" ) );
1116        assertEquals( "jar", pom.getValue( "packaging" ) );
1117    }
1118
1119    public void testCompleteModelWithoutParent()
1120        throws Exception
1121    {
1122        PomTestWrapper pom = buildPom( "complete-model/wo-parent" );
1123
1124        testCompleteModel( pom );
1125    }
1126
1127    public void testCompleteModelWithParent()
1128        throws Exception
1129    {
1130        PomTestWrapper pom = buildPom( "complete-model/w-parent/sub" );
1131
1132        testCompleteModel( pom );
1133    }
1134
1135    private void testCompleteModel( PomTestWrapper pom )
1136        throws Exception
1137    {
1138        assertEquals( "4.0.0", pom.getValue( "modelVersion" ) );
1139
1140        assertEquals( "org.apache.maven.its.mng", pom.getValue( "groupId" ) );
1141        assertEquals( "test", pom.getValue( "artifactId" ) );
1142        assertEquals( "0.2", pom.getValue( "version" ) );
1143        assertEquals( "pom", pom.getValue( "packaging" ) );
1144
1145        assertEquals( "project-name", pom.getValue( "name" ) );
1146        assertEquals( "project-description", pom.getValue( "description" ) );
1147        assertEquals( "http://project.url/", pom.getValue( "url" ) );
1148        assertEquals( "2009", pom.getValue( "inceptionYear" ) );
1149
1150        assertEquals( "project-org", pom.getValue( "organization/name" ) );
1151        assertEquals( "http://project-org.url/", pom.getValue( "organization/url" ) );
1152
1153        assertEquals( 1, ( (List<?>) pom.getValue( "licenses" ) ).size() );
1154        assertEquals( "project-license", pom.getValue( "licenses[1]/name" ) );
1155        assertEquals( "http://project.url/license", pom.getValue( "licenses[1]/url" ) );
1156        assertEquals( "repo", pom.getValue( "licenses[1]/distribution" ) );
1157        assertEquals( "free", pom.getValue( "licenses[1]/comments" ) );
1158
1159        assertEquals( 1, ( (List<?>) pom.getValue( "developers" ) ).size() );
1160        assertEquals( "dev", pom.getValue( "developers[1]/id" ) );
1161        assertEquals( "project-developer", pom.getValue( "developers[1]/name" ) );
1162        assertEquals( "developer@", pom.getValue( "developers[1]/email" ) );
1163        assertEquals( "http://developer", pom.getValue( "developers[1]/url" ) );
1164        assertEquals( "developer", pom.getValue( "developers[1]/organization" ) );
1165        assertEquals( "http://devel.org", pom.getValue( "developers[1]/organizationUrl" ) );
1166        assertEquals( "-1", pom.getValue( "developers[1]/timezone" ) );
1167        assertEquals( "yes", pom.getValue( "developers[1]/properties/developer" ) );
1168        assertEquals( 1, ( (List<?>) pom.getValue( "developers[1]/roles" ) ).size() );
1169        assertEquals( "devel", pom.getValue( "developers[1]/roles[1]" ) );
1170
1171        assertEquals( 1, ( (List<?>) pom.getValue( "contributors" ) ).size() );
1172        assertEquals( "project-contributor", pom.getValue( "contributors[1]/name" ) );
1173        assertEquals( "contributor@", pom.getValue( "contributors[1]/email" ) );
1174        assertEquals( "http://contributor", pom.getValue( "contributors[1]/url" ) );
1175        assertEquals( "contributor", pom.getValue( "contributors[1]/organization" ) );
1176        assertEquals( "http://contrib.org", pom.getValue( "contributors[1]/organizationUrl" ) );
1177        assertEquals( "+1", pom.getValue( "contributors[1]/timezone" ) );
1178        assertEquals( "yes", pom.getValue( "contributors[1]/properties/contributor" ) );
1179        assertEquals( 1, ( (List<?>) pom.getValue( "contributors[1]/roles" ) ).size() );
1180        assertEquals( "contrib", pom.getValue( "contributors[1]/roles[1]" ) );
1181
1182        assertEquals( 1, ( (List<?>) pom.getValue( "mailingLists" ) ).size() );
1183        assertEquals( "project-mailing-list", pom.getValue( "mailingLists[1]/name" ) );
1184        assertEquals( "subscribe@", pom.getValue( "mailingLists[1]/subscribe" ) );
1185        assertEquals( "unsubscribe@", pom.getValue( "mailingLists[1]/unsubscribe" ) );
1186        assertEquals( "post@", pom.getValue( "mailingLists[1]/post" ) );
1187        assertEquals( "mail-archive", pom.getValue( "mailingLists[1]/archive" ) );
1188        assertEquals( 1, ( (List<?>) pom.getValue( "mailingLists[1]/otherArchives" ) ).size() );
1189        assertEquals( "other-archive", pom.getValue( "mailingLists[1]/otherArchives[1]" ) );
1190
1191        assertEquals( "2.0.1", pom.getValue( "prerequisites/maven" ) );
1192
1193        assertEquals( "http://project.url/trunk", pom.getValue( "scm/url" ) );
1194        assertEquals( "http://project.url/scm", pom.getValue( "scm/connection" ) );
1195        assertEquals( "https://project.url/scm", pom.getValue( "scm/developerConnection" ) );
1196        assertEquals( "TAG", pom.getValue( "scm/tag" ) );
1197
1198        assertEquals( "issues", pom.getValue( "issueManagement/system" ) );
1199        assertEquals( "http://project.url/issues", pom.getValue( "issueManagement/url" ) );
1200
1201        assertEquals( "ci", pom.getValue( "ciManagement/system" ) );
1202        assertEquals( "http://project.url/ci", pom.getValue( "ciManagement/url" ) );
1203        assertEquals( 1, ( (List<?>) pom.getValue( "ciManagement/notifiers" ) ).size() );
1204        assertEquals( "irc", pom.getValue( "ciManagement/notifiers[1]/type" ) );
1205        assertEquals( "ci@", pom.getValue( "ciManagement/notifiers[1]/address" ) );
1206        assertEquals( Boolean.TRUE, pom.getValue( "ciManagement/notifiers[1]/sendOnError" ) );
1207        assertEquals( Boolean.FALSE, pom.getValue( "ciManagement/notifiers[1]/sendOnFailure" ) );
1208        assertEquals( Boolean.FALSE, pom.getValue( "ciManagement/notifiers[1]/sendOnWarning" ) );
1209        assertEquals( Boolean.FALSE, pom.getValue( "ciManagement/notifiers[1]/sendOnSuccess" ) );
1210        assertEquals( "ci", pom.getValue( "ciManagement/notifiers[1]/configuration/ciProp" ) );
1211
1212        assertEquals( "project.distros", pom.getValue( "distributionManagement/repository/id" ) );
1213        assertEquals( "distros", pom.getValue( "distributionManagement/repository/name" ) );
1214        assertEquals( "http://project.url/dist", pom.getValue( "distributionManagement/repository/url" ) );
1215        assertEquals( Boolean.TRUE, pom.getValue( "distributionManagement/repository/uniqueVersion" ) );
1216
1217        assertEquals( "project.snaps", pom.getValue( "distributionManagement/snapshotRepository/id" ) );
1218        assertEquals( "snaps", pom.getValue( "distributionManagement/snapshotRepository/name" ) );
1219        assertEquals( "http://project.url/snaps", pom.getValue( "distributionManagement/snapshotRepository/url" ) );
1220        assertEquals( Boolean.FALSE, pom.getValue( "distributionManagement/snapshotRepository/uniqueVersion" ) );
1221
1222        assertEquals( "project.site", pom.getValue( "distributionManagement/site/id" ) );
1223        assertEquals( "docs", pom.getValue( "distributionManagement/site/name" ) );
1224        assertEquals( "http://project.url/site", pom.getValue( "distributionManagement/site/url" ) );
1225
1226        assertEquals( "http://project.url/download", pom.getValue( "distributionManagement/downloadUrl" ) );
1227        assertEquals( "reloc-gid", pom.getValue( "distributionManagement/relocation/groupId" ) );
1228        assertEquals( "reloc-aid", pom.getValue( "distributionManagement/relocation/artifactId" ) );
1229        assertEquals( "reloc-version", pom.getValue( "distributionManagement/relocation/version" ) );
1230        assertEquals( "project-reloc-msg", pom.getValue( "distributionManagement/relocation/message" ) );
1231
1232        assertEquals( 1, ( (List<?>) pom.getValue( "modules" ) ).size() );
1233        assertEquals( "sub", pom.getValue( "modules[1]" ) );
1234
1235        assertEquals( 1, ( (Map<?, ?>) pom.getValue( "properties" ) ).size() );
1236        assertEquals( "project-property", pom.getValue( "properties[1]/itProperty" ) );
1237
1238        assertEquals( 1, ( (List<?>) pom.getValue( "dependencyManagement/dependencies" ) ).size() );
1239        assertEquals( "org.apache.maven.its", pom.getValue( "dependencyManagement/dependencies[1]/groupId" ) );
1240        assertEquals( "managed-dep", pom.getValue( "dependencyManagement/dependencies[1]/artifactId" ) );
1241        assertEquals( "0.1", pom.getValue( "dependencyManagement/dependencies[1]/version" ) );
1242        assertEquals( "war", pom.getValue( "dependencyManagement/dependencies[1]/type" ) );
1243        assertEquals( "runtime", pom.getValue( "dependencyManagement/dependencies[1]/scope" ) );
1244        assertEquals( Boolean.FALSE, pom.getValue( "dependencyManagement/dependencies[1]/optional" ) );
1245        assertEquals( 1, ( (List<?>) pom.getValue( "dependencyManagement/dependencies[1]/exclusions" ) ).size() );
1246        assertEquals( "org.apache.maven.its",
1247                      pom.getValue( "dependencyManagement/dependencies[1]/exclusions[1]/groupId" ) );
1248        assertEquals( "excluded-managed-dep",
1249                      pom.getValue( "dependencyManagement/dependencies[1]/exclusions[1]/artifactId" ) );
1250
1251        assertEquals( 1, ( (List<?>) pom.getValue( "dependencies" ) ).size() );
1252        assertEquals( "org.apache.maven.its", pom.getValue( "dependencies[1]/groupId" ) );
1253        assertEquals( "dep", pom.getValue( "dependencies[1]/artifactId" ) );
1254        assertEquals( "0.2", pom.getValue( "dependencies[1]/version" ) );
1255        assertEquals( "ejb", pom.getValue( "dependencies[1]/type" ) );
1256        assertEquals( "test", pom.getValue( "dependencies[1]/scope" ) );
1257        assertEquals( Boolean.TRUE, pom.getValue( "dependencies[1]/optional" ) );
1258        assertEquals( 1, ( (List<?>) pom.getValue( "dependencies[1]/exclusions" ) ).size() );
1259        assertEquals( "org.apache.maven.its", pom.getValue( "dependencies[1]/exclusions[1]/groupId" ) );
1260        assertEquals( "excluded-dep", pom.getValue( "dependencies[1]/exclusions[1]/artifactId" ) );
1261
1262        assertEquals( 2, ( (List<?>) pom.getValue( "repositories" ) ).size() );
1263        assertEquals( "project-remote-repo", pom.getValue( "repositories[1]/id" ) );
1264        assertEquals( "http://project.url/remote", pom.getValue( "repositories[1]/url" ) );
1265        assertEquals( "repo", pom.getValue( "repositories[1]/name" ) );
1266        assertEquals( RepositorySystem.DEFAULT_REMOTE_REPO_ID, pom.getValue( "repositories[2]/id" ) );
1267        assertEquals( RepositorySystem.DEFAULT_REMOTE_REPO_URL, pom.getValue( "repositories[2]/url" ) );
1268
1269        assertEquals( "test", pom.getValue( "build/defaultGoal" ) );
1270        assertEquals( "coreit", pom.getValue( "build/finalName" ) );
1271
1272        assertPathSuffixEquals( "build", pom.getValue( "build/directory" ) );
1273        assertPathSuffixEquals( "build/main", pom.getValue( "build/outputDirectory" ) );
1274        assertPathSuffixEquals( "build/test", pom.getValue( "build/testOutputDirectory" ) );
1275        assertPathSuffixEquals( "sources/main", pom.getValue( "build/sourceDirectory" ) );
1276        assertPathSuffixEquals( "sources/test", pom.getValue( "build/testSourceDirectory" ) );
1277        assertPathSuffixEquals( "sources/scripts", pom.getValue( "build/scriptSourceDirectory" ) );
1278
1279        assertEquals( 1, ( (List<?>) pom.getValue( "build/filters" ) ).size() );
1280        assertPathSuffixEquals( "src/main/filter/it.properties", pom.getValue( "build/filters[1]" ) );
1281
1282        assertEquals( 1, ( (List<?>) pom.getValue( "build/resources" ) ).size() );
1283        assertPathSuffixEquals( "res/main", pom.getValue( "build/resources[1]/directory" ) );
1284        assertPathSuffixEquals( "main", pom.getValue( "build/resources[1]/targetPath" ) );
1285        assertEquals( Boolean.TRUE, pom.getValue( "build/resources[1]/filtering" ) );
1286        assertEquals( 1, ( (List<?>) pom.getValue( "build/resources[1]/includes" ) ).size() );
1287        assertPathSuffixEquals( "main.included", pom.getValue( "build/resources[1]/includes[1]" ) );
1288        assertEquals( 1, ( (List<?>) pom.getValue( "build/resources[1]/excludes" ) ).size() );
1289        assertPathSuffixEquals( "main.excluded", pom.getValue( "build/resources[1]/excludes[1]" ) );
1290
1291        assertEquals( 1, ( (List<?>) pom.getValue( "build/testResources" ) ).size() );
1292        assertPathSuffixEquals( "res/test", pom.getValue( "build/testResources[1]/directory" ) );
1293        assertPathSuffixEquals( "test", pom.getValue( "build/testResources[1]/targetPath" ) );
1294        assertEquals( Boolean.TRUE, pom.getValue( "build/testResources[1]/filtering" ) );
1295        assertEquals( 1, ( (List<?>) pom.getValue( "build/testResources[1]/includes" ) ).size() );
1296        assertPathSuffixEquals( "test.included", pom.getValue( "build/testResources[1]/includes[1]" ) );
1297        assertEquals( 1, ( (List<?>) pom.getValue( "build/testResources[1]/excludes" ) ).size() );
1298        assertPathSuffixEquals( "test.excluded", pom.getValue( "build/testResources[1]/excludes[1]" ) );
1299
1300        assertEquals( 1, ( (List<?>) pom.getValue( "build/extensions" ) ).size() );
1301        assertEquals( "org.apache.maven.its.ext", pom.getValue( "build/extensions[1]/groupId" ) );
1302        assertEquals( "ext", pom.getValue( "build/extensions[1]/artifactId" ) );
1303        assertEquals( "3.0", pom.getValue( "build/extensions[1]/version" ) );
1304
1305        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins" ) ).size() );
1306        assertEquals( "org.apache.maven.its.plugins", pom.getValue( "build/plugins[1]/groupId" ) );
1307        assertEquals( "maven-it-plugin-build", pom.getValue( "build/plugins[1]/artifactId" ) );
1308        assertEquals( "2.1-SNAPSHOT", pom.getValue( "build/plugins[1]/version" ) );
1309        assertEquals( "test.properties", pom.getValue( "build/plugins[1]/configuration/outputFile" ) );
1310        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
1311        assertEquals( "test", pom.getValue( "build/plugins[1]/executions[1]/id" ) );
1312        assertEquals( "validate", pom.getValue( "build/plugins[1]/executions[1]/phase" ) );
1313        assertEquals( "pom.properties", pom.getValue( "build/plugins[1]/executions[1]/configuration/outputFile" ) );
1314        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/executions[1]/goals" ) ).size() );
1315        assertEquals( "eval", pom.getValue( "build/plugins[1]/executions[1]/goals[1]" ) );
1316        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/dependencies" ) ).size() );
1317        assertEquals( "org.apache.maven.its", pom.getValue( "build/plugins[1]/dependencies[1]/groupId" ) );
1318        assertEquals( "build-plugin-dep", pom.getValue( "build/plugins[1]/dependencies[1]/artifactId" ) );
1319        assertEquals( "0.3", pom.getValue( "build/plugins[1]/dependencies[1]/version" ) );
1320        assertEquals( "zip", pom.getValue( "build/plugins[1]/dependencies[1]/type" ) );
1321        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/dependencies[1]/exclusions" ) ).size() );
1322        assertEquals( "org.apache.maven.its", pom.getValue( "build/plugins[1]/dependencies[1]/exclusions[1]/groupId" ) );
1323        assertEquals( "excluded-build-plugin-dep",
1324                      pom.getValue( "build/plugins[1]/dependencies[1]/exclusions[1]/artifactId" ) );
1325
1326        assertEquals( Boolean.TRUE, pom.getValue( "reporting/excludeDefaults" ) );
1327        assertPathSuffixEquals( "docs", pom.getValue( "reporting/outputDirectory" ) );
1328
1329        assertEquals( 1, ( (List<?>) pom.getValue( "reporting/plugins" ) ).size() );
1330        assertEquals( "org.apache.maven.its.plugins", pom.getValue( "reporting/plugins[1]/groupId" ) );
1331        assertEquals( "maven-it-plugin-reporting", pom.getValue( "reporting/plugins[1]/artifactId" ) );
1332        assertEquals( "2.0-SNAPSHOT", pom.getValue( "reporting/plugins[1]/version" ) );
1333        assertEquals( "test.html", pom.getValue( "reporting/plugins[1]/configuration/outputFile" ) );
1334        assertEquals( 1, ( (List<?>) pom.getValue( "reporting/plugins[1]/reportSets" ) ).size() );
1335        assertEquals( "it", pom.getValue( "reporting/plugins[1]/reportSets[1]/id" ) );
1336        assertEquals( "index.html", pom.getValue( "reporting/plugins[1]/reportSets[1]/configuration/outputFile" ) );
1337        assertEquals( 1, ( (List<?>) pom.getValue( "reporting/plugins[1]/reportSets[1]/reports" ) ).size() );
1338        assertEquals( "run", pom.getValue( "reporting/plugins[1]/reportSets[1]/reports[1]" ) );
1339    }
1340
1341    /* MNG-2309*/
1342
1343    public void testProfileInjectionOrder()
1344        throws Exception
1345    {
1346        PomTestWrapper pom =
1347            buildPom( "profile-injection-order", "pom-a", "pom-b", "pom-e", "pom-c", "pom-d" );
1348        assertEquals( "e", pom.getValue( "properties[1]/pomProperty" ) );
1349    }
1350
1351    public void testPropertiesInheritance()
1352        throws Exception
1353    {
1354        PomTestWrapper pom = buildPom( "properties-inheritance/sub" );
1355        assertEquals( "parent-property", pom.getValue( "properties/parentProperty" ) );
1356        assertEquals( "child-property", pom.getValue( "properties/childProperty" ) );
1357        assertEquals( "child-override", pom.getValue( "properties/overriddenProperty" ) );
1358    }
1359
1360    /* MNG-4102*/
1361    public void testInheritedPropertiesInterpolatedWithValuesFromChildWithoutProfiles()
1362        throws Exception
1363    {
1364        PomTestWrapper pom = buildPom( "inherited-properties-interpolation/no-profile/sub" );
1365
1366        assertEquals( "CHILD", pom.getValue( "properties/overridden" ) );
1367        assertEquals( "CHILD", pom.getValue( "properties/interpolated" ) );
1368    }
1369
1370    /* MNG-4102 */
1371    public void testInheritedPropertiesInterpolatedWithValuesFromChildWithActiveProfiles()
1372        throws Exception
1373    {
1374        PomTestWrapper pom = buildPom( "inherited-properties-interpolation/active-profile/sub" );
1375
1376        assertEquals( 1, pom.getMavenProject().getModel().getProfiles().size() );
1377
1378        buildPom( "inherited-properties-interpolation/active-profile/sub", "it-parent", "it-child" );
1379        assertEquals( "CHILD", pom.getValue( "properties/overridden" ) );
1380        assertEquals( "CHILD", pom.getValue( "properties/interpolated" ) );
1381    }
1382    
1383    /* MNG-3545 */
1384    public void testProfileDefaultActivation()
1385        throws Exception
1386    {
1387        PomTestWrapper pom = buildPom( "profile-default-deactivation", "profile4" );
1388        assertEquals( 1, pom.getMavenProject().getActiveProfiles().size() );
1389        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins" ) ).size() );
1390        assertEquals( "2.1", pom.getValue( "build/plugins[1]/version" ) );
1391    }    
1392    
1393    /* MNG-1995 */
1394    public void testBooleanInterpolation()
1395        throws Exception
1396    {
1397        PomTestWrapper pom = buildPom( "boolean-interpolation" );
1398        assertTrue ((Boolean) pom.getValue( "repositories[1]/releases/enabled" ) );     
1399        assertTrue((Boolean) pom.getValue( "build/resources[1]/filtering" ) ); 
1400    }    
1401
1402    
1403    /* MNG-3899 */
1404    public void testBuildExtensionInheritance()
1405        throws Exception
1406    {
1407        PomTestWrapper pom = buildPom( "build-extension-inheritance/sub" ); 
1408        assertEquals( 3, ( (List<?>) pom.getValue( "build/extensions" ) ).size() );
1409        assertEquals( "b", pom.getValue( "build/extensions[1]/artifactId" ) );
1410        assertEquals( "a", pom.getValue( "build/extensions[2]/artifactId" ) );
1411        assertEquals( "0.2", pom.getValue( "build/extensions[2]/version" ) );
1412        assertEquals( "c", pom.getValue( "build/extensions[3]/artifactId" ) );
1413    }
1414    
1415    /*MNG-1957*/
1416    public void testJdkActivation()
1417        throws Exception
1418        {
1419        Properties props = new Properties();
1420        props.put( "java.version", "1.5.0_15" );
1421
1422        PomTestWrapper pom = buildPom( "jdk-activation", props );
1423        assertEquals( 3, pom.getMavenProject().getActiveProfiles().size() );
1424        assertEquals( "PASSED", pom.getValue( "properties/jdkProperty3" ) );
1425        assertEquals( "PASSED", pom.getValue( "properties/jdkProperty2" ) );
1426        assertEquals( "PASSED", pom.getValue( "properties/jdkProperty1" ) );
1427        }   
1428    
1429    /* MNG-2174 */
1430    public void testProfilePluginMngDependencies()
1431        throws Exception
1432    {
1433        PomTestWrapper pom = buildPom( "profile-plugin-mng-dependencies/sub", "maven-core-it" );
1434        assertEquals( "a", pom.getValue( "build/plugins[1]/dependencies[1]/artifactId" ) );
1435    }    
1436    
1437    /** MNG-4116 */
1438    public void testPercentEncodedUrlsMustNotBeDecoded()
1439        throws Exception
1440    {
1441        PomTestWrapper pom = this.buildPom( "url-no-decoding" );
1442        assertEquals( "http://maven.apache.org/spacy%20path", pom.getValue( "url" ) );
1443        assertEquals( "http://svn.apache.org/viewvc/spacy%20path", pom.getValue( "scm/url" ) );
1444        assertEquals( "scm:svn:svn+ssh://svn.apache.org/spacy%20path", pom.getValue( "scm/connection" ) );
1445        assertEquals( "scm:svn:svn+ssh://svn.apache.org/spacy%20path", pom.getValue( "scm/developerConnection" ) );
1446        assertEquals( "http://issues.apache.org/spacy%20path", pom.getValue( "issueManagement/url" ) );
1447        assertEquals( "http://ci.apache.org/spacy%20path", pom.getValue( "ciManagement/url" ) );
1448        assertEquals( "scm:svn:svn+ssh://dist.apache.org/spacy%20path",
1449                      pom.getValue( "distributionManagement/repository/url" ) );
1450        assertEquals( "scm:svn:svn+ssh://snap.apache.org/spacy%20path",
1451                      pom.getValue( "distributionManagement/snapshotRepository/url" ) );
1452        assertEquals( "scm:svn:svn+ssh://site.apache.org/spacy%20path",
1453                      pom.getValue( "distributionManagement/site/url" ) );
1454    }    
1455
1456    public void testPluginManagementInheritance()
1457        throws Exception
1458    {
1459        PomTestWrapper pom = this.buildPom( "plugin-management-inheritance" );
1460        assertEquals( "0.1-stub-SNAPSHOT",
1461                      pom.getValue( "build/pluginManagement/plugins[@artifactId='maven-compiler-plugin']/version" ) );
1462    }   
1463    
1464    public void testProfilePlugins()
1465            throws Exception
1466        {
1467        PomTestWrapper pom = this.buildPom( "profile-plugins", "standard" );
1468        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins" ) ).size() );
1469        assertEquals( "maven-assembly2-plugin", pom.getValue( "build/plugins[2]/artifactId" ) );
1470        }       
1471    
1472    public void testPluginInheritanceSimple()
1473            throws Exception
1474        {
1475        PomTestWrapper pom = this.buildPom( "plugin-inheritance-simple/sub" );
1476            assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins" ) ).size() );   
1477        } 
1478    
1479    public void testPluginManagementDuplicate()
1480            throws Exception
1481        {
1482        PomTestWrapper pom = this.buildPom( "plugin-management-duplicate/sub" );
1483        assertEquals( 12, ( (List<?>) pom.getValue( "build/pluginManagement/plugins" ) ).size() );
1484        } 
1485    
1486    public void testDistributionManagement()
1487            throws Exception
1488        {
1489        PomTestWrapper pom = this.buildPom( "distribution-management" );
1490        assertEquals( "legacy", pom.getValue( "distributionManagement/repository/layout" ) );
1491        }      
1492    
1493    public void testDependencyScopeInheritance()
1494            throws Exception
1495        {
1496        PomTestWrapper pom = buildPom( "dependency-scope-inheritance/sub" );
1497        String scope = (String) pom.getValue( "dependencies[1]/scope" );
1498        assertEquals( "compile", scope );
1499        }   
1500    
1501    public void testDependencyScope()
1502            throws Exception
1503        {
1504            buildPom( "dependency-scope/sub" );
1505        }   
1506 
1507    //This will fail on a validation error if incorrect
1508    public void testDependencyManagementWithInterpolation()
1509            throws Exception
1510        {
1511            buildPom( "dependency-management-with-interpolation/sub" );
1512        }   
1513
1514    public void testInterpolationWithSystemProperty()
1515        throws Exception
1516    {
1517        Properties sysProps = new Properties();
1518        sysProps.setProperty( "system.property", "PASSED" );
1519        PomTestWrapper pom = buildPom( "sytem-property-interpolation", sysProps );
1520        assertEquals( "PASSED", pom.getValue( "name" ) );
1521    }    
1522
1523    /* MNG-4129 */
1524    public void testPluginExecutionInheritanceWhenChildDoesNotDeclarePlugin()
1525        throws Exception
1526    {
1527        PomTestWrapper pom = buildPom( "plugin-exec-inheritance/wo-merge" );
1528        @SuppressWarnings( "unchecked" )
1529        List<PluginExecution> executions =
1530            (List<PluginExecution>) pom.getValue( "build/pluginsAsMap[@name='org.apache.maven.its.plugins:maven-it-plugin-log-file']/executions" );
1531        assertEquals( 1, executions.size() );
1532        assertEquals( "inherited-execution", executions.get( 0 ).getId() );
1533    }
1534
1535    public void testPluginExecutionInheritanceWhenChildDoesDeclarePluginAsWell()
1536        throws Exception
1537    {
1538        PomTestWrapper pom = buildPom( "plugin-exec-inheritance/w-merge" );
1539        @SuppressWarnings( "unchecked" )
1540        List<PluginExecution> executions =
1541            (List<PluginExecution>) pom.getValue( "build/pluginsAsMap[@name='org.apache.maven.its.plugins:maven-it-plugin-log-file']/executions" );
1542        assertEquals( 1, executions.size() );
1543        assertEquals( "inherited-execution", executions.get( 0 ).getId() );
1544    }    
1545    
1546    /* MNG-4193 */
1547    public void testValidationErrorUponNonUniqueArtifactRepositoryId()
1548        throws Exception
1549    {
1550        try
1551        {
1552            buildPom( "unique-repo-id/artifact-repo" );
1553            fail( "Non-unique repository ids did not cause validation error" );
1554        }
1555        catch ( ProjectBuildingException e )
1556        {
1557            // expected
1558        }
1559    }
1560
1561    /* MNG-4193 */
1562    public void testValidationErrorUponNonUniquePluginRepositoryId()
1563        throws Exception
1564    {
1565        try
1566        {
1567            buildPom( "unique-repo-id/plugin-repo" );
1568            fail( "Non-unique repository ids did not cause validation error" );
1569        }
1570        catch ( ProjectBuildingException e )
1571        {
1572            // expected
1573        }
1574    }
1575    
1576    /* MNG-4193 */
1577    public void testValidationErrorUponNonUniqueArtifactRepositoryIdInProfile()
1578        throws Exception
1579    {
1580        try
1581        {
1582            buildPom( "unique-repo-id/artifact-repo-in-profile" );
1583            fail( "Non-unique repository ids did not cause validation error" );
1584        }
1585        catch ( ProjectBuildingException e )
1586        {
1587            // expected
1588        }
1589    }
1590
1591    /* MNG-4193 */
1592    public void testValidationErrorUponNonUniquePluginRepositoryIdInProfile()
1593        throws Exception
1594    {
1595        try
1596        {
1597            buildPom( "unique-repo-id/plugin-repo-in-profile" );
1598            fail( "Non-unique repository ids did not cause validation error" );
1599        }
1600        catch ( ProjectBuildingException e )
1601        {
1602            // expected
1603        }
1604    }
1605
1606    /** MNG-3843 */
1607    public void testPrerequisitesAreNotInherited()
1608        throws Exception
1609    {
1610        PomTestWrapper pom = buildPom( "prerequisites-inheritance/child" );
1611        assertSame( null, pom.getValue( "prerequisites" ) );
1612    }    
1613
1614    public void testLicensesAreInheritedButNotAggregated()
1615        throws Exception
1616    {
1617        PomTestWrapper pom = buildPom( "licenses-inheritance/child-2" );
1618        assertEquals( 1, ( (List<?>) pom.getValue( "licenses" ) ).size() );
1619        assertEquals( "child-license", pom.getValue( "licenses[1]/name" ) );
1620        assertEquals( "http://child.url/license", pom.getValue( "licenses[1]/url" ) );
1621    }    
1622
1623    public void testDevelopersAreInheritedButNotAggregated()
1624        throws Exception
1625    {
1626        PomTestWrapper pom = buildPom( "developers-inheritance/child-2" );
1627        assertEquals( 1, ( (List<?>) pom.getValue( "developers" ) ).size() );
1628        assertEquals( "child-developer", pom.getValue( "developers[1]/name" ) );
1629    }
1630
1631    public void testContributorsAreInheritedButNotAggregated()
1632        throws Exception
1633    {
1634        PomTestWrapper pom = buildPom( "contributors-inheritance/child-2" );
1635        assertEquals( 1, ( (List<?>) pom.getValue( "contributors" ) ).size() );
1636        assertEquals( "child-contributor", pom.getValue( "contributors[1]/name" ) );
1637    }    
1638
1639    public void testMailingListsAreInheritedButNotAggregated()
1640        throws Exception
1641    {
1642        PomTestWrapper pom = buildPom( "mailing-lists-inheritance/child-2" );
1643        assertEquals( 1, ( (List<?>) pom.getValue( "mailingLists" ) ).size() );
1644        assertEquals( "child-mailing-list", pom.getValue( "mailingLists[1]/name" ) );
1645    }    
1646
1647    public void testPluginInheritanceOrder()
1648        throws Exception
1649    {
1650        PomTestWrapper pom = buildPom( "plugin-inheritance-order/child" );
1651
1652        assertEquals( "maven-it-plugin-log-file", pom.getValue( "build/plugins[1]/artifactId" ) );
1653        assertEquals( "maven-it-plugin-expression", pom.getValue( "build/plugins[2]/artifactId" ) );
1654        assertEquals( "maven-it-plugin-configuration", pom.getValue( "build/plugins[3]/artifactId" ) );
1655
1656        assertEquals( "maven-it-plugin-log-file", pom.getValue( "reporting/plugins[1]/artifactId" ) );
1657        assertEquals( "maven-it-plugin-expression", pom.getValue( "reporting/plugins[2]/artifactId" ) );
1658        assertEquals( "maven-it-plugin-configuration", pom.getValue( "reporting/plugins[3]/artifactId" ) );
1659    }
1660
1661    public void testCliPropsDominateProjectPropsDuringInterpolation()
1662        throws Exception
1663    {
1664        Properties props = new Properties();
1665        props.setProperty( "testProperty", "PASSED" );
1666        PomTestWrapper pom = buildPom( "interpolation-cli-wins", props );
1667
1668        assertEquals( "PASSED", pom.getValue( "properties/interpolatedProperty" ) );
1669    }
1670
1671    public void testParentPomPackagingMustBePom()
1672        throws Exception
1673    {
1674        try
1675        {
1676            buildPom( "parent-pom-packaging/sub" );
1677            fail( "Wrong packaging of parent POM was not rejected" );
1678        }
1679        catch ( ProjectBuildingException e )
1680        {
1681            // expected
1682        }
1683    }
1684
1685    /** MNG-522, MNG-3018 */
1686    public void testManagedPluginConfigurationAppliesToImplicitPluginsIntroducedByPackaging()
1687        throws Exception
1688    {
1689        PomTestWrapper pom = buildPom( "plugin-management-for-implicit-plugin/child" );
1690        assertEquals( "passed.txt",
1691                      pom.getValue( "build/plugins[@artifactId='maven-resources-plugin']/configuration/pathname" ) );
1692        assertEquals( "passed.txt",
1693                      pom.getValue( "build/plugins[@artifactId='maven-it-plugin-log-file']/configuration/logFile" ) );
1694    }
1695
1696    public void testDefaultPluginsExecutionContributedByPackagingExecuteBeforeUserDefinedExecutions()
1697        throws Exception
1698    {
1699        PomTestWrapper pom = buildPom( "plugin-exec-order-and-default-exec" );
1700        @SuppressWarnings( "unchecked" )
1701        List<PluginExecution> executions =
1702            (List<PluginExecution>) pom.getValue( "build/plugins[@artifactId='maven-resources-plugin']/executions" );
1703        assertNotNull( executions );
1704        assertEquals( 4, executions.size() );
1705        assertEquals( "default-resources", executions.get( 0 ).getId() );
1706        assertEquals( "default-testResources", executions.get( 1 ).getId() );
1707        assertEquals( "test-1", executions.get( 2 ).getId() );
1708        assertEquals( "test-2", executions.get( 3 ).getId() );
1709    }
1710
1711    public void testPluginDeclarationsRetainPomOrderAfterInjectionOfDefaultPlugins()
1712        throws Exception
1713    {
1714        PomTestWrapper pom = buildPom( "plugin-exec-order-with-lifecycle" );
1715        @SuppressWarnings( "unchecked" )
1716        List<Plugin> plugins = (List<Plugin>) pom.getValue( "build/plugins" );
1717        int resourcesPlugin = -1;
1718        int customPlugin = -1;
1719        for ( int i = 0; i < plugins.size(); i++ )
1720        {
1721            Plugin plugin = plugins.get( i );
1722            if ( "maven-resources-plugin".equals( plugin.getArtifactId() ) )
1723            {
1724                assertTrue( resourcesPlugin < 0 );
1725                resourcesPlugin = i;
1726            }
1727            else if ( "maven-it-plugin-log-file".equals( plugin.getArtifactId() ) )
1728            {
1729                assertTrue( customPlugin < 0 );
1730                customPlugin = i;
1731            }
1732        }
1733        assertTrue( plugins.toString(), customPlugin == resourcesPlugin - 1 );
1734    }
1735
1736    /** MNG-4415 */
1737    public void testPluginOrderAfterMergingWithInheritedPlugins()
1738        throws Exception
1739    {
1740        PomTestWrapper pom = buildPom( "plugin-inheritance-merge-order/sub" );
1741
1742        List<String> expected = new ArrayList<String>();
1743        expected.add( "maven-it-plugin-error" );
1744        expected.add( "maven-it-plugin-configuration" );
1745        expected.add( "maven-it-plugin-dependency-resolution" );
1746        expected.add( "maven-it-plugin-packaging" );
1747        expected.add( "maven-it-plugin-log-file" );
1748        expected.add( "maven-it-plugin-expression" );
1749        expected.add( "maven-it-plugin-fork" );
1750        expected.add( "maven-it-plugin-touch" );
1751
1752        List<String> actual = new ArrayList<String>();
1753        @SuppressWarnings( "unchecked" )
1754        List<Plugin> plugins = (List<Plugin>) pom.getValue( "build/plugins" );
1755        for ( Plugin plugin : plugins )
1756        {
1757            actual.add( plugin.getArtifactId() );
1758        }
1759
1760        actual.retainAll( expected );
1761
1762        assertEquals( actual, expected );
1763    }
1764
1765    /** MNG-4416 */
1766    public void testPluginOrderAfterMergingWithInjectedPlugins()
1767        throws Exception
1768    {
1769        PomTestWrapper pom = buildPom( "plugin-injection-merge-order" );
1770
1771        List<String> expected = new ArrayList<String>();
1772        expected.add( "maven-it-plugin-error" );
1773        expected.add( "maven-it-plugin-configuration" );
1774        expected.add( "maven-it-plugin-dependency-resolution" );
1775        expected.add( "maven-it-plugin-packaging" );
1776        expected.add( "maven-it-plugin-log-file" );
1777        expected.add( "maven-it-plugin-expression" );
1778        expected.add( "maven-it-plugin-fork" );
1779        expected.add( "maven-it-plugin-touch" );
1780
1781        List<String> actual = new ArrayList<String>();
1782        @SuppressWarnings( "unchecked" )
1783        List<Plugin> plugins = (List<Plugin>) pom.getValue( "build/plugins" );
1784        for ( Plugin plugin : plugins )
1785        {
1786            actual.add( plugin.getArtifactId() );
1787        }
1788
1789        actual.retainAll( expected );
1790
1791        assertEquals( actual, expected );
1792    }
1793
1794    public void testProjectArtifactIdIsNotInheritedButMandatory()
1795        throws Exception
1796    {
1797        try
1798        {
1799            buildPom( "artifact-id-inheritance/child" );
1800            fail( "Missing artifactId did not cause validation error" );
1801        }
1802        catch ( ProjectBuildingException e )
1803        {
1804            // expected
1805        }
1806    }
1807
1808    private void assertPathSuffixEquals( String expected, Object actual )
1809    {
1810        String a = actual.toString();
1811        a = a.substring( a.length() - expected.length() ).replace( '\\', '/' );
1812        assertEquals( expected, a );
1813    }
1814
1815    private void assertPathWithNormalizedFileSeparators( Object value )
1816    {
1817        assertEquals( new File( value.toString() ).getPath(), value.toString() );
1818    }
1819    
1820    private PomTestWrapper buildPom( String pomPath, String... profileIds )
1821        throws Exception
1822    {
1823        return buildPom( pomPath, null, profileIds );
1824    }
1825
1826    private PomTestWrapper buildPom( String pomPath, Properties executionProperties, String... profileIds )
1827        throws Exception
1828    {
1829        return buildPom( pomPath, false, executionProperties, profileIds );
1830    }
1831
1832    private PomTestWrapper buildPom( String pomPath, boolean lenientValidation, Properties executionProperties,
1833                                     String... profileIds )
1834        throws Exception
1835    {
1836        File pomFile = new File( testDirectory, pomPath );
1837        if ( pomFile.isDirectory() )
1838        {
1839            pomFile = new File( pomFile, "pom.xml" );
1840        }
1841
1842        ProjectBuildingRequest config = new DefaultProjectBuildingRequest();
1843
1844        String localRepoUrl =
1845            System.getProperty( "maven.repo.local", System.getProperty( "user.home" ) + "/.m2/repository" );
1846        localRepoUrl = "file://" + localRepoUrl;
1847        config.setLocalRepository( repositorySystem.createArtifactRepository( "local", localRepoUrl, new DefaultRepositoryLayout(), null, null ) );
1848        config.setActiveProfileIds( Arrays.asList( profileIds ) );
1849        config.setSystemProperties( executionProperties );
1850        config.setUserProperties( executionProperties );
1851        config.setValidationLevel( lenientValidation ? ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0
1852                        : ModelBuildingRequest.VALIDATION_LEVEL_STRICT );
1853
1854        DefaultRepositorySystemSession repoSession = MavenRepositorySystemUtils.newSession();
1855        LocalRepository localRepo = new LocalRepository( config.getLocalRepository().getBasedir() );
1856        repoSession.setLocalRepositoryManager( new SimpleLocalRepositoryManagerFactory().newInstance( repoSession, localRepo ) );
1857        config.setRepositorySession( repoSession );
1858
1859        return new PomTestWrapper( pomFile, projectBuilder.build( pomFile, config ).getProject() );
1860    }
1861
1862    protected void assertModelEquals( PomTestWrapper pom, Object expected, String expression )
1863    {
1864        assertEquals( expected, pom.getValue( expression ) );        
1865    }
1866
1867    private static String createPath( List<String> elements )
1868    {
1869        StringBuilder buffer = new StringBuilder( 256 );
1870        for ( String s : elements )
1871        {
1872            buffer.append( s ).append( File.separator );
1873        }
1874        return buffer.toString().substring( 0, buffer.toString().length() - 1 );
1875    }
1876}