/**********************************************************************
 * This file is part of "Object Teams Development Tooling"-Software
 *
 * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
 * for its Fraunhofer Institute and Computer Architecture and Software
 * Technology (FIRST), Berlin, Germany and Technical University Berlin,
 * Germany.
 *
 * 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
 * $Id$
 *
 * Please visit http://www.eclipse.org/objectteams for updates and contact.
 *
 * Contributors:
 * 	  Fraunhofer FIRST - Initial API and implementation
 * 	  Technical University Berlin - Initial API and implementation
 **********************************************************************/
package org.eclipse.objectteams.otdt.ui.tests.refactoring.reorg;

import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IImportDeclaration;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ui.tests.refactoring.infra.MockClipboard;
import org.eclipse.jdt.ui.tests.refactoring.infra.MockWorkbenchSite;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.widgets.Display;
import org.eclipse.objectteams.otdt.core.IMethodMapping;
import org.eclipse.objectteams.otdt.core.IRoleType;
import org.eclipse.objectteams.otdt.core.OTModelManager;
import org.eclipse.objectteams.otdt.ui.tests.refactoring.MySetup;
import org.eclipse.objectteams.otdt.ui.tests.refactoring.RefactoringTest;
import org.eclipse.jdt.internal.ui.refactoring.reorg.CopyToClipboardAction;
import org.eclipse.jdt.internal.ui.refactoring.reorg.PasteAction;


public class OTPasteActionTest extends RefactoringTest
{

	private Clipboard _clipboard;
	private IPackageFragment	_packageQ;
	private static final String REFACTORING_PATH= "Paste/";

	public OTPasteActionTest(String name) {
		super(name);
	}

	public static Test suite() {
		return new MySetup(new TestSuite(OTPasteActionTest.class));
	}

	protected String getRefactoringPath() {
		return REFACTORING_PATH;
	}

	protected void setUp() throws Exception {
		super.setUp();
		_clipboard= new MockClipboard(Display.getDefault());
		_packageQ = MySetup.getDefaultSourceFolder().createPackageFragment("q", true, null);
	}

	protected void tearDown() throws Exception
	{
		if (_packageQ.exists())
        {
            _packageQ.delete(true, null);
        }
		_clipboard.dispose();
		super.tearDown();
	}

	private static Object[] merge(Object[] array1, Object[] array2) {
		Set elements= new HashSet(array1.length + array2.length);
		elements.addAll(Arrays.asList(array1));
		elements.addAll(Arrays.asList(array2));
		return elements.toArray();
	}

	private PasteAction verifyEnabled(IResource[] copySelectedResources, IJavaElement[] copySelectedJavaElements, IResource[] pasteSelectedResources, IJavaElement[] pasteSelectedJavaElements) throws JavaModelException {
		PasteAction pasteAction= new PasteAction(new MockWorkbenchSite(merge(pasteSelectedResources, pasteSelectedJavaElements)), _clipboard);
		CopyToClipboardAction copyToClipboardAction= new CopyToClipboardAction(new MockWorkbenchSite(merge(copySelectedResources, copySelectedJavaElements)), _clipboard);
		copyToClipboardAction.setAutoRepeatOnFailure(true);
		copyToClipboardAction.update(copyToClipboardAction.getSelection());
		assertTrue("copy not enabled", copyToClipboardAction.isEnabled());
		copyToClipboardAction.run();

		pasteAction.update(pasteAction.getSelection());
		assertTrue("paste should be enabled", pasteAction.isEnabled());
		return pasteAction;
	}

	private void compareContents(String cuName) throws JavaModelException, IOException {
		assertEqualLines(cuName, getFileContents(getOutputTestFileName(cuName)), getPackageP().getCompilationUnit(cuName + ".java").getSource());
	}

	private void delete(ICompilationUnit cu) throws Exception {
		try {
			performDummySearch();
			cu.delete(true, new NullProgressMonitor());
		} catch (JavaModelException e) {
			e.printStackTrace();
			//ingore and keep going
		}
	}

	public void testPasteTeamclassIntoTeamclass() throws Exception
	{
		ICompilationUnit cuTSource = createCUfromTestFile(getPackageP(),
			"TSource");
		ICompilationUnit cuTDest = createCUfromTestFile(getPackageP(),
			"TDest");

		try
		{
			IType teamTSource = cuTSource.getType("TSource");
			IType teamTDest = cuTDest.getType("TDest");

			assertTrue("TSource does not exist", teamTSource.exists());
			assertTrue("TDest does not exist", teamTDest.exists());

			IJavaElement[] copyJavaElements = { teamTSource };
			IResource[] copyResources = {};
			IJavaElement[] pasteJavaElements = { teamTDest };
			IResource[] pasteResources = {};
			PasteAction paste = verifyEnabled(copyResources,
					copyJavaElements, pasteResources, pasteJavaElements);
			paste.run((IStructuredSelection)paste.getSelection());

			compareContents("TSource");
			compareContents("TDest");
		}
		finally
		{
			delete(cuTSource);
		}
	}

	public void testPasteNestedTeamclass() throws Exception
	{
		ICompilationUnit cuTSource = createCUfromTestFile(getPackageP(),
				"TSource");
		ICompilationUnit cuTDest = createCUfromTestFile(getPackageP(), "TDest");

		try
		{
			IType teamTDest_TN = cuTSource.getType("TSource").getType("TN");
			IType teamTDest = cuTDest.getType("TDest");

			assertTrue("TSource.TN does not exist", teamTDest_TN.exists());
			assertTrue("TDest does not exist", teamTDest.exists());

			IJavaElement[] copyJavaElements = { teamTDest_TN };
			IResource[] copyResources = {};
			IJavaElement[] pasteJavaElements = { teamTDest };
			IResource[] pasteResources = {};
			PasteAction paste = verifyEnabled(copyResources,
					copyJavaElements, pasteResources, pasteJavaElements);
			paste.run((IStructuredSelection)paste.getSelection());
			compareContents("TSource");
			compareContents("TDest");
		}
		finally
		{
			delete(cuTSource);
			delete(cuTDest);
		}
	}

	public void testPasteRoleclass() throws Exception
	{
		ICompilationUnit cuTSource = createCUfromTestFile(getPackageP(),
				"TSource");
		ICompilationUnit cuTDest = createCUfromTestFile(getPackageP(), "TDest");

		try
		{
			IType roleR = cuTSource.getType("TSource").getType("R");
			IType teamTDest = cuTDest.getType("TDest");

			assertTrue("R does not exist", roleR.exists());
			assertTrue("TDest does not exist", teamTDest.exists());

			IJavaElement[] copyJavaElements = { roleR };
			IResource[] copyResources = {};
			IJavaElement[] pasteJavaElements = { teamTDest };
			IResource[] pasteResources = {};
			PasteAction paste = verifyEnabled(copyResources,
					copyJavaElements, pasteResources, pasteJavaElements);
			paste.run((IStructuredSelection)paste.getSelection());
			compareContents("TSource");
			compareContents("TDest");
		}
		finally
		{
			delete(cuTSource);
			delete(cuTDest);
		}
	}

	public void testPasteCalloutMapping() throws Exception
	{
		ICompilationUnit cuTSource= createCUfromTestFile(getPackageP(), "TSource");
		ICompilationUnit cuTDest= createCUfromTestFile(getPackageP(), "TDest");

		try
		{
			IRoleType roleSrc = (IRoleType)OTModelManager.getOTElement(cuTSource.getType("TSource").getType("R"));
			IMethodMapping calloutMapping = roleSrc.getMethodMappings()[0];
			IType roleTDest_R = cuTDest.getType("TDest").getType("R");

			assertTrue("callout does not exist", calloutMapping.exists());
			assertTrue("R does not exist", roleTDest_R.exists());

			IJavaElement[] copyJavaElements= {calloutMapping};
			IResource[] copyResources= {};
			IJavaElement[] pasteJavaElements= {roleTDest_R};
			IResource[] pasteResources= {};
			PasteAction paste= verifyEnabled(copyResources, copyJavaElements, pasteResources, pasteJavaElements);
			paste.run((IStructuredSelection)paste.getSelection());
			compareContents("TSource");
			compareContents("TDest");
		}
		finally
		{
			delete(cuTSource);
			delete(cuTDest);
		}
	}

	public void testPasteCalloutMappingParam() throws Exception
	{
		ICompilationUnit cuTSource= createCUfromTestFile(getPackageP(), "TSource");
		ICompilationUnit cuTDest= createCUfromTestFile(getPackageP(), "TDest");

		try
		{
			IRoleType roleSrc = (IRoleType)OTModelManager.getOTElement(cuTSource.getType("TSource").getType("R"));
			IMethodMapping calloutMapping = roleSrc.getMethodMappings()[0];
			IType roleTDest_R = cuTDest.getType("TDest").getType("R");

			assertTrue("callout does not exist", calloutMapping.exists());
			assertTrue("R does not exist", roleTDest_R.exists());

			IJavaElement[] copyJavaElements= {calloutMapping};
			IResource[] copyResources= {};
			IJavaElement[] pasteJavaElements= {roleTDest_R};
			IResource[] pasteResources= {};
			PasteAction paste= verifyEnabled(copyResources, copyJavaElements, pasteResources, pasteJavaElements);
			paste.run((IStructuredSelection)paste.getSelection());
			compareContents("TSource");
			compareContents("TDest");
		}
		finally
		{
			delete(cuTSource);
			delete(cuTDest);
		}
	}

	public void testPasteCallinMappingParam() throws Exception
	{
		ICompilationUnit cuTSource= createCUfromTestFile(getPackageP(), "TSource");
		ICompilationUnit cuTDest= createCUfromTestFile(getPackageP(), "TDest");

		try
		{
			IRoleType roleSrc = (IRoleType)OTModelManager.getOTElement(cuTSource.getType("TSource").getType("R"));
			IMethodMapping calloutMapping = roleSrc.getMethodMappings()[0];
			IType roleTDest_R = cuTDest.getType("TDest").getType("R");

			assertTrue("callout does not exist", calloutMapping.exists());
			assertTrue("R does not exist", roleTDest_R.exists());

			IJavaElement[] copyJavaElements= {calloutMapping};
			IResource[] copyResources= {};
			IJavaElement[] pasteJavaElements= {roleTDest_R};
			IResource[] pasteResources= {};
			PasteAction paste= verifyEnabled(copyResources, copyJavaElements, pasteResources, pasteJavaElements);
			paste.run((IStructuredSelection)paste.getSelection());
			compareContents("TSource");
			compareContents("TDest");
		}
		finally
		{
			delete(cuTSource);
			delete(cuTDest);
		}
	}

	public void testPasteCalloutToFieldMapping() throws Exception
	{
		ICompilationUnit cuTSource = createCUfromTestFile(getPackageP(),
				"TSource");
		ICompilationUnit cuTDest = createCUfromTestFile(getPackageP(), "TDest");

		try
		{
			IRoleType roleSrc = (IRoleType)OTModelManager
					.getOTElement(cuTSource.getType("TSource").getType("R"));
			IMethodMapping calloutToFieldMapping = roleSrc.getMethodMappings()[0];
			IType roleTDest_R = cuTDest.getType("TDest").getType("R");

			assertTrue("callout does not exist", calloutToFieldMapping.exists());
			assertTrue("R does not exist", roleTDest_R.exists());

			IJavaElement[] copyJavaElements = { calloutToFieldMapping };
			IResource[] copyResources = {};
			IJavaElement[] pasteJavaElements = { roleTDest_R };
			IResource[] pasteResources = {};
			PasteAction paste = verifyEnabled(copyResources,
					copyJavaElements, pasteResources, pasteJavaElements);
			paste.run((IStructuredSelection)paste.getSelection());
			compareContents("TSource");
			compareContents("TDest");
		}
		finally
		{
			delete(cuTSource);
			delete(cuTDest);
		}
	}

	public void testPasteCallinMapping() throws Exception
	{
		ICompilationUnit cuTSource = createCUfromTestFile(getPackageP(),
				"TSource");
		ICompilationUnit cuTDest = createCUfromTestFile(getPackageP(), "TDest");

		try
		{
			IRoleType roleSrc = (IRoleType)OTModelManager
					.getOTElement(cuTSource.getType("TSource").getType("R"));
			IMethodMapping callinMapping = roleSrc.getMethodMappings()[0];
			IType roleTDest_R = cuTDest.getType("TDest").getType("R");

			assertTrue("callout does not exist", callinMapping.exists());
			assertTrue("R does not exist", roleTDest_R.exists());

			IJavaElement[] copyJavaElements = { callinMapping };
			IResource[] copyResources = {};
			IJavaElement[] pasteJavaElements = { roleTDest_R };
			IResource[] pasteResources = {};
			PasteAction paste = verifyEnabled(copyResources,
					copyJavaElements, pasteResources, pasteJavaElements);
			paste.run((IStructuredSelection)paste.getSelection());
			compareContents("TSource");
			compareContents("TDest");
		}
		finally
		{
			delete(cuTSource);
			delete(cuTDest);
		}
	}

}
