/*******************************************************************************
 * 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.dom.persistence.defaults;

import junit.framework.TestCase;

import org.eclipse.jst.ws.jaxws.dom.runtime.IPropertyDefaults;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.DomFactory;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.DomPackage;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IServiceEndpointInterface;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IWebMethod;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IWebParam;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.SOAPBindingParameterStyle;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.SOAPBindingStyle;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.SOAPBindingUse;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.WebParamKind;
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.defaults.ParameterPropertyDefaultsAdapter;
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.defaults.PropertyDefaultsAdapterFactory;

/**
 * Tests for {@link IWebParam} properties default values
 * 
 * @author Georgi Vachkov
 */
public class ParameterPropertyDefaultsAdapterTest extends TestCase 
{
	private IWebMethod webMethod;
	private IWebParam webParam;
	private IPropertyDefaults defaults;
	
	public void setUp() 
	{
		webMethod = DomFactory.eINSTANCE.createIWebMethod();
		webMethod.setSoapBindingStyle(SOAPBindingStyle.DOCUMENT);
		webMethod.setSoapBindingUse(SOAPBindingUse.LITERAL);
		webMethod.setSoapBindingParameterStyle(SOAPBindingParameterStyle.WRAPPED);
		
		webParam = DomFactory.eINSTANCE.createIWebParam();
		webParam.eSet(DomPackage.Literals.IJAVA_WEB_SERVICE_ELEMENT__IMPLEMENTATION, "myParam");
		
		IWebParam dummy = DomFactory.eINSTANCE.createIWebParam();
		dummy.eSet(DomPackage.Literals.IJAVA_WEB_SERVICE_ELEMENT__IMPLEMENTATION, "dummy");
		
		webMethod.getParameters().add(dummy);
		webMethod.getParameters().add(webParam);
		
		defaults = (IPropertyDefaults)PropertyDefaultsAdapterFactory.INSTANCE.adapt(webParam, IPropertyDefaults.class);
	}
	
	public void testNameDefaultValue() 
	{
		webParam.setName("test");
		assertEquals("arg1", defaults.getDefault(DomPackage.Literals.IJAVA_WEB_SERVICE_ELEMENT__NAME));
	}
	
	public void testPartNameDefaultValue()
	{
		webParam.setPartName("test");
		assertEquals("arg1", defaults.getDefault(DomPackage.Literals.IWEB_PARAM__PART_NAME));
	}
	
	public void testPartNameMethodParamStyleBare()
	{
		webMethod.setSoapBindingParameterStyle(SOAPBindingParameterStyle.BARE);
		webMethod.setName("test");
		assertEquals("test", defaults.getDefault(DomPackage.Literals.IJAVA_WEB_SERVICE_ELEMENT__NAME));
	}
	
	public void testTargetNSDefaultValue()
	{
		webParam.setTargetNamespace("test");
		assertEquals("", defaults.getDefault(DomPackage.Literals.IWEB_PARAM__TARGET_NAMESPACE));
	}
	
	public void testTargetNSParamInHeaderDefaultValue()
	{
		IServiceEndpointInterface sei = DomFactory.eINSTANCE.createIServiceEndpointInterface();
		sei.setTargetNamespace("http://test");
		
		sei.getWebMethods().add(webMethod);
		
		webParam.setHeader(true);
		assertEquals("http://test", defaults.getDefault(DomPackage.Literals.IWEB_PARAM__TARGET_NAMESPACE));	
	}
	
	public void testHeaderDefaultValue()
	{
		assertEquals(false, defaults.getDefault(DomPackage.Literals.IWEB_PARAM__HEADER));	
	}
	
	public void testKindDefaultValue() 
	{
		assertEquals(WebParamKind.IN, defaults.getDefault(DomPackage.Literals.IWEB_PARAM__KIND));
	}
	
	public void testAdaptedOnce()
	{
		IPropertyDefaults adapter = (IPropertyDefaults)PropertyDefaultsAdapterFactory.INSTANCE.adapt(webParam, IPropertyDefaults.class);
		assertTrue(adapter instanceof ParameterPropertyDefaultsAdapter);
		
		assertEquals(1, webParam.eAdapters().size());
		assertEquals(defaults, adapter);
	}	
}
