/*******************************************************************************
 * Copyright (c) 2004, 2015 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM - Initial API and implementation
 *     Alexander Kurtakov <akurtako@redhat.com> - Bug 459343
 *******************************************************************************/
package org.eclipse.core.tests.resources;

import java.util.HashMap;
import java.util.Map;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.internal.events.BuildCommand;
import org.eclipse.core.internal.resources.Project;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.tests.internal.builders.CustomTriggerBuilder;

/**
 * Tests protocol of IProjectDescription and other specified behavior
 * that relates to the project description.
 */
public class IProjectDescriptionTest extends ResourceTest {
	public static Test suite() {
		return new TestSuite(IProjectDescriptionTest.class);
	}

	public IProjectDescriptionTest() {
		super();
	}

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

	public void testDescriptionConstant() {
		assertEquals("1.0", ".project", IProjectDescription.DESCRIPTION_FILE_NAME);
	}

	/**
	 * Tests that setting the build spec preserves any instantiated builder.
	 */
	public void testBuildSpecBuilder() throws Exception {
		Project project = (Project) getWorkspace().getRoot().getProject("ProjectTBSB");
		ensureExistsInWorkspace(project, true);
		project.refreshLocal(IResource.DEPTH_INFINITE, null);
		IFile descriptionFile = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
		assertTrue("1.0", descriptionFile.exists());

		// Add a builder to the build command.
		IProjectDescription desc = project.getDescription();
		ICommand command = desc.newCommand();
		command.setBuilderName(CustomTriggerBuilder.BUILDER_NAME);
		desc.setBuildSpec(new ICommand[] {command});
		project.setDescription(desc, null);

		project.build(IncrementalProjectBuilder.FULL_BUILD, null);

		// Get a non-cloned version of the project desc build spec, and check for the builder
		assertTrue("2.0", ((BuildCommand) project.internalGetDescription().getBuildSpec(false)[0]).getBuilders() != null);

		// Now reset the build command. The builder shouldn't disappear.
		desc = project.getDescription();
		desc.setBuildSpec(new ICommand[] {command});
		project.setDescription(desc, null);

		// builder should still be there
		assertTrue("3.0", ((BuildCommand) project.internalGetDescription().getBuildSpec(false)[0]).getBuilders() != null);
	}

	/**
	 * Tests that the description file is not dirtied if the description has not actually
	 * changed.
	 */
	public void testDirtyDescription() {
		IProject project = getWorkspace().getRoot().getProject("Project");
		IProject target1 = getWorkspace().getRoot().getProject("target1");
		IProject target2 = getWorkspace().getRoot().getProject("target2");
		ensureExistsInWorkspace(project, true);
		IFile descriptionFile = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
		assertTrue("1.0", descriptionFile.exists());

		long timestamp = descriptionFile.getLocalTimeStamp();
		try {
			//wait a bit to ensure that timestamp granularity does not
			//spoil our test
			Thread.sleep(1000);
		} catch (InterruptedException e1) {
			fail("1.99", e1);
		}
		try {
			IProjectDescription description = project.getDescription();
			description.setBuildSpec(description.getBuildSpec());
			description.setComment(description.getComment());
			description.setDynamicReferences(description.getDynamicReferences());
			description.setLocation(description.getLocation());
			description.setName(description.getName());
			description.setNatureIds(description.getNatureIds());
			description.setReferencedProjects(description.getReferencedProjects());
			project.setDescription(description, IResource.NONE, null);
		} catch (CoreException e) {
			fail("2.99", e);
		}
		//the timestamp should be the same
		assertEquals("2.0", timestamp, descriptionFile.getLocalTimeStamp());

		//adding a dynamic reference should not dirty the file
		try {
			IProjectDescription description = project.getDescription();
			description.setDynamicReferences(new IProject[] {target1, target2});
			project.setDescription(description, IResource.NONE, null);
		} catch (CoreException e) {
			fail("3.99", e);
		}
		assertEquals("2.1", timestamp, descriptionFile.getLocalTimeStamp());
	}

	/**
	 * Tests that the description file is dirtied if the description has actually
	 * changed. This is a regression test for bug 64128.
	 */
	public void testDirtyBuildSpec() {
		IProject project = getWorkspace().getRoot().getProject("Project");
		IFile projectDescription = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
		ensureExistsInWorkspace(project, true);
		String key = "key";
		String value1 = "value1";
		String value2 = "value2";
		try {
			IProjectDescription description = project.getDescription();
			ICommand newCommand = description.newCommand();
			Map<String, String> args = new HashMap<>();
			args.put(key, value1);
			newCommand.setArguments(args);
			description.setBuildSpec(new ICommand[] {newCommand});
			project.setDescription(description, IResource.NONE, null);
		} catch (CoreException e) {
			fail("1.99", e);
		}
		//changing a build command argument should dirty the description file
		long modificationStamp = projectDescription.getModificationStamp();
		try {
			IProjectDescription description = project.getDescription();
			ICommand command = description.getBuildSpec()[0];
			Map<String, String> args = command.getArguments();
			args.put(key, value2);
			command.setArguments(args);
			description.setBuildSpec(new ICommand[] {command});
			project.setDescription(description, IResource.NONE, null);
		} catch (CoreException e) {
			fail("2.99", e);
		}
		assertTrue("3.0", modificationStamp != projectDescription.getModificationStamp());
	}

	public void testDynamicProjectReferences() {
		IProject target1 = getWorkspace().getRoot().getProject("target1");
		IProject target2 = getWorkspace().getRoot().getProject("target2");
		ensureExistsInWorkspace(target1, true);
		ensureExistsInWorkspace(target2, true);

		IProject project = getWorkspace().getRoot().getProject("project");
		ensureExistsInWorkspace(project, true);

		IProjectDescription description = null;
		try {
			description = project.getDescription();
		} catch (CoreException e) {
			fail("1.0", e);
		}
		description.setReferencedProjects(new IProject[] {target1});
		description.setDynamicReferences(new IProject[] {target2});
		try {
			project.setDescription(description, getMonitor());
		} catch (CoreException e) {
			fail("2.0", e);
		}
		IProject[] refs = null;
		try {
			refs = project.getReferencedProjects();
		} catch (CoreException e2) {
			fail("2.99", e2);
		}
		assertEquals("2.1", 2, refs.length);
		assertEquals("2.2", target1, refs[0]);
		assertEquals("2.3", target2, refs[1]);
		assertEquals("2.4", 1, target1.getReferencingProjects().length);
		assertEquals("2.5", 1, target2.getReferencingProjects().length);

		//get references for a non-existent project
		try {
			getWorkspace().getRoot().getProject("DoesNotExist").getReferencedProjects();
			fail("3.0");
		} catch (CoreException e1) {
			//should fail
		}
	}

	/**
	 * Tests IProjectDescription project references
	 */
	public void testProjectReferences() {
		IProject target = getWorkspace().getRoot().getProject("Project1");
		ensureExistsInWorkspace(target, true);

		IProject project = getWorkspace().getRoot().getProject("Project2");
		ensureExistsInWorkspace(project, true);

		try {
			project.open(getMonitor());
		} catch (CoreException e) {
			fail("0.0", e);
		}

		IProjectDescription description = null;
		try {
			description = project.getDescription();
		} catch (CoreException e) {
			fail("1.0", e);
		}
		description.setReferencedProjects(new IProject[] {target});
		try {
			project.setDescription(description, getMonitor());
		} catch (CoreException e) {
			fail("2.0", e);
		}
		assertEquals("2.1", 1, target.getReferencingProjects().length);

		//get references for a non-existent project
		try {
			getWorkspace().getRoot().getProject("DoesNotExist").getReferencedProjects();
			fail("3.0");
		} catch (CoreException e1) {
			//should fail
		}
		//get referencing projects for a non-existent project
		IProject[] refs = getWorkspace().getRoot().getProject("DoesNotExist2").getReferencingProjects();
		assertEquals("4.0", 0, refs.length);
	}
}
