blob: 767113bd3dda57332d5e4a3a6fd4430f7c006f5e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2015 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
* Lars Vogel <Lars.Vogel@vogella.com> - Bug 474274
******************************************************************************/
package org.eclipse.e4.core.internal.tests.contexts;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import javax.inject.Inject;
import javax.inject.Named;
import org.eclipse.e4.core.contexts.ContextFunction;
import org.eclipse.e4.core.contexts.EclipseContextFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.contexts.RunAndTrack;
import org.junit.Test;
public class ActivationTest {
static public class TestRAT extends ContextFunction {
@Override
public Object compute(IEclipseContext context, String contextKey) {
IEclipseContext activeContext = context.getActiveLeaf();
// returns name of the context
return activeContext.get("debugString");
}
}
@Test
public void testContextActivation() {
IEclipseContext rootContext = EclipseContextFactory.create("root");
rootContext.set("testRAT", new TestRAT());
IEclipseContext child1 = rootContext.createChild("child1");
IEclipseContext child11 = child1.createChild("child11");
IEclipseContext child12 = child1.createChild("child12");
IEclipseContext child2 = rootContext.createChild("child2");
IEclipseContext child21 = child2.createChild("child21");
IEclipseContext child22 = child2.createChild("child22");
assertEquals(rootContext, rootContext.getActiveLeaf());
assertNull(rootContext.getActiveChild());
assertEquals("root", rootContext.get("testRAT"));
child12.activateBranch();
assertEquals(child12, rootContext.getActiveLeaf());
assertEquals(child1, rootContext.getActiveChild());
assertEquals("child12", rootContext.get("testRAT"));
assertEquals(child2, child2.getActiveLeaf());
assertNull(child2.getActiveChild());
assertEquals("child2", child2.get("testRAT"));
child21.activateBranch();
assertEquals(child21, rootContext.getActiveLeaf());
assertEquals(child2, rootContext.getActiveChild());
assertEquals("child21", rootContext.get("testRAT"));
assertEquals(child12, child1.getActiveLeaf());
assertEquals(child12, child1.getActiveChild());
assertEquals("child12", child1.get("testRAT"));
assertEquals(child21, child2.getActiveLeaf());
assertEquals(child21, child2.getActiveChild());
assertEquals("child21", child2.get("testRAT"));
child21.deactivate();
assertEquals(child2, rootContext.getActiveLeaf());
assertEquals("child2", rootContext.get("testRAT"));
assertEquals(child12, child1.getActiveLeaf());
assertEquals("child12", child1.get("testRAT"));
assertEquals(child2, child2.getActiveLeaf());
assertNull(child2.getActiveChild());
assertEquals("child2", child2.get("testRAT"));
child22.activateBranch();
assertEquals(child22, rootContext.getActiveLeaf());
assertEquals("child22", rootContext.get("testRAT"));
assertEquals(child12, child1.getActiveLeaf());
assertEquals("child12", child1.get("testRAT"));
assertEquals(child22, child2.getActiveLeaf());
assertEquals("child22", child2.get("testRAT"));
child11.activateBranch();
assertEquals(child11, rootContext.getActiveLeaf());
assertEquals("child11", rootContext.get("testRAT"));
assertEquals(child11, child1.getActiveLeaf());
assertEquals("child11", child1.get("testRAT"));
assertEquals(child22, child2.getActiveLeaf());
assertEquals("child22", child2.get("testRAT"));
child11.deactivate();
assertEquals(child1, rootContext.getActiveLeaf());
assertEquals("child1", rootContext.get("testRAT"));
assertEquals(child1, child1.getActiveLeaf());
assertEquals("child1", child1.get("testRAT"));
assertEquals(child22, child2.getActiveLeaf());
assertEquals("child22", child2.get("testRAT"));
child1.dispose();
assertNull(rootContext.getActiveChild());
child2.activateBranch();
assertEquals(child22, rootContext.getActiveLeaf());
assertEquals("child22", rootContext.get("testRAT"));
assertEquals(child22, child2.getActiveLeaf());
assertEquals("child22", child2.get("testRAT"));
}
@Test
public void testGetActive() {
IEclipseContext root = EclipseContextFactory.create("root");
IEclipseContext child1 = root.createChild("child1");
IEclipseContext child11 = child1.createChild("child11");
IEclipseContext child12 = child1.createChild("child12");
IEclipseContext child2 = root.createChild("child2");
IEclipseContext child21 = child2.createChild("child21");
IEclipseContext child22 = child2.createChild("child22");
child11.set("var", "1");
child12.set("var", "2");
child1.set("var", "3");
child21.set("var", "4");
child22.set("var", "5");
child2.set("var", "6");
root.set("var", "7");
// nothing is active - we get value from the node
assertEquals("3", child1.getActive("var"));
child11.activateBranch();
assertEquals("1", child1.getActive("var"));
child12.activateBranch();
assertEquals("2", child1.getActive("var"));
child22.activateBranch();
assertEquals("5", child2.getActive("var"));
}
@Test
public void testGetActiveBug384425() {
IEclipseContext root = EclipseContextFactory.create("root");
IEclipseContext child1 = root.createChild("child1");
IEclipseContext child11 = child1.createChild("child11");
IEclipseContext child2 = root.createChild("child2");
// nothing is active - we get value from the node
assertNull(root.getActive("var"));
assertNull(child1.getActive("var"));
assertNull(child2.getActive("var"));
child11.activateBranch();
child11.set("var", "1");
assertEquals("1", root.getActive("var"));
assertEquals("1", child1.getActive("var"));
assertNull(child2.getActive("var"));
}
@Test
public void testGetActiveRAT() {
IEclipseContext root = EclipseContextFactory.create("root");
IEclipseContext child1 = root.createChild("child1");
IEclipseContext child11 = child1.createChild("child11");
IEclipseContext child12 = child1.createChild("child12");
IEclipseContext child2 = root.createChild("child2");
IEclipseContext child21 = child2.createChild("child21");
IEclipseContext child22 = child2.createChild("child22");
child11.set("var", "1");
child12.set("var", "2");
child1.set("var", "3");
child21.set("var", "4");
child22.set("var", "5");
child2.set("var", "6");
root.set("var", "7");
final String[] result = new String[1];
child1.runAndTrack(new RunAndTrack() {
@Override
public boolean changed(IEclipseContext context) {
result[0] = (String) context.getActive("var");
return true;
}});
// nothing is active - we get value from the node
assertEquals("3", result[0]);
child11.activateBranch();
assertEquals("1", result[0]);
child12.activateBranch();
assertEquals("2", result[0]);
child22.activateBranch();
assertEquals("2", result[0]);
}
@Test
public void testGetActiveRATNumberOfCalls() {
IEclipseContext root = EclipseContextFactory.create("root");
IEclipseContext child1 = root.createChild("child1");
IEclipseContext child11 = child1.createChild("child11");
IEclipseContext child12 = child1.createChild("child12");
IEclipseContext child2 = root.createChild("child2");
IEclipseContext child21 = child2.createChild("child21");
IEclipseContext child22 = child2.createChild("child22");
child11.set("var", "1");
child12.set("var", "1");
child1.set("var", "3");
child21.set("var", "4");
child22.set("var", "4");
child2.set("var", "6");
root.set("var", "7");
final String[] result = new String[1];
final int[] called = new int[1];
called[0] = 0;
child1.runAndTrack(new RunAndTrack() {
@Override
public boolean changed(IEclipseContext context) {
result[0] = (String) context.getActive("var");
called[0]++;
return true;
}});
// nothing is active - we get value from the node
assertEquals("3", result[0]);
assertEquals(1, called[0]);
child11.activateBranch();
assertEquals("1", result[0]);
assertEquals(2, called[0]);
child12.activateBranch();
assertEquals("1", result[0]);
assertEquals(3, called[0]);
child22.activateBranch();
assertEquals("1", result[0]);
assertEquals(3, called[0]);
child21.activateBranch();
assertEquals("1", result[0]);
assertEquals(3, called[0]);
}
/**
* A variation of {@link #testGetActiveRATNumberOfCalls()} that
* uses distinct values in the leaf contexts.
*/
@Test
public void testGetActiveRATNumberOfCalls2() {
IEclipseContext root = EclipseContextFactory.create("root");
IEclipseContext child1 = root.createChild("child1");
IEclipseContext child11 = child1.createChild("child11");
IEclipseContext child12 = child1.createChild("child12");
IEclipseContext child2 = root.createChild("child2");
IEclipseContext child21 = child2.createChild("child21");
IEclipseContext child22 = child2.createChild("child22");
child11.set("var", "11");
child12.set("var", "12");
child1.set("var", "3");
child21.set("var", "21");
child22.set("var", "22");
child2.set("var", "6");
root.set("var", "7");
final String[] result = new String[1];
final int[] called = new int[1];
called[0] = 0;
child1.runAndTrack(new RunAndTrack() {
@Override
public boolean changed(IEclipseContext context) {
result[0] = (String) context.getActive("var");
called[0]++;
return true;
}});
// nothing is active - we get value from the node
assertEquals("3", result[0]);
assertEquals(1, called[0]);
child11.activateBranch();
assertEquals("11", result[0]);
assertEquals(2, called[0]);
child12.activateBranch();
assertEquals("12", result[0]);
assertEquals(3, called[0]);
child22.activateBranch();
assertEquals("12", result[0]);
assertEquals(3, called[0]);
child21.activateBranch();
assertEquals("12", result[0]);
assertEquals(3, called[0]);
}
public static class ActiveInject {
//@Inject @Named("var")
public String value;
@Inject
public void setValue(@Named("var") String value) {
this.value = value;
}
}
}