package org.sdif4j.testing.pico2; import org.picocontainer.Characteristics; import org.picocontainer.MutablePicoContainer; import org.picocontainer.PicoBuilder; import org.picocontainer.PicoContainer; import org.picocontainer.behaviors.OptInCaching; import org.picocontainer.injectors.AnnotatedFieldInjection; import org.picocontainer.injectors.CompositeInjection; import org.sdif4j.InjectContext; import org.sdif4j.pico2.Pico2InjectContext; import org.sdif4j.testing.TestEagerSingleton; import org.sdif4j.testing.TestLazySingleton; import org.sdif4j.testing.TestPrototype; import org.sdif4j.testing.TestSingleton; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import javax.inject.Inject; import javax.inject.Named; import static org.testng.Assert.*; public class Pico2Test { private InjectContext injectContext; @BeforeClass public void beforeClass() { final MutablePicoContainer picoContainer = createPicoContatiner(); final PicoContainer picoContainer1 = picoContainer.getComponent(PicoContainer.class); final PicoContainer picoContainer2 = picoContainer.getComponent(PicoContainer.class); assertTrue(picoContainer == picoContainer1); assertTrue(picoContainer1 == picoContainer2); final Pico2InjectContext pico2InjectContext = picoContainer.getComponent(Pico2InjectContext.class); // assertTrue(pico2InjectContext.getPicoContainerAccessor() == picoContainer); final Pico2InjectContext pico2InjectContext1 = picoContainer.getComponent(Pico2InjectContext.class); assertTrue(pico2InjectContext == pico2InjectContext1); this.injectContext = picoContainer.getComponent(InjectContext.class); final InjectContext injectContext = picoContainer.getComponent(InjectContext.class); assertTrue(injectContext == this.injectContext); assertTrue(pico2InjectContext == this.injectContext); } private MutablePicoContainer createPicoContatiner() { final MutablePicoContainer picoContainer = new PicoBuilder() .withBehaviors(new OptInCaching()) .withComponentFactory(new CompositeInjection(new AnnotatedFieldInjection(Inject.class))) .build(); picoContainer.addComponent(PicoContainer.class, picoContainer); picoContainer.as(Characteristics.CACHE).addComponent(Pico2InjectContext.class); picoContainer.as(Characteristics.CACHE).addComponent(TestLazySingleton.class); picoContainer.as(Characteristics.CACHE).addComponent(TestEagerSingleton.class); picoContainer.addComponent(TestPrototype.class); picoContainer.addComponent("key", "value"); return picoContainer; } @Test public void testInjectContextInstance() { final InjectContext injectContext = this.injectContext; assertTrue(injectContext instanceof Pico2InjectContext); assertTrue(this.injectContext.getInstance(InjectContext.class) == injectContext); } @Test public void testNamed() { assertEquals(injectContext.getInstance(String.class, "key"), "value"); } @Test public void testEagerSingleton() { // todo 1 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"); } }