blob: 7965ec1908da2866ea0ac1f808349373cc05e879 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2016 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ua.tests.cheatsheet.execution;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Map;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.NotEnabledException;
import org.eclipse.core.commands.NotHandledException;
import org.eclipse.core.commands.ParameterizedCommand;
import org.eclipse.core.commands.SerializationException;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.internal.cheatsheets.CommandRunner;
import org.eclipse.ui.internal.cheatsheets.data.CheatSheetCommand;
import org.eclipse.ui.internal.cheatsheets.registry.CheatSheetElement;
import org.eclipse.ui.internal.cheatsheets.views.CheatSheetManager;
import org.junit.Before;
import org.junit.Test;
/**
* Tests which exercise the CommandRunner class
*/
public class TestCommandExecution {
private static final String PARAM2_VALUE = "bar"; //$NON-NLS-1$
private static final String PARAM1_VALUE = "foo"; //$NON-NLS-1$
private static final String PARAM1_ID = "param1_id"; //$NON-NLS-1$
private static final String PARAM2_ID = "param2_id"; //$NON-NLS-1$
private static final String COMMAND_ID =
"org.eclipse.ui.cheatsheets.tests.command1"; //$NON-NLS-1$
private static final String SERIALIZED_COMMAND = COMMAND_ID + '('
+ PARAM1_ID + '=' + PARAM1_VALUE + ','
+ PARAM2_ID + '=' + PARAM2_VALUE + ')';
private static final String RETURN_STORE = "retData";
private static final String PARENT_RETURN_STORE = "parent.retData";
@Before
public void setUp() throws Exception {
CommandHandler.reset();
}
public CheatSheetManager createManager() {
CheatSheetElement element = new CheatSheetElement("Name");
element.setID("TestCommandExecutionId");
return new CheatSheetManager(element);
}
private ICommandService getService() {
IWorkbench wb = PlatformUI.getWorkbench();
Object serviceObject = wb.getAdapter(ICommandService.class);
if (serviceObject != null) {
ICommandService service = (ICommandService)serviceObject;
return service;
}
return null;
}
private IHandlerService getHandlerService() {
IWorkbench wb = PlatformUI.getWorkbench();
if (wb != null) {
Object serviceObject = wb.getAdapter(IHandlerService.class);
if (serviceObject != null) {
IHandlerService service = (IHandlerService)serviceObject;
return service;
}
}
return null;
}
/**
* Execute a command without using the command runner class
*/
@Test
public void testExecuteCommand() {
ParameterizedCommand selectedCommand;
try {
selectedCommand = getService().deserialize(SERIALIZED_COMMAND);
getHandlerService().executeCommand(selectedCommand, null);
} catch (NotDefinedException e) {
fail("Command not defined");
} catch (SerializationException e) {
fail("Bad serialization");
} catch (ExecutionException e) {
fail("Execution exception");
} catch (NotEnabledException e) {
fail("Not enabled exception");
} catch (NotHandledException e) {
fail("Not handled exception");
}
checkCommandExecution();
}
private void checkCommandExecution() {
assertTrue(CommandHandler.getTimesCompleted() == 1);
Map<?, ?> params = CommandHandler.getParams();
assertEquals(2, params.size());
assertTrue(params.containsKey(PARAM1_ID));
assertEquals(PARAM1_VALUE, params.get(PARAM1_ID));
assertTrue(params.containsKey(PARAM2_ID));
assertEquals(PARAM2_VALUE, params.get(PARAM2_ID));
}
@Test
public void testCommandRunner() {
CheatSheetCommand command = new CheatSheetCommand();
CheatSheetManager csm = createManager();
command.setSerialization(SERIALIZED_COMMAND);
IStatus status = new CommandRunner().executeCommand(command, csm);
assertTrue(status.isOK());
checkCommandExecution();
}
@Test
public void testCommandWithResult() {
CheatSheetCommand command = new CheatSheetCommand();
CheatSheetManager csm = createManager();
command.setSerialization(SERIALIZED_COMMAND);
command.setReturns(RETURN_STORE);
IStatus status = new CommandRunner().executeCommand(command, csm);
assertTrue(status.isOK());
String result = csm.getData(RETURN_STORE);
assertNotNull(result);
assertEquals(CommandHandler.RESULT_TO_STRING, result);
checkCommandExecution();
}
/**
* Test that if the return is set to parent.retData the
* return value is written to the parent cheat sheet manager.
*/
@Test
public void testCommandWithQualifiedResult() {
CheatSheetCommand command = new CheatSheetCommand();
CheatSheetManager csm = createManager();
CheatSheetManager parentManager = createManager();
csm.setParent(parentManager);
command.setSerialization(SERIALIZED_COMMAND);
command.setReturns(PARENT_RETURN_STORE);
IStatus status = new CommandRunner().executeCommand(command, csm);
assertTrue(status.isOK());
assertNull(csm.getData(RETURN_STORE));
assertNotNull(parentManager.getData(RETURN_STORE));
}
@Test
public void testInvalidCommandId() {
CheatSheetCommand command = new CheatSheetCommand();
CheatSheetManager csm = createManager();
command.setSerialization(COMMAND_ID + ".invalid"); //$NON-NLS-1$
IStatus status = new CommandRunner().executeCommand(command, csm);
assertFalse(status.isOK());
}
@Test
public void testCommandException() {
CheatSheetCommand command = new CheatSheetCommand();
CheatSheetManager csm = createManager();
command.setSerialization(SERIALIZED_COMMAND);
CommandHandler.setThrowException(true);
IStatus status = new CommandRunner().executeCommand(command, csm);
assertFalse(status.isOK());
}
private static final String NEGATE_INTEGER_COMMAND_ID = "org.eclipse.ui.cheatsheets.tests.NegateIntegerCommand(number=123)";
private static final String INT_RETURN_STORE = "intData";
@Test
public void testCommandWithIntegerValues() {
CheatSheetCommand command = new CheatSheetCommand();
CheatSheetManager csm = createManager();
command.setSerialization(NEGATE_INTEGER_COMMAND_ID);
command.setReturns(INT_RETURN_STORE);
IStatus status = new CommandRunner().executeCommand(command, csm);
assertTrue(status.isOK());
String result = csm.getData(INT_RETURN_STORE);
assertNotNull(result);
assertEquals("-123", result);
}
}