package org.sdif4j.testing.cdi;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.sdif4j.InjectContext;
import org.sdif4j.cdi.CdiInjectContext;
import org.sdif4j.testing.TestEagerSingleton;
import org.sdif4j.testing.TestLazySingleton;
import org.sdif4j.testing.TestPrototype;
import org.sdif4j.testing.TestSingleton;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;
import javax.inject.Named;
import static org.testng.Assert.*;
/**
* Simple CDI tests for {@link org.sdif4j.cdi.CdiInjectContext} inside SE container.
*
* @author Pavel Shackih
*/
public class CdiSeTest {
static final String FOO_BEAN = "fooBean";
Weld weld;
WeldContainer container;
InjectContext injectContext;
@BeforeClass
public void beforeClass() {
weld = new Weld();
container = weld.initialize();
injectContext = container.instance().select(InjectContext.class).get();
}
@Test
public void testInjectContextInstance() {
final InjectContext injectContext = this.injectContext;
assertTrue(injectContext instanceof CdiInjectContext);
assertTrue(this.injectContext.getInstance(InjectContext.class) == injectContext);
}
@Test
public void testNamedService() {
IService service = injectContext.getInstance(IService.class, FOO_BEAN);
assertNotNull(service);
assertTrue("foo".equals(service.foo()));
}
@Test
public void testNamedString() {
assertEquals(injectContext.getInstance(String.class, "key"), "value");
}
@Test
public void testSingleton() {
assertEquals(TestEagerSingleton.getInstantCount(), 0);
final TestSingleton testSingleton1 = injectContext.getInstance(TestSingleton.class);
final TestSingleton testSingleton2 = injectContext.getInstance(TestSingleton.class);
final TestEagerSingleton testEagerSingleton1 = injectContext.getInstance(TestEagerSingleton.class);
final TestEagerSingleton testEagerSingleton2 = injectContext.getInstance(TestEagerSingleton.class);
assertEquals(TestEagerSingleton.getInstantCount(), 1);
assertNotNull(testSingleton1);
assertTrue(testSingleton1 == testSingleton2);
assertTrue(testSingleton2 == testEagerSingleton1);
assertTrue(testEagerSingleton1 == testEagerSingleton2);
}
@Test
public void testLazySingleton() {
assertEquals(TestLazySingleton.getInstantCount(), 0);
final TestLazySingleton s1 = injectContext.getInstance(TestLazySingleton.class);
final TestLazySingleton s2 = injectContext.getInstance(TestLazySingleton.class);
assertEquals(TestLazySingleton.getInstantCount(), 1);
assertNotNull(s1);
assertTrue(s1 == s2);
}
@Test
public void testPrototype() {
final TestPrototype testPrototype1 = injectContext.getInstance(TestPrototype.class);
final TestPrototype testPrototype2 = injectContext.getInstance(TestPrototype.class);
assertNotNull(testPrototype1);
assertNotNull(testPrototype2);
assertTrue(testPrototype1 != testPrototype2);
}
@Test
public void testInjectMembers() {
class TestInjectable {
@Inject
@Named("key")
String testKey;
}
final TestInjectable testInjectable = new TestInjectable();
injectContext.injectMembers(testInjectable);
assertEquals(testInjectable.testKey, "value");
}
@AfterClass
public void afterClass() {
weld.shutdown();
}
interface IService {
String foo();
}
@Named(FOO_BEAN)
@SuppressWarnings("unused")
static class IServiceImpl implements IService {
public String foo() {
return "foo";
}
}
@Produces
@Named("key")
@SuppressWarnings("unused")
String keyProduce() {
return "value";
}
}