blob: 3079b38a56b5a218a8fcf533251dfaf1dbe7873b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2007 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.tests.commands;
import org.eclipse.core.commands.AbstractHandlerWithState;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.IStateListener;
import org.eclipse.core.commands.State;
import org.eclipse.core.commands.common.CommandException;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.handlers.IHandlerActivation;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.tests.harness.util.UITestCase;
/**
* Tests various aspects of command state.
*
* @since 3.2
*/
public class StateTest extends UITestCase {
private static final class ObjectStateHandler extends
AbstractHandlerWithState {
Object currentValue;
public final Object execute(final ExecutionEvent event) {
getState(OBJECT_STATE_ID).setValue(OBJECT_CHANGED);
return OBJECT_CHANGED;
}
public final void handleStateChange(final State state,
final Object oldValue) {
if (OBJECT_STATE_ID.equals(state.getId())) {
currentValue = state.getValue();
}
}
}
private static final class StateListener implements IStateListener {
Object currentValue;
public final void handleStateChange(final State state,
final Object oldValue) {
if (OBJECT_STATE_ID.equals(state.getId())) {
currentValue = state.getValue();
}
}
}
/**
* The identifier of the command with state that we wish to test.
*/
private static final String COMMAND_ID = "org.eclipse.ui.tests.commandWithState";
/**
* The object to which the command is set as a test.
*/
private static final Object OBJECT_CHANGED = "CHANGED";
/**
* The object to which the command is set before the test starts.
*/
private static final Object OBJECT_INITIAL = "INITIAL";
/**
* The identifier of the state storing a simple object.
*/
private static final String OBJECT_STATE_ID = "OBJECT";
/**
* The object state handler.
*/
private ObjectStateHandler handler;
/**
* The handler activation for the object state handler.
*/
private IHandlerActivation handlerActivation;
/**
* Constructor for <code>StateTest</code>.
*
* @param name
* The name of the test
*/
public StateTest(String name) {
super(name);
}
protected final void doSetUp() {
// Reset the object state to the initial object.
final ICommandService commandService = (ICommandService) fWorkbench
.getService(ICommandService.class);
final Command command = commandService.getCommand(COMMAND_ID);
command.getState(OBJECT_STATE_ID).setValue(OBJECT_INITIAL);
// Register the object state handler.
handler = new ObjectStateHandler();
final IHandlerService handlerService = (IHandlerService) fWorkbench
.getService(IHandlerService.class);
handlerActivation = handlerService.activateHandler(COMMAND_ID, handler);
}
protected final void doTearDown() {
// Unregister the object state handler.
final IHandlerService handlerService = (IHandlerService) fWorkbench
.getService(IHandlerService.class);
handlerService.deactivateHandler(handlerActivation);
handlerActivation = null;
handler.dispose();
handler = null;
}
/**
* Tests that if the handler changes the state, a listener to the state
* retrieved from the command is notified.
*
* @throws CommandException
* Never.
*/
public final void testCommandNotifiedOfStateChange()
throws CommandException {
// Attach a listener to the state on the command.
final ICommandService commandService = (ICommandService) fWorkbench
.getService(ICommandService.class);
final Command command = commandService.getCommand(COMMAND_ID);
final State state = command.getState(OBJECT_STATE_ID);
final StateListener listener = new StateListener();
listener.currentValue = state.getValue();
state.addListener(listener);
// Check the initial state.
assertSame("The initial state was not correct", OBJECT_INITIAL,
listener.currentValue);
// Run the handler.
final IHandlerService handlerService = (IHandlerService) fWorkbench
.getService(IHandlerService.class);
handlerService.executeCommand(COMMAND_ID, null);
// Check the state.
assertSame(
"The state on the command after the handler changed was not correct",
OBJECT_CHANGED, listener.currentValue);
// Remove the listener.
state.removeListener(listener);
}
/**
* Tests that if the handler changes the state, the command reflects these
* changes.
*
* @throws CommandException
* Never.
*/
public final void testStateChangeReflectedInCommand()
throws CommandException {
// Get the command.
final ICommandService commandService = (ICommandService) fWorkbench
.getService(ICommandService.class);
final Command command = commandService.getCommand(COMMAND_ID);
// Check the initial state.
assertSame("The initial state was not correct", OBJECT_INITIAL, command
.getState(OBJECT_STATE_ID).getValue());
// Run the handler.
final IHandlerService handlerService = (IHandlerService) fWorkbench
.getService(IHandlerService.class);
handlerService.executeCommand(COMMAND_ID, null);
// Check the state.
assertSame(
"The state on the command after the handler changed was not correct",
OBJECT_CHANGED, command.getState(OBJECT_STATE_ID).getValue());
}
/**
* Tests that if the command changes the state, the handler reflects these
* changes.
*/
public final void testStateChangeReflectedInHandler() {
// Check the initial state.
assertSame("The initial state was not correct", OBJECT_INITIAL,
handler.currentValue);
// Change the state on the command.
final ICommandService commandService = (ICommandService) fWorkbench
.getService(ICommandService.class);
final Command command = commandService.getCommand(COMMAND_ID);
command.getState(OBJECT_STATE_ID).setValue(OBJECT_CHANGED);
// Check the state.
assertSame(
"The state on the command after the handler changed was not correct",
OBJECT_CHANGED, handler.currentValue);
}
}