/*******************************************************************************
 * Copyright (c) 2009 by SAP AG, Walldorf. 
 * 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:
 *     SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.ws.jaxws.dom.integration.tests.navigator;

import java.util.Iterator;

import junit.framework.TestCase;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jst.ws.jaxws.dom.integration.navigator.DOMAdapterFactoryContentProvider;
import org.eclipse.jst.ws.jaxws.dom.integration.navigator.DOMAdapterFactoryLabelProvider;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IDOM;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IWebServiceProject;
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.JaxWsWorkspaceResource;
import org.eclipse.jst.ws.jaxws.testutils.project.TestProject;
import org.eclipse.jst.ws.jaxws.testutils.project.TestProjectsUtils;

public class DOMAdapterFactoryLabelProviderTest extends TestCase 
{
	private static TestProject testPrj1; 
	
	protected JaxWsWorkspaceResource targetResource;
	protected DOMAdapterFactoryContentProvider adapterFactory;
	protected DOMAdapterFactoryLabelProvider labelProvider;
	
	private IWebServiceProject wsProject;
	
	@Override
	public void setUp() throws Exception 
	{
		if(testPrj1==null)
		{
			IProject ejbProject = TestProjectsUtils.createEjb3Project("DOMLblProvTestProject1" + System.currentTimeMillis());
			testPrj1 = new TestProject(ejbProject.getProject());
			testPrj1.createSourceFolder("src");
			final IPackageFragment modelSync1 = testPrj1.createPackage("org.eclipse.test.modelsync1");
			testPrj1.createType(modelSync1, "Sei1.java", "@javax.jws.WebService(name=\"Sei1Name\") public interface Sei1{\n" +
					"@javax.jws.WebMethod(name=\"parentMethod\") public void voidMethodWithNoArgsInParent();\n" +
					"}");
			testPrj1.createType(modelSync1, "Sei2.java", "@javax.jws.WebService(name=\"Sei2Name\") public interface Sei2 extends Sei1 {\n" +
					"@javax.jws.WebMethod(name=\"webMethod\") public void voidMethodWithNoArgsNotInParent();\n" +
					"}");
			testPrj1.createType(modelSync1, "WS1.java", "@javax.jws.WebService(serviceName=\"WS1Name\", endpointInterface=\"org.eclipse.test.modelsync1.Sei2\") public class WS1 {}");
			testPrj1.createType(modelSync1, "WS2.java", "@javax.jws.WebService(serviceName=\"WS2Name\", endpointInterface=\"org.eclipse.test.modelsync1.Sei2\") public class WS2 {}");
		}
		
		targetResource = new JaxWsWorkspaceResource(JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()));
		targetResource.load(null);
		Iterator<IWebServiceProject> wsProjects = targetResource.getDOM().getWebServiceProjects().iterator();
		
		while(wsProjects.hasNext())
		{
			IWebServiceProject wsProj = wsProjects.next();
			
			if(wsProj.getName().equals(testPrj1.getProject().getName()))
			{
				this.wsProject = wsProj;
			}
		}
		
		assertNotNull(this.wsProject);
		
		labelProvider = new DOMAdapterFactoryLabelProvider();
		adapterFactory = new DOMAdapterFactoryContentProvider() 
		{
			@Override
			protected IWebServiceProject getWsProject(final IDOM dom, final IProject project) {
				return wsProject;
			}			
		};
	}

	public void testGetImageObject() 
	{
		Object[] children = adapterFactory.getChildren(testPrj1.getProject());
		
		assertNotNull(labelProvider.getImage(children[0]));

		children = adapterFactory.getChildren(children[0]);
		
		assertNotNull(labelProvider.getImage(children[0]));
		assertNotNull(labelProvider.getImage(children[1]));
		
		Object[] sEIs = adapterFactory.getChildren(children[0]);
		
		assertNotNull(labelProvider.getImage(sEIs[0]));
		
		assertNotSame(labelProvider.getImage(null), labelProvider.getImage(sEIs[0]));
		assertNotSame(labelProvider.getImage(testPrj1), labelProvider.getImage(sEIs[0]));
		
		Object[] wSs = adapterFactory.getChildren(children[1]);
		
		assertNotNull(labelProvider.getImage(wSs[0]));
		
		assertNotSame(labelProvider.getImage(null), labelProvider.getImage(wSs[0]));
		assertNotSame(labelProvider.getImage(testPrj1), labelProvider.getImage(wSs[0]));
		
		Object[] webMethods = adapterFactory.getChildren(sEIs[0]);
		
		assertNotNull(labelProvider.getImage(webMethods[0]));
		
		assertNotSame(labelProvider.getImage(null), labelProvider.getImage(webMethods[0]));
		assertNotSame(labelProvider.getImage(testPrj1), labelProvider.getImage(webMethods[0]));
	}

	public void testGetTextObject() 
	{
		Object[] children = adapterFactory.getChildren(testPrj1.getProject());
		
		assertNotNull(labelProvider.getText(children[0]));

		children = adapterFactory.getChildren(children[0]);
		
		assertNotNull(labelProvider.getText(children[0]));
		assertNotNull(labelProvider.getText(children[1]));
		
		Object[] sEIs = adapterFactory.getChildren(children[0]);
		
		assertNotNull(labelProvider.getText(sEIs[0]));
		
		assertNotSame(labelProvider.getText(null), labelProvider.getText(sEIs[0]));
		assertNotSame(labelProvider.getText(testPrj1), labelProvider.getText(sEIs[0]));
		
		Object[] wSs = adapterFactory.getChildren(children[1]);
		
		assertNotNull(labelProvider.getText(wSs[0]));
		
		assertNotSame(labelProvider.getText(null), labelProvider.getText(wSs[0]));
		assertNotSame(labelProvider.getText(testPrj1), labelProvider.getText(wSs[0]));
		
		Object[] webMethods = adapterFactory.getChildren(sEIs[0]);
		
		assertNotNull(labelProvider.getText(webMethods[0]));
		
		assertNotSame(labelProvider.getText(null), labelProvider.getText(webMethods[0]));
		assertNotSame(labelProvider.getText(testPrj1), labelProvider.getText(webMethods[0]));
	}
	
	public void testGetDescription()
	{
		Object[] children = adapterFactory.getChildren(testPrj1.getProject());
		
		assertNotNull(labelProvider.getDescription(children[0]));

		children = adapterFactory.getChildren(children[0]);
		
		assertNotNull(labelProvider.getDescription(children[0]));
		assertNotNull(labelProvider.getDescription(children[1]));
		
		Object[] sEIs = adapterFactory.getChildren(children[0]);
		
		assertNotNull(labelProvider.getDescription(sEIs[0]));
		
		assertNotSame(labelProvider.getDescription(null), labelProvider.getDescription(sEIs[0]));
		assertNotSame(labelProvider.getDescription(testPrj1), labelProvider.getDescription(sEIs[0]));
		
		Object[] wSs = adapterFactory.getChildren(children[1]);
		
		assertNotNull(labelProvider.getDescription(wSs[0]));
		
		assertNotSame(labelProvider.getDescription(null), labelProvider.getDescription(wSs[0]));
		assertNotSame(labelProvider.getDescription(testPrj1), labelProvider.getDescription(wSs[0]));
		
		Object[] webMethods = adapterFactory.getChildren(sEIs[0]);
		
		assertNotNull(labelProvider.getDescription(webMethods[0]));
		
		assertNotSame(labelProvider.getDescription(null), labelProvider.getDescription(webMethods[0]));
		assertNotSame(labelProvider.getDescription(testPrj1), labelProvider.getDescription(webMethods[0]));
	}
}
