/*******************************************************************************
 * Copyright (c) 2000, 2008 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 junit.framework.Test;
import junit.framework.TestSuite;

import org.eclipse.jdt.testplugin.JavaProjectHelper;

import org.eclipse.core.runtime.Path;

import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.participants.RenameArguments;
import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring;

import org.eclipse.jdt.core.IAccessRule;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.refactoring.IJavaRefactorings;
import org.eclipse.jdt.core.refactoring.descriptors.RenameJavaElementDescriptor;

import org.eclipse.jdt.internal.core.refactoring.descriptors.RefactoringSignatureDescriptorFactory;

public class RenameJavaProjectTests extends RefactoringTest {

	private static final Class<RenameJavaProjectTests> clazz= RenameJavaProjectTests.class;

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

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

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		fIsPreDeltaTest= true;
	}

	public void test0() throws Exception {
		IJavaProject p1= null;
		IJavaProject referencing1= null;
		IJavaProject referencing2= null;
		try {
			ParticipantTesting.reset();
			String newProjectName= "newName";
			p1= JavaProjectHelper.createJavaProject("p1", "bin");
			referencing1= JavaProjectHelper.createJavaProject("p2", "bin");
			referencing2= JavaProjectHelper.createJavaProject("p3", "bin");

			JavaProjectHelper.addRTJar(referencing1);
			JavaProjectHelper.addRequiredProject(referencing1, p1);
			JavaProjectHelper.addSourceContainer(referencing1, "src");

			JavaProjectHelper.addRTJar(referencing2);
			JavaProjectHelper.addRequiredProject(referencing2, p1);
			JavaProjectHelper.addSourceContainer(referencing2, "src");

			JavaProjectHelper.addRTJar(p1);

			ParticipantTesting.reset();
			String[] handles= ParticipantTesting.createHandles(p1, p1.getResource());

			RenameJavaElementDescriptor descriptor= RefactoringSignatureDescriptorFactory.createRenameJavaElementDescriptor(IJavaRefactorings.RENAME_JAVA_PROJECT);
			descriptor.setJavaElement(p1);
			descriptor.setUpdateReferences(true);
			descriptor.setNewName(newProjectName);

			RenameRefactoring ref= (RenameRefactoring) createRefactoring(descriptor);
			assertTrue(ref.isApplicable());

			RefactoringStatus result= performRefactoring(ref);

			assertEquals("not expected to fail", null, result);
			assertTrue("p1 is gone", !p1.exists());

			ParticipantTesting.testRename(handles,
				new RenameArguments[] {
					new RenameArguments(newProjectName, true),
					new RenameArguments(newProjectName, true)});

			p1= referencing1.getJavaModel().getJavaProject(newProjectName);
			assertTrue("p1 exists", p1.exists());

			//check entries in  referencing1
			IClasspathEntry[] entries= referencing1.getRawClasspath();
			assertEquals("expected entries", 3, entries.length);
			for (int i= 0; i < entries.length; i++) {
				IClasspathEntry iClassPathEntry= entries[i];
				if (i == 1) {
					assertEquals("expected entry name", p1.getProject().getFullPath(), iClassPathEntry.getPath());
					assertEquals("expected entry kind", IClasspathEntry.CPE_PROJECT, iClassPathEntry.getEntryKind());
				}
			}

			//check entries in  referencing2
			entries= referencing2.getRawClasspath();
			assertEquals("expected entries", 3, entries.length);
			for (int i= 0; i < entries.length; i++) {
				IClasspathEntry iClassPathEntry= entries[i];
				if (i == 1) {
					assertEquals("expected entry name", p1.getProject().getFullPath(), iClassPathEntry.getPath());
					assertEquals("expected entry kind", IClasspathEntry.CPE_PROJECT, iClassPathEntry.getEntryKind());
				}
			}

		} finally {
			performDummySearch();

			if (referencing1 != null && referencing1.exists())
				JavaProjectHelper.removeSourceContainer(referencing1, "src");
			if (referencing2 != null && referencing2.exists())
				JavaProjectHelper.removeSourceContainer(referencing2, "src");

			if (p1 != null && p1.exists())
				JavaProjectHelper.delete(p1);
			if (referencing1 != null && referencing1.exists())
				JavaProjectHelper.delete(referencing1);
			if (referencing2 != null && referencing2.exists())
				JavaProjectHelper.delete(referencing2);
		}
	}

	public void test1() throws Exception {
		IJavaProject p1= null;
		IJavaProject referencing1= null;
		IJavaProject referencing2= null;
		try {
			ParticipantTesting.reset();
			String newProjectName= "newName";
			p1= JavaProjectHelper.createJavaProject("p1", "bin");
			referencing1= JavaProjectHelper.createJavaProject("p2", "bin");
			referencing2= JavaProjectHelper.createJavaProject("p3", "bin");

			JavaProjectHelper.addRTJar(referencing1);
			IClasspathEntry cpe1= JavaCore.newProjectEntry(p1.getProject().getFullPath(), true);
			JavaProjectHelper.addToClasspath(referencing1, cpe1);
			JavaProjectHelper.addSourceContainer(referencing1, "src");

			JavaProjectHelper.addRTJar(referencing2);
			IAccessRule[] accessRules2= new IAccessRule[] {
					JavaCore.newAccessRule(new Path("accessible"), IAccessRule.K_ACCESSIBLE)
			};
			IClasspathAttribute[] extraAttributes2= new IClasspathAttribute[] {
				JavaCore.newClasspathAttribute("myTestAttribute", "val")
			};
			IClasspathEntry cpe2= JavaCore.newProjectEntry(p1.getProject().getFullPath(), accessRules2, true, extraAttributes2, false);
			JavaProjectHelper.addToClasspath(referencing2, cpe2);
			JavaProjectHelper.addSourceContainer(referencing2, "src");

			JavaProjectHelper.addRTJar(p1);

			ParticipantTesting.reset();
			String[] handles= ParticipantTesting.createHandles(p1, p1.getResource());

			RenameJavaElementDescriptor descriptor= RefactoringSignatureDescriptorFactory.createRenameJavaElementDescriptor(IJavaRefactorings.RENAME_JAVA_PROJECT);
			descriptor.setJavaElement(p1);
			descriptor.setUpdateReferences(true);
			descriptor.setNewName(newProjectName);

			RenameRefactoring ref= (RenameRefactoring) createRefactoring(descriptor);
			assertTrue(ref.isApplicable());

			RefactoringStatus result= performRefactoring(ref);

			assertEquals("not expected to fail", null, result);
			assertTrue("p1 is gone", !p1.exists());

			ParticipantTesting.testRename(handles,
				new RenameArguments[] {
					new RenameArguments(newProjectName, true),
					new RenameArguments(newProjectName, true)});

			p1= referencing1.getJavaModel().getJavaProject(newProjectName);
			assertTrue("p1 exists", p1.exists());

			//check entries in  referencing1
			IClasspathEntry[] entries= referencing1.getRawClasspath();
			assertEquals("expected entries", 3, entries.length);
			IClasspathEntry iClassPathEntry= entries[1];
			assertEquals("expected entry name", p1.getProject().getFullPath(), iClassPathEntry.getPath());
			assertEquals("expected entry kind", IClasspathEntry.CPE_PROJECT, iClassPathEntry.getEntryKind());
			assertEquals("expected entry isExported", true, iClassPathEntry.isExported());
			assertEquals("expected entry combineAccessRules", true, iClassPathEntry.combineAccessRules());
			assertEquals("expected entry accessRules count", 0, iClassPathEntry.getAccessRules().length);
			assertEquals("expected entry accessRules getExtraAttributes", 0, iClassPathEntry.getExtraAttributes().length);

			//check entries in  referencing2
			entries= referencing2.getRawClasspath();
			assertEquals("expected entries", 3, entries.length);
			iClassPathEntry= entries[1];
			assertEquals("expected entry name", p1.getProject().getFullPath(), iClassPathEntry.getPath());
			assertEquals("expected entry kind", IClasspathEntry.CPE_PROJECT, iClassPathEntry.getEntryKind());
			assertEquals("expected entry isExported", false, iClassPathEntry.isExported());
			assertEquals("expected entry combineAccessRules", true, iClassPathEntry.combineAccessRules());
			assertEquals("expected entry accessRules count", accessRules2.length, iClassPathEntry.getAccessRules().length);
			assertEquals("expected entry accessRules getExtraAttributes", extraAttributes2.length, iClassPathEntry.getExtraAttributes().length);

		} finally {
			performDummySearch();

			if (p1 != null && p1.exists())
				JavaProjectHelper.delete(p1);
			if (referencing1 != null && referencing1.exists())
				JavaProjectHelper.delete(referencing1);
			if (referencing2 != null && referencing2.exists())
				JavaProjectHelper.delete(referencing2);
		}
	}

}
