/*
 * 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.
 */
package org.apache.maven.plugins.invoker;

/*
 * 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.io.Reader;
import java.util.Map;
import java.util.Properties;

import org.apache.maven.model.Scm;
import org.apache.maven.plugin.testing.AbstractMojoTestCase;
import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
import org.apache.maven.settings.Settings;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.ReaderFactory;

/**
 * @author Olivier Lamy
 * @since 22 nov. 07
 */
public class InterpolationTest extends AbstractMojoTestCase {

    protected MavenProjectStub buildMavenProjectStub() {
        ExtendedMavenProjectStub project = new ExtendedMavenProjectStub();
        project.setVersion("1.0-SNAPSHOT");
        project.setArtifactId("foo");
        project.setGroupId("bar");
        Properties properties = new Properties();
        properties.put("fooOnProject", "barOnProject");
        project.setProperties(properties);
        Scm scm = new Scm();
        scm.setConnection("http://blabla");
        project.setScm(scm);
        return project;
    }

    public void testCompositeMap() {

        Properties properties = new Properties();
        properties.put("foo", "bar");
        properties.put("version", "2.0-SNAPSHOT");
        CompositeMap compositeMap = new CompositeMap(buildMavenProjectStub(), (Map) properties, false);
        assertEquals("1.0-SNAPSHOT", compositeMap.get("pom.version"));
        assertEquals("bar", compositeMap.get("foo"));
        assertEquals("bar", compositeMap.get("pom.groupId"));
        assertEquals("http://blabla", compositeMap.get("pom.scm.connection"));
        assertEquals("barOnProject", compositeMap.get("fooOnProject"));
    }

    public void testPomInterpolation() throws Exception {
        Reader reader = null;
        File interpolatedPomFile;
        try {
            InvokerMojo invokerMojo = new InvokerMojo();
            setVariableValueToObject(invokerMojo, "project", buildMavenProjectStub());
            setVariableValueToObject(invokerMojo, "settings", new Settings());
            Properties properties = new Properties();
            properties.put("foo", "bar");
            properties.put("version", "2.0-SNAPSHOT");
            setVariableValueToObject(invokerMojo, "filterProperties", properties);
            String dirPath =
                    getBasedir() + File.separatorChar + "src" + File.separatorChar + "test" + File.separatorChar
                            + "resources" + File.separatorChar + "unit" + File.separatorChar + "interpolation";

            interpolatedPomFile = new File(getBasedir(), "target/interpolated-pom.xml");
            invokerMojo.buildInterpolatedFile(new File(dirPath, "pom.xml"), interpolatedPomFile);
            reader = ReaderFactory.newXmlReader(interpolatedPomFile);
            String content = IOUtil.toString(reader);
            assertTrue(content.indexOf("<interpolateValue>bar</interpolateValue>") > 0);
            reader.close();
            reader = null;
            // recreate it to test delete if exists before creation
            invokerMojo.buildInterpolatedFile(new File(dirPath, "pom.xml"), interpolatedPomFile);
            reader = ReaderFactory.newXmlReader(interpolatedPomFile);
            content = IOUtil.toString(reader);
            assertTrue(content.indexOf("<interpolateValue>bar</interpolateValue>") > 0);
            reader.close();
            reader = null;
        } finally {
            IOUtil.close(reader);
        }
    }
}
