/*******************************************************************************
 * Copyright (c) 2000, 2003 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();
	}
}
}
