package org.limewire.inject; import junit.framework.Test; import org.limewire.concurrent.AbstractLazySingletonProvider; import org.limewire.util.BaseTestCase; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Singleton; import com.google.inject.Stage; import com.google.inject.name.Names; public class AbstractModuleTest extends BaseTestCase { public AbstractModuleTest(String name) { super(name); } public static Test suite() { return buildTestSuite(AbstractModuleTest.class); } public void testSameInstanceIfSingletonAndCached() { Injector injector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { bindAll(Names.named("A"), I3.class, P.class, I2.class, I1.class); } }); I3 i3 = injector.getInstance(Key.get(I3.class, Names.named("A"))); I2 i2 = injector.getInstance(Key.get(I2.class, Names.named("A"))); I1 i1 = injector.getInstance(Key.get(I1.class, Names.named("A"))); assertSame(i3, i2); assertSame(i3, i1); } public void testWrapperModuleSingletons() { Injector parent = Guice.createInjector(Stage.DEVELOPMENT, new AbstractModule() { @Override protected void configure() { bind(S1.class).to(S1I.class); } }); Injector child = parent.createChildInjector(new AbstractModule() { @Override protected void configure() { bind(S2.class).to(S2I.class); bind(S3I.class); } }); assertFalse(S1I.created); assertFalse(S2I.created); assertFalse(S3I.created); assertSame(parent.getInstance(S1.class), child.getInstance(S1.class)); assertTrue(S1I.created); } private static interface I1 {} private static interface I2 extends I1 {} private static interface I3 extends I2 {} @Singleton private static class P extends AbstractLazySingletonProvider<I3> { @Override protected I3 createObject() { return new I3() {}; } } private static interface S1 {} @Singleton private static class S1I implements S1 { private static boolean created = false; S1I () { created = true; } } private static interface S2 {} @Singleton private static class S2I implements S2 { private static boolean created = false; S2I () { created = true; } } @Singleton private static class S3I { private static boolean created = false; S3I () { created = true; } } }