/*******************************************************************************
* Copyright (c) 2010 SAP AG.
* 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:
* Emil Simeonov - initial API and implementation.
* Dimitar Donchev - initial API and implementation.
* Dimitar Tenev - initial API and implementation.
* Nevena Manova - initial API and implementation.
* Georgi Konstantinov - initial API and implementation.
*******************************************************************************/
package org.eclipse.wst.sse.sieditor.test.ui.v2.resources;
import static org.easymock.EasyMock.aryEq;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.ui.IStorageEditorInput;
import org.eclipse.ui.PartInitException;
import org.eclipse.wst.sse.sieditor.test.util.SIEditorBaseTest;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.w3c.dom.Document;
import org.eclipse.wst.sse.sieditor.command.common.AbstractNotificationOperation;
import org.eclipse.wst.sse.sieditor.model.api.IModelObject;
import org.eclipse.wst.sse.sieditor.model.api.IModelRoot;
import org.eclipse.wst.sse.sieditor.model.api.IXSDModelRoot;
import org.eclipse.wst.sse.sieditor.model.utils.HiddenErrorStatus;
import org.eclipse.wst.sse.sieditor.model.utils.ResourceUtils;
import org.eclipse.wst.sse.sieditor.model.utils.StatusUtils;
import org.eclipse.wst.sse.sieditor.ui.AbstractEditorWithSourcePage;
import org.eclipse.wst.sse.sieditor.ui.preedit.EditValidator;
public class TestCanEditResource extends SIEditorBaseTest {
@Override
@Before
public void setUp() throws Exception {
super.setUp();
StatusUtils.isUnderJunitExecution = true;
}
@Override
@After
public void tearDown() throws Exception {
super.tearDown();
StatusUtils.isUnderJunitExecution = false;
ResourceUtils.resetInstance();
}
@Test
public void testAbstractNotificationOperationCallsCanEditFromIEditValidator() throws Exception {
final IFile file = org.eclipse.wst.sse.sieditor.test.util.ResourceUtils.copyFileIntoTestProject("pub/xsd/example.xsd",
Document_FOLDER_NAME, this.getProject(), "example.xsd");
refreshProjectNFile(file);
final IXSDModelRoot modelRoot = this.getXSDModelRoot(file);
final IWorkspace mockWorkspace = createMock(IWorkspace.class);
expect(mockWorkspace.validateEdit(aryEq(new IFile[] { file }), eq(IWorkspace.VALIDATE_PROMPT))).andReturn(
Status.OK_STATUS);
expect(mockWorkspace.isTreeLocked()).andReturn(false).anyTimes();
replay(mockWorkspace);
final AbstractEditorWithSourcePageTest editor = new AbstractEditorWithSourcePageTest(modelRoot, true);
final EditValidatorTest validator = new EditValidatorTest(editor, mockWorkspace);
final AbstractNotificationOperationForTest anyCommand = new AbstractNotificationOperationForTest(modelRoot, modelRoot
.getSchema(), "Test command");
modelRoot.getEnv().setEditValidator(validator);
modelRoot.getEnv().execute(anyCommand);
assertTrue(anyCommand.run);
verify(mockWorkspace);
}
@Test
public void testCanEditOnReadOnlyResourceWithErrorStatus() throws Exception {
final IFile file = createMock(IFile.class);
expect(file.isReadOnly()).andReturn(true);
replay(file);
final IWorkspace mockWorkspace = createMock(IWorkspace.class);
expect(mockWorkspace.validateEdit(aryEq(new IFile[] { file }), eq(IWorkspace.VALIDATE_PROMPT))).andReturn(
Status.OK_STATUS);
replay(mockWorkspace);
final AbstractEditorWithSourcePageTest editor = new AbstractEditorWithSourcePageTest(true);
final EditValidatorTest validator = new EditValidatorTest(null, mockWorkspace);
assertEquals(HiddenErrorStatus.class, validator.canEditTest(file).getClass());
verify(mockWorkspace);
verify(file);
}
@Test
public void testCanEditDirivedResourceAssertThatCanNot() throws Exception {
final IFile file = createMock(IFile.class);
expect(file.isReadOnly()).andReturn(false);
replay(file);
final IWorkspace mockWorkspace = createMock(IWorkspace.class);
expect(mockWorkspace.validateEdit(aryEq(new IFile[] { file }), eq(IWorkspace.VALIDATE_PROMPT))).andReturn(
Status.OK_STATUS);
expect(mockWorkspace.isTreeLocked()).andReturn(false).anyTimes();
replay(mockWorkspace);
final AbstractEditorWithSourcePageTest editor = new AbstractEditorWithSourcePageTest(false);
final EditValidatorTest validator = new EditValidatorTest(editor, mockWorkspace);
assertEquals(HiddenErrorStatus.class, validator.canEditTest(file).getClass());
verify(mockWorkspace);
verify(file);
}
@Test
public void testCanEditDirivedResourceAssertThatCan() throws Exception {
final IFile file = createMock(IFile.class);
expect(file.isReadOnly()).andReturn(false);
replay(file);
final IWorkspace mockWorkspace = createMock(IWorkspace.class);
expect(mockWorkspace.validateEdit(aryEq(new IFile[] { file }), eq(IWorkspace.VALIDATE_PROMPT))).andReturn(
Status.OK_STATUS);
expect(mockWorkspace.isTreeLocked()).andReturn(false).anyTimes();
replay(mockWorkspace);
final AbstractEditorWithSourcePageTest editor = new AbstractEditorWithSourcePageTest(true);
final EditValidatorTest validator = new EditValidatorTest(editor, mockWorkspace);
assertEquals(Status.OK_STATUS.getClass(), validator.canEditTest(file).getClass());
verify(mockWorkspace);
verify(file);
}
@Test
public void testCanEditDirivedResourceAssertThatCanWithWorkspaceTreeLocked() throws Exception {
final IFile file = createMock(IFile.class);
expect(file.isReadOnly()).andReturn(false);
replay(file);
final IWorkspace mockWorkspace = createMock(IWorkspace.class);
expect(mockWorkspace.validateEdit(aryEq(new IFile[] { file }), eq(IWorkspace.VALIDATE_PROMPT))).andReturn(
Status.OK_STATUS);
expect(mockWorkspace.isTreeLocked()).andReturn(true).anyTimes();
replay(mockWorkspace);
final AbstractEditorWithSourcePageTest editor = new AbstractEditorWithSourcePageTest(true);
final EditValidatorTest validator = new EditValidatorTest(editor, mockWorkspace);
assertEquals(Status.OK_STATUS.getClass(), validator.canEditTest(file).getClass());
verify(mockWorkspace);
verify(file);
}
private class AbstractNotificationOperationForTest extends AbstractNotificationOperation {
public AbstractNotificationOperationForTest(final IModelRoot root, final IModelObject modelObject,
final String operationLabel) {
super(root, modelObject, operationLabel);
}
public boolean run = false;
@Override
public IStatus run(final IProgressMonitor monitor, final IAdaptable info) throws ExecutionException {
run = true;
return Status.OK_STATUS;
}
}
private class EditValidatorTest extends EditValidator {
private final IWorkspace mockWorkspace;
public EditValidatorTest(final AbstractEditorWithSourcePage editor, final IWorkspace mockWorkspace) {
super(editor);
this.mockWorkspace = mockWorkspace;
}
public IStatus canEditTest(final IFile file) {
return super.canEdit(file);
}
@Override
public IWorkspace getWorkspace() {
return mockWorkspace;
}
}
private class AbstractEditorWithSourcePageTest extends AbstractEditorWithSourcePage {
boolean resultFromValidateEditorInput;
public AbstractEditorWithSourcePageTest(final boolean resultFromValidateEditorInput) {
this.resultFromValidateEditorInput = resultFromValidateEditorInput;
}
public AbstractEditorWithSourcePageTest(final IModelRoot modelRoot, final boolean resultFromValidateEditorInput) {
this.resultFromValidateEditorInput = resultFromValidateEditorInput;
super.commonModel = modelRoot;
}
@Override
public boolean validateEditorInputState() {
// called
return resultFromValidateEditorInput;
}
@Override
protected void addExtraPages(final IStorageEditorInput in) throws PartInitException {
// TODO Auto-generated method stub
}
@Override
protected IModelRoot createModelRoot(final Document document) {
// TODO Auto-generated method stub
return null;
}
@Override
protected void validate() {
// TODO Auto-generated method stub
}
}
}