/*******************************************************************************
 *  Copyright (c) 2012 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 Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.core.tests.resources.session;

import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.internal.resources.TestingSupport;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.tests.resources.AutomatedTests;
import org.eclipse.core.tests.resources.WorkspaceSessionTest;
import org.eclipse.core.tests.session.SessionTestSuite;
import org.eclipse.core.tests.session.WorkspaceSessionTestSuite;

/**
 * Test for bug 294854
 */
public class TestBug294854 extends WorkspaceSessionTest {
	private static final String PROJECT_OLD_NAME = "project_old_name";
	private static final String PROJECT_NEW_NAME = "project_new_name";

	public static Test suite() {
		TestSuite suite = new TestSuite(TestBug294854.class.getName());
		//		suite.addTest(new TestBug294854("testRenameUsingResourcePath_01"));

		SessionTestSuite scenario1 = new WorkspaceSessionTestSuite(AutomatedTests.PI_RESOURCES_TESTS, "renameUsingProjectDescription");
		scenario1.addCrashTest(new TestBug294854("testRenameUsingProjectDescription_01"));
		scenario1.addTest(new TestBug294854("testRenameUsingProjectDescription_02"));

		SessionTestSuite scenario2 = new WorkspaceSessionTestSuite(AutomatedTests.PI_RESOURCES_TESTS, "renameUsingResourcePath");
		scenario2.addCrashTest(new TestBug294854("testRenameUsingResourcePath_01"));
		scenario2.addTest(new TestBug294854("testRenameUsingResourcePath_02"));

		SessionTestSuite scenario3 = new WorkspaceSessionTestSuite(AutomatedTests.PI_RESOURCES_TESTS, "delete");
		scenario3.addCrashTest(new TestBug294854("testDelete_01"));
		scenario3.addTest(new TestBug294854("testDelete_02"));

		suite.addTest(scenario1);
		suite.addTest(scenario2);
		suite.addTest(scenario3);

		return suite;
	}

	public TestBug294854() {
		super();
	}

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

	private IProject createProject() throws CoreException {
		IWorkspace workspace = getWorkspace();
		IProject project = workspace.getRoot().getProject(PROJECT_OLD_NAME);
		ensureExistsInWorkspace(project, true);
		assertTrue("1.0", project.exists());

		// make sure we do not have .snap file
		TestingSupport.waitForSnapshot();
		workspace.save(true, getMonitor());

		return project;
	}

	private boolean checkProjectExists(String name) {
		IProject project = getWorkspace().getRoot().getProject(name);
		return project.exists();
	}

	public void testRenameUsingProjectDescription_01() throws CoreException, InterruptedException {
		IProject project = createProject();

		// move project using IProjectDescription
		IProjectDescription description = project.getDescription();
		description.setName(PROJECT_NEW_NAME);
		project.move(description, true, getMonitor());

		// give a moment for the snapshot to run
		Thread.sleep(1000);

		// simulate process kill
		System.exit(1);
	}

	public void testRenameUsingProjectDescription_02() {
		assertFalse("1.0", checkProjectExists(PROJECT_OLD_NAME));
		assertTrue("2.0", checkProjectExists(PROJECT_NEW_NAME));
	}

	public void testRenameUsingResourcePath_01() throws CoreException, InterruptedException {
		IProject project = createProject();

		// move project using IPath
		project.move(project.getFullPath().removeLastSegments(1).append(PROJECT_NEW_NAME), true, getMonitor());

		// give a moment for the snapshot to run
		Thread.sleep(1000);

		// simulate process kill
		System.exit(1);
	}

	public void testRenameUsingResourcePath_02() {
		assertFalse("1.0", checkProjectExists(PROJECT_OLD_NAME));
		assertTrue("2.0", checkProjectExists(PROJECT_NEW_NAME));
	}

	public void testDelete_01() throws CoreException {
		IProject project = createProject();

		// delete project
		project.delete(true, getMonitor());

		// simulate process kill
		System.exit(1);
	}

	public void testDelete_02() {
		assertFalse("1.0", checkProjectExists(PROJECT_OLD_NAME));
	}
}
