/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.ui.tests.refactoring;

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

import org.eclipse.core.runtime.NullProgressMonitor;

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

import org.eclipse.jdt.ui.tests.refactoring.infra.TestExceptionHandler;

import org.eclipse.jdt.internal.corext.refactoring.base.ChangeContext;
import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
import org.eclipse.jdt.internal.corext.refactoring.rename.RenameMethodProcessor;
import org.eclipse.jdt.internal.corext.refactoring.rename.RenameRefactoring;

public class RenamePrivateMethodTests extends RefactoringTest {
	
	private static final Class clazz= RenamePrivateMethodTests.class;
	private static final String REFACTORING_PATH= "RenamePrivateMethod/";

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

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

	protected String getRefactoringPath() {
		return REFACTORING_PATH;
	}

	private void helper1_0(String methodName, String newMethodName, String[] signatures) throws Exception{
		IType classA= getType(createCUfromTestFile(getPackageP(), "A"), "A");
		RenameRefactoring refactoring= new RenameRefactoring(classA.getMethod(methodName, signatures));
		refactoring.setNewName(newMethodName);
		RefactoringStatus result= performRefactoring(refactoring);
		assertNotNull("precondition was supposed to fail", result);
	}
	
	private void helper1() throws Exception{
		helper1_0("m", "k", new String[0]);
	}
	
	private void helper2_0(String methodName, String newMethodName, String[] signatures, boolean updateReferences) throws Exception{
		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
		IType classA= getType(cu, "A");
		RenameRefactoring refactoring= new RenameRefactoring(classA.getMethod(methodName, signatures));
		RenameMethodProcessor processor= (RenameMethodProcessor)refactoring.getProcessor();
		processor.setUpdateReferences(updateReferences);
		processor.setNewElementName(newMethodName);
		assertEquals("was supposed to pass", null, performRefactoring(refactoring));
		assertEqualLines("invalid renaming", getFileContents(getOutputTestFileName("A")), cu.getSource());
		
		assertTrue("anythingToUndo", Refactoring.getUndoManager().anythingToUndo());
		assertTrue("! anythingToRedo", !Refactoring.getUndoManager().anythingToRedo());
		//assertEquals("1 to undo", 1, Refactoring.getUndoManager().getRefactoringLog().size());
		
		Refactoring.getUndoManager().performUndo(new ChangeContext(new TestExceptionHandler()), new NullProgressMonitor());
		assertEqualLines("invalid undo", getFileContents(getInputTestFileName("A")), cu.getSource());

		assertTrue("! anythingToUndo", !Refactoring.getUndoManager().anythingToUndo());
		assertTrue("anythingToRedo", Refactoring.getUndoManager().anythingToRedo());
		//assertEquals("1 to redo", 1, Refactoring.getUndoManager().getRedoStack().size());
		
		Refactoring.getUndoManager().performRedo(new ChangeContext(new TestExceptionHandler()), new NullProgressMonitor());
		assertEqualLines("invalid redo", getFileContents(getOutputTestFileName("A")), cu.getSource());
	}
	
	private void helper2_0(String methodName, String newMethodName, String[] signatures) throws Exception{
		helper2_0(methodName, newMethodName, signatures, true);
	}
	
	private void helper2(boolean updateReferences) throws Exception{
		helper2_0("m", "k", new String[0], updateReferences);
	}
	
	private void helper2() throws Exception{
		helper2(true);
	}

	/******* tests ******************/
	public void testFail0() throws Exception{
		helper1();
	}
	
	public void testFail1() throws Exception{
		helper1();
	}
	
	public void testFail2() throws Exception{
		helper1();
	}
	
	//testFail3 deleted
	
	//testFail4 deleted
	
	public void testFail5() throws Exception{
		helper1();
	}
	
	public void test0() throws Exception{
		helper2();
	}	
	
	public void test10() throws Exception{
		helper2();
	}	

	public void test11() throws Exception{
		helper2();
	}	

	public void test12() throws Exception{
		helper2();
	}	

	public void test13() throws Exception{
		helper2();
	}	
	
	public void test14() throws Exception{
		helper2();
	}	

	public void test15() throws Exception{
		helper2_0("m", "k", new String[]{"I"});
	}	

	public void test16() throws Exception{
		helper2_0("m", "fred", new String[]{"I"});
	}	

	public void test17() throws Exception{
		helper2_0("m", "kk", new String[]{"I"});
	}	

	public void test18() throws Exception{
		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
		ICompilationUnit cuC= createCUfromTestFile(getPackageP(), "C");
		
		IType classB= getType(cu, "B");
		RenameRefactoring refactoring= new RenameRefactoring(classB.getMethod("m", new String[]{"I"}));
		refactoring.setNewName("kk");
		
		assertEquals("was supposed to pass", null, performRefactoring(refactoring));
		assertEqualLines("invalid renaming A", getFileContents(getOutputTestFileName("A")), cu.getSource());
		assertEqualLines("invalid renaming C", getFileContents(getOutputTestFileName("C")), cuC.getSource());
		
	}

	public void test2() throws Exception{
		helper2_0("m", "fred", new String[0]);
	}	

	public void test20() throws Exception{
		helper2_0("m", "fred", new String[]{"I"});
	}	

	public void test23() throws Exception{
		helper2_0("m", "k", new String[0]);
	}			

	public void test24() throws Exception{
		helper2_0("m", "k", new String[]{"QString;"});
	}	
	
	public void test25() throws Exception{
		helper2_0("m", "k", new String[]{"[QString;"});
	}
	
	public void test26() throws Exception{
		helper2_0("m", "k", new String[0]);
	}
	
	public void test27() throws Exception{
		helper2_0("m", "k", new String[0], false);
	}

	public void testAnon0() throws Exception{
		helper2();
	}			
}
