blob: f5aef8dd3569b2161bd5b5ac7e07b86e76b13950 [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:
* Stefan Mücke - 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.assertTrue;
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.internal.contexts.EclipseContext;
import org.junit.Before;
import org.junit.Test;
public class DependenciesLeakTest {
final static String LEGACY_H_ID = "legacy::handler::"; //$NON-NLS-1$
static class HandlerSelectionFunction extends ContextFunction {
private String commandId;
public HandlerSelectionFunction(String commandId) {
this.commandId = commandId;
}
@Override
public Object compute(IEclipseContext context, String contextKey) {
return context.get(LEGACY_H_ID + commandId);
}
@Override
public String toString() {
return "HandlerSelectionFunction [commandId=" + commandId + "]";
}
}
private IEclipseContext windowContext;
private IEclipseContext perspectiveContext;
private IEclipseContext partContext;
@Before
public void setUp() throws Exception {
windowContext = EclipseContextFactory.create("Window");
perspectiveContext = windowContext.createChild("Perspective");
partContext = perspectiveContext.createChild("Part");
}
@Test
public void testBug() {
// register a handler
Object handler = "<foo.bar.handler>";
windowContext.set("legacy::handler::foo.bar", handler); // fake activate legacy handler
windowContext.set("foo.bar", new HandlerSelectionFunction("foo.bar"));
// there may be no listeners initially
assertNoListeners(windowContext);
assertNoListeners(perspectiveContext);
assertNoListeners(partContext);
// cause a ValueComputation to be created
Object object = partContext.get("foo.bar");
assertEquals(object, handler);
// now invalidate the name; this should notify the part context
windowContext.set("foo.bar", null);
//windowContext.remove("foo.bar");
// all ValueComputation listeners must have been removed
assertNoListeners(windowContext);
assertNoListeners(perspectiveContext);
assertNoListeners(partContext);
}
@Test
public void testInvalidateDirectly() {
windowContext.set("x", 42);
windowContext.set("y", 11);
windowContext.set("some.handler", new AddContextFunction());
assertNoListeners(windowContext);
assertNoListeners(perspectiveContext);
assertNoListeners(partContext);
Object object = partContext.get("some.handler");
assertEquals(object, 53);
windowContext.set("some.handler", null); // invalidate
assertNoListeners(windowContext);
assertNoListeners(perspectiveContext);
assertNoListeners(partContext);
}
private void assertNoListeners(IEclipseContext context) {
EclipseContext c = (EclipseContext) context;
try {
assertTrue(c.getListeners().isEmpty());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}