/******************************************************************************
 * Copyright (c) 2005-2007 BEA Systems, Inc.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *    Konstantin Komissarchik
 ******************************************************************************/

package org.eclipse.wst.common.project.facet.core.tests;

import static java.util.Arrays.asList;
import static org.eclipse.wst.common.project.facet.core.tests.support.TestUtils.asSet;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

import org.eclipse.wst.common.project.facet.core.IProjectFacet;
import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
import org.eclipse.wst.common.project.facet.core.IFacetedProject.Action;

/**
 * @author <a href="mailto:kosta@bea.com">Konstantin Komissarchik</a>
 */

@SuppressWarnings( "unused" )
public class FacetActionSortTests

    extends TestCase
    
{
    private static IProjectFacet f1;
    private static IProjectFacetVersion f1v10;
    private static IProjectFacetVersion f1v12;
    private static IProjectFacetVersion f1v121;
    private static IProjectFacetVersion f1v13;
    private static IProjectFacetVersion f1v20;
    
    private static IProjectFacet f2;
    private static IProjectFacetVersion f2v35;
    private static IProjectFacetVersion f2v35a;
    private static IProjectFacetVersion f2v47;
    private static IProjectFacetVersion f2v47b;
    private static IProjectFacetVersion f2v47c;
    
    private static IProjectFacet f2ext;
    private static IProjectFacetVersion f2extv10;

    private static IProjectFacet f3a;
    private static IProjectFacetVersion f3av10;
    private static IProjectFacetVersion f3av20;

    private static IProjectFacet f3b;
    private static IProjectFacetVersion f3bv10;
    private static IProjectFacetVersion f3bv20;

    private static IProjectFacet f3c;
    private static IProjectFacetVersion f3cv10;
    private static IProjectFacetVersion f3cv20;

    static
    {
        try
        {
            f1 = ProjectFacetsManager.getProjectFacet( "facet1" );
            f1v10 = f1.getVersion( "1.0" );
            f1v12 = f1.getVersion( "1.2" );
            f1v121 = f1.getVersion( "1.2.1" );
            f1v13 = f1.getVersion( "1.3" );
            f1v20 = f1.getVersion( "2.0" );
            
            f2 = ProjectFacetsManager.getProjectFacet( "facet2" );
            f2v35 = f2.getVersion( "3.5" );
            f2v35a = f2.getVersion( "3.5#a" );
            f2v47 = f2.getVersion( "4.7" );
            f2v47b = f2.getVersion( "4.7#b" );
            f2v47c = f2.getVersion( "4.7#c" );
            
            f2ext = ProjectFacetsManager.getProjectFacet( "facet2ext" );
            f2extv10 = f2ext.getVersion( "1.0" );

            f3a = ProjectFacetsManager.getProjectFacet( "facet3a" );
            f3av10 = f3a.getVersion( "1.0" );
            f3av20 = f3a.getVersion( "2.0" );

            f3b = ProjectFacetsManager.getProjectFacet( "facet3b" );
            f3bv10 = f3b.getVersion( "1.0" );
            f3bv20 = f3b.getVersion( "2.0" );

            f3c = ProjectFacetsManager.getProjectFacet( "facet3c" );
            f3cv10 = f3c.getVersion( "1.0" );
            f3cv20 = f3c.getVersion( "2.0" );
        }
        catch( Exception e )
        {
            // Ignore failures. This api is tested explicitly.
        }
    }
    
    private FacetActionSortTests( final String name )
    {
        super( name );
    }
    
    public static Test suite()
    {
        final TestSuite suite = new TestSuite();
        
        suite.setName( "Facet Action Sort Tests" );

        suite.addTest( new FacetActionSortTests( "testUninstallComesFirst1" ) );
        suite.addTest( new FacetActionSortTests( "testUninstallComesFirst2" ) );
        suite.addTest( new FacetActionSortTests( "testSortStability1" ) );
        suite.addTest( new FacetActionSortTests( "testSortStability2" ) );
        
        return suite;
    }
    
    /**
     * Tests whether the sort places uninstall actions first. This is the 
     * control test case. The input already places uninstall first.
     */
    
    public void testUninstallComesFirst1()
    {
        final Action a1 = new Action( Action.Type.INSTALL, f1v12, null );
        final Action a2 = new Action( Action.Type.UNINSTALL, f3av10, null );
        
        final List<Action> actions = new ArrayList<Action>();
        
        actions.add( a2 );
        actions.add( a1 );
        
        ProjectFacetsManager.sort( asSet( f3av10 ), actions );
        assertEquals( actions, asList( a2, a1 ) );
    }
    
    /**
     * Tests whether the sort places uninstall actions first. The test case 
     * places an install action in front of the uninstall action and checks
     * whether the sort algorithm reverses the order. 
     */
    
    public void testUninstallComesFirst2()
    {
        final Action a1 = new Action( Action.Type.INSTALL, f1v12, null );
        final Action a2 = new Action( Action.Type.UNINSTALL, f3av10, null );
        
        final List<Action> actions = new ArrayList<Action>();
        
        actions.add( a1 );
        actions.add( a2 );
        
        ProjectFacetsManager.sort( asSet( f3av10 ), actions );
        assertEquals( actions, asList( a2, a1 ) );
    }

    /**
     * Tests whether the sort produces "stable" results given unrelated facets.
     * This is the control test case. The input is already in the correct order. 
     */
    
    @SuppressWarnings( "unchecked" )
    public void testSortStability1()
    {
        final Action a1 = new Action( Action.Type.INSTALL, f1v12, null );
        final Action a2 = new Action( Action.Type.INSTALL, f3av10, null );
        
        final List<Action> actions = new ArrayList<Action>();
        
        actions.add( a1 );
        actions.add( a2 );
        
        ProjectFacetsManager.sort( Collections.EMPTY_SET, actions );
        assertEquals( actions, asList( a1, a2 ) );
    }

    /**
     * Tests whether the sort produces "stable" results given unrelated facets.
     * The input facets are in the reverse order.
     */
    
    @SuppressWarnings( "unchecked" )
    public void testSortStability2()
    {
        final Action a1 = new Action( Action.Type.INSTALL, f1v12, null );
        final Action a2 = new Action( Action.Type.INSTALL, f3av10, null );
        
        final List<Action> actions = new ArrayList<Action>();
        
        actions.add( a2 );
        actions.add( a1 );
        
        ProjectFacetsManager.sort( Collections.EMPTY_SET, actions );
        assertEquals( actions, asList( a1, a2 ) );
    }
    
}
