/*******************************************************************************
 * 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.sync;

import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.JavaModelException;
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.dom.runtime.persistence.JaxWsWorkspaceResource.ServiceModelData;
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.sync.AbstractModelSynchronizer;
import org.eclipse.jst.ws.jaxws.testutils.jmock.Mock;
import org.eclipse.jst.ws.jaxws.testutils.jmock.MockObjectTestCase;

/**
 * Tests for {@link AbstractModelSynchronizer} class, methods not covered in this test
 * are covered implicitly by {@link ModelSynchronizationTests}.
 * 
 * @author Georgi Vachkov
 */
public class AbstractModelSynchronizerTest extends MockObjectTestCase
{
	private AbstractModelSynchronizerTester modelSync;
	private JaxWsWorkspaceResource resource;
	
	@Override
	public void setUp()
	{
		Mock<IJavaModel> javaModelMock = mock(IJavaModel.class);
		resource = new JaxWsWorkspaceResource(javaModelMock.proxy());
		
		modelSync = new AbstractModelSynchronizerTester(resource, resource.new ServiceModelData()){};
	}
	
	public void testProcessCompilationUnitEditEnabledDespiteNPE() throws JavaModelException 
	{
		assertTrue(resource.isSaveEnabled());
		try {
			modelSync.processCompilationUnit(null, null);
		} catch (NullPointerException _) {
		}
		assertTrue(resource.isSaveEnabled());
	}		
	
	public void testProcessCompilationUnitEditEnabledNormalExecution() throws JavaModelException 
	{
		assertTrue(resource.isSaveEnabled());
		Mock<ICompilationUnit> cuMock = mock(ICompilationUnit.class);
		cuMock.expects(once()).method("findPrimaryType").will(returnValue(null));			
		modelSync.processCompilationUnit(null, cuMock.proxy());
		assertTrue(resource.isSaveEnabled());
	}			
	
	public class AbstractModelSynchronizerTester extends AbstractModelSynchronizer
	{
		public AbstractModelSynchronizerTester(JaxWsWorkspaceResource resource, ServiceModelData serviceData) {
			super(resource, serviceData);
		}
		
		protected void processCompilationUnit(final IWebServiceProject wsProject, final ICompilationUnit cu) throws JavaModelException
		{
			super.processCompilationUnit(wsProject, cu);
		}		
	}
}
