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();
    }
}
