blob: fb8c1b431eb03294237ac6f64975caa061dc9417 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2017 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.ui.tests.contexts;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.CommandManager;
import org.eclipse.core.commands.ParameterizedCommand;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.core.commands.contexts.Context;
import org.eclipse.core.commands.contexts.ContextManager;
import org.eclipse.core.commands.contexts.IContextManagerListener;
import org.eclipse.jface.bindings.Binding;
import org.eclipse.jface.bindings.BindingManager;
import org.eclipse.jface.bindings.Scheme;
import org.eclipse.jface.bindings.keys.KeyBinding;
import org.eclipse.jface.bindings.keys.KeySequence;
import org.eclipse.jface.bindings.keys.ParseException;
import org.eclipse.jface.contexts.IContextIds;
import org.eclipse.ui.tests.harness.util.UITestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
* A test case covering the scenario described in Bug 84763. The problem was
* that the context manager was exposing its internal data structures, and the
* binding manager was mangling them. Debug then responded to bad information in
* the <code>previouslyEnabledContextIds</code> property on the context event.
*
* @since 3.1
*/
@RunWith(JUnit4.class)
public final class Bug84763Test extends UITestCase {
/**
* The binding manager to use in each test case. A new binding manager is
* created for each test case, and it is disposed when the test is over.
*/
private BindingManager bindingManager = null;
/**
* The context manager to use in each test case. A new context manager is
* created for each test case, and it is disposed when the test is over.
*/
private ContextManager contextManager = null;
/**
* The context manager listener to use in each test case. A new context
* manager listener is created for each test case, and it is disposed when
* the test is over.
*/
private IContextManagerListener contextManagerListener = null;
/**
* The set of the previous context identifiers returned by the last context
* manager event. This value is set to <code>null</code> at the end of
* each test.
*/
private Set<String> previousContextIds = null;
/**
* Constructor for <code>Bug84763Test</code>.
*/
public Bug84763Test() {
super(Bug84763Test.class.getSimpleName());
}
/**
* Creates a new context manager and a binding manager for use in the test
* cases.
*/
@Override
protected void doSetUp() {
contextManager = new ContextManager();
contextManagerListener = contextManagerEvent -> {
previousContextIds = contextManagerEvent.getPreviouslyActiveContextIds();
if (previousContextIds != null) {
previousContextIds = new HashSet<>(previousContextIds);
}
};
contextManager.addContextManagerListener(contextManagerListener);
bindingManager = new BindingManager(contextManager, new CommandManager());
}
/**
* Releases the context manager and binding manager for garbage collection.
*/
@Override
protected void doTearDown() {
contextManager = null;
contextManagerListener = null;
previousContextIds = null;
bindingManager = null;
}
/**
* <p>
* Testst whether the binding manager will overwrite information in the
* context manager. In particular, whether the list of previous enabled
* context identifiers will be changed.
* </p>
*
* @throws NotDefinedException
* If the scheme we try to activate is not defined.
* @throws ParseException
* If "CTRL+F" cannot be parsed for some reason.
*/
@Test
public void testWindowChildWhenDialog() throws NotDefinedException,
ParseException {
// Define the contexts to use.
final Context dialogAndWindowsContext = contextManager
.getContext(IContextIds.CONTEXT_ID_DIALOG_AND_WINDOW);
dialogAndWindowsContext.define("In Dialogs and Windows", null, null);
final Context dialogContext = contextManager
.getContext(IContextIds.CONTEXT_ID_DIALOG);
dialogContext.define("In Dialogs", null,
IContextIds.CONTEXT_ID_DIALOG_AND_WINDOW);
final Context windowContext = contextManager
.getContext(IContextIds.CONTEXT_ID_WINDOW);
windowContext.define("In Windows", null,
IContextIds.CONTEXT_ID_DIALOG_AND_WINDOW);
final Context windowChildContext = contextManager.getContext("sibling");
windowChildContext.define("Sibling", null,
IContextIds.CONTEXT_ID_WINDOW);
// Force a binding computation.
final Scheme scheme = bindingManager.getScheme("na");
scheme.define("name", null, null);
bindingManager.setActiveScheme(scheme);
final CommandManager commandManager = new CommandManager();
final Command command = commandManager.getCommand("commandId");
final ParameterizedCommand parameterizedCommand = new ParameterizedCommand(
command, null);
bindingManager.addBinding(new KeyBinding(KeySequence
.getInstance("CTRL+F"), parameterizedCommand, scheme.getId(),
windowChildContext.getId(), null, null, null, Binding.SYSTEM));
bindingManager.getActiveBindingsFor((ParameterizedCommand) null);
// Activate the dialog context and the sibling.
final Set<String> activeContextIds = new HashSet<>();
activeContextIds.add(IContextIds.CONTEXT_ID_DIALOG);
activeContextIds.add(IContextIds.CONTEXT_ID_DIALOG_AND_WINDOW);
activeContextIds.add(windowChildContext.getId());
contextManager.setActiveContextIds(activeContextIds);
// Force a binding computation.
bindingManager.getActiveBindingsFor((ParameterizedCommand) null);
// Active the window context.
activeContextIds.remove(IContextIds.CONTEXT_ID_DIALOG);
activeContextIds.add(IContextIds.CONTEXT_ID_WINDOW);
contextManager.setActiveContextIds(activeContextIds);
// Force a binding computation.
bindingManager.getActiveBindingsFor((ParameterizedCommand) null);
/*
* Check to see what the listener got as the list of previously active
* context identifiers.
*/
assertEquals("There should have been 3 context ids active previously",
3, previousContextIds.size());
assertTrue("The previous contexts should include the dialog context",
previousContextIds.contains(IContextIds.CONTEXT_ID_DIALOG));
assertTrue("The previous contexts should include the dialog context",
previousContextIds
.contains(IContextIds.CONTEXT_ID_DIALOG_AND_WINDOW));
assertTrue("The previous contexts should include the dialog context",
previousContextIds.contains(windowChildContext.getId()));
System.out.println("testSiblingContext");
}
}