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