package org.eclipse.jst.ws.tests.unittest;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
import org.eclipse.jst.ws.internal.common.ResourceUtils;
import org.eclipse.jst.ws.tests.util.JUnitUtils;
import org.eclipse.wst.command.internal.env.context.PersistentResourceContext;
import org.eclipse.wst.command.internal.env.eclipse.EclipseEnvironment;
import org.eclipse.wst.command.internal.env.ui.eclipse.EclipseStatusHandler;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;

/**
 * JUnit tests for selective ResourceUtils methods.  Calls which return a simple String or rely on a IResource
 * API need not be tested.  The focus is mainly to exercise Component and Flexible project APIs. 
 * 
 */
public class ResourceUtilsTests extends TestCase implements WSJUnitConstants{


	public static Test suite(){
		return new TestSuite(ResourceUtilsTests.class);
	}
	
	public void testComponentType(){
		IProject project = ProjectUtilities.getProject(projectName);
		String componentType = ResourceUtils.getComponentType(project);
		assertEquals(IModuleConstants.JST_WEB_MODULE, componentType);
	}
	
	public void testComponentOf(){
		IProject project = ProjectUtilities.getProject(projectName);
        IPath destPath = ResourceUtils.getJavaSourceLocation(project);
        IFolder folder = (IFolder)ResourceUtils.findResource(destPath);
        try {
            PersistentResourceContext  resourceContext = PersistentResourceContext.getInstance();
            EclipseStatusHandler       handler         = new EclipseStatusHandler();
            EclipseEnvironment         env     = new EclipseEnvironment( null, resourceContext, handler );

            IFile file = folder.getFile(new Path("foo/Echo.java"));
            if (!file.exists()) {
              JUnitUtils.copyTestData("BUJava/src", folder, env, null );
            }
        }
        catch (Exception ex){
        	ex.printStackTrace();
        }

        IPath javaFilePath = folder.getFile(new Path("foo/Echo.java")).getFullPath();
        IVirtualComponent vc = ResourceUtils.getComponentOf(javaFilePath);
        assertTrue(vc.exists());
        
		
	}
	
	public void testJavaSourceLocation(){
		IProject project = ProjectUtilities.getProject(projectName);
		String javaSourceLoc = ResourceUtils.getJavaSourceLocation(project).toString();
		System.out.println("Java source location = "+javaSourceLoc);
		assertTrue(javaSourceLoc.endsWith("src"));
		
		// get all the JavaSourceLocations via the VirtualComponent
		IVirtualComponent vc1 = ComponentCore.createComponent(project);
		IVirtualComponent vc2 = ComponentCore.createComponent(project);
		IVirtualComponent[] vcs = new IVirtualComponent[]{vc1, vc2};
		IPath[] paths = ResourceUtils.getAllJavaSourceLocations(vcs);
		
		// verify first folder exists
		IPath path1 = (IPath)paths[0];
		IResource resource  = ResourceUtils.findResource(path1);
		if (resource.exists()){
			assertEquals(IResource.FOLDER, resource.getType());
		}

		// verify second folder exists
		IPath path2 = (IPath)paths[1];
		IResource resource2  = ResourceUtils.findResource(path2);
		if (resource2.exists()){
			assertEquals(IResource.FOLDER, resource2.getType());
		}		
	}
	
	public void testWebComponentServerRoot() {
		IProject project = ProjectUtilities.getProject(projectName);
		IFolder folder = ResourceUtils.getWebComponentServerRoot(project);
		assertTrue(folder.exists());
	
	}
	
}
