/*******************************************************************************
 * Copyright (c) 2011, 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.wst.jsdt.web.ui.tests.conversion;

import junit.framework.TestCase;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.wst.jsdt.core.IIncludePathEntry;
import org.eclipse.wst.jsdt.core.JavaScriptCore;
import org.eclipse.wst.jsdt.core.JavaScriptModelException;
import org.eclipse.wst.jsdt.internal.ui.util.ConvertAction;

public class IncludePathTests extends TestCase {
	private static IProject createSimpleProject(String name, IPath location, String[] natureIds) {
		IProjectDescription description = ResourcesPlugin.getWorkspace().newProjectDescription(name);
		if (location != null) {
			description.setLocation(location);
		}
		if (natureIds != null) {
			description.setNatureIds(natureIds);
		}
		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
		try {
			project.create(description, new NullProgressMonitor());
			project.open(new NullProgressMonitor());
		}
		catch (CoreException e) {
			e.printStackTrace();
		}
		return project;
	}

	private static final ISelection selectionFor(IProject p) {
		return new StructuredSelection(new IProject[]{p, ResourcesPlugin.getWorkspace().getRoot().getProject("IncludePathTests")});
	}

	public IncludePathTests() {
		this("WEb project Include Path manipulation tests");
	}

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

	private void assertConvertedIncludePath(IProject p, String expected) throws JavaScriptModelException {
		ConvertAction convertor = new ConvertAction();
		convertor.selectionChanged(null, selectionFor(p));
		convertor.run(null);

		assertIncludePath(p, expected);
	}

	private void assertIncludePath(IProject p, String expected) throws JavaScriptModelException {
		IIncludePathEntry[] rawIncludepath = JavaScriptCore.create(p).getRawIncludepath();
		StringBuffer b = new StringBuffer();
		for (int i = 0; i < rawIncludepath.length; i++) {
			b.append(rawIncludepath[i].toString());
			b.append('\n');
		}
		assertEquals("Unexpected Include Path entries", expected, b.toString());
	}

//	public void testAddingModuleCoreToProject() throws CoreException {
//	}
//
//	public void testAddingWebFacetToJSProject() throws CoreException {
//	}
//
//	public void testAddingWebFacetToNonJSProject() throws CoreException {
//	}
//
//	public void testBrowserSuperTypeJSProject() throws CoreException {
//	}
//
//	public void testConvertModuleCoreProject() throws CoreException {
//	}

	public void testConvertSimpleProject() throws CoreException {
		IProject p = createSimpleProject(getName(), null, null);
		assertConvertedIncludePath(p, "/testConvertSimpleProject[CPE_SOURCE][K_SOURCE][isExported:false][attributes:provider=org.eclipse.wst.jsdt.web.core.internal.project.ModuleSourcePathProvider]\norg.eclipse.wst.jsdt.launching.JRE_CONTAINER[CPE_CONTAINER][K_SOURCE][isExported:false]\norg.eclipse.wst.jsdt.launching.baseBrowserLibrary[CPE_CONTAINER][K_SOURCE][isExported:false]\n");
		// clean up if we got to the end
		try {
			p.delete(true, true, null);
		}
		catch (Exception e) {
			// not a failure condition
		}
	}

	public void testConvertDefaultJSProject() throws CoreException {
		IProject p = createSimpleProject(getName(), null, new String[]{JavaScriptCore.NATURE_ID});
		assertConvertedIncludePath(p, "org.eclipse.wst.jsdt.launching.JRE_CONTAINER[CPE_CONTAINER][K_SOURCE][isExported:false]\norg.eclipse.wst.jsdt.launching.baseBrowserLibrary[CPE_CONTAINER][K_SOURCE][isExported:false]\n/testConvertDefaultJSProject[CPE_SOURCE][K_SOURCE][isExported:false]\n");
		// clean up if we got to the end
		try {
			p.delete(true, true, null);
		}
		catch (Exception e) {
			// not a failure condition
		}
	}

	public void testVerifyDefaultIncludePath() throws CoreException {
		IProject p = createSimpleProject(getName(), null, new String[]{JavaScriptCore.NATURE_ID});
		assertIncludePath(p, "org.eclipse.wst.jsdt.launching.JRE_CONTAINER[CPE_CONTAINER][K_SOURCE][isExported:false]\norg.eclipse.wst.jsdt.launching.baseBrowserLibrary[CPE_CONTAINER][K_SOURCE][isExported:false]\n/testVerifyDefaultIncludePath[CPE_SOURCE][K_SOURCE][isExported:false]\n");
		// clean up if we got to the end
		try {
			p.delete(true, true, null);
		}
		catch (Exception e) {
			// not a failure condition
		}
	}
}
