/*
 * 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.it;

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

import java.io.File;
import java.util.List;

/**
 * This is a test set for <a href="https://issues.apache.org/jira/browse/MNG-2720">MNG-2720</a>.
 * 
 * This test will ensure that running the 'package' phase on a multimodule build with child
 * interdependency will result in one child using the JAR of the other child in its compile
 * classpath, NOT the target/classes directory. This is critical, since sibling projects might
 * use literally ANY artifact produced by another module project, and limiting to target/classes
 * and target/test-classes eliminates many of the options that would be possible if the dependent
 * sibling were built on its own.
 *
 * @author jdcasey
 * 
 */
public class MavenITmng2720SiblingClasspathArtifactsTest
    extends AbstractMavenIntegrationTestCase
{

    public MavenITmng2720SiblingClasspathArtifactsTest()
    {
        super( "[2.1.0,)" );
    }

    public void testIT()
        throws Exception
    {
        File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/mng-2720" );

        Verifier verifier = newVerifier( testDir.getAbsolutePath() );
        verifier.setAutoclean( false );
        verifier.deleteDirectory( "child2/target" );
        verifier.deleteDirectory( "child3/target" );
        verifier.executeGoal( "initialize" );
        verifier.verifyErrorFreeLog();
        verifier.resetStreams();
        
        List<String> classPath;

        classPath = verifier.loadLines( "child2/target/compile.txt", "UTF-8" );
        assertMainJar( classPath );

        classPath = verifier.loadLines( "child2/target/runtime.txt", "UTF-8" );
        assertMainJar( classPath );

        classPath = verifier.loadLines( "child2/target/test.txt", "UTF-8" );
        assertMainJar( classPath );
        
        classPath = verifier.loadLines( "child3/target/compile.txt", "UTF-8" );
        assertTestJar( classPath );

        classPath = verifier.loadLines( "child3/target/runtime.txt", "UTF-8" );
        assertTestJar( classPath );

        classPath = verifier.loadLines( "child3/target/test.txt", "UTF-8" );
        assertTestJar( classPath );
    }

    private void assertMainJar( List<String> classPath )
    {
        assertTrue( classPath.toString(), classPath.contains( "main.jar" ) );
        assertFalse( classPath.toString(), classPath.contains( "main" ) );
        assertFalse( classPath.toString(), classPath.contains( "test.jar" ) );
        assertFalse( classPath.toString(), classPath.contains( "test" ) );
    }

    private void assertTestJar( List<String> classPath )
    {
        assertFalse( classPath.toString(), classPath.contains( "main.jar" ) );
        assertFalse( classPath.toString(), classPath.contains( "main" ) );
        assertTrue( classPath.toString(), classPath.contains( "test.jar" ) );
        assertFalse( classPath.toString(), classPath.contains( "test" ) );
    }

}
