/*******************************************************************************
 * Copyright (c) 2000, 2004 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.core.tests.harness;

import java.io.InputStream;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;

/**
 * Tests which use the Eclipse Platform workspace.
 */
public class ExampleWorkspaceTest extends EclipseWorkspaceTest {
	/**
	 * Need a zero argument constructor to satisfy the test harness.
	 * This constructor should not do any real work nor should it be
	 * called by user code.
	 */
	public ExampleWorkspaceTest() {
		super();
	}

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

	protected IProject getTestProject() {
		return getWorkspace().getRoot().getProject("testProject");
	}

	/**
	 * Returns the test suite for this test class.
	 */
	public static Test suite() {
		TestSuite suite = new TestSuite();
		suite.addTest(new ExampleWorkspaceTest("testProjectCreation"));
		suite.addTest(new ExampleWorkspaceTest("testFolderCreation"));
		suite.addTest(new ExampleWorkspaceTest("testFileCreation"));
		suite.addTest(new ExampleWorkspaceTest("testFileInFolderCreation"));
		suite.addTest(new ExampleWorkspaceTest("testSetContents"));
		suite.addTest(new ExampleWorkspaceTest("testFileOverFolder"));
		suite.addTest(new ExampleWorkspaceTest("testFolderOverFile"));
		suite.addTest(new ExampleWorkspaceTest("testFolderDeletion"));
		suite.addTest(new ExampleWorkspaceTest("testFileDeletion"));
		suite.addTest(new ExampleWorkspaceTest("testProjectDeletion"));
		return suite;
	}

	public void testFileCreation() throws Throwable {
		IFile target = getTestProject().getFile("testFile");
		target.create(null, true, getMonitor());
		assertTrue(target.exists());
	}

	public void testFileDeletion() throws Throwable {
		IFile target = getTestProject().getFile("testFileForDelete");
		target.create(null, true, getMonitor());
		assertTrue(target.exists());
		target.delete(true, getMonitor());
		assertTrue(!target.exists());
	}

	public void testFileInFolderCreation() throws Throwable {
		IFile target = getTestProject().getFile(new Path("testFolder/testFile2"));
		target.create(getRandomContents(), true, getMonitor());
		assertTrue(target.exists());
	}

	public void testFileOverFolder() throws Throwable {
		IFolder existing = getTestProject().getFolder("testFolder");
		assertTrue(existing.exists());
		IFile target = getWorkspace().getRoot().getFile(existing.getFullPath());
		try {
			target.create(null, true, getMonitor());
		} catch (CoreException e) {
			assertTrue(existing.exists());
			return;
		}
		fail("Should not be able to create file over folder");
	}

	public void testFolderCreation() throws Throwable {
		IFolder target = getTestProject().getFolder("testFolder");
		target.create(true, true, getMonitor());
		assertTrue(target.exists());
	}

	public void testFolderDeletion() throws Throwable {
		IProject project = getTestProject();
		IResource[] before = buildResources(project, new String[] {"c/", "c/b/", "c/x", "c/b/y", "c/b/z"});
		ensureExistsInWorkspace(before, true);
		//
		assertExistsInWorkspace(before);
		project.getFolder("c").delete(true, getMonitor());
		assertDoesNotExistInWorkspace(before);
	}

	public void testFolderOverFile() throws Throwable {
		IFile existing = getTestProject().getFile("testFile");
		assertTrue(existing.exists());
		IFolder target = getWorkspace().getRoot().getFolder(existing.getFullPath());
		try {
			target.create(true, true, getMonitor());
		} catch (CoreException e) {
			assertTrue(existing.exists());
			return;
		}
		fail("Should not be able to create folder over a file");
	}

	public void testProjectCreation() throws Throwable {
		IProject target = getTestProject();
		target.create(null, getMonitor());
		assertTrue(target.exists());
		target.open(getMonitor());
		assertTrue(target.isOpen());
	}

	public void testProjectDeletion() throws Throwable {
		IProject target = getTestProject();
		target.delete(true, getMonitor());
		assertTrue("Project Deletion failed", !target.exists());
	}

	public void testSetContents() throws Throwable {
		IFile target = getTestProject().getFile("testFile");
		String testString = getRandomString();
		target.setContents(getContents(testString), true, false, getMonitor());
		InputStream content = null;
		try {
			content = target.getContents();
			assertTrue("get not equal set", compareContent(content, getContents(testString)));
		} finally {
			content.close();
		}
	}
}