package org.eclipse.ui.tests.navigator;

import java.io.ByteArrayInputStream;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;

import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.tests.util.UITestCase;
import org.eclipse.ui.views.navigator.ResourceNavigator;

/**
 * The AbstractNavigatorTest is the abstract superclass
 * of tests that use a populated Resource Navigator.
 */
abstract class AbstractNavigatorTest extends UITestCase {

	private static final String NAVIGATOR_VIEW_ID = "org.eclipse.ui.views.ResourceNavigator";
	
	protected IProject testProject;
	protected IFolder testFolder;
	protected IFile testFile;
	protected ResourceNavigator navigator;
	
	public AbstractNavigatorTest(String testName) {
		super(testName);
	}

	protected void createTestProject() throws CoreException {
		if (testProject == null) {
			IWorkspace workspace = ResourcesPlugin.getWorkspace();
			testProject = workspace.getRoot().getProject("TestProject");
			testProject.create(null);
			testProject.open(null);
		}
	}
	
	protected void createTestFolder() throws CoreException {
		if (testFolder == null) {
			createTestProject();
			testFolder = testProject.getFolder("TestFolder");
			testFolder.create(false, false, null);
		}
	}

	protected void createTestFile() throws CoreException {
		if (testFile == null) {
			createTestFolder();
			testFile = testFolder.getFile("Foo.txt");
			testFile.create(new ByteArrayInputStream("Some content.".getBytes()), false, null);
		}
	}

	/** Shows the Navigator in a new test window. */
	protected void showNav() throws PartInitException {
		IWorkbenchWindow window = openTestWindow();
		navigator = (ResourceNavigator) window.getActivePage().showView(NAVIGATOR_VIEW_ID);
	}
	
	public void tearDown() throws Exception {
		if (testProject != null) {
			try {
				testProject.delete(true, null);
			}
			catch (CoreException e) {
				fail(e.toString());
			}
			testProject = null;
			testFolder = null;
			testFile = null;
		}
		super.tearDown();
		navigator = null;
	}
	
}
