/*******************************************************************************
 *  Copyright (c) 2000, 2011 IBM Corporation and others.
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  which accompanies this distribution, and is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 *
 *  Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.debug.tests.core;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IVariable;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;

/**
 * Tests working directories.
 */
public class WorkingDirectoryTests extends AbstractDebugTest {

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

	public void testDefaultWorkingDirectory() throws Exception {
		String typeName = "WorkingDirectoryTest";
		createLineBreakpoint(16, typeName);

		IJavaThread thread= null;
		try {
			thread= launchToBreakpoint(typeName);
			assertNotNull("Breakpoint not hit within timeout period", thread);
			IBreakpoint hit = getBreakpoint(thread);
			assertNotNull("suspended, but not by breakpoint", hit);
			IVariable var = thread.findVariable("dir");
			String dir = var.getValue().getValueString();
			IPath path = new Path(dir);
			assertEquals("default working dir should be the project directory.", get14Project().getProject().getLocation(), path);
		} finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	/**
	 * Sets the working directory attribute of the test launch config
	 * @param path
	 */
	protected void setWorkingDirectory(IPath path) throws CoreException {
		ILaunchConfiguration configuration = getLaunchConfiguration("WorkingDirectoryTest");
		ILaunchConfigurationWorkingCopy workingCopy = configuration.getWorkingCopy();
		String dir = null;
		if (path != null) {
			dir = path.toString();
		}
		workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, dir);
		workingCopy.doSave();
	}


	public void testWorkspaceRelativeWorkingDirectory() throws Exception {
		String typeName = "WorkingDirectoryTest";
		createLineBreakpoint(16, typeName);
		IPath wd = get14Project().getProject().getFolder("src").getFullPath().makeRelative();
		setWorkingDirectory(wd);

		IJavaThread thread= null;
		try {
			thread= launchToBreakpoint(typeName);
			assertNotNull("Breakpoint not hit within timeout period", thread);
			IBreakpoint hit = getBreakpoint(thread);
			assertNotNull("suspended, but not by breakpoint", hit);
			IVariable var = thread.findVariable("dir");
			String dir = var.getValue().getValueString();
			IPath path = new Path(dir);
			assertEquals("working dir should be the src directory.", get14Project().getProject().getFolder("src").getLocation(), path);
		} finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
			setWorkingDirectory(null);
		}
	}

	public void testAbsoluteWorkingDirectory() throws Exception {
		String typeName = "WorkingDirectoryTest";
		createLineBreakpoint(16, typeName);
		IPath wd = get14Project().getProject().getFolder("src").getLocation();
		setWorkingDirectory(wd);

		IJavaThread thread= null;
		try {
			thread= launchToBreakpoint(typeName);
			assertNotNull("Breakpoint not hit within timeout period", thread);
			IBreakpoint hit = getBreakpoint(thread);
			assertNotNull("suspended, but not by breakpoint", hit);
			IVariable var = thread.findVariable("dir");
			String dir = var.getValue().getValueString();
			IPath path = new Path(dir);
			assertEquals("working dir should be the src directory.", get14Project().getProject().getFolder("src").getLocation(), path);
		} finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
			setWorkingDirectory(null);
		}
	}
}
