package org.apache.maven.it;

import java.io.File;
import java.util.Properties;

import org.apache.maven.it.util.ResourceExtractor;

public class MavenITmng5774ConfigurationProcessorsTest
    extends AbstractMavenIntegrationTestCase
{
    public MavenITmng5774ConfigurationProcessorsTest()
    {
        super( "(3.2.5,)" );
    }

    public void testBehaviourWhereThereIsOneUserSuppliedConfigurationProcessor()
        throws Exception
    {
        File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/mng-5774-configuration-processors" );

        Verifier verifier = newVerifier( testDir.getAbsolutePath() );
        verifier.filterFile( "settings-template.xml", "settings.xml", "UTF-8", verifier.newDefaultFilterProperties() );

        verifier = newVerifier( new File( testDir, "build-with-one-processor-valid" ).getAbsolutePath() );
        verifier.deleteDirectory( "target" );
        verifier.deleteArtifacts( "org.apache.maven.its.it-configuration-processors" );
        verifier.getCliOptions().add( "-s" );
        verifier.getCliOptions().add( new File( testDir, "settings.xml" ).getAbsolutePath() );
        verifier.executeGoal( "process-resources" );
        verifier.verifyErrorFreeLog();
        // Making sure our configuration processor executes
        verifier.verifyTextInLog( "[INFO] ConfigurationProcessorOne.process()" );  
        // We have a property value injected by our configuration processor. Make sure it's correct
        verifier.assertFilePresent( "target/classes/result.properties" );
        Properties result = verifier.loadProperties( "target/classes/result.properties" );
        assertEquals( "yes", result.getProperty( "configurationProcessorContributedValue" ) );
        verifier.resetStreams();
    }

    public void testBehaviourWhereThereAreTwoUserSuppliedConfigurationProcessor()
        throws Exception
    {
        File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/mng-5774-configuration-processors" );

        Verifier verifier = newVerifier( testDir.getAbsolutePath() );
        verifier.filterFile( "settings-template.xml", "settings.xml", "UTF-8", verifier.newDefaultFilterProperties() );

        verifier = newVerifier( new File( testDir, "build-with-two-processors-invalid" ).getAbsolutePath() );
        verifier.deleteDirectory( "target" );
        verifier.deleteArtifacts( "org.apache.maven.its.it-configuration-processors" );
        verifier.getCliOptions().add( "-s" );
        verifier.getCliOptions().add( new File( testDir, "settings.xml" ).getAbsolutePath() );
        try
        {
            verifier.executeGoal( "process-resources" );
            fail( "We expected this invocation to fail because of too many user supplied configuration processors being present" );
        }
        catch ( VerificationException e )
        {
            verifier.verifyTextInLog( "There can only be one user supplied ConfigurationProcessor" );
        }
        verifier.resetStreams();
    }
}
