package com.codeaffine.extras.ide.internal.delete;
import static java.util.Collections.emptyMap;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.expressions.EvaluationContext;
import org.eclipse.core.expressions.IEvaluationContext;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IPersistableElement;
import org.eclipse.ui.ISources;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.part.FileEditorInput;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import com.codeaffine.extras.ide.internal.delete.DeleteEditorFileHandler.DeleteEditorFilePrompter;
import com.codeaffine.extras.test.util.ProjectHelper;
import com.codeaffine.extras.test.util.ServiceHelper;
public class DeleteEditorFileHandler_ResourcePDETest {
@Rule
public ProjectHelper projectHelper = new ProjectHelper();
@Rule
public final TemporaryFolder tempFolder = new TemporaryFolder();
private IWorkbenchPage workbenchPage;
private DeleteEditorFilePrompter prompter;
private DeleteEditorFileHandler handler;
@Before
public void setUp() {
workbenchPage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
prompter = mock( DeleteEditorFilePrompter.class );
handler = spy( new DeleteEditorFileHandler( prompter ) );
doNothing().when( handler ).deleteResource( any(), any() );
}
@Test
public void testEnablementWithFileEditor() throws CoreException {
IFile file = projectHelper.createFile( "file.txt", "content" );
IEvaluationContext evaluationContext = createEvaluationContext( new FileEditorInput( file ) );
handler.setEnabled( evaluationContext );
assertThat( handler.isEnabled() ).isTrue();
}
@Test
public void testEnablementWithFolderEditor() throws CoreException {
IFolder folder = projectHelper.createFolder( "folder" );
IEditorInput editorInput = mock( IEditorInput.class );
when( editorInput.getAdapter( IResource.class ) ).thenReturn( folder );
IEvaluationContext evaluationContext = createEvaluationContext( editorInput );
handler.setEnabled( evaluationContext );
assertThat( handler.isEnabled() ).isFalse();
}
@Test
public void testEnablementWithNonResourceEditor() {
IEvaluationContext evaluationContext = createEvaluationContext( new NonFileEditorInput() );
handler.setEnabled( evaluationContext );
assertThat( handler.isEnabled() ).isFalse();
}
@Test
public void testEnablementWithoutActiveEditor() {
IEvaluationContext evaluationContext = createEvaluationContext( null );
handler.setEnabled( evaluationContext );
assertThat( handler.isEnabled() ).isFalse();
}
@Test
public void testEnablementWithNullEvaluationContext() {
handler.setEnabled( new Object() );
assertThat( handler.isEnabled() ).isFalse();
}
@Test
public void testEnablementWithIrregularEvaluationContext() {
handler.setEnabled( new Object() );
assertThat( handler.isEnabled() ).isFalse();
}
@Test
public void testEnablementWithObjectAsEditorInput() {
IEvaluationContext evaluationContext = createEvaluationContext( new Object() );
handler.setEnabled( evaluationContext );
assertThat( handler.isEnabled() ).isFalse();
}
@Test
public void testExecuteWithExistingResource() throws CoreException {
IFile file = projectHelper.createFile( "file.txt", "content" );
IEvaluationContext evaluationContext = createEvaluationContext( new FileEditorInput( file ) );
ExecutionEvent event = createExecutionEvent( evaluationContext );
handler.execute( event );
verify( handler ).deleteResource( workbenchPage.getWorkbenchWindow(), file );
}
@Test
public void testExecuteWithNonExistingResource() throws CoreException {
IFile file = projectHelper.createFile( "file.txt", "content" );
file.delete( true, new NullProgressMonitor() );
IEvaluationContext evaluationContext = createEvaluationContext( new FileEditorInput( file ) );
ExecutionEvent event = createExecutionEvent( evaluationContext );
handler.execute( event );
verify( handler, never() ).deleteResource( any(), any() );
}
@Test
public void testExecuteWithNonResourceEditor() {
IEvaluationContext evaluationContext = createEvaluationContext( new NonFileEditorInput() );
ExecutionEvent event = createExecutionEvent( evaluationContext );
handler.execute( event );
verify( handler, never() ).deleteResource( any(), any() );
}
private ExecutionEvent createExecutionEvent( IEvaluationContext evaluationContext ) {
return new ExecutionEvent( getDeleteEditorFileCommand(), emptyMap(), null, evaluationContext );
}
private Command getDeleteEditorFileCommand() {
IWorkbench workbench = workbenchPage.getWorkbenchWindow().getWorkbench();
ICommandService commandService = ServiceHelper.getService( workbench, ICommandService.class );
return commandService.getCommand( DeleteEditorFileHandler.COMMAND_ID );
}
private IEvaluationContext createEvaluationContext( Object editorInput ) {
IWorkbenchWindow activeWorkbenchWindow = workbenchPage.getWorkbenchWindow();
IEvaluationContext result = new EvaluationContext( null, new Object() );
result.addVariable( ISources.ACTIVE_WORKBENCH_WINDOW_NAME, activeWorkbenchWindow );
if( editorInput != null ) {
result.addVariable( ISources.ACTIVE_EDITOR_INPUT_NAME, editorInput );
}
return result;
}
private static class NonFileEditorInput implements IEditorInput {
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public Object getAdapter( Class adapter ) {
return null;
}
@Override
public boolean exists() {
return false;
}
@Override
public ImageDescriptor getImageDescriptor() {
return null;
}
@Override
public String getName() {
return "test-editor-input";
}
@Override
public IPersistableElement getPersistable() {
return null;
}
@Override
public String getToolTipText() {
return "";
}
}
}