package org.eclipse.jdt.ui.tests.refactoring;

import java.util.ArrayList;
import java.util.List;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.JavaModelException;

import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
import org.eclipse.jdt.internal.corext.refactoring.reorg.MoveRefactoring;
import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;

public class MultiMoveTests extends RefactoringTest {

	private static final Class clazz= MultiMoveTests.class;
	private static final String REFACTORING_PATH= "MultiMove/";

	public MultiMoveTests(String name) {
		super(name);
	}

	public static Test suite() {
		return new MySetup(new TestSuite(clazz));
	}

	protected String getRefactoringPath() {
		return REFACTORING_PATH;
	}

	//---
	private IPackageFragment createPackage(String name) throws Exception{
		return getRoot().createPackageFragment(name, true, null);
	}
	
	private ICompilationUnit createCu(IPackageFragment pack, String cuPath, String cuName) throws Exception{
		return createCU(pack, cuName, getFileContents(getRefactoringPath() + cuPath));
	}
	
	private void delete(IPackageFragment pack) throws Exception {
		performDummySearch();
		try {
			if (pack.exists())
				pack.delete(true, null);
		} catch(JavaModelException e) {
			//ignore
		}
	}
	
	
	//--------
	public void test0() throws Exception{		
		final String p1Name= "p1";
		final String inDir= "/in/";
		final String outDir= "/out/";
		
		IPackageFragment packP1= createPackage(p1Name);
		ICompilationUnit p1A= createCu(packP1, getName() + inDir + p1Name + "/A.java", "A.java");
		ICompilationUnit p1B= createCu(packP1, getName() + inDir + p1Name + "/B.java", "B.java");
		
		String p2Name= "p2";
		IPackageFragment packP2= createPackage(p2Name);
		ICompilationUnit p2C= createCu(packP2, getName() + inDir + p2Name + "/C.java", "C.java");
		
		List elems= new ArrayList();
		elems.add(p1A);
		elems.add(p1B);
		MoveRefactoring ref= new MoveRefactoring(elems, JavaPreferencesSettings.getCodeGenerationSettings());
		ref.setDestination(packP2);
		ref.setUpdateReferences(true);
		RefactoringStatus status= performRefactoring(ref);
		
		//-- checks
		assertEquals("status should be ok here", null, status);		
		
		assertEquals("p1 files", 0, packP1.getChildren().length);
		assertEquals("p2 files", 3, packP2.getChildren().length);

		String expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p2Name + "/A.java");
		assertEquals("incorrect update of A", expectedSource, packP2.getCompilationUnit("A.java").getSource());		
		
		expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p2Name + "/B.java");
		assertEquals("incorrect update of B", expectedSource, packP2.getCompilationUnit("B.java").getSource());
		
		expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p2Name + "/C.java");
		assertEquals("incorrect update of C", expectedSource ,p2C.getSource());
		
		delete(packP1);
		delete(packP2);
	}

	
	public void test1() throws Exception{		
		final String p1Name= "p1";
		final String p3Name= "p3";
		final String inDir= "/in/";
		final String outDir= "/out/";
		
		IPackageFragment packP1= createPackage(p1Name);
		IPackageFragment packP3= createPackage(p3Name);
		ICompilationUnit p1A= createCu(packP1, getName() + inDir + p1Name + "/A.java", "A.java");
		ICompilationUnit p3B= createCu(packP3, getName() + inDir + p3Name + "/B.java", "B.java");
		
		String p2Name= "p2";
		IPackageFragment packP2= createPackage(p2Name);
		ICompilationUnit p2C= createCu(packP2, getName() + inDir + p2Name + "/C.java", "C.java");
		
		List elems= new ArrayList();
		elems.add(p1A);
		elems.add(p3B);
		MoveRefactoring ref= new MoveRefactoring(elems, JavaPreferencesSettings.getCodeGenerationSettings());
		ref.setDestination(packP2);
		ref.setUpdateReferences(true);
		RefactoringStatus status= performRefactoring(ref);
		
		//-- checks
		assertEquals("status should be ok here", null, status);		
		
		assertEquals("p1 files", 0, packP1.getChildren().length);
		assertEquals("p2 files", 3, packP2.getChildren().length);
		assertEquals("p1 files", 0, packP3.getChildren().length);
				
		String expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p2Name + "/A.java");
		assertEquals("incorrect update of A", expectedSource, packP2.getCompilationUnit("A.java").getSource());
		
		expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p2Name + "/B.java");
		assertEquals("incorrect update of B", expectedSource, packP2.getCompilationUnit("B.java").getSource());
		
		expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p2Name + "/C.java");
		assertEquals("incorrect update of C", expectedSource ,p2C.getSource());
		
		delete(packP1);
		delete(packP2);
		delete(packP3);
	}
	
	public void test2() throws Exception{
		final String p1Name= "p1";
		final String inDir= "/in/";
		final String outDir= "/out/";
		
		IPackageFragment packP1= createPackage(p1Name);
		ICompilationUnit p1A= createCu(packP1, getName() + inDir + p1Name + "/A.java", "A.java");
		createCu(packP1, getName() + inDir + p1Name + "/B.java", "B.java");
		
		String p2Name= "p2";
		IPackageFragment packP2= createPackage(p2Name);
		ICompilationUnit p2C= createCu(packP2, getName() + inDir + p2Name + "/C.java", "C.java");
		
		List elems= new ArrayList();
		elems.add(p1A);
		MoveRefactoring ref= new MoveRefactoring(elems, JavaPreferencesSettings.getCodeGenerationSettings());
		ref.setDestination(packP2);
		ref.setUpdateReferences(true);
		RefactoringStatus status= performRefactoring(ref);
		
		//-- checks
		assertEquals("status should be ok here", null, status);		
		
		assertEquals("p1 files", 1, packP1.getChildren().length);
		assertEquals("p2 files", 2, packP2.getChildren().length);

		String expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p2Name + "/A.java");
		assertEquals("incorrect update of A", expectedSource, packP2.getCompilationUnit("A.java").getSource());		
		
		expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p1Name + "/B.java");
		assertEquals("incorrect update of B", expectedSource, packP1.getCompilationUnit("B.java").getSource());
		
		expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p2Name + "/C.java");
		assertEquals("incorrect update of C", expectedSource, p2C.getSource());
		
		delete(packP1);
		delete(packP2);
	}

	public void test3() throws Exception{		
		final String p1Name= "p1";
		final String p3Name= "p3";
		final String inDir= "/in/";
		final String outDir= "/out/";
		
		IPackageFragment packP1= createPackage(p1Name);
		IPackageFragment packP3= createPackage(p3Name);
		ICompilationUnit p1A= createCu(packP1, getName() + inDir + p1Name + "/Outer.java", "Outer.java");
		createCu(packP3, getName() + inDir + p3Name + "/Test.java", "Test.java");
		
		String p2Name= "p2";
		IPackageFragment packP2= createPackage(p2Name);
		
		List elems= new ArrayList();
		elems.add(p1A);
		MoveRefactoring ref= new MoveRefactoring(elems, JavaPreferencesSettings.getCodeGenerationSettings());
		ref.setDestination(packP2);
		ref.setUpdateReferences(true);
		RefactoringStatus status= performRefactoring(ref);
		
		//-- checks
		assertEquals("status should be ok here", null, status);		
		
		assertEquals("p1 files", 0, packP1.getChildren().length);
		assertEquals("p2 files", 1, packP2.getChildren().length);
		assertEquals("p1 files", 1, packP3.getChildren().length);
				
		String expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p2Name + "/Outer.java");
		assertEquals("incorrect update of Outer", expectedSource, packP2.getCompilationUnit("Outer.java").getSource());
		
		expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p3Name + "/Test.java");
		assertEquals("incorrect update of Test", expectedSource, packP3.getCompilationUnit("Test.java").getSource());
		
		delete(packP1);
		delete(packP2);
		delete(packP3);
	}
}

