/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * IBM Corporation - initial API and implementation
 * yyyymmdd bug      Email and other contact information
 * -------- -------- -----------------------------------------------------------
 * 20071024   196997 pmoogk@ca.ibm.com - Peter Moogk
 *******************************************************************************/
package org.eclipse.wst.ws.service.policy.test;

import java.util.List;
import java.util.Set;
import java.util.Vector;

import junit.framework.TestCase;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.wst.ws.service.policy.IDescriptor;
import org.eclipse.wst.ws.service.policy.IFilter;
import org.eclipse.wst.ws.service.policy.IServicePolicy;
import org.eclipse.wst.ws.service.policy.ServicePolicyPlatform;
import org.eclipse.wst.ws.service.policy.ui.IPolicyOperation;
import org.eclipse.wst.ws.service.policy.ui.IQuickFixAction;
import org.eclipse.wst.ws.service.policy.ui.IQuickFixActionInfo;
import org.eclipse.wst.ws.service.policy.ui.ServicePolicyPlatformUI;
import org.eclipse.wst.ws.service.policy.ui.utils.ActivityUtils;

public class MainUITester extends TestCase
{  
   
   public void testExtensions()
   {
     ServicePolicyPlatformUI platformUI   = ServicePolicyPlatformUI.getInstance();
     List<IPolicyOperation>  operations   = platformUI.getAllOperations();
     
     for( IPolicyOperation operation : operations )
     {
       displayOperation( operation );
     }  
   }
   
   public void testOperationCache()
   {
     ServicePolicyPlatform   platform   = ServicePolicyPlatform.getInstance();
     ServicePolicyPlatformUI platformUI = ServicePolicyPlatformUI.getInstance();
     IServicePolicy          id1        = platform.getServicePolicy( "id1" ); //$NON-NLS-1$
     IServicePolicy          id2        = platform.getServicePolicy( "id2" ); //$NON-NLS-1$
     IServicePolicy          id3        = platform.getServicePolicy( "id3" ); //$NON-NLS-1$
     IServicePolicy          id4        = platform.getServicePolicy( "id4" ); //$NON-NLS-1$
     //IServicePolicy          id_bool1   = platform.getServicePolicy( "id_boolean1" );
//     /IServicePolicy          id_bool2   = platform.getServicePolicy( "id_boolean2" );
     List<IServicePolicy>    list1      = new Vector<IServicePolicy>();
     List<IServicePolicy>    list2      = new Vector<IServicePolicy>();
     List<IServicePolicy>    list3      = new Vector<IServicePolicy>();
     List<IServicePolicy>    list4      = new Vector<IServicePolicy>();
     List<IServicePolicy>    list5      = new Vector<IServicePolicy>();
     List<IServicePolicy>    list6      = new Vector<IServicePolicy>();
     List<IServicePolicy>    list7      = new Vector<IServicePolicy>();
     IPolicyOperation        op1        = platformUI.getOperation( "service.ui.operation1" ); //$NON-NLS-1$
     IPolicyOperation        op2        = platformUI.getOperation( "service.ui.operation2" ); //$NON-NLS-1$
     IPolicyOperation        op3        = platformUI.getOperation( "service.ui.operation3" ); //$NON-NLS-1$
     IPolicyOperation        op4        = platformUI.getOperation( "service.ui.operation4" ); //$NON-NLS-1$
  
     list1.add( id1 );
     list2.add( id2 );
     list3.add( id3 );
     list4.add( id4 );
     list5.add( id4 );
     list5.add( id1 );
     list6.add( id2 );
     list6.add( id3 );
     list7.add( id1 );
     list7.add( id2 );
     list7.add( id3 );
     list7.add( id4 );
    
     Set<IPolicyOperation> set1 = platformUI.getSelectedOperations( list1, true );
     Set<IPolicyOperation> set2 = platformUI.getSelectedOperations( list2, true );
     Set<IPolicyOperation> set3 = platformUI.getSelectedOperations( list3, true );
     Set<IPolicyOperation> set4 = platformUI.getSelectedOperations( list4, true );
     Set<IPolicyOperation> set5 = platformUI.getSelectedOperations( list5, true );
     Set<IPolicyOperation> set6 = platformUI.getSelectedOperations( list6, true );
     Set<IPolicyOperation> set7 = platformUI.getSelectedOperations( list7, true );
     
     System.out.println( "\nDisplay sets" ); //$NON-NLS-1$
     displaySet( "Set1", set1 ); //$NON-NLS-1$
     displaySet( "Set2", set2 ); //$NON-NLS-1$
     displaySet( "Set3", set3 ); //$NON-NLS-1$
     displaySet( "Set4", set4 ); //$NON-NLS-1$
     displaySet( "Set5", set5 ); //$NON-NLS-1$
     displaySet( "Set6", set6 ); //$NON-NLS-1$
     displaySet( "Set7", set7 ); //$NON-NLS-1$
     
     checkContents( "Set1", set1, new IPolicyOperation[]{ op2, op4 } ); //$NON-NLS-1$
     checkContents( "Set2", set2, new IPolicyOperation[]{ op1, op2, op4 } ); //$NON-NLS-1$
     checkContents( "Set3", set3, new IPolicyOperation[]{ op1, op2, op4 } ); //$NON-NLS-1$
     checkContents( "Set4", set4, new IPolicyOperation[]{ op2, op3 } ); //$NON-NLS-1$
     checkContents( "Set5", set5, new IPolicyOperation[]{ op2, op3, op4 } ); //$NON-NLS-1$
     checkContents( "Set6", set6, new IPolicyOperation[]{ op1, op2, op4 } ); //$NON-NLS-1$
     checkContents( "Set7", set7, new IPolicyOperation[]{ op1, op2, op3, op4 } ); //$NON-NLS-1$
   }
   
   public void testEnabledOperations()
   {
     ServicePolicyPlatform   platform    = ServicePolicyPlatform.getInstance();
     ServicePolicyPlatformUI platformUI  = ServicePolicyPlatformUI.getInstance();
     IServicePolicy          id1         = platform.getServicePolicy( "id1" ); //$NON-NLS-1$
     IServicePolicy          id2         = platform.getServicePolicy( "id2" ); //$NON-NLS-1$
     IServicePolicy          id3         = platform.getServicePolicy( "id3" ); //$NON-NLS-1$
     IServicePolicy          id4         = platform.getServicePolicy( "id4" ); //$NON-NLS-1$
     List<IServicePolicy>    policyList1 = new Vector<IServicePolicy>();
     List<IServicePolicy>    policyList2 = new Vector<IServicePolicy>();
     IPolicyOperation        op1         = platformUI.getOperation( "service.ui.operation3" ); //$NON-NLS-1$
     
     policyList1.add( id1 );
     policyList1.add( id2 );
     policyList1.add( id3 );
     policyList1.add( id4 );
     policyList2.add( id4 );
     
     assertTrue( "Expected operation to not be enabled", !op1.isEnabled( policyList1 ) ); //$NON-NLS-1$
     assertTrue( "Expected operation to be enabled", op1.isEnabled( policyList2 ) ); //$NON-NLS-1$
   }
   
   public void testQuickFixActions()
   {
     ServicePolicyPlatform      platform    = ServicePolicyPlatform.getInstance();
     ServicePolicyPlatformUI    platformUI  = ServicePolicyPlatformUI.getInstance();
     IServicePolicy             id1         = platform.getServicePolicy( "id1" ); //$NON-NLS-1$
     IStatus                    status1     = new Status( IStatus.ERROR, "org.eclipse.wst.ws.service.policy.test", 1, "some error", null ); //$NON-NLS-1$ //$NON-NLS-2$
     IStatus                    status2     = new Status( IStatus.ERROR, "org.eclipse.wst.ws.service.policy.test", 2, "some error", null ); //$NON-NLS-1$ //$NON-NLS-2$
     List<IQuickFixActionInfo>  fixList1    = platformUI.getQuickFixes( status1 );
     List<IQuickFixActionInfo>  fixList2    = platformUI.getQuickFixes( status2 );
     
     assertTrue( "Expecting two quick fixes", fixList1.size() == 2 ); //$NON-NLS-1$
     assertTrue( "Expection one quick fix", fixList2.size() == 1 ); //$NON-NLS-1$
     
     for( IQuickFixActionInfo actionInfo : fixList1 )
     {
       IQuickFixAction action = actionInfo.getAction();
       id1.setStatus( status1 );
       
       assertTrue( "Status is not OK", !id1.getStatus().isOK() ); //$NON-NLS-1$
       action.action( id1 );
       assertTrue( "Status is Ok ", id1.getStatus().isOK() ); //$NON-NLS-1$
     }
     
     for( IQuickFixActionInfo actionInfo : fixList2 )
     {
       IQuickFixAction action = actionInfo.getAction();
       id1.setStatus( status2 );
       
       assertTrue( "Status is not OK", !id1.getStatus().isOK() ); //$NON-NLS-1$
       action.action( id1 );
       assertTrue( "Status is Ok ", id1.getStatus().isOK() ); //$NON-NLS-1$
     }
   }
   
   public void testActivitiesFilter()
   {
     IFilter                    activitiesFilter = ActivityUtils.getCurrentActivitiesFilter();
     ServicePolicyPlatform      platform         = ServicePolicyPlatform.getInstance();
     List<IServicePolicy>       policyList       = platform.getRootServicePolicies( activitiesFilter );
         
     displayPolicies( policyList );
   }
   
   private void displayPolicies( List<IServicePolicy> policyList )
   {
     System.out.println( "Listing service policies:" );
     for( IServicePolicy policy : policyList )
     {
       System.out.println( "  " + policy.getId() );
     }
   }
   
   private void displaySet( String setName, Set<IPolicyOperation> operationSet )
   {
     System.out.print( setName + ": " ); //$NON-NLS-1$
     
     for( IPolicyOperation operation : operationSet )
     {
       System.out.print( operation.getId() + "," ); //$NON-NLS-1$
     }
     
     System.out.println( "" ); //$NON-NLS-1$
   }
   
   private void checkContents( String setName, Set<IPolicyOperation> operationSet, IPolicyOperation[] operationArray )
   {
     assertTrue( "Set and array sizes don't match for " + setName + ".", operationSet.size() == operationArray.length ); //$NON-NLS-1$ //$NON-NLS-2$

     for( IPolicyOperation operation : operationArray )
     {
       assertTrue( setName + " does not contain operation " + operation.getId() + ".", operationSet.contains( operation ) ); //$NON-NLS-1$ //$NON-NLS-2$
     }
   }
   
   private void displayOperation( IPolicyOperation operation )
   {
     List<IServicePolicy> zeroPolicies = new Vector<IServicePolicy>();
     List<IServicePolicy> manyPolicies = ServicePolicyPlatform.getInstance().getRootServicePolicies( null );
     IDescriptor           descriptor   = operation.getDescriptor();
     String               shortName    = descriptor.getShortName();
     String               longName     = descriptor.getLongName();
     
     System.out.println( "Operation id: " + operation.getId() ); //$NON-NLS-1$
     System.out.println( "          short name: " + shortName ); //$NON-NLS-1$
     System.out.println( "          long name: " + longName ); //$NON-NLS-1$
     System.out.println( "          pattern: " + operation.getPolicyIdPattern() ); //$NON-NLS-1$
     System.out.println( "          isEnabled zero: " + operation.isEnabled( zeroPolicies ) ); //$NON-NLS-1$
     System.out.println( "          isEnabled many: " + operation.isEnabled( manyPolicies ) ); //$NON-NLS-1$
     
     switch( operation.getOperationKind() )
     {
       case selection:
       {
         System.out.println( "          selection: true" ); //$NON-NLS-1$
         break;  
       }
       
       case iconSelection:
       {
         System.out.println( "          selection icon: true" ); //$NON-NLS-1$
         break;  
       }
       
       case enumeration:
       {      
         System.out.println( "          enumeration id: " + operation.getEnumerationId() ); //$NON-NLS-1$
         break;  
       }
       
       case complex:
       {
         System.out.println( "          complex: true" );  //$NON-NLS-1$
         operation.launchOperation( zeroPolicies );
         break;  
       }
     }
   }
}
