blob: 57f7bf08e1ed97cec433a69b683ba632a951476d [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.inject;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Named;
import org.eclipse.e4.core.contexts.ContextFunction;
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.core.contexts.EclipseContextFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.di.annotations.Optional;
import org.junit.Before;
import org.junit.Test;
/**
* Tests updates of injected values and calls to runnables
*/
public class InjectionUpdateTest {
private IEclipseContext c1; // common root
private IEclipseContext c21; // dependents of root - path 1
private IEclipseContext c22; // dependents of root - path 2
static public class PropagationTest {
public int called = 0;
public String in;
@Inject
public PropagationTest() {
// placeholder
}
@Inject
public void setCalculated(@Named("calculated") String string) {
called++;
in = string;
}
}
@Before
public void setUp() throws Exception {
c1 = EclipseContextFactory.create("c1");
c1.set("id", "c1");
c21 = c1.createChild("c21");
c21.set("id", "c21");
c1.set("c21", c21);
c22 = c1.createChild("c22");
c22.set("id", "c22");
c1.set("c22", c22);
}
@Test
public void testPropagation() {
c1.set("base", "abc");
c21.set("derived1", new ContextFunction() {
@Override
public Object compute(IEclipseContext context, String contextKey) {
String baseString = (String) context.get("base");
return baseString.charAt(0) + "_";
}});
c22.set("derived2", new ContextFunction() {
@Override
public Object compute(IEclipseContext context, String contextKey) {
String baseString = (String) context.get("base");
return "_" + baseString.charAt(baseString.length() - 1);
}});
c1.set("calculated", new ContextFunction() {
@Override
public Object compute(IEclipseContext context, String contextKey) {
IEclipseContext context21 = (IEclipseContext) context.get("c21");
String derived1 = (String) context21.get("derived1");
IEclipseContext context22 = (IEclipseContext) context.get("c22");
String derived2 = (String) context22.get("derived2");
return derived1 + derived2;
}});
PropagationTest testObject = ContextInjectionFactory.make(PropagationTest.class, c1);
assertNotNull(testObject);
assertEquals(1, testObject.called);
assertEquals("a__c", testObject.in);
c1.set("base", "123"); // this should result in only one injection call
assertEquals(2, testObject.called);
assertEquals("1__3", testObject.in);
c1.set("base", "xyz");
assertEquals(3, testObject.called);
assertEquals("x__z", testObject.in);
}
public static class InjectTarget {
private static final String KEY = "key";
@Inject
private IEclipseContext context;
@PostConstruct
void pc() {
context.containsKey(KEY);
}
public void modify() {
context.set(KEY, null);
}
}
@Test
public void testNestedUpdatesPostConstruct() throws Exception {
IEclipseContext appContext = EclipseContextFactory.create();
appContext.set(InjectTarget.class.getName(), new ContextFunction() {
@Override
public Object compute(IEclipseContext context, String contextKey) {
return ContextInjectionFactory
.make(InjectTarget.class, context);
}
});
InjectTarget targetA = appContext.get(InjectTarget.class);
targetA.modify();
InjectTarget targetB = appContext.get(InjectTarget.class);
assertEquals(targetA, targetB);
assertSame(targetA, targetB);
}
public static class InjectTarget2 {
private static final String KEY = "key"; //$NON-NLS-1$
@Inject
private IEclipseContext context;
public Object key;
@Inject
public InjectTarget2(@Optional @Named("key") Object key) {
this.key = key;
}
public void modify() {
context.set(KEY, null);
}
}
@Test
public void testNestedUpdatesConstructor() throws Exception {
IEclipseContext appContext = EclipseContextFactory.create();
appContext.set(InjectTarget2.class.getName(), new ContextFunction() {
@Override
public Object compute(IEclipseContext context, String contextKey) {
return ContextInjectionFactory.make(InjectTarget2.class,
context);
}
});
InjectTarget2 targetA = appContext.get(InjectTarget2.class);
targetA.modify();
InjectTarget2 targetB = appContext.get(InjectTarget2.class);
assertEquals(targetA, targetB);
assertSame(targetA, targetB);
}
}