package org.apache.maven.project;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.inject.Inject;

import org.codehaus.plexus.testing.PlexusTest;
import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginExecution;
import org.apache.maven.model.building.ModelBuildingRequest;
import org.apache.maven.project.harness.PomTestWrapper;
import org.apache.maven.repository.RepositorySystem;
import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
import org.eclipse.aether.repository.LocalRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.codehaus.plexus.testing.PlexusExtension.getBasedir;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.endsWith;
import static org.hamcrest.Matchers.lessThan;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertThrows;

@PlexusTest
public class PomConstructionTest
{
    private static String BASE_DIR = "src/test";

    private static String BASE_POM_DIR = BASE_DIR + "/resources-project-builder";

    private static String BASE_MIXIN_DIR = BASE_DIR + "/resources-mixins";

    @Inject
    private DefaultProjectBuilder projectBuilder;

    @Inject
    private RepositorySystem repositorySystem;

    private File testDirectory;

    @BeforeEach
    public void setUp()
        throws Exception
    {
        testDirectory = new File( getBasedir(), BASE_POM_DIR );
        new File( getBasedir(), BASE_MIXIN_DIR );
    }

    /**
     * Will throw exception if url is empty. MNG-4050
     *
     * @throws Exception in case of issue
     */
    @Test
    public void testEmptyUrl()
        throws Exception
    {
        buildPom( "empty-distMng-repo-url" );
    }

    /**
     * Tests that modules is not overridden by profile
     *
     * @throws Exception in case of issue
     */
    /* MNG-786*/
    @Test
    public void testProfileModules()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "profile-module", "a" );
        assertEquals( "test-prop", pom.getValue( "properties[1]/b" ) );// verifies profile applied
        assertEquals( 4, ( (List<?>) pom.getValue( "modules" ) ).size() );
        assertEquals( "module-2", pom.getValue( "modules[1]" ) );
        assertEquals( "module-1", pom.getValue( "modules[2]" ) );
        assertEquals( "module-3", pom.getValue( "modules[3]" ) );
        assertEquals( "module-4", pom.getValue( "modules[4]" ) );
    }

    /**
     * Will throw exception if doesn't find parent(s) in build
     *
     * @throws Exception in case of issue
     */
    @Test
    public void testParentInheritance()
        throws Exception
    {
        buildPom( "parent-inheritance/sub" );
    }

    /*MNG-3995*/
    @Test
    public void testExecutionConfigurationJoin()
       throws Exception
    {
        PomTestWrapper pom = buildPom( "execution-configuration-join" );
        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins[1]/executions[1]/configuration[1]/fileset[1]" ) ).size() );
    }

    /*MNG-3803*/
    @Test
    public void testPluginConfigProperties()
       throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-config-properties" );
        assertEquals( "my.property", pom.getValue( "build/plugins[1]/configuration[1]/systemProperties[1]/property[1]/name" ) );
    }

    /*MNG-3900*/
    @Test
    public void testProfilePropertiesInterpolation()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "profile-properties-interpolation", "interpolation-profile" );
        assertEquals( "PASSED", pom.getValue( "properties[1]/test" ) );
        assertEquals( "PASSED", pom.getValue( "properties[1]/property" ) );
    }


    // Some better conventions for the test poms needs to be created and each of these tests
    // that represent a verification of a specification item needs to be a couple lines at most.
    // The expressions help a lot, but we need a clean to pick up a directory of POMs, automatically load
    // them into a resolver, create the expression to extract the data to validate the Model, and the URI
    // to validate the properties. We also need a way to navigate from the Tex specification documents to
    // the test in question and vice versa. A little Eclipse plugin would do the trick.
    public void testThatExecutionsWithoutIdsAreMergedAndTheChildWins()
        throws Exception
    {
        PomTestWrapper tester = buildPom( "micromailer" );
        assertModelEquals( tester, "child-descriptor", "build/plugins[1]/executions[1]/goals[1]" );
    }

    /*MNG-
    public void testDependencyScope()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "dependency-scope/sub" );

    }*/

    /*MNG- 4010*/
    @Test
    public void testDuplicateExclusionsDependency()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "duplicate-exclusions-dependency/sub" );
        assertEquals( 1, ( (List<?>) pom.getValue( "dependencies[1]/exclusions" ) ).size() );

    }

    /*MNG- 4008*/
    @Test
    public void testMultipleFilters()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "multiple-filters" );
        assertEquals( 4, ( (List<?>) pom.getValue( "build/filters" ) ).size() );

    }

    /* MNG-4005: postponed to 3.1
    public void testValidationErrorUponNonUniqueDependencyKey()
        throws Exception
    {
        try
        {
            buildPom( "unique-dependency-key/deps" );
            fail( "Non-unique dependency keys did not cause validation error" );
        }
        catch ( ProjectBuildingException e )
        {
            // expected
        }
    }

    @Test
    public void testValidationErrorUponNonUniqueDependencyManagementKey()
        throws Exception
    {
        try
        {
            buildPom( "unique-dependency-key/dep-mgmt" );
            fail( "Non-unique dependency keys did not cause validation error" );
        }
        catch ( ProjectBuildingException e )
        {
            // expected
        }
    }

    @Test
    public void testValidationErrorUponNonUniqueDependencyKeyInProfile()
        throws Exception
    {
        try
        {
            buildPom( "unique-dependency-key/deps-in-profile" );
            fail( "Non-unique dependency keys did not cause validation error" );
        }
        catch ( ProjectBuildingException e )
        {
            // expected
        }
    }

    @Test
    public void testValidationErrorUponNonUniqueDependencyManagementKeyInProfile()
        throws Exception
    {
        try
        {
            buildPom( "unique-dependency-key/dep-mgmt-in-profile" );
            fail( "Non-unique dependency keys did not cause validation error" );
        }
        catch ( ProjectBuildingException e )
        {
            // expected
        }
    }
    */

    @Test
    public void testDuplicateDependenciesCauseLastDeclarationToBePickedInLenientMode()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "unique-dependency-key/deps", true, null );
        assertEquals( 1, ( (List<?>) pom.getValue( "dependencies" ) ).size() );
        assertEquals( "0.2", pom.getValue( "dependencies[1]/version" ) );
    }

    /* MNG-3567*/
    @Test
    public void testParentInterpolation()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "parent-interpolation/sub" );
        pom = new PomTestWrapper( pom.getMavenProject().getParent() );
        assertEquals( "1.3.0-SNAPSHOT", pom.getValue( "build/plugins[1]/version" ) );
    }

/*
    public void testMaven()
        throws Exception
    {
        PomTestWrapper pom =  buildPomFromMavenProject( "maven-build/sub/pom.xml", null );

        for( String s: pom.getMavenProject().getTestClasspathElements() )
        {
            System.out.println( s );
        }

    }
    */

    /* MNG-3567*/
    @Test
    public void testPluginManagementInherited()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "pluginmanagement-inherited/sub" );
        assertEquals( "1.0-alpha-21", pom.getValue( "build/plugins[1]/version" ) );
    }

     /* MNG-2174*/
    @Test
    public void testPluginManagementDependencies()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-management-dependencies/sub", "test" );
        assertEquals( "1.0-alpha-21", pom.getValue( "build/plugins[1]/version" ) );
        assertEquals( "1.0", pom.getValue( "build/plugins[1]/dependencies[1]/version" ) );
    }


    /* MNG-3877*/
    @Test
    public void testReportingInterpolation()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "reporting-interpolation" );
        assertEquals( createPath( Arrays.asList( System.getProperty( "user.dir" ), "src", "test",
                                                 "resources-project-builder", "reporting-interpolation", "target",
                                                 "site" ) ), pom.getValue( "reporting/outputDirectory" ) );
    }

    @Test
    public void testPluginOrder()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-order" );
        assertEquals( "plexus-component-metadata", pom.getValue( "build/plugins[1]/artifactId" ) );
        assertEquals( "maven-surefire-plugin", pom.getValue( "build/plugins[2]/artifactId" ) );
    }

    @Test
    public void testErroneousJoiningOfDifferentPluginsWithEqualDependencies()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "equal-plugin-deps" );
        assertEquals( "maven-it-plugin-a", pom.getValue( "build/plugins[1]/artifactId" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/dependencies" ) ).size() );
        assertEquals( "maven-it-plugin-b", pom.getValue( "build/plugins[2]/artifactId" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/dependencies" ) ).size() );
    }

    /** MNG-3821 */
    @Test
    public void testErroneousJoiningOfDifferentPluginsWithEqualExecutionIds()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "equal-plugin-exec-ids" );
        assertEquals( "maven-it-plugin-a", pom.getValue( "build/plugins[1]/artifactId" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
        assertEquals( "maven-it-plugin-b", pom.getValue( "build/plugins[2]/artifactId" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
        assertEquals( "maven-it-plugin-a", pom.getValue( "reporting/plugins[1]/artifactId" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "reporting/plugins[1]/reportSets" ) ).size() );
        assertEquals( "maven-it-plugin-b", pom.getValue( "reporting/plugins[2]/artifactId" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "reporting/plugins[1]/reportSets" ) ).size() );
    }

     /** MNG-3998 */
    @Test
    public void testExecutionConfiguration()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "execution-configuration" );
        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
        assertEquals( "src/main/mdo/nexus.xml",
                      ( pom.getValue( "build/plugins[1]/executions[1]/configuration[1]/model" ) ) );
        assertEquals( "src/main/mdo/security.xml",
                      ( pom.getValue( "build/plugins[1]/executions[2]/configuration[1]/model" ) ) );
    }

    /*
    public void testPluginConfigDuplicate()
    throws Exception
{
    PomTestWrapper pom = buildPom( "plugin-config-duplicate/dup" );
}
*/
    @Test
    public void testSingleConfigurationInheritance()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "single-configuration-inheritance" );

        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins[1]/executions[1]/configuration[1]/rules" ) ).size() );
        assertEquals( "2.0.6",
                      pom.getValue( "build/plugins[1]/executions[1]/configuration[1]/rules[1]/requireMavenVersion[1]/version" ) );
        assertEquals( "[1.4,)",
                      pom.getValue( "build/plugins[1]/executions[1]/configuration[1]/rules[1]/requireJavaVersion[1]/version" ) );
    }

    @Test
    public void testConfigWithPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "config-with-plugin-mng" );
        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
        assertEquals( "src/main/mdo/security.xml", pom.getValue( "build/plugins[1]/executions[2]/configuration[1]/model" ) );
        assertEquals( "1.0.8", pom.getValue( "build/plugins[1]/executions[1]/configuration[1]/version" ) );
    }

    /** MNG-3965 */
    @Test
    public void testExecutionConfigurationSubcollections()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "execution-configuration-subcollections" );
        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins[1]/executions[1]/configuration[1]/rules[1]/bannedDependencies" ) ).size() );
    }

    /** MNG-3985 */
    @Test
    public void testMultipleRepositories()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "multiple-repos/sub" );
        assertEquals( 3, ( (List<?>) pom.getValue( "repositories" ) ).size() );
    }

    /** MNG-3965 */
    @Test
    public void testMultipleExecutionIds()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "dual-execution-ids/sub" );
        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
    }

    /** MNG-3997 */
    @Test
    public void testConsecutiveEmptyElements()
        throws Exception
    {
        buildPom( "consecutive_empty_elements" );
    }

    @Test
    public void testOrderOfGoalsFromPluginExecutionWithoutPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-exec-goals-order/wo-plugin-mgmt" );
        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/executions[1]/goals" ) ).size() );
        assertEquals( "b", pom.getValue( "build/plugins[1]/executions[1]/goals[1]" ) );
        assertEquals( "a", pom.getValue( "build/plugins[1]/executions[1]/goals[2]" ) );
        assertEquals( "d", pom.getValue( "build/plugins[1]/executions[1]/goals[3]" ) );
        assertEquals( "c", pom.getValue( "build/plugins[1]/executions[1]/goals[4]" ) );
        assertEquals( "e", pom.getValue( "build/plugins[1]/executions[1]/goals[5]" ) );
    }

    /* MNG-3886*/
    @Test
    public void testOrderOfGoalsFromPluginExecutionWithPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-exec-goals-order/w-plugin-mgmt" );
        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/executions[1]/goals" ) ).size() );
        assertEquals( "b", pom.getValue( "build/plugins[1]/executions[1]/goals[1]" ) );
        assertEquals( "a", pom.getValue( "build/plugins[1]/executions[1]/goals[2]" ) );
        assertEquals( "d", pom.getValue( "build/plugins[1]/executions[1]/goals[3]" ) );
        assertEquals( "c", pom.getValue( "build/plugins[1]/executions[1]/goals[4]" ) );
        assertEquals( "e", pom.getValue( "build/plugins[1]/executions[1]/goals[5]" ) );
    }

    @Test
    public void testOrderOfPluginExecutionsWithoutPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-exec-order/wo-plugin-mgmt" );
        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
        assertEquals( "b", pom.getValue( "build/plugins[1]/executions[1]/id" ) );
        assertEquals( "a", pom.getValue( "build/plugins[1]/executions[2]/id" ) );
        assertEquals( "d", pom.getValue( "build/plugins[1]/executions[3]/id" ) );
        assertEquals( "c", pom.getValue( "build/plugins[1]/executions[4]/id" ) );
        assertEquals( "e", pom.getValue( "build/plugins[1]/executions[5]/id" ) );
    }

    /* MNG-3887 */
    @Test
    public void testOrderOfPluginExecutionsWithPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-exec-order/w-plugin-mgmt" );
        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
        assertEquals( "b", pom.getValue( "build/plugins[1]/executions[1]/id" ) );
        assertEquals( "a", pom.getValue( "build/plugins[1]/executions[2]/id" ) );
        assertEquals( "d", pom.getValue( "build/plugins[1]/executions[3]/id" ) );
        assertEquals( "c", pom.getValue( "build/plugins[1]/executions[4]/id" ) );
        assertEquals( "e", pom.getValue( "build/plugins[1]/executions[5]/id" ) );
    }

    @Test
    public void testMergeOfPluginExecutionsWhenChildInheritsPluginVersion()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-exec-merging-wo-version/sub" );
        assertEquals( 4, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
    }

    /* MNG-3943*/
    @Test
    public void testMergeOfPluginExecutionsWhenChildAndParentUseDifferentPluginVersions()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-exec-merging-version-insensitive/sub" );
        assertEquals( 4, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
    }


    @Test
    public void testInterpolationWithXmlMarkup()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "xml-markup-interpolation" );
        assertEquals( "<?xml version='1.0'?>Tom&Jerry", pom.getValue( "properties/xmlTest" ) );
    }

    /* MNG-3925 */
    @Test
    public void testOrderOfMergedPluginExecutionsWithoutPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "merged-plugin-exec-order/wo-plugin-mgmt/sub" );
        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
        assertEquals( "parent-1", pom.getValue( "build/plugins[1]/executions[1]/goals[1]" ) );
        assertEquals( "parent-2", pom.getValue( "build/plugins[1]/executions[2]/goals[1]" ) );
        assertEquals( "child-default", pom.getValue( "build/plugins[1]/executions[3]/goals[1]" ) );
        assertEquals( "child-1", pom.getValue( "build/plugins[1]/executions[4]/goals[1]" ) );
        assertEquals( "child-2", pom.getValue( "build/plugins[1]/executions[5]/goals[1]" ) );
    }

    @Test
    public void testOrderOfMergedPluginExecutionsWithPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "merged-plugin-exec-order/w-plugin-mgmt/sub" );
        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
        assertEquals( "parent-1", pom.getValue( "build/plugins[1]/executions[1]/goals[1]" ) );
        assertEquals( "parent-2", pom.getValue( "build/plugins[1]/executions[2]/goals[1]" ) );
        assertEquals( "child-default", pom.getValue( "build/plugins[1]/executions[3]/goals[1]" ) );
        assertEquals( "child-1", pom.getValue( "build/plugins[1]/executions[4]/goals[1]" ) );
        assertEquals( "child-2", pom.getValue( "build/plugins[1]/executions[5]/goals[1]" ) );
    }

    /* MNG-3984*/
    @Test
    public void testDifferentContainersWithSameId()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "join-different-containers-same-id" );
        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/executions[1]/goals" ) ).size() );
        assertEquals( 1, ( (List<?>) pom.getValue( "build/pluginManagement/plugins[@artifactId='maven-it-plugin-b']/executions[1]/goals" ) ).size() );
    }

    /* MNG-3937*/
    @Test
    public void testOrderOfMergedPluginExecutionGoalsWithoutPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "merged-plugin-exec-goals-order/wo-plugin-mgmt/sub" );

        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/executions[1]/goals" ) ).size() );
        assertEquals( "child-a", pom.getValue( "build/plugins[1]/executions[1]/goals[1]" ) );
        assertEquals( "merged", pom.getValue( "build/plugins[1]/executions[1]/goals[2]" ) );
        assertEquals( "child-b", pom.getValue( "build/plugins[1]/executions[1]/goals[3]" ) );
        assertEquals( "parent-b", pom.getValue( "build/plugins[1]/executions[1]/goals[4]" ) );
        assertEquals( "parent-a", pom.getValue( "build/plugins[1]/executions[1]/goals[5]" ) );
    }

    @Test
    public void testOrderOfMergedPluginExecutionGoalsWithPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "merged-plugin-exec-goals-order/w-plugin-mgmt/sub" );
        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/executions[1]/goals" ) ).size() );
        assertEquals( "child-a", pom.getValue( "build/plugins[1]/executions[1]/goals[1]" ) );
        assertEquals( "merged", pom.getValue( "build/plugins[1]/executions[1]/goals[2]" ) );
        assertEquals( "child-b", pom.getValue( "build/plugins[1]/executions[1]/goals[3]" ) );
        assertEquals( "parent-b", pom.getValue( "build/plugins[1]/executions[1]/goals[4]" ) );
        assertEquals( "parent-a", pom.getValue( "build/plugins[1]/executions[1]/goals[5]" ) );
    }

    /*MNG-3938*/
    @Test
    public void testOverridingOfInheritedPluginExecutionsWithoutPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-exec-merging/wo-plugin-mgmt/sub" );
        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
        assertEquals( "child-default", pom.getValue( "build/plugins[1]/executions[@id='default']/phase" ) );
        assertEquals( "child-non-default", pom.getValue( "build/plugins[1]/executions[@id='non-default']/phase" ) );
    }

    /* MNG-3938 */
    @Test
    public void testOverridingOfInheritedPluginExecutionsWithPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-exec-merging/w-plugin-mgmt/sub" );
        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
        assertEquals( "child-default", pom.getValue( "build/plugins[1]/executions[@id='default']/phase" ) );
        assertEquals( "child-non-default", pom.getValue( "build/plugins[1]/executions[@id='non-default']/phase" ) );
    }


    /* MNG-3906*/
    @Test
    public void testOrderOfMergedPluginDependenciesWithoutPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "merged-plugin-class-path-order/wo-plugin-mgmt/sub" );

        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/dependencies" ) ).size() );
        assertNotNull( pom.getValue( "build/plugins[1]/dependencies[1]" ) );
        assertEquals( "c", pom.getValue( "build/plugins[1]/dependencies[1]/artifactId" ) );
        assertEquals( "1", pom.getValue( "build/plugins[1]/dependencies[1]/version" ) );
        assertEquals( "a", pom.getValue( "build/plugins[1]/dependencies[2]/artifactId" ) );
        assertEquals( "2", pom.getValue( "build/plugins[1]/dependencies[2]/version" ) );
        assertEquals( "b", pom.getValue( "build/plugins[1]/dependencies[3]/artifactId" ) );
        assertEquals( "1", pom.getValue( "build/plugins[1]/dependencies[3]/version" ) );
        assertEquals( "e", pom.getValue( "build/plugins[1]/dependencies[4]/artifactId" ) );
        assertEquals( "1", pom.getValue( "build/plugins[1]/dependencies[4]/version" ) );
        assertEquals( "d", pom.getValue( "build/plugins[1]/dependencies[5]/artifactId" ) );
        assertEquals( "1", pom.getValue( "build/plugins[1]/dependencies[5]/version" ) );
    }

    @Test
    public void testOrderOfMergedPluginDependenciesWithPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "merged-plugin-class-path-order/w-plugin-mgmt/sub" );
        assertEquals( 5, ( (List<?>) pom.getValue( "build/plugins[1]/dependencies" ) ).size() );
        assertEquals( "c", pom.getValue( "build/plugins[1]/dependencies[1]/artifactId" ) );
        assertEquals( "1", pom.getValue( "build/plugins[1]/dependencies[1]/version" ) );
        assertEquals( "a", pom.getValue( "build/plugins[1]/dependencies[2]/artifactId" ) );
        assertEquals( "2", pom.getValue( "build/plugins[1]/dependencies[2]/version" ) );
        assertEquals( "b", pom.getValue( "build/plugins[1]/dependencies[3]/artifactId" ) );
        assertEquals( "1", pom.getValue( "build/plugins[1]/dependencies[3]/version" ) );
        assertEquals( "e", pom.getValue( "build/plugins[1]/dependencies[4]/artifactId" ) );
        assertEquals( "1", pom.getValue( "build/plugins[1]/dependencies[4]/version" ) );
        assertEquals( "d", pom.getValue( "build/plugins[1]/dependencies[5]/artifactId" ) );
        assertEquals( "1", pom.getValue( "build/plugins[1]/dependencies[5]/version" ) );
    }

    @Test
    public void testInterpolationOfNestedBuildDirectories()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "nested-build-dir-interpolation" );
        assertEquals( new File( pom.getBasedir(), "target/classes/dir0" ),
                      new File( (String) pom.getValue( "properties/dir0" ) ) );
        assertEquals( new File( pom.getBasedir(), "src/test/dir1" ),
                      new File( (String) pom.getValue( "properties/dir1" ) ) );
        assertEquals( new File( pom.getBasedir(), "target/site/dir2" ),
                      new File( (String) pom.getValue( "properties/dir2" ) ) );
    }

    @Test
    public void testAppendArtifactIdOfChildToInheritedUrls()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "url-inheritance/sub" );
        assertEquals( "https://parent.url/child", pom.getValue( "url" ) );
        assertEquals( "https://parent.url/org", pom.getValue( "organization/url" ) );
        assertEquals( "https://parent.url/license.txt", pom.getValue( "licenses[1]/url" ) );
        assertEquals( "https://parent.url/viewvc/child", pom.getValue( "scm/url" ) );
        assertEquals( "https://parent.url/scm/child", pom.getValue( "scm/connection" ) );
        assertEquals( "https://parent.url/scm/child", pom.getValue( "scm/developerConnection" ) );
        assertEquals( "https://parent.url/issues", pom.getValue( "issueManagement/url" ) );
        assertEquals( "https://parent.url/ci", pom.getValue( "ciManagement/url" ) );
        assertEquals( "https://parent.url/dist", pom.getValue( "distributionManagement/repository/url" ) );
        assertEquals( "https://parent.url/snaps", pom.getValue( "distributionManagement/snapshotRepository/url" ) );
        assertEquals( "https://parent.url/site/child", pom.getValue( "distributionManagement/site/url" ) );
        assertEquals( "https://parent.url/download", pom.getValue( "distributionManagement/downloadUrl" ) );
    }

    /* MNG-3846*/
    @Test
    public void testAppendArtifactIdOfParentAndChildToInheritedUrls()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "url-inheritance/another-parent/sub" );
        assertEquals( "https://parent.url/ap/child", pom.getValue( "url" ) );
        assertEquals( "https://parent.url/org", pom.getValue( "organization/url" ) );
        assertEquals( "https://parent.url/license.txt", pom.getValue( "licenses[1]/url" ) );
        assertEquals( "https://parent.url/viewvc/ap/child", pom.getValue( "scm/url" ) );
        assertEquals( "https://parent.url/scm/ap/child", pom.getValue( "scm/connection" ) );
        assertEquals( "https://parent.url/scm/ap/child", pom.getValue( "scm/developerConnection" ) );
        assertEquals( "https://parent.url/issues", pom.getValue( "issueManagement/url" ) );
        assertEquals( "https://parent.url/ci", pom.getValue( "ciManagement/url" ) );
        assertEquals( "https://parent.url/dist", pom.getValue( "distributionManagement/repository/url" ) );
        assertEquals( "https://parent.url/snaps", pom.getValue( "distributionManagement/snapshotRepository/url" ) );
        assertEquals( "https://parent.url/site/ap/child", pom.getValue( "distributionManagement/site/url" ) );
        assertEquals( "https://parent.url/download", pom.getValue( "distributionManagement/downloadUrl" ) );
    }

    @Test
    public void testNonInheritedElementsInSubtreesOverriddenByChild()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "limited-inheritance/child" );
        assertNull( pom.getValue( "organization/url" ) );
        assertNull( pom.getValue( "issueManagement/system" ) );
        assertEquals( 0, ( (List<?>) pom.getValue( "ciManagement/notifiers" ) ).size() );
        assertEquals( "child-distros", pom.getValue( "distributionManagement/repository/id" ) );
        assertEquals( "ssh://child.url/distros", pom.getValue( "distributionManagement/repository/url" ) );
        assertNull( pom.getValue( "distributionManagement/repository/name" ) );
        assertEquals( true, pom.getValue( "distributionManagement/repository/uniqueVersion" ) );
        assertEquals( "default", pom.getValue( "distributionManagement/repository/layout" ) );
        assertEquals( "child-snaps", pom.getValue( "distributionManagement/snapshotRepository/id" ) );
        assertEquals( "ssh://child.url/snaps", pom.getValue( "distributionManagement/snapshotRepository/url" ) );
        assertNull( pom.getValue( "distributionManagement/snapshotRepository/name" ) );
        assertEquals( true, pom.getValue( "distributionManagement/snapshotRepository/uniqueVersion" ) );
        assertEquals( "default", pom.getValue( "distributionManagement/snapshotRepository/layout" ) );
        assertEquals( "child-site", pom.getValue( "distributionManagement/site/id" ) );
        assertEquals( "scp://child.url/site", pom.getValue( "distributionManagement/site/url" ) );
        assertNull( pom.getValue( "distributionManagement/site/name" ) );
    }

    @Test
    public void testXmlTextCoalescing()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "xml-coalesce-text" );
        assertEquals( "A  Test  Project Property", pom.getValue( "properties/prop0" ) );
        assertEquals( "That's a test!", pom.getValue( "properties/prop1" ) );
        assertEquals( 32 * 1024,
                      pom.getValue( "properties/prop2" ).toString().trim().replaceAll( "[\n\r]", "" ).length() );
    }

    @Test
    public void testFullInterpolationOfNestedExpressions()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "full-interpolation" );
        for ( int i = 0; i < 24; i++ )
        {
            String index = ( ( i < 10 ) ? "0" : "" ) + i;
            assertEquals( "PASSED", pom.getValue( "properties/property" + index ) );
        }
    }

    @Test
    public void testInterpolationOfLegacyExpressionsThatDontIncludeTheProjectPrefix()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "unprefixed-expression-interpolation/child" );

        assertEquals( pom.getBasedir(), new File( pom.getValue( "properties/projectDir" ).toString() ) );

        assertEquals( "org.apache.maven.its.mng3831.child", pom.getValue( "properties/projectGroupId" ) );
        assertEquals( "child", pom.getValue( "properties/projectArtifactId" ) );
        assertEquals( "2.0-alpha-1", pom.getValue( "properties/projectVersion" ) );
        assertEquals( "jar", pom.getValue( "properties/projectPackaging" ) );

        assertEquals( "child-name", pom.getValue( "properties/projectName" ) );
        assertEquals( "child-desc", pom.getValue( "properties/projectDesc" ) );
        assertEquals( "https://child.org/", pom.getValue( "properties/projectUrl" ) );
        assertEquals( "2008", pom.getValue( "properties/projectYear" ) );
        assertEquals( "child-org-name", pom.getValue( "properties/projectOrgName" ) );

        assertEquals( "2.0.0", pom.getValue( "properties/projectPrereqMvn" ) );
        assertEquals( "https://scm.org/", pom.getValue( "properties/projectScmUrl" ) );
        assertEquals( "https://issue.org/", pom.getValue( "properties/projectIssueUrl" ) );
        assertEquals( "https://ci.org/", pom.getValue( "properties/projectCiUrl" ) );
        assertEquals( "child-dist-repo", pom.getValue( "properties/projectDistRepoName" ) );
        assertEquals( "https://dist.org/", pom.getValue( "properties/projectDistRepoUrl" ) );
        assertEquals( "https://site.org/", pom.getValue( "properties/projectDistSiteUrl" ) );

        assertEquals( "org.apache.maven.its.mng3831", pom.getValue( "properties/parentGroupId" ) );
        assertEquals( "parent", pom.getValue( "properties/parentArtifactId" ) );
        assertEquals( "1.0", pom.getValue( "properties/parentVersion" ) );

        assertThat( pom.getValue( "properties/projectBuildOut" ).toString(), endsWith( "bin" ) );
        assertThat( pom.getValue( "properties/projectSiteOut" ).toString(), endsWith( "doc" ) );
    }

    @Test
    public void testInterpolationWithBasedirAlignedDirectories()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "basedir-aligned-interpolation" );
        assertEquals( new File( pom.getBasedir(), "src/main/java" ),
                      new File( pom.getValue( "properties/buildMainSrc" ).toString() ) );
        assertEquals( new File( pom.getBasedir(), "src/test/java" ),
                      new File( pom.getValue( "properties/buildTestSrc" ).toString() ) );
        assertEquals( new File( pom.getBasedir(), "src/main/scripts" ),
                      new File( pom.getValue( "properties/buildScriptSrc" ).toString() ) );
        assertEquals( new File( pom.getBasedir(), "target" ),
                      new File( pom.getValue( "properties/buildOut" ).toString() ) );
        assertEquals( new File( pom.getBasedir(), "target/classes" ),
                      new File( pom.getValue( "properties/buildMainOut" ).toString() ) );
        assertEquals( new File( pom.getBasedir(), "target/test-classes" ),
                      new File( pom.getValue( "properties/buildTestOut" ).toString() ) );
        assertEquals( new File( pom.getBasedir(), "target/site" ),
                      new File( pom.getValue( "properties/siteOut" ).toString() ) );
    }

    /* MNG-3944*/
    @Test
    public void testInterpolationOfBasedirInPomWithUnusualName()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "basedir-interpolation/pom-with-unusual-name.xml" );
        assertEquals( pom.getBasedir(), new File( pom.getValue( "properties/prop0" ).toString() ) );
        assertEquals( pom.getBasedir(), new File( pom.getValue( "properties/prop1" ).toString() ) );
    }

    /* MNG-3979 */
    @Test
    public void testJoiningOfContainersWhenChildHasEmptyElements()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "id-container-joining-with-empty-elements/sub" );
        assertNotNull( pom );
    }

    @Test
    public void testOrderOfPluginConfigurationElementsWithoutPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-config-order/wo-plugin-mgmt" );
        assertEquals( "one", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[1]" ) );
        assertEquals( "two", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[2]" ) );
        assertEquals( "three", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[3]" ) );
        assertEquals( "four", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[4]" ) );
    }

    /* MNG-3827*/
    @Test
    public void testOrderOfPluginConfigurationElementsWithPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-config-order/w-plugin-mgmt" );
        assertEquals( "one", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[1]" ) );
        assertEquals( "two", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[2]" ) );
        assertEquals( "three", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[3]" ) );
        assertEquals( "four", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[4]" ) );
    }

    @Test
    public void testOrderOfPluginExecutionConfigurationElementsWithoutPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-exec-config-order/wo-plugin-mgmt" );
        String prefix = "build/plugins[1]/executions[1]/configuration/";
        assertEquals( "one", pom.getValue( prefix + "stringParams/stringParam[1]" ) );
        assertEquals( "two", pom.getValue( prefix + "stringParams/stringParam[2]" ) );
        assertEquals( "three", pom.getValue( prefix + "stringParams/stringParam[3]" ) );
        assertEquals( "four", pom.getValue( prefix + "stringParams/stringParam[4]" ) );
        assertEquals( "key1", pom.getValue( prefix + "propertiesParam/property[1]/name" ) );
        assertEquals( "key2", pom.getValue( prefix + "propertiesParam/property[2]/name" ) );
    }

    /* MNG-3864*/
    @Test
    public void testOrderOfPluginExecutionConfigurationElementsWithPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-exec-config-order/w-plugin-mgmt" );
        String prefix = "build/plugins[1]/executions[1]/configuration/";
        assertEquals( "one", pom.getValue( prefix + "stringParams/stringParam[1]" ) );
        assertEquals( "two", pom.getValue( prefix + "stringParams/stringParam[2]" ) );
        assertEquals( "three", pom.getValue( prefix + "stringParams/stringParam[3]" ) );
        assertEquals( "four", pom.getValue( prefix + "stringParams/stringParam[4]" ) );
        assertEquals( "key1", pom.getValue( prefix + "propertiesParam/property[1]/name" ) );
        assertEquals( "key2", pom.getValue( prefix + "propertiesParam/property[2]/name" ) );
    }

    /* MNG-3836*/
    @Test
    public void testMergeOfInheritedPluginConfiguration()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-config-merging/child" );

        String prefix = "build/plugins[1]/configuration/";
        assertEquals( "PASSED", pom.getValue( prefix + "propertiesFile" ) );
        assertEquals( "PASSED", pom.getValue( prefix + "parent" ) );
        assertEquals( "PASSED-1", pom.getValue( prefix + "stringParams/stringParam[1]" ) );
        assertEquals( "PASSED-3", pom.getValue( prefix + "stringParams/stringParam[2]" ) );
        assertEquals( "PASSED-2", pom.getValue( prefix + "stringParams/stringParam[3]" ) );
        assertEquals( "PASSED-4", pom.getValue( prefix + "stringParams/stringParam[4]" ) );
        assertEquals( "PASSED-1", pom.getValue( prefix + "listParam/listParam[1]" ) );
        assertEquals( "PASSED-3", pom.getValue( prefix + "listParam/listParam[2]" ) );
        assertEquals( "PASSED-2", pom.getValue( prefix + "listParam/listParam[3]" ) );
        assertEquals( "PASSED-4", pom.getValue( prefix + "listParam/listParam[4]" ) );
    }

    /* MNG-2591 */
    @Test
    public void testAppendOfInheritedPluginConfigurationWithNoProfile()
        throws Exception
    {
        testAppendOfInheritedPluginConfiguration( "no-profile" );
    }

    /* MNG-2591*/
    @Test
    public void testAppendOfInheritedPluginConfigurationWithActiveProfile()
        throws Exception
    {
        testAppendOfInheritedPluginConfiguration( "with-profile" );
    }

    private void testAppendOfInheritedPluginConfiguration( String test )
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-config-append/" + test + "/subproject" );
        String prefix = "build/plugins[1]/configuration/";
        assertEquals( "PARENT-1", pom.getValue( prefix + "stringParams/stringParam[1]" ) );
        assertEquals( "PARENT-3", pom.getValue( prefix + "stringParams/stringParam[2]" ) );
        assertEquals( "PARENT-2", pom.getValue( prefix + "stringParams/stringParam[3]" ) );
        assertEquals( "PARENT-4", pom.getValue( prefix + "stringParams/stringParam[4]" ) );
        assertEquals( "CHILD-1", pom.getValue( prefix + "stringParams/stringParam[5]" ) );
        assertEquals( "CHILD-3", pom.getValue( prefix + "stringParams/stringParam[6]" ) );
        assertEquals( "CHILD-2", pom.getValue( prefix + "stringParams/stringParam[7]" ) );
        assertEquals( "CHILD-4", pom.getValue( prefix + "stringParams/stringParam[8]" ) );
        assertNull( pom.getValue( prefix + "stringParams/stringParam[9]" ) );
        assertEquals( "PARENT-1", pom.getValue( prefix + "listParam/listParam[1]" ) );
        assertEquals( "PARENT-3", pom.getValue( prefix + "listParam/listParam[2]" ) );
        assertEquals( "PARENT-2", pom.getValue( prefix + "listParam/listParam[3]" ) );
        assertEquals( "PARENT-4", pom.getValue( prefix + "listParam/listParam[4]" ) );
        assertEquals( "CHILD-1", pom.getValue( prefix + "listParam/listParam[5]" ) );
        assertEquals( "CHILD-3", pom.getValue( prefix + "listParam/listParam[6]" ) );
        assertEquals( "CHILD-2", pom.getValue( prefix + "listParam/listParam[7]" ) );
        assertEquals( "CHILD-4", pom.getValue( prefix + "listParam/listParam[8]" ) );
        assertNull( pom.getValue( prefix + "listParam/listParam[9]" ) );
    }

    /* MNG-4000 */
    @Test
    public void testMultiplePluginExecutionsWithAndWithoutIdsWithoutPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-exec-w-and-wo-id/wo-plugin-mgmt" );
        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
        assertEquals( "log-string", pom.getValue( "build/plugins[1]/executions[1]/goals[1]" ) );
        assertEquals( "log-string", pom.getValue( "build/plugins[1]/executions[2]/goals[1]" ) );
    }

    @Test
    public void testMultiplePluginExecutionsWithAndWithoutIdsWithPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-exec-w-and-wo-id/w-plugin-mgmt" );
        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
        assertEquals( "log-string", pom.getValue( "build/plugins[1]/executions[1]/goals[1]" ) );
        assertEquals( "log-string", pom.getValue( "build/plugins[1]/executions[2]/goals[1]" ) );
    }

    @Test
    public void testDependencyOrderWithoutPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "dependency-order/wo-plugin-mgmt" );
        assertEquals( 4, ( (List<?>) pom.getValue( "dependencies" ) ).size() );
        assertEquals( "a", pom.getValue( "dependencies[1]/artifactId" ) );
        assertEquals( "c", pom.getValue( "dependencies[2]/artifactId" ) );
        assertEquals( "b", pom.getValue( "dependencies[3]/artifactId" ) );
        assertEquals( "d", pom.getValue( "dependencies[4]/artifactId" ) );
    }

    @Test
    public void testDependencyOrderWithPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "dependency-order/w-plugin-mgmt" );
        assertEquals( 4, ( (List<?>) pom.getValue( "dependencies" ) ).size() );
        assertEquals( "a", pom.getValue( "dependencies[1]/artifactId" ) );
        assertEquals( "c", pom.getValue( "dependencies[2]/artifactId" ) );
        assertEquals( "b", pom.getValue( "dependencies[3]/artifactId" ) );
        assertEquals( "d", pom.getValue( "dependencies[4]/artifactId" ) );
    }

    @Test
    public void testBuildDirectoriesUsePlatformSpecificFileSeparator()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "platform-file-separator" );
        assertPathWithNormalizedFileSeparators( pom.getValue( "build/directory" ) );
        assertPathWithNormalizedFileSeparators( pom.getValue( "build/outputDirectory" ) );
        assertPathWithNormalizedFileSeparators( pom.getValue( "build/testOutputDirectory" ) );
        assertPathWithNormalizedFileSeparators( pom.getValue( "build/sourceDirectory" ) );
        assertPathWithNormalizedFileSeparators( pom.getValue( "build/testSourceDirectory" ) );
        assertPathWithNormalizedFileSeparators( pom.getValue( "build/resources[1]/directory" ) );
        assertPathWithNormalizedFileSeparators( pom.getValue( "build/testResources[1]/directory" ) );
        assertPathWithNormalizedFileSeparators( pom.getValue( "build/filters[1]" ) );
        assertPathWithNormalizedFileSeparators( pom.getValue( "reporting/outputDirectory" ) );
    }

    /* MNG-4008 */
    @Test
    public void testMergedFilterOrder()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "merged-filter-order/sub" );

        assertEquals( 7, ( (List<?>) pom.getValue( "build/filters" ) ).size() );
        assertThat( pom.getValue( "build/filters[1]" ).toString(), endsWith( "child-a.properties" ) );
        assertThat( pom.getValue( "build/filters[2]" ).toString(), endsWith( "child-c.properties" ) );
        assertThat( pom.getValue( "build/filters[3]" ).toString(), endsWith( "child-b.properties" ) );
        assertThat( pom.getValue( "build/filters[4]" ).toString(), endsWith( "child-d.properties" ) );
        assertThat( pom.getValue( "build/filters[5]" ).toString(), endsWith( "parent-c.properties" ) );
        assertThat( pom.getValue( "build/filters[6]" ).toString(), endsWith( "parent-b.properties" ) );
        assertThat( pom.getValue( "build/filters[7]" ).toString(), endsWith( "parent-d.properties" ) );
    }

    /** MNG-4027*/
    @Test
    public void testProfileInjectedDependencies()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "profile-injected-dependencies" );
        assertEquals( 4, ( (List<?>) pom.getValue( "dependencies" ) ).size() );
        assertEquals( "a", pom.getValue( "dependencies[1]/artifactId" ) );
        assertEquals( "c", pom.getValue( "dependencies[2]/artifactId" ) );
        assertEquals( "b", pom.getValue( "dependencies[3]/artifactId" ) );
        assertEquals( "d", pom.getValue( "dependencies[4]/artifactId" ) );
    }

    /** IT-0021*/
    @Test
    public void testProfileDependenciesMultipleProfiles()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "profile-dependencies-multiple-profiles", "profile-1", "profile-2" );
        assertEquals(2,  ( (List<?>) pom.getValue( "dependencies" ) ).size() );
    }

    @Test
    public void testDependencyInheritance()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "dependency-inheritance/sub" );
        assertEquals( 1, ( (List<?>) pom.getValue( "dependencies" ) ).size() );
        assertEquals( "4.13.1", pom.getValue( "dependencies[1]/version" ) );
    }

    /** MNG-4034 */
    @Test
    public void testManagedProfileDependency()
        throws Exception
    {
        PomTestWrapper pom = this.buildPom( "managed-profile-dependency/sub", "maven-core-it" );
        assertEquals( 1, ( (List<?>) pom.getValue( "dependencies" ) ).size() );
        assertEquals( "org.apache.maven.its", pom.getValue( "dependencies[1]/groupId" ) );
        assertEquals( "maven-core-it-support", pom.getValue( "dependencies[1]/artifactId" ) );
        assertEquals( "1.3", pom.getValue( "dependencies[1]/version" ) );
        assertEquals( "runtime", pom.getValue( "dependencies[1]/scope" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "dependencies[1]/exclusions" ) ).size() );
        assertEquals( "commons-lang", pom.getValue( "dependencies[1]/exclusions[1]/groupId" ) );
    }

    /** MNG-4040 */
    @Test
    public void testProfileModuleInheritance()
        throws Exception
    {
        PomTestWrapper pom = this.buildPom( "profile-module-inheritance/sub", "dist" );
        assertEquals( 0, ( (List<?>) pom.getValue( "modules" ) ).size() );
    }

    /** MNG-3621 */
    @Test
    public void testUncPath()
        throws Exception
    {
        PomTestWrapper pom = this.buildPom( "unc-path/sub" );
        assertEquals( "file:////host/site/test-child", pom.getValue( "distributionManagement/site/url" ) );
    }

    /** MNG-2006 */
    @Test
    public void testUrlAppendWithChildPathAdjustment()
        throws Exception
    {
        PomTestWrapper pom = this.buildPom( "url-append/child" );
        assertEquals( "https://project.url/child", pom.getValue( "url" ) );
        assertEquals( "https://viewvc.project.url/child", pom.getValue( "scm/url" ) );
        assertEquals( "https://scm.project.url/child", pom.getValue( "scm/connection" ) );
        assertEquals( "https://scm.project.url/child", pom.getValue( "scm/developerConnection" ) );
        assertEquals( "https://site.project.url/child", pom.getValue( "distributionManagement/site/url" ) );
    }

    /** MNG-0479 */
    @Test
    public void testRepoInheritance()
        throws Exception
    {
        PomTestWrapper pom = this.buildPom( "repo-inheritance" );
        assertEquals( 1, ( (List<?>) pom.getValue( "repositories" ) ).size() );
        assertEquals( "it0043", pom.getValue( "repositories[1]/name" ) );
    }

    @Test
    public void testEmptyScm()
        throws Exception
    {
        PomTestWrapper pom = this.buildPom( "empty-scm" );
        assertNull( pom.getValue( "scm" ) );
    }

    @Test
    public void testPluginConfigurationUsingAttributesWithoutPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-config-attributes/wo-plugin-mgmt" );
        assertEquals( "src", pom.getValue( "build/plugins[1]/configuration/domParam/copy/@todir" ) );
        assertEquals( "true", pom.getValue( "build/plugins[1]/configuration/domParam/copy/@overwrite" ) );
        assertEquals( "target", pom.getValue( "build/plugins[1]/configuration/domParam/copy/fileset/@dir" ) );
        assertNull( pom.getValue( "build/plugins[1]/configuration/domParam/copy/fileset/@todir" ) );
        assertNull( pom.getValue( "build/plugins[1]/configuration/domParam/copy/fileset/@overwrite" ) );
    }

    /** MNG-4053*/
    @Test
    public void testPluginConfigurationUsingAttributesWithPluginManagement()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-config-attributes/w-plugin-mgmt" );
        assertEquals( "src", pom.getValue( "build/plugins[1]/configuration/domParam/copy/@todir" ) );
        assertEquals( "true", pom.getValue( "build/plugins[1]/configuration/domParam/copy/@overwrite" ) );
        assertEquals( "target", pom.getValue( "build/plugins[1]/configuration/domParam/copy/fileset/@dir" ) );
        assertNull( pom.getValue( "build/plugins[1]/configuration/domParam/copy/fileset/@todir" ) );
        assertNull( pom.getValue( "build/plugins[1]/configuration/domParam/copy/fileset/@overwrite" ) );
    }

    @Test
    public void testPluginConfigurationUsingAttributesWithPluginManagementAndProfile()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-config-attributes/w-profile", "maven-core-it" );
        assertEquals( "src", pom.getValue( "build/plugins[1]/configuration/domParam/copy/@todir" ) );
        assertEquals( "true", pom.getValue( "build/plugins[1]/configuration/domParam/copy/@overwrite" ) );
        assertEquals( "target", pom.getValue( "build/plugins[1]/configuration/domParam/copy/fileset/@dir" ) );
        assertNull( pom.getValue( "build/plugins[1]/configuration/domParam/copy/fileset/@todir" ) );
        assertNull( pom.getValue( "build/plugins[1]/configuration/domParam/copy/fileset/@overwrite" ) );
    }

    @Test
    public void testPomEncoding()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "pom-encoding/utf-8" );
        assertEquals( "TEST-CHARS: \u00DF\u0131\u03A3\u042F\u05D0\u20AC", pom.getValue( "description" ) );
        pom = buildPom( "pom-encoding/latin-1" );
        assertEquals( "TEST-CHARS: \u00C4\u00D6\u00DC\u00E4\u00F6\u00FC\u00DF", pom.getValue( "description" ) );
    }

    /* MNG-4070 */
    @Test
    public void testXmlWhitespaceHandling()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "xml-whitespace/sub" );
        assertEquals( "org.apache.maven.its.mng4070", pom.getValue( "groupId" ) );
    }

    /* MNG-3760*/
    @Test
    public void testInterpolationOfBaseUri()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "baseuri-interpolation/pom.xml" );
        assertNotEquals( pom.getBasedir().toURI().toString(), pom.getValue( "properties/prop1" ).toString() );
    }

    /* MNG-6386 */
    @Test
    public void testInterpolationOfRfc3986BaseUri()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "baseuri-interpolation/pom.xml" );
        String prop1 = pom.getValue( "properties/prop1" ).toString();
        assertEquals( pom.getBasedir().toPath().toUri().toASCIIString(), prop1 );
        assertThat( prop1, startsWith( "file:///" ) );
    }

    /* MNG-3811*/
    @Test
    public void testReportingPluginConfig()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "reporting-plugin-config/sub" );

        assertEquals( 3, ( (List<?>) pom.getValue( "reporting/plugins[1]/configuration/stringParams" ) ).size() );
        assertEquals( "parentParam", pom.getValue( "reporting/plugins[1]/configuration/stringParams[1]/stringParam[1]" ) );
        assertEquals( "childParam", pom.getValue( "reporting/plugins[1]/configuration/stringParams[1]/stringParam[2]" ) );
        assertEquals( "  preserve space  ", pom.getValue( "reporting/plugins[1]/configuration/stringParams[1]/stringParam[3]" ) );
        assertEquals( "true", pom.getValue( "reporting/plugins[1]/configuration/booleanParam" ) );
    }

    @Test
    public void testPropertiesNoDuplication()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "properties-no-duplication/sub" );
        assertEquals( 1, ( (Properties) pom.getValue( "properties" ) ).size() );
        assertEquals( "child", pom.getValue( "properties/pomProfile" ) );
    }

    @Test
    public void testPomInheritance()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "pom-inheritance/sub" );
        assertEquals( "parent-description", pom.getValue( "description" ) );
        assertEquals( "jar", pom.getValue( "packaging" ) );
    }

    @Test
    public void testCompleteModelWithoutParent()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "complete-model/wo-parent" );

        testCompleteModel( pom );
    }

    @Test
    public void testCompleteModelWithParent()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "complete-model/w-parent/sub" );

        testCompleteModel( pom );
    }

    private void testCompleteModel( PomTestWrapper pom )
        throws Exception
    {
        assertEquals( "4.0.0", pom.getValue( "modelVersion" ) );

        assertEquals( "org.apache.maven.its.mng", pom.getValue( "groupId" ) );
        assertEquals( "test", pom.getValue( "artifactId" ) );
        assertEquals( "0.2", pom.getValue( "version" ) );
        assertEquals( "pom", pom.getValue( "packaging" ) );

        assertEquals( "project-name", pom.getValue( "name" ) );
        assertEquals( "project-description", pom.getValue( "description" ) );
        assertEquals( "https://project.url/", pom.getValue( "url" ) );
        assertEquals( "2009", pom.getValue( "inceptionYear" ) );

        assertEquals( "project-org", pom.getValue( "organization/name" ) );
        assertEquals( "https://project-org.url/", pom.getValue( "organization/url" ) );

        assertEquals( 1, ( (List<?>) pom.getValue( "licenses" ) ).size() );
        assertEquals( "project-license", pom.getValue( "licenses[1]/name" ) );
        assertEquals( "https://project.url/license", pom.getValue( "licenses[1]/url" ) );
        assertEquals( "repo", pom.getValue( "licenses[1]/distribution" ) );
        assertEquals( "free", pom.getValue( "licenses[1]/comments" ) );

        assertEquals( 1, ( (List<?>) pom.getValue( "developers" ) ).size() );
        assertEquals( "dev", pom.getValue( "developers[1]/id" ) );
        assertEquals( "project-developer", pom.getValue( "developers[1]/name" ) );
        assertEquals( "developer@", pom.getValue( "developers[1]/email" ) );
        assertEquals( "https://developer", pom.getValue( "developers[1]/url" ) );
        assertEquals( "developer", pom.getValue( "developers[1]/organization" ) );
        assertEquals( "https://devel.org", pom.getValue( "developers[1]/organizationUrl" ) );
        assertEquals( "-1", pom.getValue( "developers[1]/timezone" ) );
        assertEquals( "yes", pom.getValue( "developers[1]/properties/developer" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "developers[1]/roles" ) ).size() );
        assertEquals( "devel", pom.getValue( "developers[1]/roles[1]" ) );

        assertEquals( 1, ( (List<?>) pom.getValue( "contributors" ) ).size() );
        assertEquals( "project-contributor", pom.getValue( "contributors[1]/name" ) );
        assertEquals( "contributor@", pom.getValue( "contributors[1]/email" ) );
        assertEquals( "https://contributor", pom.getValue( "contributors[1]/url" ) );
        assertEquals( "contributor", pom.getValue( "contributors[1]/organization" ) );
        assertEquals( "https://contrib.org", pom.getValue( "contributors[1]/organizationUrl" ) );
        assertEquals( "+1", pom.getValue( "contributors[1]/timezone" ) );
        assertEquals( "yes", pom.getValue( "contributors[1]/properties/contributor" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "contributors[1]/roles" ) ).size() );
        assertEquals( "contrib", pom.getValue( "contributors[1]/roles[1]" ) );

        assertEquals( 1, ( (List<?>) pom.getValue( "mailingLists" ) ).size() );
        assertEquals( "project-mailing-list", pom.getValue( "mailingLists[1]/name" ) );
        assertEquals( "subscribe@", pom.getValue( "mailingLists[1]/subscribe" ) );
        assertEquals( "unsubscribe@", pom.getValue( "mailingLists[1]/unsubscribe" ) );
        assertEquals( "post@", pom.getValue( "mailingLists[1]/post" ) );
        assertEquals( "mail-archive", pom.getValue( "mailingLists[1]/archive" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "mailingLists[1]/otherArchives" ) ).size() );
        assertEquals( "other-archive", pom.getValue( "mailingLists[1]/otherArchives[1]" ) );

        assertEquals( "2.0.1", pom.getValue( "prerequisites/maven" ) );

        assertEquals( "https://project.url/trunk", pom.getValue( "scm/url" ) );
        assertEquals( "https://project.url/scm", pom.getValue( "scm/connection" ) );
        assertEquals( "https://project.url/scm", pom.getValue( "scm/developerConnection" ) );
        assertEquals( "TAG", pom.getValue( "scm/tag" ) );

        assertEquals( "issues", pom.getValue( "issueManagement/system" ) );
        assertEquals( "https://project.url/issues", pom.getValue( "issueManagement/url" ) );

        assertEquals( "ci", pom.getValue( "ciManagement/system" ) );
        assertEquals( "https://project.url/ci", pom.getValue( "ciManagement/url" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "ciManagement/notifiers" ) ).size() );
        assertEquals( "irc", pom.getValue( "ciManagement/notifiers[1]/type" ) );
        assertEquals( "ci@", pom.getValue( "ciManagement/notifiers[1]/address" ) );
        assertEquals( Boolean.TRUE, pom.getValue( "ciManagement/notifiers[1]/sendOnError" ) );
        assertEquals( Boolean.FALSE, pom.getValue( "ciManagement/notifiers[1]/sendOnFailure" ) );
        assertEquals( Boolean.FALSE, pom.getValue( "ciManagement/notifiers[1]/sendOnWarning" ) );
        assertEquals( Boolean.FALSE, pom.getValue( "ciManagement/notifiers[1]/sendOnSuccess" ) );
        assertEquals( "ci", pom.getValue( "ciManagement/notifiers[1]/configuration/ciProp" ) );

        assertEquals( "project.distros", pom.getValue( "distributionManagement/repository/id" ) );
        assertEquals( "distros", pom.getValue( "distributionManagement/repository/name" ) );
        assertEquals( "https://project.url/dist", pom.getValue( "distributionManagement/repository/url" ) );
        assertEquals( Boolean.TRUE, pom.getValue( "distributionManagement/repository/uniqueVersion" ) );

        assertEquals( "project.snaps", pom.getValue( "distributionManagement/snapshotRepository/id" ) );
        assertEquals( "snaps", pom.getValue( "distributionManagement/snapshotRepository/name" ) );
        assertEquals( "https://project.url/snaps", pom.getValue( "distributionManagement/snapshotRepository/url" ) );
        assertEquals( Boolean.FALSE, pom.getValue( "distributionManagement/snapshotRepository/uniqueVersion" ) );

        assertEquals( "project.site", pom.getValue( "distributionManagement/site/id" ) );
        assertEquals( "docs", pom.getValue( "distributionManagement/site/name" ) );
        assertEquals( "https://project.url/site", pom.getValue( "distributionManagement/site/url" ) );

        assertEquals( "https://project.url/download", pom.getValue( "distributionManagement/downloadUrl" ) );
        assertEquals( "reloc-gid", pom.getValue( "distributionManagement/relocation/groupId" ) );
        assertEquals( "reloc-aid", pom.getValue( "distributionManagement/relocation/artifactId" ) );
        assertEquals( "reloc-version", pom.getValue( "distributionManagement/relocation/version" ) );
        assertEquals( "project-reloc-msg", pom.getValue( "distributionManagement/relocation/message" ) );

        assertEquals( 1, ( (List<?>) pom.getValue( "modules" ) ).size() );
        assertEquals( "sub", pom.getValue( "modules[1]" ) );

        assertEquals( 1, ( (Map<?, ?>) pom.getValue( "properties" ) ).size() );
        assertEquals( "project-property", pom.getValue( "properties[1]/itProperty" ) );

        assertEquals( 1, ( (List<?>) pom.getValue( "dependencyManagement/dependencies" ) ).size() );
        assertEquals( "org.apache.maven.its", pom.getValue( "dependencyManagement/dependencies[1]/groupId" ) );
        assertEquals( "managed-dep", pom.getValue( "dependencyManagement/dependencies[1]/artifactId" ) );
        assertEquals( "0.1", pom.getValue( "dependencyManagement/dependencies[1]/version" ) );
        assertEquals( "war", pom.getValue( "dependencyManagement/dependencies[1]/type" ) );
        assertEquals( "runtime", pom.getValue( "dependencyManagement/dependencies[1]/scope" ) );
        assertEquals( Boolean.FALSE, pom.getValue( "dependencyManagement/dependencies[1]/optional" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "dependencyManagement/dependencies[1]/exclusions" ) ).size() );
        assertEquals( "org.apache.maven.its",
                      pom.getValue( "dependencyManagement/dependencies[1]/exclusions[1]/groupId" ) );
        assertEquals( "excluded-managed-dep",
                      pom.getValue( "dependencyManagement/dependencies[1]/exclusions[1]/artifactId" ) );

        assertEquals( 1, ( (List<?>) pom.getValue( "dependencies" ) ).size() );
        assertEquals( "org.apache.maven.its", pom.getValue( "dependencies[1]/groupId" ) );
        assertEquals( "dep", pom.getValue( "dependencies[1]/artifactId" ) );
        assertEquals( "0.2", pom.getValue( "dependencies[1]/version" ) );
        assertEquals( "ejb", pom.getValue( "dependencies[1]/type" ) );
        assertEquals( "test", pom.getValue( "dependencies[1]/scope" ) );
        assertEquals( Boolean.TRUE, pom.getValue( "dependencies[1]/optional" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "dependencies[1]/exclusions" ) ).size() );
        assertEquals( "org.apache.maven.its", pom.getValue( "dependencies[1]/exclusions[1]/groupId" ) );
        assertEquals( "excluded-dep", pom.getValue( "dependencies[1]/exclusions[1]/artifactId" ) );

        assertEquals( 2, ( (List<?>) pom.getValue( "repositories" ) ).size() );
        assertEquals( "project-remote-repo", pom.getValue( "repositories[1]/id" ) );
        assertEquals( "https://project.url/remote", pom.getValue( "repositories[1]/url" ) );
        assertEquals( "repo", pom.getValue( "repositories[1]/name" ) );
        assertEquals( RepositorySystem.DEFAULT_REMOTE_REPO_ID, pom.getValue( "repositories[2]/id" ) );
        assertEquals( RepositorySystem.DEFAULT_REMOTE_REPO_URL, pom.getValue( "repositories[2]/url" ) );

        assertEquals( "test", pom.getValue( "build/defaultGoal" ) );
        assertEquals( "coreit", pom.getValue( "build/finalName" ) );

        assertPathSuffixEquals( "build", pom.getValue( "build/directory" ) );
        assertPathSuffixEquals( "build/main", pom.getValue( "build/outputDirectory" ) );
        assertPathSuffixEquals( "build/test", pom.getValue( "build/testOutputDirectory" ) );
        assertPathSuffixEquals( "sources/main", pom.getValue( "build/sourceDirectory" ) );
        assertPathSuffixEquals( "sources/test", pom.getValue( "build/testSourceDirectory" ) );
        assertPathSuffixEquals( "sources/scripts", pom.getValue( "build/scriptSourceDirectory" ) );

        assertEquals( 1, ( (List<?>) pom.getValue( "build/filters" ) ).size() );
        assertPathSuffixEquals( "src/main/filter/it.properties", pom.getValue( "build/filters[1]" ) );

        assertEquals( 1, ( (List<?>) pom.getValue( "build/resources" ) ).size() );
        assertPathSuffixEquals( "res/main", pom.getValue( "build/resources[1]/directory" ) );
        assertPathSuffixEquals( "main", pom.getValue( "build/resources[1]/targetPath" ) );
        assertEquals( Boolean.TRUE, pom.getValue( "build/resources[1]/filtering" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "build/resources[1]/includes" ) ).size() );
        assertPathSuffixEquals( "main.included", pom.getValue( "build/resources[1]/includes[1]" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "build/resources[1]/excludes" ) ).size() );
        assertPathSuffixEquals( "main.excluded", pom.getValue( "build/resources[1]/excludes[1]" ) );

        assertEquals( 1, ( (List<?>) pom.getValue( "build/testResources" ) ).size() );
        assertPathSuffixEquals( "res/test", pom.getValue( "build/testResources[1]/directory" ) );
        assertPathSuffixEquals( "test", pom.getValue( "build/testResources[1]/targetPath" ) );
        assertEquals( Boolean.TRUE, pom.getValue( "build/testResources[1]/filtering" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "build/testResources[1]/includes" ) ).size() );
        assertPathSuffixEquals( "test.included", pom.getValue( "build/testResources[1]/includes[1]" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "build/testResources[1]/excludes" ) ).size() );
        assertPathSuffixEquals( "test.excluded", pom.getValue( "build/testResources[1]/excludes[1]" ) );

        assertEquals( 1, ( (List<?>) pom.getValue( "build/extensions" ) ).size() );
        assertEquals( "org.apache.maven.its.ext", pom.getValue( "build/extensions[1]/groupId" ) );
        assertEquals( "ext", pom.getValue( "build/extensions[1]/artifactId" ) );
        assertEquals( "3.0", pom.getValue( "build/extensions[1]/version" ) );

        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins" ) ).size() );
        assertEquals( "org.apache.maven.its.plugins", pom.getValue( "build/plugins[1]/groupId" ) );
        assertEquals( "maven-it-plugin-build", pom.getValue( "build/plugins[1]/artifactId" ) );
        assertEquals( "2.1-SNAPSHOT", pom.getValue( "build/plugins[1]/version" ) );
        assertEquals( "test.properties", pom.getValue( "build/plugins[1]/configuration/outputFile" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/executions" ) ).size() );
        assertEquals( "test", pom.getValue( "build/plugins[1]/executions[1]/id" ) );
        assertEquals( "validate", pom.getValue( "build/plugins[1]/executions[1]/phase" ) );
        assertEquals( "pom.properties", pom.getValue( "build/plugins[1]/executions[1]/configuration/outputFile" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/executions[1]/goals" ) ).size() );
        assertEquals( "eval", pom.getValue( "build/plugins[1]/executions[1]/goals[1]" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/dependencies" ) ).size() );
        assertEquals( "org.apache.maven.its", pom.getValue( "build/plugins[1]/dependencies[1]/groupId" ) );
        assertEquals( "build-plugin-dep", pom.getValue( "build/plugins[1]/dependencies[1]/artifactId" ) );
        assertEquals( "0.3", pom.getValue( "build/plugins[1]/dependencies[1]/version" ) );
        assertEquals( "zip", pom.getValue( "build/plugins[1]/dependencies[1]/type" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins[1]/dependencies[1]/exclusions" ) ).size() );
        assertEquals( "org.apache.maven.its", pom.getValue( "build/plugins[1]/dependencies[1]/exclusions[1]/groupId" ) );
        assertEquals( "excluded-build-plugin-dep",
                      pom.getValue( "build/plugins[1]/dependencies[1]/exclusions[1]/artifactId" ) );

        assertEquals( Boolean.TRUE, pom.getValue( "reporting/excludeDefaults" ) );
        assertPathSuffixEquals( "docs", pom.getValue( "reporting/outputDirectory" ) );

        assertEquals( 1, ( (List<?>) pom.getValue( "reporting/plugins" ) ).size() );
        assertEquals( "org.apache.maven.its.plugins", pom.getValue( "reporting/plugins[1]/groupId" ) );
        assertEquals( "maven-it-plugin-reporting", pom.getValue( "reporting/plugins[1]/artifactId" ) );
        assertEquals( "2.0-SNAPSHOT", pom.getValue( "reporting/plugins[1]/version" ) );
        assertEquals( "test.html", pom.getValue( "reporting/plugins[1]/configuration/outputFile" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "reporting/plugins[1]/reportSets" ) ).size() );
        assertEquals( "it", pom.getValue( "reporting/plugins[1]/reportSets[1]/id" ) );
        assertEquals( "index.html", pom.getValue( "reporting/plugins[1]/reportSets[1]/configuration/outputFile" ) );
        assertEquals( 1, ( (List<?>) pom.getValue( "reporting/plugins[1]/reportSets[1]/reports" ) ).size() );
        assertEquals( "run", pom.getValue( "reporting/plugins[1]/reportSets[1]/reports[1]" ) );
    }

    /* MNG-2309*/
    @Test
    public void testProfileInjectionOrder()
        throws Exception
    {
        PomTestWrapper pom =
            buildPom( "profile-injection-order", "pom-a", "pom-b", "pom-e", "pom-c", "pom-d" );
        assertEquals( "e", pom.getValue( "properties[1]/pomProperty" ) );
    }

    @Test
    public void testPropertiesInheritance()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "properties-inheritance/sub" );
        assertEquals( "parent-property", pom.getValue( "properties/parentProperty" ) );
        assertEquals( "child-property", pom.getValue( "properties/childProperty" ) );
        assertEquals( "child-override", pom.getValue( "properties/overriddenProperty" ) );
    }

    /* MNG-4102*/
    @Test
    public void testInheritedPropertiesInterpolatedWithValuesFromChildWithoutProfiles()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "inherited-properties-interpolation/no-profile/sub" );

        assertEquals( "CHILD", pom.getValue( "properties/overridden" ) );
        assertEquals( "CHILD", pom.getValue( "properties/interpolated" ) );
    }

    /* MNG-4102 */
    @Test
    public void testInheritedPropertiesInterpolatedWithValuesFromChildWithActiveProfiles()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "inherited-properties-interpolation/active-profile/sub" );

        assertEquals( 1, pom.getMavenProject().getModel().getProfiles().size() );

        buildPom( "inherited-properties-interpolation/active-profile/sub", "it-parent", "it-child" );
        assertEquals( "CHILD", pom.getValue( "properties/overridden" ) );
        assertEquals( "CHILD", pom.getValue( "properties/interpolated" ) );
    }

    /* MNG-3545 */
    @Test
    public void testProfileDefaultActivation()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "profile-default-deactivation", "profile4" );
        assertEquals( 1, pom.getMavenProject().getActiveProfiles().size() );
        assertEquals( 1, ( (List<?>) pom.getValue( "build/plugins" ) ).size() );
        assertEquals( "2.1", pom.getValue( "build/plugins[1]/version" ) );
    }

    /* MNG-1995 */
    @Test
    public void testBooleanInterpolation()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "boolean-interpolation" );
        assertEquals(true, pom.getValue( "repositories[1]/releases/enabled" ) );
        assertEquals(true, pom.getValue( "build/resources[1]/filtering" ) );
    }


    /* MNG-3899 */
    @Test
    public void testBuildExtensionInheritance()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "build-extension-inheritance/sub" );
        assertEquals( 3, ( (List<?>) pom.getValue( "build/extensions" ) ).size() );
        assertEquals( "b", pom.getValue( "build/extensions[1]/artifactId" ) );
        assertEquals( "a", pom.getValue( "build/extensions[2]/artifactId" ) );
        assertEquals( "0.2", pom.getValue( "build/extensions[2]/version" ) );
        assertEquals( "c", pom.getValue( "build/extensions[3]/artifactId" ) );
    }

    /*MNG-1957*/
    @Test
    public void testJdkActivation()
        throws Exception
    {
        Properties props = new Properties();
        props.put( "java.version", "1.5.0_15" );

        PomTestWrapper pom = buildPom( "jdk-activation", props );
        assertEquals( 3, pom.getMavenProject().getActiveProfiles().size() );
        assertEquals( "PASSED", pom.getValue( "properties/jdkProperty3" ) );
        assertEquals( "PASSED", pom.getValue( "properties/jdkProperty2" ) );
        assertEquals( "PASSED", pom.getValue( "properties/jdkProperty1" ) );
    }

    /* MNG-2174 */
    @Test
    public void testProfilePluginMngDependencies()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "profile-plugin-mng-dependencies/sub", "maven-core-it" );
        assertEquals( "a", pom.getValue( "build/plugins[1]/dependencies[1]/artifactId" ) );
    }

    /** MNG-4116 */
    @Test
    public void testPercentEncodedUrlsMustNotBeDecoded()
        throws Exception
    {
        PomTestWrapper pom = this.buildPom( "url-no-decoding" );
        assertEquals( "https://maven.apache.org/spacy%20path", pom.getValue( "url" ) );
        assertEquals( "https://svn.apache.org/viewvc/spacy%20path", pom.getValue( "scm/url" ) );
        assertEquals( "scm:svn:svn+ssh://svn.apache.org/spacy%20path", pom.getValue( "scm/connection" ) );
        assertEquals( "scm:svn:svn+ssh://svn.apache.org/spacy%20path", pom.getValue( "scm/developerConnection" ) );
        assertEquals( "https://issues.apache.org/spacy%20path", pom.getValue( "issueManagement/url" ) );
        assertEquals( "https://ci.apache.org/spacy%20path", pom.getValue( "ciManagement/url" ) );
        assertEquals( "scm:svn:svn+ssh://dist.apache.org/spacy%20path",
                      pom.getValue( "distributionManagement/repository/url" ) );
        assertEquals( "scm:svn:svn+ssh://snap.apache.org/spacy%20path",
                      pom.getValue( "distributionManagement/snapshotRepository/url" ) );
        assertEquals( "scm:svn:svn+ssh://site.apache.org/spacy%20path",
                      pom.getValue( "distributionManagement/site/url" ) );
    }

    @Test
    public void testPluginManagementInheritance()
        throws Exception
    {
        PomTestWrapper pom = this.buildPom( "plugin-management-inheritance" );
        assertEquals( "0.1-stub-SNAPSHOT",
                      pom.getValue( "build/pluginManagement/plugins[@artifactId='maven-compiler-plugin']/version" ) );
    }

    @Test
    public void testProfilePlugins()
        throws Exception
    {
        PomTestWrapper pom = this.buildPom( "profile-plugins", "standard" );
        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins" ) ).size() );
        assertEquals( "maven-assembly2-plugin", pom.getValue( "build/plugins[2]/artifactId" ) );
    }

    @Test
    public void testPluginInheritanceSimple()
        throws Exception
    {
        PomTestWrapper pom = this.buildPom( "plugin-inheritance-simple/sub" );
        assertEquals( 2, ( (List<?>) pom.getValue( "build/plugins" ) ).size() );
    }

    @Test
    public void testPluginManagementDuplicate()
        throws Exception
    {
        PomTestWrapper pom = this.buildPom( "plugin-management-duplicate/sub" );
        assertEquals( 8, ( (List<?>) pom.getValue( "build/pluginManagement/plugins" ) ).size() );
    }

    @Test
    public void testDistributionManagement()
        throws Exception
    {
        PomTestWrapper pom = this.buildPom( "distribution-management" );
        assertEquals( "legacy", pom.getValue( "distributionManagement/repository/layout" ) );
    }

    @Test
    public void testDependencyScopeInheritance()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "dependency-scope-inheritance/sub" );
        String scope = (String) pom.getValue( "dependencies[1]/scope" );
        assertEquals( "compile", scope );
    }

    @Test
    public void testDependencyScope()
        throws Exception
    {
        buildPom( "dependency-scope/sub" );
    }

    //This will fail on a validation error if incorrect
    public void testDependencyManagementWithInterpolation()
        throws Exception
    {
        buildPom( "dependency-management-with-interpolation/sub" );
    }

    @Test
    public void testInterpolationWithSystemProperty()
        throws Exception
    {
        Properties sysProps = new Properties();
        sysProps.setProperty( "system.property", "PASSED" );
        PomTestWrapper pom = buildPom( "system-property-interpolation", sysProps );
        assertEquals( "PASSED", pom.getValue( "name" ) );
    }

    /* MNG-4129 */
    @Test
    public void testPluginExecutionInheritanceWhenChildDoesNotDeclarePlugin()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-exec-inheritance/wo-merge" );
        @SuppressWarnings( "unchecked" )
        List<PluginExecution> executions =
            (List<PluginExecution>) pom.getValue( "build/pluginsAsMap[@name='org.apache.maven.its.plugins:maven-it-plugin-log-file']/executions" );
        assertEquals( 1, executions.size() );
        assertEquals( "inherited-execution", executions.get( 0 ).getId() );
    }

    @Test
    public void testPluginExecutionInheritanceWhenChildDoesDeclarePluginAsWell()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-exec-inheritance/w-merge" );
        @SuppressWarnings( "unchecked" )
        List<PluginExecution> executions =
            (List<PluginExecution>) pom.getValue( "build/pluginsAsMap[@name='org.apache.maven.its.plugins:maven-it-plugin-log-file']/executions" );
        assertEquals( 1, executions.size() );
        assertEquals( "inherited-execution", executions.get( 0 ).getId() );
    }

    /* MNG-4193 */
    @Test
    public void testValidationErrorUponNonUniqueArtifactRepositoryId()
        throws Exception
    {
        assertThrows(
                ProjectBuildingException.class,
                () -> buildPom( "unique-repo-id/artifact-repo" ),
                "Non-unique repository ids did not cause validation error" );
    }

    /* MNG-4193 */
    @Test
    public void testValidationErrorUponNonUniquePluginRepositoryId()
        throws Exception
    {
        assertThrows(
                ProjectBuildingException.class,
                () -> buildPom( "unique-repo-id/plugin-repo" ),
                "Non-unique repository ids did not cause validation error" );
    }

    /* MNG-4193 */
    @Test
    public void testValidationErrorUponNonUniqueArtifactRepositoryIdInProfile()
        throws Exception
    {
        assertThrows(
                ProjectBuildingException.class,
                () -> buildPom( "unique-repo-id/artifact-repo-in-profile" ),
                "Non-unique repository ids did not cause validation error" );
    }

    /* MNG-4193 */
    @Test
    public void testValidationErrorUponNonUniquePluginRepositoryIdInProfile()
        throws Exception
    {
        assertThrows(
                ProjectBuildingException.class,
                () -> buildPom( "unique-repo-id/plugin-repo-in-profile" ),
                "Non-unique repository ids did not cause validation error" );
    }

    /** MNG-3843 */
    @Test
    public void testPrerequisitesAreNotInherited()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "prerequisites-inheritance/child" );
        assertSame( null, pom.getValue( "prerequisites" ) );
    }

    @Test
    public void testLicensesAreInheritedButNotAggregated()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "licenses-inheritance/child-2" );
        assertEquals( 1, ( (List<?>) pom.getValue( "licenses" ) ).size() );
        assertEquals( "child-license", pom.getValue( "licenses[1]/name" ) );
        assertEquals( "https://child.url/license", pom.getValue( "licenses[1]/url" ) );
    }

    @Test
    public void testDevelopersAreInheritedButNotAggregated()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "developers-inheritance/child-2" );
        assertEquals( 1, ( (List<?>) pom.getValue( "developers" ) ).size() );
        assertEquals( "child-developer", pom.getValue( "developers[1]/name" ) );
    }

    @Test
    public void testContributorsAreInheritedButNotAggregated()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "contributors-inheritance/child-2" );
        assertEquals( 1, ( (List<?>) pom.getValue( "contributors" ) ).size() );
        assertEquals( "child-contributor", pom.getValue( "contributors[1]/name" ) );
    }

    @Test
    public void testMailingListsAreInheritedButNotAggregated()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "mailing-lists-inheritance/child-2" );
        assertEquals( 1, ( (List<?>) pom.getValue( "mailingLists" ) ).size() );
        assertEquals( "child-mailing-list", pom.getValue( "mailingLists[1]/name" ) );
    }

    @Test
    public void testPluginInheritanceOrder()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-inheritance-order/child" );

        assertEquals( "maven-it-plugin-log-file", pom.getValue( "build/plugins[1]/artifactId" ) );
        assertEquals( "maven-it-plugin-expression", pom.getValue( "build/plugins[2]/artifactId" ) );
        assertEquals( "maven-it-plugin-configuration", pom.getValue( "build/plugins[3]/artifactId" ) );

        assertEquals( "maven-it-plugin-log-file", pom.getValue( "reporting/plugins[1]/artifactId" ) );
        assertEquals( "maven-it-plugin-expression", pom.getValue( "reporting/plugins[2]/artifactId" ) );
        assertEquals( "maven-it-plugin-configuration", pom.getValue( "reporting/plugins[3]/artifactId" ) );
    }

    @Test
    public void testCliPropsDominateProjectPropsDuringInterpolation()
        throws Exception
    {
        Properties props = new Properties();
        props.setProperty( "testProperty", "PASSED" );
        PomTestWrapper pom = buildPom( "interpolation-cli-wins", props );

        assertEquals( "PASSED", pom.getValue( "properties/interpolatedProperty" ) );
    }

    @Test
    public void testParentPomPackagingMustBePom()
        throws Exception
    {
        assertThrows(
                ProjectBuildingException.class,
                () -> buildPom( "parent-pom-packaging/sub" ),
                "Wrong packaging of parent POM was not rejected" );
    }

    /** MNG-522, MNG-3018 */
    @Test
    public void testManagedPluginConfigurationAppliesToImplicitPluginsIntroducedByPackaging()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-management-for-implicit-plugin/child" );
        assertEquals( "passed.txt",
                      pom.getValue( "build/plugins[@artifactId='maven-resources-plugin']/configuration/pathname" ) );
        assertEquals( "passed.txt",
                      pom.getValue( "build/plugins[@artifactId='maven-it-plugin-log-file']/configuration/logFile" ) );
    }

    @Test
    public void testDefaultPluginsExecutionContributedByPackagingExecuteBeforeUserDefinedExecutions()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-exec-order-and-default-exec" );
        @SuppressWarnings( "unchecked" )
        List<PluginExecution> executions =
            (List<PluginExecution>) pom.getValue( "build/plugins[@artifactId='maven-resources-plugin']/executions" );
        assertNotNull( executions );
        assertEquals( 4, executions.size() );
        assertEquals( "default-resources", executions.get( 0 ).getId() );
        assertEquals( "default-testResources", executions.get( 1 ).getId() );
        assertEquals( "test-1", executions.get( 2 ).getId() );
        assertEquals( "test-2", executions.get( 3 ).getId() );
    }

    @Test
    public void testPluginDeclarationsRetainPomOrderAfterInjectionOfDefaultPlugins()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-exec-order-with-lifecycle" );
        @SuppressWarnings( "unchecked" )
        List<Plugin> plugins = (List<Plugin>) pom.getValue( "build/plugins" );
        int resourcesPlugin = -1;
        int customPlugin = -1;
        for ( int i = 0; i < plugins.size(); i++ )
        {
            Plugin plugin = plugins.get( i );
            if ( "maven-resources-plugin".equals( plugin.getArtifactId() ) )
            {
                assertThat( resourcesPlugin, lessThan( 0 ) );
                resourcesPlugin = i;
            }
            else if ( "maven-it-plugin-log-file".equals( plugin.getArtifactId() ) )
            {
                assertThat( customPlugin, lessThan( 0 ) );
                customPlugin = i;
            }
        }
        assertEquals( customPlugin, resourcesPlugin - 1, plugins.toString() );
    }

    /** MNG-4415 */
    @Test
    public void testPluginOrderAfterMergingWithInheritedPlugins()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-inheritance-merge-order/sub" );

        List<String> expected = new ArrayList<>();
        expected.add( "maven-it-plugin-error" );
        expected.add( "maven-it-plugin-configuration" );
        expected.add( "maven-it-plugin-dependency-resolution" );
        expected.add( "maven-it-plugin-packaging" );
        expected.add( "maven-it-plugin-log-file" );
        expected.add( "maven-it-plugin-expression" );
        expected.add( "maven-it-plugin-fork" );
        expected.add( "maven-it-plugin-touch" );

        List<String> actual = new ArrayList<>();
        @SuppressWarnings( "unchecked" )
        List<Plugin> plugins = (List<Plugin>) pom.getValue( "build/plugins" );
        for ( Plugin plugin : plugins )
        {
            actual.add( plugin.getArtifactId() );
        }

        actual.retainAll( expected );

        assertEquals( actual, expected );
    }

    /** MNG-4416 */
    @Test
    public void testPluginOrderAfterMergingWithInjectedPlugins()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "plugin-injection-merge-order" );

        List<String> expected = new ArrayList<>();
        expected.add( "maven-it-plugin-error" );
        expected.add( "maven-it-plugin-configuration" );
        expected.add( "maven-it-plugin-dependency-resolution" );
        expected.add( "maven-it-plugin-packaging" );
        expected.add( "maven-it-plugin-log-file" );
        expected.add( "maven-it-plugin-expression" );
        expected.add( "maven-it-plugin-fork" );
        expected.add( "maven-it-plugin-touch" );

        List<String> actual = new ArrayList<>();
        @SuppressWarnings( "unchecked" )
        List<Plugin> plugins = (List<Plugin>) pom.getValue( "build/plugins" );
        for ( Plugin plugin : plugins )
        {
            actual.add( plugin.getArtifactId() );
        }

        actual.retainAll( expected );

        assertEquals( actual, expected );
    }

    @Test
    public void testProjectArtifactIdIsNotInheritedButMandatory()
        throws Exception
    {
        assertThrows(
                ProjectBuildingException.class,
                () -> buildPom( "artifact-id-inheritance/child" ),
                "Missing artifactId did not cause validation error" );
    }

    private void assertPathSuffixEquals( String expected, Object actual )
    {
        String a = actual.toString();
        a = a.substring( a.length() - expected.length() ).replace( '\\', '/' );
        assertEquals( expected, a );
    }

    private void assertPathWithNormalizedFileSeparators( Object value )
    {
        assertEquals( new File( value.toString() ).getPath(), value.toString() );
    }

    private PomTestWrapper buildPom( String pomPath, String... profileIds )
        throws Exception
    {
        return buildPom( pomPath, null, profileIds );
    }

    private PomTestWrapper buildPom( String pomPath, Properties executionProperties, String... profileIds )
        throws Exception
    {
        return buildPom( pomPath, false, executionProperties, profileIds );
    }

    private PomTestWrapper buildPom( String pomPath, boolean lenientValidation, Properties executionProperties,
                                     String... profileIds )
        throws Exception
    {
        File pomFile = new File( testDirectory, pomPath );
        if ( pomFile.isDirectory() )
        {
            pomFile = new File( pomFile, "pom.xml" );
        }

        ProjectBuildingRequest config = new DefaultProjectBuildingRequest();

        String localRepoUrl =
            System.getProperty( "maven.repo.local", System.getProperty( "user.home" ) + "/.m2/repository" );
        localRepoUrl = "file://" + localRepoUrl;
        config.setLocalRepository( repositorySystem.createArtifactRepository( "local", localRepoUrl, new DefaultRepositoryLayout(), null, null ) );
        config.setActiveProfileIds( Arrays.asList( profileIds ) );
        config.setSystemProperties( executionProperties );
        config.setUserProperties( executionProperties );
        config.setValidationLevel( lenientValidation ? ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0
                        : ModelBuildingRequest.VALIDATION_LEVEL_STRICT );

        DefaultRepositorySystemSession repoSession = MavenRepositorySystemUtils.newSession();
        LocalRepository localRepo = new LocalRepository( config.getLocalRepository().getBasedir() );
        repoSession.setLocalRepositoryManager( new SimpleLocalRepositoryManagerFactory().newInstance( repoSession, localRepo ) );
        config.setRepositorySession( repoSession );

        return new PomTestWrapper( pomFile, projectBuilder.build( pomFile, config ).getProject() );
    }

    protected void assertModelEquals( PomTestWrapper pom, Object expected, String expression )
    {
        assertEquals( expected, pom.getValue( expression ) );
    }

    private static String createPath( List<String> elements )
    {
        StringBuilder buffer = new StringBuilder( 256 );
        for ( String s : elements )
        {
            buffer.append( s ).append( File.separator );
        }
        return buffer.toString().substring( 0, buffer.toString().length() - 1 );
    }
}
