/******************************************************************************
 * Copyright (c) 2011, EBM WebSourcing
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     EBM WebSourcing - initial API and implementation
 *******************************************************************************/

package org.eclipse.bpel.ui.wizards;

import java.net.URL;

import org.eclipse.bpel.validator.Builder;
import org.eclipse.bpel.validator.model.IProblem;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
//import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
//import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
//import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
//import org.eclipse.swtbot.swt.finder.widgets.SWTBotMenu;
//import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
import org.junit.After;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;

/**
 * A set of tests for the BPEL creation wizard.
 * @author Vincent Zurczak - EBM WebSourcing
 * 
 * June 04.2020 - ralph.soika@imixs.com 
 * deactivated UI front-end test because of outdated test scenarios. Need to be fixed in the future.
 * 
 */
//@RunWith(SWTBotJunit4ClassRunner.class)
public class NewBpelFileWizardTest {

	private static final String BPEL_DIR = "bpelContent";
	private static final String BPEL_NAME = "myProcess";
	private static final String PROJECT_NAME = "BpelTest";
	private static final String BPEL_FILE_NAME = BPEL_NAME + ".bpel";

	//private static SWTWorkbenchBot bot = new SWTWorkbenchBot();
	private final Builder bpelBuilder = new Builder();


	/**
	 * Deletes the created project (and will thus close the BPEL editor).
	 * @throws Exception
	 */
	/*
	@After
	public void afterTest() throws Exception {

		// Close a previous wizard whose test failed?
		try {
			bot.button( "Cancel" ).click();
		} catch( Exception e ) {
			// nothing
		}

		// Delete the project
		final IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject( PROJECT_NAME );
		if( ! project.exists())
			return;

		project.delete( true, null );
		bot.waitUntil( new DefaultCondition() {

			@Override
			public boolean test() throws Exception {
				return ! project.exists();
			}

			@Override
			public String getFailureMessage() {
				return "The project could not be deleted.";
			}
		});
	}
*/

	/**
	 * Prepares the work.
	 * @throws Exception
	 */
//	@BeforeClass
//	public static void beforeClass() throws Exception {
//
//		// Close the welcome page
//		try {
//			bot.viewByTitle( "Welcome" ).close();
//		} catch( Exception e ) {
//			// nothing
//		}
//
//		// Disable auto-build
//		// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=260010
//		SWTBotMenu menu = null;
//		String ba = "Build Automatically";
//		try {
//			menu = bot.menu( "Project" ).menu( ba );
//		} catch( Exception e ) {
//			// nothing
//		}
//
//		if( menu == null ) {
//			try {
//				menu = bot.menu( "Project", 1 ).menu( ba );
//			} catch( Exception e2 ) {
//				// nothing
//			}
//		}
//
//		if( menu == null ) {
//			try {
//				menu = bot.menu( ba );
//			} catch( Exception e ) {
//				// nothing
//			}
//		}
//
//		if( menu != null && menu.isChecked())
//			menu.click();
//	}
//
//
//	/**
//	 * Tests the creation of a BPEL from a template.
//	 * <p>
//	 * The process is created in the "bpelContent" directory of a BPEL project.
//	 * Empty process.
//	 * </p>
//	 *
//	 * @throws Exception
//	 */
//	@Test
//	public void testTemplateInBpelDirectoryEmpty() throws Exception {
//		testTemplate( 1, false, 1, true, true );
//	}
//
//
//	/**
//	 * Tests the creation of a BPEL from a template.
//	 * <p>
//	 * The process is created in the "bpelContent" directory of a BPEL project.
//	 * Synchronous process.
//	 * </p>
//	 *
//	 * @throws Exception
//	 */
//	@Test
//	public void testTemplateInBpelDirectorySynchronous() throws Exception {
//		testTemplate( 2, false, 0, true, true );
//	}
//
//
//	/**
//	 * Tests the creation of a BPEL from a template.
//	 * <p>
//	 * The process is created in the "bpelContent" directory of a BPEL project.
//	 * Asynchronous process.
//	 * </p>
//	 *
//	 * @throws Exception
//	 */
//	@Test
//	public void testTemplateInBpelDirectoryAsynchronous() throws Exception {
//		testTemplate( 0, false, 0, true, true );
//	}
//
//
//	/**
//	 * Tests the creation of a BPEL from a template.
//	 * <p>
//	 * The process is created in the "bpelContent" directory of a BPEL project.
//	 * Empty process.
//	 * </p>
//	 *
//	 * @throws Exception
//	 */
//	@Test
//	public void testTemplateInBpelProjectEmpty() throws Exception {
//		testTemplate( 1, false, 1, true, false );
//	}
//
//
//	/**
//	 * Tests the creation of a BPEL from a template.
//	 * <p>
//	 * The process is created in the "bpelContent" directory of a BPEL project.
//	 * Synchronous process.
//	 * </p>
//	 *
//	 * @throws Exception
//	 */
//	@Test
//	public void testTemplateInBpelProjectSynchronous() throws Exception {
//		testTemplate( 2, false, 0, true, false );
//	}
//
//
//	/**
//	 * Tests the creation of a BPEL from a template.
//	 * <p>
//	 * The process is created in the "bpelContent" directory of a BPEL project.
//	 * Asynchronous process.
//	 * </p>
//	 *
//	 * @throws Exception
//	 */
//	@Test
//	public void testTemplateInBpelProjectAsynchronous() throws Exception {
//		testTemplate( 0, false, 0, true, false );
//	}
//
//
//	/**
//	 * Tests the creation of a BPEL from a template.
//	 * <p>
//	 * The process is created in the "bpelContent" directory of a BPEL project.
//	 * Empty process.
//	 * </p>
//	 *
//	 * @throws Exception
//	 */
//	@Test
//	public void testTemplateInNonBpelProjectEmpty() throws Exception {
//		testTemplate( 1, false, 1, false, false );
//	}
//
//
//	/**
//	 * Tests the creation of a BPEL from a template.
//	 * <p>
//	 * The process is created in the "bpelContent" directory of a BPEL project.
//	 * Synchronous process.
//	 * </p>
//	 *
//	 * @throws Exception
//	 */
//	@Test
//	public void testTemplateInNonBpelProjectSynchronous() throws Exception {
//		testTemplate( 2, false, 0, false, false );
//	}
//
//
//	/**
//	 * Tests the creation of a BPEL from a template.
//	 * <p>
//	 * The process is created in the "bpelContent" directory of a BPEL project.
//	 * Asynchronous process.
//	 * </p>
//	 *
//	 * @throws Exception
//	 */
//	@Test
//	public void testTemplateInNonBpelProjectAsynchronous() throws Exception {
//		testTemplate( 0, false, 0, false, false );
//	}
//
//
//	/**
//	 * Tests the creation of an abstract BPEL from a template.
//	 * <p>
//	 * The process is created at the root of a BPEL project.
//	 * Empty process.
//	 * </p>
//	 *
//	 * @throws Exception
//	 */
//	@Test
//	public void testAbstractTemplateEmpty() throws Exception {
//		testTemplate( 1, true, 1, true, false );
//	}
//
//
//	/**
//	 *Tests the creation of an abstract BPEL from a template.
//	 * <p>
//	 * The process is created at the root of a BPEL project.
//	 * Synchronous process.
//	 * </p>
//	 *
//	 * @throws Exception
//	 */
//	@Test
//	public void  testAbstractTemplateSynchronous() throws Exception {
//		testTemplate( 2, true, 1, true, false );
//	}
//
//
//	/**
//	 * Tests the creation of an abstract BPEL from a template.
//	 * <p>
//	 * The process is created at the root of a BPEL project.
//	 * Asynchronous process.
//	 * </p>
//	 *
//	 * @throws Exception
//	 */
//	@Test
//	public void  testAbstractTemplateAsynchronous() throws Exception {
//		testTemplate( 0, true, 1, true, false );
//	}
//
//
//	/**
//	 * Tests the creation of a BPEL from a WSDL definition.
//	 * <p>
//	 * The WSDL is imported in the project.
//	 * The process is created in the "bpelContent" directory of a BPEL project.
//	 * The created process is NOT abstract.
//	 * </p>
//	 *
//	 * @throws Exception
//	 */
//	@Test
//	public void testWsdlWithImportTux() throws Exception {
//		testWsdlFirst( "test1/tuxDroid.wsdl", false, true, true, true, 0 );
//	}
//
//
//	/**
//	 * Tests the creation of a BPEL from a WSDL definition.
//	 * <p>
//	 * The WSDL is imported in the project.
//	 * The process is created in the "bpelContent" directory of a BPEL project.
//	 * The created process is NOT abstract.
//	 * </p>
//	 *
//	 * @throws Exception
//	 */
//	@Test
//	public void testWsdlWithImportTo() throws Exception {
//		testWsdlFirst( "test2/To.wsdl", false, true, true, true, 0 );
//	}
//
//
//	/**
//	 * Tests the creation of a BPEL from a WSDL definition.
//	 * <p>
//	 * The WSDL is NOT imported in the project.
//	 * The process is created in the "bpelContent" directory of a BPEL project.
//	 * The created process is NOT abstract.
//	 * </p>
//	 *
//	 * @throws Exception
//	 */
//	@Test
//	public void testWsdlWithoutImportTux() throws Exception {
//		testWsdlFirst( "test1/tuxDroid.wsdl", false, true, true, true, 0 );
//	}
//
//
//	/**
//	 * Tests the creation of a BPEL from a WSDL definition.
//	 * <p>
//	 * The WSDL is NOT imported in the project.
//	 * The process is created in the "bpelContent" directory of a BPEL project.
//	 * The created process is NOT abstract.
//	 * </p>
//	 *
//	 * @throws Exception
//	 */
//	@Test
//	public void testWsdlWithoutImportTo() throws Exception {
//		testWsdlFirst( "test2/To.wsdl", false, true, true, true, 0 );
//	}
//
//
//	/**
//	 * Tests the creation of a BPEL from a WSDL definition.
//	 * <p>
//	 * The WSDL is imported in the project.
//	 * The process is created in the "bpelContent" directory of a BPEL project.
//	 * The created process is abstract.
//	 * </p>
//	 *
//	 * @throws Exception
//	 */
//	@Test
//	public void testWsdlAsAbstractWithImportTux() throws Exception {
//		testWsdlFirst( "test1/tuxDroid.wsdl", true, true, true, true, 1 );
//	}
//
//
//	/**
//	 * Tests the creation of a BPEL from a WSDL definition.
//	 * <p>
//	 * The WSDL is imported in the project.
//	 * The process is created in the "bpelContent" directory of a BPEL project.
//	 * The created process is abstract.
//	 * </p>
//	 *
//	 * @throws Exception
//	 */
//	@Test
//	public void testWsdlAsAbstractWithImportTo() throws Exception {
//		testWsdlFirst( "test2/To.wsdl", true, true, true, true, 1 );
//	}
//
//
//	/**
//	 * Tests the creation of a BPEL from a WSDL.
//	 * @param wsdlFile the relative location of the WSDL file to use as input
//	 * @param isAbstract true f the created process must be abstract, false otherwise
//	 * @param importWsdl true to import the WSDL in the project, false to reference the remote one
//	 * @param createBpelProject true to create a BPEL project, false for a simple Eclipse project
//	 * @param selectBpelDir true to select the BPEL directory, false otherwise (only makes sense for a BPEL project)
//	 * @param expectedNumberOfProblems the number of problems the created process should contain
//	 * @throws Exception
//	 */
//	private void testWsdlFirst(
//			String wsdlFile, boolean isAbstract, boolean importWsdl,
//			boolean createBpelProject, boolean selectBpelDir, int expectedNumberOfProblems )
//	throws Exception {
//
//		if( createBpelProject )
//			createBpelProject();
//		else
//			createSimpleProject();
//
//		SWTBotMenu newMenu = bot.menu( "File" ).menu( "New" );
//		newMenu.menu( "BPEL Process File" ).click();
//
//		bot.comboBox().setSelection( 1 );
//		bot.text( 0 ).setText( BPEL_NAME );
//		bot.comboBox( 1 ).setText( "http://" + BPEL_NAME );
//		if( isAbstract )
//			bot.checkBox( 0 ).select();
//		bot.button( "Next >" ).click();
//
//		URL url = getClass().getResource( "/wsdls/" + wsdlFile );
//		url = FileLocator.toFileURL( url );
//
//		bot.text( 0 ).setText( url.toString());
//		bot.link( 2 ).click();
//		bot.comboBox( 0 ).setSelection( 0 );
//		if( ! importWsdl )
//			bot.checkBox( 0 ).deselect();
//		bot.button( "Next >" ).click();
//
//		completeBpelFileCreation( selectBpelDir );
//		IPath path;
//		if( selectBpelDir )
//			path = new Path( PROJECT_NAME  ).append( BPEL_DIR ).append( BPEL_FILE_NAME );
//		else
//			path = new Path( PROJECT_NAME  ).append( BPEL_FILE_NAME );
//
//		IFile bpelFile = ResourcesPlugin.getWorkspace().getRoot().getFile( path );
//		Assert.assertTrue( bpelFile.isAccessible());
//
//		IProblem[] problems = this.bpelBuilder.validate( bpelFile, null );
//		Assert.assertEquals( problems.length, expectedNumberOfProblems );
//
//		// No import => only 1 WSDL, the one for the artifacts
//		if( ! importWsdl ) {
//			int wsdlCpt = 0;
//			for( IResource r : bpelFile.getParent().members()) {
//				if( r instanceof IFile && "wsdl".equalsIgnoreCase( r.getFileExtension()))
//					wsdlCpt ++;
//			}
//
//			Assert.assertEquals( wsdlCpt, 1 );
//		}
//	}
//
//
//	/**
//	 * Tests the creation of a BPEL from a template.
//	 * @param tplId the template ID (index of the template in the associated combo)
//	 * @param isAbstract true if the created process must be abstract, false otherwise
//	 * @param expectedNumberOfProblems the number of problems the created process should contain
//	 * @param createBpelProject true to create a BPEL project, false for a simple Eclipse project
//	 * @param selectBpelDir true to select the BPEL directory, false otherwise (only makes sense for a BPEL project)
//	 * @throws Exception
//	 */
//	private void testTemplate( int tplId, boolean isAbstract, int expectedNumberOfProblems, boolean createBpelProject, boolean selectBpelDir )
//	throws Exception {
//
//		if( createBpelProject )
//			createBpelProject();
//		else
//			createSimpleProject();
//
//		bot.defaultPerspective().activate();
//		bot.menu( "File" ).menu( "New" ).menu( "Other..." ).click();
//		SWTBotShell shell = bot.shell( "New" );
//		shell.activate();
//
//		bot.tree( 0 ).setFocus();
//		bot.tree( 0 ).expandNode( "BPEL 2.0" ).select( "BPEL Process File" );
//		bot.button("Next >").click();
//
//		bot.text( 0 ).setText( BPEL_NAME );
//		bot.comboBox( 1 ).setText( "http://" + BPEL_NAME );
//		if( isAbstract )
//			bot.checkBox( 0 ).select();
//		bot.button( "Next >" ).click();
//
//		bot.comboBox( 0 ).setSelection( tplId );
//		bot.button( "Next >" ).click();
//
//		completeBpelFileCreation( selectBpelDir );
//		IPath path;
//		if( selectBpelDir )
//			path = new Path( PROJECT_NAME  ).append( BPEL_DIR ).append( BPEL_FILE_NAME );
//		else
//			path = new Path( PROJECT_NAME  ).append( BPEL_FILE_NAME );
//
//		IFile bpelFile = ResourcesPlugin.getWorkspace().getRoot().getFile( path );
//		Assert.assertTrue( bpelFile.isAccessible());
//
//		// The empty template is not valid because it does not start with an starting activity
//		IProblem[] problems = this.bpelBuilder.validate( bpelFile, null );
//		Assert.assertEquals( problems.length, expectedNumberOfProblems );
//	}
//
//
//	/**
//	 * Completes the creation of a new BPEL file.
//	 * @param selectBpelDir true to create the BPEL in the {@link #BPEL_DIR} directory, false for the root of the project
//	 * @throws Exception if the created project could not be built
//	 */
//	private void completeBpelFileCreation( boolean selectBpelDir ) throws Exception {
//
//		// Create the project
//		if( selectBpelDir )
//			bot.tree( 0 ).expandNode( PROJECT_NAME ).select( BPEL_DIR );
//		else
//			bot.tree( 0 ).select( PROJECT_NAME );
//
//		bot.button( "Finish" ).click();
//		bot.waitUntil( new DefaultCondition() {
//
//			@Override
//			public boolean test() throws Exception {
//				String title = NewBpelFileWizardTest.bot.activeEditor().getTitle();
//				return (BPEL_NAME + ".bpel").equals( title );
//			}
//
//			@Override
//			public String getFailureMessage() {
//				return "Could not wait for the BPEL Designer to be open";
//			}
//		});
//	}
//
//
//	/**
//	 * Creates a BPEL project.
//	 */
//	private void createBpelProject() {
//
//		bot.menu( "File" ).menu( "New" ).menu( "Other..." ).click();
//		SWTBotShell shell = bot.shell( "New" );
//		shell.activate();
//
//		bot.tree( 0 ).setFocus();
//		bot.tree( 0 ).expandNode( "BPEL 2.0" ).select( "BPEL Project" );
//		bot.button("Next >").click();
//
//		bot.text( 0 ).setText( PROJECT_NAME );
//		bot.button( "Next >" ).click();
//		bot.button( "Finish" ).click();
//
//		try {
//			shell = bot.shell( "Open Associated Perspective?" );
//			shell.activate();
//			bot.button( "Yes" ).click();
//
//		} catch( Exception e ) {
//			// nothing - the shell does not appear all the time
//		}
//	}
//
//
//	/**
//	 * Creates a simple project.
//	 */
//	private void createSimpleProject() {
//
//		bot.menu( "File" ).menu( "New" ).menu( "Other..." ).click();
//		SWTBotShell shell = bot.shell( "New" );
//		shell.activate();
//
//		bot.tree( 0 ).setFocus();
//		bot.tree( 0 ).expandNode( "General" ).select( "Project" );
//		bot.button("Next >").click();
//
//		bot.text( 0 ).setText( PROJECT_NAME );
//		bot.button( "Finish" ).click();
//
//		// The following code is useless - there is no default perspective for simple projects -
//		// but it makes one test work (otherwise, this test fails and there is no reason for it).
//		try {
//			shell = bot.shell( "Open Associated Perspective?" );
//			shell.activate();
//			bot.button( "Yes" ).click();
//
//		} catch( Exception e ) {
//			// nothing - the shell does not appear all the time
//		}
//	}
}
