/*******************************************************************************
 * Copyright (c) 2000, 2012 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 java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
import org.eclipse.jdt.launching.JavaLaunchDelegate;
import org.eclipse.jdt.launching.JavaRuntime;

/**
 * Tests bootpath settings
 */
public class BootpathTests extends AbstractDebugTest {

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

	public void testDefaultBootpath() throws Exception {
		ILaunchConfiguration config = getLaunchConfiguration("Breakpoints");

		JavaLaunchDelegate delegate = new JavaLaunchDelegate();
		String[] path = delegate.getBootpath(config);
		assertNull("Default bootpath should be null", path);
		String[][] pathInfo= delegate.getBootpathExt(config);
		assertNotNull("Bootpath info shouldn't be null", pathInfo);
		assertEquals("Wrong bootpath info array size",3, pathInfo.length);
		assertNull("Prepend bootpath should be null", pathInfo[0]);
		assertNull("Main bootpath should be null", pathInfo[1]);
		assertNull("Append bootpath should be null", pathInfo[2]);
	}

	public void testEmptyBootpath() throws Exception {
		ILaunchConfiguration config = getLaunchConfiguration("Breakpoints");
		ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy();

		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH, false);

		JavaLaunchDelegate delegate = new JavaLaunchDelegate();
		String[] path = delegate.getBootpath(wc);
		assertNotNull("Empty bootpath should be empty array", path);
		assertEquals("bootpath should be empty", 0, path.length);
		String[][] pathInfo= delegate.getBootpathExt(config);
		assertNotNull("Bootpath info should'nt be null", pathInfo);
		assertEquals("Wrong bootpath info array size",3, pathInfo.length);
		assertNull("Prepend bootpath should be null", pathInfo[0]);
		assertNull("Main bootpath should be empty array", pathInfo[1]);
		assertNull("Append bootpath should be null", pathInfo[2]);
	}

	public void testPrependBootpath() throws Exception {
		ILaunchConfiguration config = getLaunchConfiguration("Breakpoints");
		ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy();
		IRuntimeClasspathEntry[] classpath = JavaRuntime.computeUnresolvedRuntimeClasspath(wc);
		IRuntimeClasspathEntry[] newpath = new IRuntimeClasspathEntry[classpath.length + 1];
		IResource jar = get14Project().getProject().getFile(new Path("src/A.jar"));
		IRuntimeClasspathEntry pre = JavaRuntime.newArchiveRuntimeClasspathEntry(jar);
		pre.setClasspathProperty(IRuntimeClasspathEntry.BOOTSTRAP_CLASSES);
		newpath[0] = pre;
		System.arraycopy(classpath, 0, newpath, 1, classpath.length);
		List<String> mementos = new ArrayList<>(newpath.length);
		for (int i = 0; i < newpath.length; i++) {
			IRuntimeClasspathEntry entry = newpath[i];
			mementos.add(entry.getMemento());
		}

		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH, false);
		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH, mementos);

		JavaLaunchDelegate delegate = new JavaLaunchDelegate();
		Map<String, Object> map = delegate.getVMSpecificAttributesMap(wc);
		assertNotNull("Missing VM specific attributes map", map);
		String[] prepath = (String[]) map.get(IJavaLaunchConfigurationConstants.ATTR_BOOTPATH_PREPEND);
		assertNotNull("Missing bootpath prepend", pre);
		assertEquals("Incorrect number of prepends", 1, prepath.length);
		assertEquals("wrong prepended path", jar.getLocation().toOSString(), prepath[0]);
	}

}
