/*******************************************************************************
 * 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.utils.tests.internal;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.IBuffer;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jst.ws.jaxws.testutils.jmock.Mock;
import org.eclipse.jst.ws.jaxws.testutils.jmock.MockObjectTestCase;
import org.eclipse.jst.ws.jaxws.utils.StatusUtils;
import org.eclipse.jst.ws.jaxws.utils.resources.FileUtils;
import org.eclipse.jst.ws.jaxws.utils.resources.IFileUtils;
import org.jmock.core.constraint.IsEqual;
import org.jmock.core.constraint.IsSame;

public class FileUtilsUnitTest extends MockObjectTestCase
{
	private final IFileUtils fileUtils = FileUtils.getInstance();
	private Mock<ICompilationUnit> cuMock;
	private final IProgressMonitor monitor = new NullProgressMonitor();
	
	@Override
	protected void setUp() throws Exception
	{
		cuMock = mock(ICompilationUnit.class);
	}
	
	public void testSetCompilationUnitContentDealsCorrectlyWithWorkingCopy() throws JavaModelException
	{
		final String testContent = "MyTestContent";
		final Mock<IBuffer> bufferMock = mock(IBuffer.class);
		bufferMock.expects(once()).method("setContents").with(new IsSame(testContent));
		
		cuMock.expects(once()).method("becomeWorkingCopy");
		cuMock.expects(once()).method("getBuffer").will(returnValue(bufferMock.proxy()));
		cuMock.expects(once()).method("commitWorkingCopy").with(new IsEqual(true), new IsSame(monitor));
		cuMock.expects(once()).method("discardWorkingCopy");

		fileUtils.setCompilationUnitContent(cuMock.proxy(), testContent, true, monitor);
	}
	
	public void testSetCompilationUnitContentDoesNotDiscardWorkingCopyOnJME()
	{
		final JavaModelException testException = new JavaModelException(new CoreException(StatusUtils.statusError("TEST")));
		cuMock.expects(once()).method("becomeWorkingCopy").will(throwException(testException));
		cuMock.expects(never()).method("discardWorkingCopy");
		cuMock.expects(never()).method("commitWorkingCopy");
		
		try
		{
			fileUtils.setCompilationUnitContent(cuMock.proxy(), "123", true, monitor);
		}
		catch(JavaModelException e)
		{
			assertTrue("Test exception was not caught", e == testException);
		}
	}
	
	public void testSetCuContentSavesDirtyEditors() throws JavaModelException
	{
		final boolean[] saveEditorInvoked = new boolean[]{false};
		final boolean[] setContentsInvoked = new boolean[]{false};
		
		final IFileUtils myFileUtils = new FileUtils(){
			public boolean isCompilationUnitDisplayedInDirtyEditor(final ICompilationUnit cu)
			{
				assertTrue("Unexpected compilation unit", cu == cuMock.proxy());
				return true;
			}
			
			@Override
			public void saveEditor(final ICompilationUnit cu)
			{
				assertTrue("Save editors invoked before set CU content", setContentsInvoked[0]);
				assertTrue("Unexpected compilation unit", cu == cuMock.proxy());
				saveEditorInvoked[0] = true;
			}
			
			@Override
			public void setCompilationUnitContent(ICompilationUnit unit, String content, boolean force, IProgressMonitor monitor)
											throws JavaModelException
			{
				assertFalse("Set CU content invoked after editor saved", saveEditorInvoked[0]);
				assertEquals("Unexpected CU content", "MyContent", content);
				setContentsInvoked[0] = true;
			}
		};
		
		myFileUtils.setCompilationUnitContentAndSaveDirtyEditors(cuMock.proxy(), "MyContent", true, null);
		assertTrue("Set contents not invoked", setContentsInvoked[0]);
		assertTrue("Save editors not invoked", saveEditorInvoked[0]);
	}
	
	public void testSetCuContentDoesNotSavesCleanEditors() throws JavaModelException
	{
		final boolean[] isDisplayedInvoked = new boolean[]{false};
		final boolean[] setContentsInvoked = new boolean[]{false};
		
		final IFileUtils myFileUtils = new FileUtils(){
			public boolean isCompilationUnitDisplayedInDirtyEditor(final ICompilationUnit cu)
			{
				assertTrue("Unexpected compilation unit", cu == cuMock.proxy());
				isDisplayedInvoked[0] = true;
				return false;
			}
			
			@Override
			public void saveEditor(final ICompilationUnit cu)
			{
				fail("Unexpected invocation");
			}
			
			@Override
			public void setCompilationUnitContent(ICompilationUnit unit, String content, boolean force, IProgressMonitor monitor)
											throws JavaModelException
			{
				assertFalse("Set CU content invoked after editor saved", isDisplayedInvoked[0]);
				assertEquals("Unexpected CU content", "MyContent", content);
				setContentsInvoked[0] = true;
			}
		};
		
		myFileUtils.setCompilationUnitContentAndSaveDirtyEditors(cuMock.proxy(), "MyContent", true, null);
		assertTrue("Set contents not invoked", setContentsInvoked[0]);
		assertTrue("Is displayed in dirty editor not invoked", isDisplayedInvoked[0]);
	}
	
}
