/*******************************************************************************
 * 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.reorg;
import java.io.IOException;

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

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

import org.eclipse.jdt.ui.tests.refactoring.MySetup;
import org.eclipse.jdt.ui.tests.refactoring.RefactoringTest;

public class DeleteSourceReferenceActionTests extends RefactoringTest{

	private static final Class clazz= DeleteSourceReferenceActionTests.class;
	private static final String REFACTORING_PATH= "DeleteSourceReference/";
	
	public DeleteSourceReferenceActionTests(String name) {
		super(name);
	}
	
	public static Test suite() {
		return new MySetup(new TestSuite(clazz));
	}
	
	protected String getRefactoringPath() {
		return REFACTORING_PATH;
	}

	private ICompilationUnit fCuA;
	private ICompilationUnit fNewCuA;
	private static final String CU_NAME= "A";
		
	protected void setUp() throws Exception{
		super.setUp();
		
		fCuA= createCUfromTestFile(getPackageP(), CU_NAME);
		assertTrue("A.java does not exist", fCuA.exists());
	}
	
	protected void tearDown() throws Exception{
		super.tearDown();
		if (fNewCuA != null && fNewCuA.exists())
			fNewCuA.delete(false, null);		
		if (fCuA != null && fCuA.exists())
			fCuA.delete(false, null);		
	}

	private void check() throws IOException, JavaModelException {
		fNewCuA= getPackageP().getCompilationUnit(CU_NAME + ".java");
		assertTrue("A.java does not exist", fNewCuA.exists());
		assertEquals("incorrect content of A.java", getFileContents(getOutputTestFileName(CU_NAME)), fNewCuA.getSource());	
	}
		
	public void test0() throws Exception{
		printTestDisabledMessage("bug#15305 incorrect deletion of fields (multi-declaration case)");
//		printTestDisabledMessage("test for bug#8405 Delete field action broken for multiple declarations");
		if (true)
			return;
		Object elem0= fCuA.getType("A").getField("i");
		Object[] elems= new Object[]{elem0};
		SourceReferenceTestUtil.delete(elems);
		check();
	}

	public void test1() throws Exception{
		Object elem0= fCuA.getType("A");
		Object[] elems= new Object[]{elem0};
		SourceReferenceTestUtil.delete(elems);
		check();
	}
	
	public void test2() throws Exception{
		Object elem0= fCuA.getType("A").getField("i");
		Object[] elems= new Object[]{elem0};
		SourceReferenceTestUtil.delete(elems);
		check();
	}

	public void test3() throws Exception{
		printTestDisabledMessage("bug#15305 incorrect deletion of fields (multi-declaration case)");
//		printTestDisabledMessage("test for bug#8405 Delete field action broken for multiple declarations");		
		if (true)
			return;
		Object elem0= fCuA.getType("A").getField("i");
		Object elem1= fCuA.getType("A").getField("j");
		Object[] elems= new Object[]{elem0, elem1};
		SourceReferenceTestUtil.delete(elems);
		check();
	}

	public void test4() throws Exception{
		printTestDisabledMessage("bug#15305 incorrect deletion of fields (multi-declaration case)");
//		printTestDisabledMessage("test for bug#8405 Delete field action broken for multiple declarations");		
		if (true)
			return;
		Object elem0= fCuA.getType("A").getField("i");
		Object elem1= fCuA.getType("A").getField("k");
		Object[] elems= new Object[]{elem0, elem1};
		SourceReferenceTestUtil.delete(elems);
		check();
	}

	public void test5() throws Exception{
		printTestDisabledMessage("bug#15305 incorrect deletion of fields (multi-declaration case)");
//		printTestDisabledMessage("test for bug#8405 Delete field action broken for multiple declarations");		
		if (true)
			return;
		Object elem0= fCuA.getType("A").getField("j");
		Object[] elems= new Object[]{elem0};
		SourceReferenceTestUtil.delete(elems);
		check();
	}

	public void test6() throws Exception{
//		printTestDisabledMessage("test for bug#8405 Delete field action broken for multiple declarations");		
		printTestDisabledMessage("test for bug#9382 IField::delete incorrect on multiple field declarations with initializers");		
		if (true)
			return;
		Object elem0= fCuA.getType("A").getField("j");
		Object[] elems= new Object[]{elem0};
		SourceReferenceTestUtil.delete(elems);
		check();
	}

	public void test7() throws Exception{
		//exposes bug#9381 IPackageDeclaration is not ISourceManipulation 
		Object elem0= fCuA.getPackageDeclaration("p");
		Object[] elems= new Object[]{elem0};
		SourceReferenceTestUtil.delete(elems);
		check();
	}
	
	public void test8() throws Exception{
		Object elem0= fCuA.getType("A").getMethod("m", new String[0]);
		Object[] elems= new Object[]{elem0};
		SourceReferenceTestUtil.delete(elems);
		check();
	}

	public void test9() throws Exception{
		Object elem0= fCuA.getType("A").getInitializer(1);
		Object[] elems= new Object[]{elem0};
		SourceReferenceTestUtil.delete(elems);
		check();
	}

	public void test10() throws Exception{
		Object elem0= fCuA.getType("A").getInitializer(1);
		Object[] elems= new Object[]{elem0};
		SourceReferenceTestUtil.delete(elems);
		check();
	}

	public void test11() throws Exception{
		Object elem0= fCuA.getImport("java.util.List");
		Object[] elems= new Object[]{elem0};
		SourceReferenceTestUtil.delete(elems);
		check();
	}

	public void test12() throws Exception{
		Object elem0= fCuA.getType("A").getType("B");
		Object[] elems= new Object[]{elem0};
		SourceReferenceTestUtil.delete(elems);
		check();
	}
	
	public void test13() throws Exception{
		Object elem0= fCuA.getType("A").getType("B");
		Object elem1= fCuA.getType("A");
		Object[] elems= new Object[]{elem0, elem1};
		SourceReferenceTestUtil.delete(elems);
		check();
	}

	public void test14() throws Exception{
		Object elem0= fCuA.getType("A").getType("B");
		Object elem1= fCuA.getType("A");
		Object elem2= fCuA.getPackageDeclaration("p");
		Object[] elems= new Object[]{elem0, elem1, elem2};
		SourceReferenceTestUtil.delete(elems);
		check();
	}

	public void test15() throws Exception{
		Object elem0= fCuA.getType("A").getField("field");
		Object[] elems= new Object[]{elem0};
		SourceReferenceTestUtil.delete(elems);
		check();
	}

	public void test16() throws Exception{
//		printTestDisabledMessage("test for bug#15412 deleting type removes too much from editor");		
//		if (true)
//			return;
		
		Object elem0= fCuA.getType("Test");
		Object[] elems= new Object[]{elem0};
		SourceReferenceTestUtil.delete(elems);
		check();
	}

	public void test17() throws Exception{
//		printTestDisabledMessage("test for bug#15936 delete methods deletes too much (indent messing)");		
//		if (true)
//			return;
		
		Object elem0= fCuA.getType("A").getMethod("f", new String[0]);
		Object[] elems= new Object[]{elem0};
		SourceReferenceTestUtil.delete(elems);
		check();
	}

	public void test18() throws Exception{
//		printTestDisabledMessage("test for bug#16314");		
//		if (true)
//			return;
		
		Object elem0= fCuA.getType("A").getMethod("fs", new String[0]);
		Object[] elems= new Object[]{elem0};
		SourceReferenceTestUtil.delete(elems);
		check();
	}
	
}
