package org.codehaus.plexus.component.repository;

/*
 * Copyright 2001-2006 Codehaus Foundation.
 *
 * Licensed 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 junit.framework.TestCase;
import org.codehaus.plexus.component.repository.io.PlexusTools;
import org.codehaus.plexus.classworlds.ClassWorld;
import org.codehaus.plexus.classworlds.realm.ClassRealm;

import java.util.List;

/**
 *
 *
 * @author Jason van Zyl
 *
 * @version $Id$
 */
public class ComponentSetTest
    extends TestCase
{
    public void testSimpleComponentResolution()
        throws Exception
    {
        String xml =
            "<component-set>" +
            "  <components>" +
            "    <component>" +
            "      <implementation>java.lang.String</implementation>" +
            "      <role>c1</role>" +
            "      <role-hint>role-hint</role-hint>" +
            "      <component-profile>component-profile</component-profile>" +
            "      <requirements>" +
            "        <requirement>" +
            "          <role>c2</role>" +
            "        </requirement>" +
            "        <requirement>" +
            "          <role>c3</role>" +
            "        </requirement>" +
            "      </requirements>" +
            "    </component>" +
            "  </components>" +
            "  <dependencies>" +
            "    <dependency>" +
            "      <group-id>plexus</group-id>" +
            "      <artifact-id>wedgy</artifact-id>" +
            "      <version>1.0</version>" +
            "    </dependency>" +
            "  </dependencies>" +
            "</component-set>";

        ClassWorld classWorld = new ClassWorld( "test", Thread.currentThread().getContextClassLoader() );
        ClassRealm realm = classWorld.getRealm( "test" );

        ComponentSetDescriptor cs = PlexusTools.buildComponentSet( PlexusTools.buildConfiguration( xml ), realm );

        ComponentDescriptor<?> c1 = cs.getComponents().get( 0 );

        assertEquals( "c1", c1.getRole() );

        assertEquals( "role-hint", c1.getRoleHint() );

        assertEquals( "component-profile", c1.getComponentProfile() );

        List<ComponentRequirement> requirements = c1.getRequirements();

        assertEquals( 2, requirements.size() );

        boolean containsC2 = false;

        boolean containsC3 = false;

        for ( ComponentRequirement requirement : requirements )
        {
            if ( requirement.getRole().equals( "c2" ) )
            {
                containsC2 = true;
            }
            else if ( requirement.getRole().equals( "c3" ) )
            {
                containsC3 = true;
            }

        }

        assertTrue( containsC2 );

        assertTrue( containsC3 );

        ComponentDependency d1 = cs.getDependencies().get( 0 );

        assertEquals( "plexus", d1.getGroupId() );

        assertEquals( "wedgy", d1.getArtifactId() );

        assertEquals( "1.0", d1.getVersion() );
    }
}
