/*******************************************************************************
 * Copyright (c) 2010, 2015 Broadcom 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:
 * Broadcom Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.core.tests.internal.resources;

import java.util.*;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.resources.*;
import org.eclipse.core.resources.IWorkspace.ProjectOrder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.tests.resources.ResourceTest;

/**
 * Test project dynamic references provided by extension point
 * <code>org.eclipse.core.resources.builders</code> and dynamicReference
 * {@link IDynamicReferenceProvider}
 */
public class ProjectDynamicReferencesTest extends ResourceTest {
	private static final String PROJECT_0_NAME = "ProjectDynamicReferencesTest_p0";

	private static final IProject[] EMPTY_PROJECTS = new IProject[0];
	private static final IBuildConfiguration[] EMPTY_BUILD_CONFIGURATIONS = new IBuildConfiguration[0];

	private IProject project0;
	private IProject project1;
	private IProject project2;

	public static Test suite() {
		return new TestSuite(ProjectDynamicReferencesTest.class);
	}

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

	@Override
	public void setUp() throws Exception {
		project0 = getWorkspace().getRoot().getProject(PROJECT_0_NAME);
		project1 = getWorkspace().getRoot().getProject("ProjectDynamicReferencesTest_p1");
		project2 = getWorkspace().getRoot().getProject("ProjectDynamicReferencesTest_p2");
		ensureExistsInWorkspace(new IProject[] { project0, project1, project2 }, true);
		addBuilder(project0);
		addBuilder(project1);
		addBuilder(project2);
	}

	private static void addBuilder(IProject project) throws CoreException {
		IProjectDescription description = project.getDescription();
		ICommand command = description.newCommand();
		command.setBuilderName(Builder.NAME);
		description.setBuildSpec(new ICommand[] {command});
		project.setDescription(description, null);
	}

	@Override
	protected void tearDown() throws Exception {
		super.tearDown();
		DynamicReferenceProvider.clear();
		project0.delete(true, null);
		project1.delete(true, null);
		project2.delete(true, null);
	}

	public void testReferencedProjects() throws CoreException {
		assertEquals("Project0 must not have referenced projects", EMPTY_PROJECTS, project0.getReferencedProjects());
		assertEquals("Project1 must not have referenced projects", EMPTY_PROJECTS, project1.getReferencedProjects());
		assertEquals("Project2 must not have referenced projects", EMPTY_PROJECTS, project2.getReferencedProjects());

		DynamicReferenceProvider.addReference(project0, project1);

		assertEquals("Project0 must not have referenced projects", EMPTY_PROJECTS, project0.getReferencedProjects());
		assertEquals("Project1 must not have referenced projects", EMPTY_PROJECTS, project1.getReferencedProjects());
		assertEquals("Project2 must not have referenced projects", EMPTY_PROJECTS, project2.getReferencedProjects());

		clearCache();

		assertEquals("Project0 must reference Project1", new IProject[] { project1 }, project0.getReferencedProjects());
		assertEquals("Project1 must not have referenced projects", EMPTY_PROJECTS, project1.getReferencedProjects());
		assertEquals("Project2 must not have referenced projects", EMPTY_PROJECTS, project2.getReferencedProjects());

		DynamicReferenceProvider.addReference(project1, project2);

		assertEquals("Project0 must reference Project1", new IProject[] { project1 }, project0.getReferencedProjects());
		assertEquals("Project1 must not have referenced projects", EMPTY_PROJECTS, project1.getReferencedProjects());
		assertEquals("Project2 must not have referenced projects", EMPTY_PROJECTS, project2.getReferencedProjects());

		clearCache();

		assertEquals("Project0 must reference Project1", new IProject[] { project1 }, project0.getReferencedProjects());
		assertEquals("Project1 must reference Project2", new IProject[] { project2 }, project1.getReferencedProjects());
		assertEquals("Project2 must not have referenced projects", EMPTY_PROJECTS, project2.getReferencedProjects());

		DynamicReferenceProvider.addReference(project0, project2);

		assertEquals("Project0 must reference Project1", new IProject[] { project1 }, project0.getReferencedProjects());
		assertEquals("Project1 must reference Project2", new IProject[] { project2 }, project1.getReferencedProjects());
		assertEquals("Project2 must not have referenced projects", EMPTY_PROJECTS, project2.getReferencedProjects());

		clearCache();

		assertEquals("Project0 must reference Project1 and Project2", new IProject[] { project1, project2 },
				project0.getReferencedProjects());
		assertEquals("Project1 must reference Project2", new IProject[] { project2 },
				project1.getReferencedProjects());
		assertEquals("Project2 must not have referenced projects", EMPTY_PROJECTS, project2.getReferencedProjects());
	}

	public void testReferencedBuildConfigs() throws CoreException {
		assertEquals("Project0 must not have referenced projects", EMPTY_BUILD_CONFIGURATIONS,
				project0.getReferencedBuildConfigs(IBuildConfiguration.DEFAULT_CONFIG_NAME, false));
		assertEquals("Project1 must not have referenced projects", EMPTY_BUILD_CONFIGURATIONS,
				project1.getReferencedBuildConfigs(IBuildConfiguration.DEFAULT_CONFIG_NAME, false));
		assertEquals("Project2 must not have referenced projects", EMPTY_BUILD_CONFIGURATIONS,
				project2.getReferencedBuildConfigs(IBuildConfiguration.DEFAULT_CONFIG_NAME, false));

		DynamicReferenceProvider.addReference(project0, project1);
		DynamicReferenceProvider.addReference(project1, project2);
		DynamicReferenceProvider.addReference(project0, project2);
		clearCache();

		IBuildConfiguration buildConfigProject1 = project1.getBuildConfig(IBuildConfiguration.DEFAULT_CONFIG_NAME);
		IBuildConfiguration buildConfigProject2 = project2.getBuildConfig(IBuildConfiguration.DEFAULT_CONFIG_NAME);
		assertEquals("Build configuration of Project0 must reference build configuration of project1 and project2",
				new IBuildConfiguration[] { buildConfigProject1, buildConfigProject2 },
				project0.getReferencedBuildConfigs(IBuildConfiguration.DEFAULT_CONFIG_NAME, false));
		assertEquals("Build configuration of Project1 must reference build configuration of Project2",
				new IBuildConfiguration[] { buildConfigProject2 },
				project1.getReferencedBuildConfigs(IBuildConfiguration.DEFAULT_CONFIG_NAME, false));
		assertEquals("Project2 must not have referenced projects", EMPTY_BUILD_CONFIGURATIONS,
				project2.getReferencedBuildConfigs(IBuildConfiguration.DEFAULT_CONFIG_NAME, false));
	}

	public void testReferencingProjects() throws CoreException {
		assertEquals("Project0 must not have referencing projects", EMPTY_PROJECTS, project0.getReferencingProjects());
		assertEquals("Project1 must not have referencing projects", EMPTY_PROJECTS, project1.getReferencingProjects());
		assertEquals("Project2 must not have referencing projects", EMPTY_PROJECTS, project2.getReferencingProjects());

		DynamicReferenceProvider.addReference(project0, project1);

		assertEquals("Project0 must not have referencing projects", EMPTY_PROJECTS, project0.getReferencingProjects());
		assertEquals("Project1 must not have referencing projects", EMPTY_PROJECTS, project1.getReferencingProjects());
		assertEquals("Project2 must not have referencing projects", EMPTY_PROJECTS, project2.getReferencingProjects());

		clearCache();

		assertEquals("Project0 must not have referencing projects", EMPTY_PROJECTS, project0.getReferencingProjects());
		assertEquals("Project1 must be referenced by Project0", new IProject[] { project0 },
				project1.getReferencingProjects());
		assertEquals("Project2 must not have referencing projects", EMPTY_PROJECTS, project2.getReferencingProjects());

		DynamicReferenceProvider.addReference(project1, project2);

		assertEquals("Project0 must not have referencing projects", EMPTY_PROJECTS, project0.getReferencingProjects());
		assertEquals("Project1 must must be referenced by Project0", new IProject[] { project0 },
				project1.getReferencingProjects());
		assertEquals("Project2 must not have referencing projects", EMPTY_PROJECTS, project2.getReferencingProjects());

		clearCache();

		assertEquals("Project0 must not have referencing projects", EMPTY_PROJECTS, project0.getReferencingProjects());
		assertEquals("Project1 must be referenced by Project0", new IProject[] { project0 },
				project1.getReferencingProjects());
		assertEquals("Project2 must be referenced by Project1", new IProject[] { project1 },
				project2.getReferencingProjects());

		DynamicReferenceProvider.addReference(project0, project2);

		assertEquals("Project0 must not have referencing projects", EMPTY_PROJECTS, project0.getReferencingProjects());
		assertEquals("Project1 must be referenced by Project0", new IProject[] { project0 },
				project1.getReferencingProjects());
		assertEquals("Project2 must be referenced by Project1", new IProject[] { project1 },
				project2.getReferencingProjects());

		clearCache();

		assertEquals("Project0 must not have referencing projects", EMPTY_PROJECTS, project0.getReferencingProjects());
		assertEquals("Project1 must be referenced by Project0", new IProject[] { project0 },
				project1.getReferencingProjects());
		assertEquals("Project2 must be referenced by Project0 and Project1", new IProject[] { project0, project1 },
				project2.getReferencingProjects());
	}

	public void testComputeProjectOrder() throws CoreException {
		IProject[] allProjects = new IProject[] { project0, project1, project2 };

		ProjectOrder projectOrder = getWorkspace().computeProjectOrder(allProjects);

		assertEquals("Build order not defined, must return projects in default order", allProjects, projectOrder.projects);
		assertFalse("No cycles", projectOrder.hasCycles);

		DynamicReferenceProvider.addReference(project0, project1);
		DynamicReferenceProvider.addReference(project1, project2);
		clearCache();

		projectOrder = getWorkspace().computeProjectOrder(allProjects);

		assertEquals("Build order must be Project2, Project1, Project0",
				new IProject[] { project2, project1, project0 }, projectOrder.projects);
		assertFalse("No cycles", projectOrder.hasCycles);

		DynamicReferenceProvider.clear();
		DynamicReferenceProvider.addReference(project1, project0);
		DynamicReferenceProvider.addReference(project0, project2);
		clearCache();

		projectOrder = getWorkspace().computeProjectOrder(allProjects);

		assertEquals("Build order must be Project2, Project0, Project1",
				new IProject[] { project2, project0, project1 }, projectOrder.projects);
		assertFalse("No cycles", projectOrder.hasCycles);
	}

	public void testBug543776() throws CoreException {
		IFile projectFile = project0.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
		String projectDescription = readStringInFileSystem(projectFile);
		projectDescription = projectDescription.replace(PROJECT_0_NAME, "anotherName");
		ensureExistsInWorkspace(projectFile, projectDescription);
		project0.delete(false, true, null);
		project0.create(null);
		project0.open(null);

		assertEquals(PROJECT_0_NAME, project0.getName());
		assertEquals("anotherName", project0.getDescription().getName());

		DynamicReferenceProvider.addReference(project0, project1);
		clearCache();

		assertEquals("Project0 must reference Project1", new IProject[] { project1 }, project0.getReferencedProjects());
	}

	private void clearCache() {
		project0.clearCachedDynamicReferences();
		project1.clearCachedDynamicReferences();
		project2.clearCachedDynamicReferences();
	}

	public static final class Builder extends IncrementalProjectBuilder {

		public static final String NAME = "org.eclipse.core.tests.resources.dynamicProjectReferenceBuilder";

		@Override
		protected IProject[] build(int kind, Map<String, String> args, IProgressMonitor monitor) throws CoreException {
			return null;
		}

	}

	public static final class DynamicReferenceProvider implements IDynamicReferenceProvider
	{
		private static final Map<IProject, List<IProject>> dependentProjects = new HashMap<>();

		@Override
		public List<IProject> getDependentProjects(IBuildConfiguration buildConfiguration) throws CoreException {
			IProject project = buildConfiguration.getProject();
			List<IProject> depProjects = dependentProjects.get(project);
			if (depProjects != null) {
				return depProjects;
			}
			return Collections.emptyList();
		}

		public static void addReference(IProject project, IProject dependentProject) {
			List<IProject> depProjects = dependentProjects.computeIfAbsent(project, proj -> new ArrayList<>());
			depProjects.add(dependentProject);
		}

		public static void clear() {
			dependentProjects.clear();
		}
	}
}
