/*******************************************************************************
 * Copyright (c) 2000, 2015 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
 *******************************************************************************/
package org.eclipse.jdt.ui.tests.refactoring;

import java.util.Iterator;
import java.util.List;

import org.eclipse.ltk.core.refactoring.Refactoring;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.participants.ProcessorBasedRefactoring;

import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IType;

import org.eclipse.jdt.internal.corext.refactoring.ParameterInfo;
import org.eclipse.jdt.internal.corext.refactoring.RefactoringAvailabilityTester;
import org.eclipse.jdt.internal.corext.refactoring.structure.ChangeSignatureProcessor;

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

public class RenameParametersTests extends RefactoringTest{

	private static final Class<RenameParametersTests> clazz= RenameParametersTests.class;
	private static final String REFACTORING_PATH= "RenameParameters/";

	public RenameParametersTests(String name){
		super(name);
	}

	@Override
	protected String getRefactoringPath() {
		return REFACTORING_PATH;
	}

	public static Test suite() {
		return new RefactoringTestSetup(new TestSuite(clazz));
	}

	private String getSimpleTestFileName(boolean canRename, boolean input){
		String fileName = "A_" + getName();
		if (canRename)
			fileName += input ? "_in": "_out";
		return fileName + ".java";
	}

	private String getTestFileName(boolean canRename, boolean input){
		String fileName= TEST_PATH_PREFIX + getRefactoringPath();
		fileName += (canRename ? "canRename/": "cannotRename/");
		return fileName + getSimpleTestFileName(canRename, input);
	}

	//------------
	protected ICompilationUnit createCUfromTestFile(IPackageFragment pack, boolean canRename, boolean input) throws Exception {
		return createCU(pack, getSimpleTestFileName(canRename, input), getFileContents(getTestFileName(canRename, input)));
	}

	private void helper1(String[] newNames, String[] signature) throws Exception{
		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true, true);
		IType classA= getType(cu, "A");
		IMethod method= classA.getMethod("m", signature);
		assertTrue("refactoring not available", RefactoringAvailabilityTester.isChangeSignatureAvailable(method));
		ChangeSignatureProcessor processor= new ChangeSignatureProcessor(method);
		Refactoring ref= new ProcessorBasedRefactoring(processor);
		//ref.setUpdateReferences(updateReferences);
		//ref.setNewParameterNames(newNames);
		//ref.setNewNames(createRenamings(method, newNames));
		modifyInfos(processor.getParameterInfos(), newNames);

		RefactoringStatus result= performRefactoring(ref);
		assertEquals("precondition was supposed to pass", null, result);

		IPackageFragment pack= (IPackageFragment)cu.getParent();
		String newCuName= getSimpleTestFileName(true, true);
		ICompilationUnit newcu= pack.getCompilationUnit(newCuName);
		assertTrue(newCuName + " does not exist", newcu.exists());
		assertEquals("invalid renaming", getFileContents(getTestFileName(true, false)).length(), newcu.getSource().length());
		assertEqualLines("invalid renaming", getFileContents(getTestFileName(true, false)), newcu.getSource());
	}

	private void helper2(String[] newNames, String[] signature) throws Exception{
		IType classA= getType(createCUfromTestFile(getPackageP(), false, false), "A");
		//DebugUtils.dump("classA" + classA);
		IMethod method= classA.getMethod("m", signature);
		assertTrue("refactoring not available", RefactoringAvailabilityTester.isChangeSignatureAvailable(method));
		ChangeSignatureProcessor processor= new ChangeSignatureProcessor(method);
		Refactoring ref= new ProcessorBasedRefactoring(processor);
		modifyInfos(processor.getParameterInfos(), newNames);

		RefactoringStatus result= performRefactoring(ref);
		assertNotNull("precondition was supposed to fail", result);
	}

	private void modifyInfos(List<ParameterInfo> list, String[] newNames) {
		int i= 0;
		for (Iterator<ParameterInfo> iter= list.iterator(); iter.hasNext(); i++) {
			ParameterInfo info= iter.next();
			info.setNewName(newNames[i]);
		}
	}


	public void test0() throws Exception{
		helper1(new String[]{"j"}, new String[]{"I"});
	}

	public void test1() throws Exception{
		helper1(new String[]{"j"}, new String[]{"I"});
	}

	public void test2() throws Exception{
		helper1(new String[]{"j", "k"}, new String[]{"I", "I"});
	}

	public void test3() throws Exception{
		helper1(new String[]{"j", "j1"}, new String[]{"I", "I"});
	}

	public void test4() throws Exception{
		helper1(new String[]{"k"}, new String[]{"QA;"});
	}

	public void test5() throws Exception{
		helper1(new String[]{"k"}, new String[]{"I"});
	}

	public void test6() throws Exception{
		helper1(new String[]{"k"}, new String[]{"I"});
	}

	public void test7() throws Exception{
		helper1(new String[]{"k"}, new String[]{"QA;"});
	}

	public void test8() throws Exception{
		helper1(new String[]{"j"}, new String[]{"I"});
	}

	public void test9() throws Exception{
		helper1(new String[]{"j"}, new String[]{"I"});
	}

	public void test10() throws Exception{
		helper1(new String[]{"j"}, new String[]{"I"});
	}

	public void test11() throws Exception{
		printTestDisabledMessage("revisit in the context of anonymous types in type hierarchies");
		// helper1(new String[]{"j"}, new String[]{"I"});
	}

	public void test12() throws Exception{
		helper1(new String[]{"j"}, new String[]{"I"});
	}

	public void test13() throws Exception{
		helper1(new String[]{"j"}, new String[]{"I"});
	}

	public void test14() throws Exception{
		helper1(new String[]{"j"}, new String[]{"QA;"});
	}

	public void test15() throws Exception{
		helper1(new String[]{"j", "i"}, new String[]{"I", "I"});
	}

	public void test16() throws Exception{
		helper1(new String[]{"j"}, new String[]{"I"});
	}

	public void test17() throws Exception{
		helper1(new String[]{"j", "i", "k"}, new String[]{"I", "I", "I"});
	}

	public void test18() throws Exception{
		helper1(new String[]{"j"}, new String[]{"QObject;"});
	}

	public void test19() throws Exception{
		helper1(new String[]{"j"}, new String[]{"QA;"});
	}

	public void test20() throws Exception{
		helper1(new String[]{"j"}, new String[]{"Qi;"});
	}

	public void test21() throws Exception{
		helper1(new String[]{"j"}, new String[]{"I"});
	}

	public void test22() throws Exception{
		helper1(new String[]{"j"}, new String[]{"I"});
	}

	public void test23() throws Exception{
		helper1(new String[]{"j", "i"}, new String[]{"I", "I"});
	}

	public void test24() throws Exception{
		helper1(new String[]{"j"}, new String[]{"I"});
	}

	public void test25() throws Exception{
		helper1(new String[]{"j"}, new String[]{"I"});
	}

	public void test26() throws Exception{
		printTestDisabledMessage("revisit in the context of anonymous types in type hierarchies");
		//helper1(new String[]{"j"}, new String[]{"I"});
	}

//removed - see testFail21
//	public void test27() throws Exception{
//		helper1(new String[]{"j"}, new String[]{"I"});
//	}

	public void test28() throws Exception{
		helper1(new String[]{"j"}, new String[]{"[I"});
	}

	public void test29() throws Exception{
		helper1(new String[]{"b"}, new String[]{"QA;"});
	}

	public void test30() throws Exception{
		helper1(new String[]{"i", "k"}, new String[]{"I", "I"});
	}

	public void test31() throws Exception{
		helper1(new String[]{"kk", "j"}, new String[]{"I", "I"});
	}

	public void test32() throws Exception{
		printTestDisabledMessage("must do - constructor params");
	}

	public void test33() throws Exception{
		printTestDisabledMessage("revisit - removed the 'no ref update' option");
//		helper1(new String[]{"b"}, new String[]{"QA;"}, false);
	}

	public void test34() throws Exception{
//		printTestDisabledMessage("regression test for bug#9001");
		helper1(new String[]{"test2"}, new String[]{"Z"});
	}

	public void test35() throws Exception{
		printTestDisabledMessage("regression test for bug#6224");
//		helper1(new String[]{"j"}, new String[]{"I"});
	}

	public void test36() throws Exception{
//		printTestDisabledMessage("regression test for bug#21163");
		helper1(new String[]{"j"}, new String[]{"I"});
	}

	// -----

	public void testFail0() throws Exception{
		printTestDisabledMessage("must fix - name collision with an instance var");
//		helper2(new String[]{"j"}, new String[]{"I"});
	}

	public void testFail1() throws Exception{
		helper2(new String[0], new String[0]);
	}

	public void testFail2() throws Exception{
		helper2(new String[]{"i", "i"}, new String[]{"I", "I"});
	}

	public void testFail3() throws Exception{
		helper2(new String[]{"i", "9"}, new String[]{"I", "I"});
	}

	public void testFail4() throws Exception{
		helper2(new String[]{"j"}, new String[]{"I"});
	}

	public void testFail5() throws Exception{
		helper2(new String[]{"j"}, new String[]{"I"});
	}

	public void testFail6() throws Exception{
		printTestDisabledMessage("must fix - name collision with an instance var");
//		helper2(new String[]{"j"}, new String[]{"I"});
	}

	public void testFail7() throws Exception{
		printTestDisabledMessage("waiting for better conflict detection story from DB");
//		helper2(new String[]{"j"}, new String[]{"I"});
	}

	public void testFail8() throws Exception{
		printTestDisabledMessage("waiting for better conflict detection story from DB");
//		helper2(new String[]{"j"}, new String[]{"I"});
	}

	public void testFail9() throws Exception{
		printTestDisabledMessage("waiting for better conflict detection story from DB");
//		helper2(new String[]{"j"}, new String[]{"I"});
	}

	public void testFail10() throws Exception{
		helper2(new String[]{"j", "j"}, new String[]{"I", "I"});
	}

	public void testFail11() throws Exception{
		helper2(new String[]{"j", "j"}, new String[]{"I", "I"});
	}

	public void testFail12() throws Exception{
		printTestDisabledMessage("waiting for better conflict detection story from DB");
		//		helper2(new String[]{"j"}, new String[]{"I"});
	}

	public void testFail13() throws Exception{
		printTestDisabledMessage("waiting for better conflict detection story from DB");
//		helper2(new String[]{"j"}, new String[]{"I"});
	}

	public void testFail14() throws Exception{
		printTestDisabledMessage("waiting for better conflict detection story from DB");
//		helper2(new String[]{"j"}, new String[]{"QA;"});
	}

	public void testFail15() throws Exception{
		helper2(new String[]{"j"}, new String[]{"I"});
	}

	public void testFail16() throws Exception{
		helper2(new String[]{"j"}, new String[]{"I"});
	}

	public void testFail17() throws Exception{
		helper2(new String[]{"j"}, new String[]{"I"});
	}

	public void testFail18() throws Exception{
		helper2(new String[]{"j"}, new String[]{"I"});
	}

	public void testFail19() throws Exception{
		printTestDisabledMessage("waiting for better conflict detection story from DB");
//		helper2(new String[]{"j"}, new String[]{"I"});
	}

	public void testFail20() throws Exception{
		printTestDisabledMessage("waiting for better conflict detection story from DB");
//		helper2(new String[]{"j"}, new String[]{"I"});
	}

	public void testFail21() throws Exception{
		printTestDisabledMessage("Disabled since 1.4 compliance level doesn't produce error message");
		// helper2(new String[]{"j"}, new String[]{"I"});
	}

}
