/*******************************************************************************
 * 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.runtime.tests.validation;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jst.ws.jaxws.dom.runtime.validation.provider.SeiImplementationValidator;
import org.eclipse.jst.ws.jaxws.testutils.project.ClassLoadingTest;

public class SEIImplementationValidatorTest extends ClassLoadingTest
{
	private static final String PCK = "org.eclipse.tests";

	@Override
	public void setUp() throws Exception
	{
		createJavaProject("src", PCK);
		createClasses("mock/SEITests.src");
	}

	public void testUseClassForSEI() throws Exception
	{
		try
		{
			IType seiType = getTestProject().getJavaProject().findType(PCK + ".SEIIsClass");
			new SeiImplementationValidator(seiType);
			assertTrue("IllegalArgumentException not thrown", false);
		} catch (IllegalArgumentException e)
		{
			assertTrue(true);
		}
	}

	/**
	 * Test wrong implementation via not same params and return type.
	 * 
	 * @throws JavaModelException
	 */
	public void testBeanDoesNotImplemetsSeiDifferentMethodParams() throws JavaModelException
	{
		IType seiType = getTestProject().getJavaProject().findType(PCK + ".INotImplemented");
		IType beanType = getTestProject().getJavaProject().findType(PCK + ".NotImplementedMethodParamsBean");

		SeiImplementationValidator validator = new SeiImplementationValidator(seiType);
		IStatus status = validator.validate(beanType);
		assertEquals("Status not correct", IStatus.ERROR, status.getSeverity());
	}

	/**
	 * Test wrong implementation different method exceptioins.
	 * 
	 * @throws JavaModelException
	 */
	public void testBeanDoesNotImplemetsSeiDifferentExceptions() throws JavaModelException
	{
		IType seiType = getTestProject().getJavaProject().findType(PCK + ".INotImplemented");
		IType beanType = getTestProject().getJavaProject().findType(PCK + ".NotImplementedMethodExceptionsBean");

		SeiImplementationValidator validator = new SeiImplementationValidator(seiType);
		IStatus status = validator.validate(beanType);
		assertEquals("Status not correct", IStatus.ERROR, status.getSeverity());
	}

	/**
	 * Tests the case when the bean implements the Sei by declaring the implementation.
	 * 
	 * @throws Exception
	 */
	public void testBeanImplementsSei() throws Exception
	{
		IType seiType = getTestProject().getJavaProject().findType(PCK + ".IImplemented");
		IType beanType = getTestProject().getJavaProject().findType(PCK + ".BeanImplementsSei");

		SeiImplementationValidator validator = new SeiImplementationValidator(seiType);
		IStatus status = validator.validate(beanType);
		assertEquals("Staus not correct", IStatus.OK, status.getSeverity());
	}

	/**
	 * Tests the case when the bean implements methods from Sei withot directly implementing it via java declaration.
	 * 
	 * @throws Exception
	 */
	public void testSEIImplemented() throws Exception
	{
		IType seiType = getTestProject().getJavaProject().findType(PCK + ".IImplemented");
		IType beanType = getTestProject().getJavaProject().findType(PCK + ".ImplementedBean");

		SeiImplementationValidator validator = new SeiImplementationValidator(seiType);
		IStatus status = validator.validate(beanType);
		assertEquals("Staus not correct", IStatus.OK, status.getSeverity());
	}

	public void testSEIImplementedExtended() throws Exception
	{
		IType seiType = getTestProject().getJavaProject().findType(PCK + ".IImplementedExtended");
		IType beanType = getTestProject().getJavaProject().findType(PCK + ".ImplementedExtendedBean");

		SeiImplementationValidator validator = new SeiImplementationValidator(seiType);
		IStatus status = validator.validate(beanType);
		assertEquals("Status not correct", IStatus.OK, status.getSeverity());
	}

	public void testSEIImplementedNonPublicMethods() throws Exception
	{
		IType seiType = getTestProject().getJavaProject().findType(PCK + ".IImplemented");
		IType beanType = getTestProject().getJavaProject().findType(PCK + ".ImplementedBean1");

		SeiImplementationValidator validator = new SeiImplementationValidator(seiType);
		IStatus status = validator.validate(beanType);
		assertEquals("Status not correct", IStatus.ERROR, status.getSeverity());
	}

	public void testSEIImplementedWrongExceptions() throws Exception
	{
		IType seiType = getTestProject().getJavaProject().findType(PCK + ".IExceptionsUsed");
		IType beanType = getTestProject().getJavaProject().findType(PCK + ".ExceptionsUsedBean");

		SeiImplementationValidator validator = new SeiImplementationValidator(seiType);
		IStatus status = validator.validate(beanType);
		assertEquals("Status not correct", IStatus.ERROR, status.getSeverity());
	}

	public void testSEIImplementedRightExceptions() throws Exception
	{
		IType seiType = getTestProject().getJavaProject().findType(PCK + ".IExceptionsUsed");
		IType beanType = getTestProject().getJavaProject().findType(PCK + ".ExceptionsUsedBean1");

		SeiImplementationValidator validator = new SeiImplementationValidator(seiType);
		IStatus status = validator.validate(beanType);
		assertEquals("Status not correct", IStatus.OK, status.getSeverity());
	}

}
