/*******************************************************************************
 * 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;

import java.util.Collection;

import junit.framework.TestCase;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IWsDOMRuntimeExtension;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.WsDOMRuntimeManager;
import org.eclipse.jst.ws.jaxws.dom.runtime.registry.IWsDOMRuntimeInfo;
import org.eclipse.jst.ws.jaxws.dom.runtime.registry.WsDOMRuntimeRegistry;

public class WsDOMRuntimeManagerTest extends TestCase
{
	private WsDOMRuntimeManager target;
	
	@Override
	public void setUp() 
	{
		target = (WsDOMRuntimeManager)WsDOMRuntimeManager.instance();
	}
	
	public void testGetDOMRuntimeForRuntimeInfo()
	{
		Collection<IWsDOMRuntimeInfo> registeredRuntimes = WsDOMRuntimeRegistry.getRegisteredRuntimesInfo();
		
		assertNotNull(target.getDOMRuntime(registeredRuntimes.iterator().next()));
		
		IWsDOMRuntimeExtension runtime = target.getDOMRuntime(registeredRuntimes.iterator().next());
		
		assertEquals(runtime, target.getDOMRuntime(registeredRuntimes.iterator().next()));
		
		registeredRuntimes = WsDOMRuntimeRegistry.getRegisteredRuntimesInfo();
		
		assertEquals(runtime, target.getDOMRuntime(registeredRuntimes.iterator().next()));
	}

	public void testGetDOMRuntimeForRuntimeId()
	{
		assertNotNull(target.getDOMRuntime("supportedruntimetest"));
		assertNull(target.getDOMRuntime("test.id"));
		assertEquals(target.getDOMRuntime("supportedruntimetest"), target.getDOMRuntime("supportedruntimetest"));
	}
	
	public void testCreateDOMRuntimes()
	{
		target.createDOMRuntimes(null);
		
		assertNotNull(target.getDOMRuntime("supportedruntimetest"));
		assertNotNull(target.getDOMRuntime("supportedruntimetest1"));
	}
	
	public void testEarlyStartup()
	{
		IConfigurationElement[] confElements = Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.ui.startup").getConfigurationElements();
		
		for(int ii=0; ii<confElements.length; ii++)
		{
			if("org.eclipse.jst.ws.jaxws.dom.runtime.WsDomStartupParticipant".equals(confElements[ii].getAttribute("class")))
			{
				return;
			}
		}
		
		fail("The early startup for DOM Model is not defined !");
	}
	
	public void testReloadDOMRuntimes()
	{
		target.reloadDOMRuntimes(null);
		
		IWsDOMRuntimeExtension domRuntime = target.getDOMRuntime("supportedruntimetest");
		IWsDOMRuntimeExtension domRuntime1 = target.getDOMRuntime("supportedruntimetest1");
			
		target.reloadDOMRuntimes(null);
		
		assertNotSame(domRuntime,target.getDOMRuntime(WsDOMRuntimeRegistry.getRuntimeInfo("supportedruntimetest").getId()));
		assertNotSame(domRuntime1,target.getDOMRuntime(WsDOMRuntimeRegistry.getRuntimeInfo("supportedruntimetest1").getId()));
	}
	
	public void testGetDOMRuntimes()
	{
		IWsDOMRuntimeExtension domRuntime = target.getDOMRuntime("supportedruntimetest");		
		assertNotNull(domRuntime);
		assertTrue(domRuntime instanceof TestWsDOMRuntimeExtension);
		
		IWsDOMRuntimeExtension domRuntime1 = target.getDOMRuntime("supportedruntimetest1");		
		assertNotNull(domRuntime1);
		assertTrue(domRuntime1 instanceof TestWsDOMRuntimeExtension);		
		
		IWsDOMRuntimeExtension domRuntime2 = target.getDOMRuntime("supportedruntimetest2");
		assertNull(domRuntime2);
	}
	
	public void testCreateDOMPassesProgressMonitor()
	{
		MyWsDomRuntimeManager manager = new MyWsDomRuntimeManager();
		IWsDOMRuntimeInfo info = WsDOMRuntimeRegistry.getRuntimeInfo("supportedruntimetest1");
		NullProgressMonitor npm = new NullProgressMonitor();
		IWsDOMRuntimeExtension rtEx = manager.createDOMRuntime(info, npm);
		assertTrue(rtEx instanceof TestWsDOMRuntimeExtension);
		assertEquals(npm, ((TestWsDOMRuntimeExtension)rtEx).monitor);		
	}
	
	private class MyWsDomRuntimeManager extends WsDOMRuntimeManager
	{
		protected IWsDOMRuntimeExtension createDOMRuntime(final IWsDOMRuntimeInfo runtimeInfo, final IProgressMonitor monitor) {
			return super.createDOMRuntime(runtimeInfo, monitor);
		}
	}
}
