package org.limewire.inject;
import junit.framework.Test;
import org.limewire.util.BaseTestCase;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Provider;
import com.google.inject.Stage;
public class EagerSingletonTest extends BaseTestCase {
private static boolean EAGER_ANNOTATED_CONSTRUCTED;
private static boolean FOO_CONSTRUCTED;
public EagerSingletonTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(EagerSingletonTest.class);
}
@Override
protected void setUp() throws Exception {
EAGER_ANNOTATED_CONSTRUCTED = false;
FOO_CONSTRUCTED = false;
}
public void testEagerAnnotated() throws Exception {
assertFalse(EAGER_ANNOTATED_CONSTRUCTED);
Injector injector = Guice.createInjector(Stage.DEVELOPMENT, new AbstractModule() {
@Override
protected void configure() {
install(new LimeWireInjectModule());
bind(EagerAnnotated.class);
}
});
GuiceUtils.loadEagerSingletons(injector);
assertTrue(EAGER_ANNOTATED_CONSTRUCTED);
Provider<?> p = injector.getProvider(EagerAnnotated.class);
assertTrue(EAGER_ANNOTATED_CONSTRUCTED);
EagerAnnotated la = injector.getInstance(EagerAnnotated.class);
assertTrue(EAGER_ANNOTATED_CONSTRUCTED);
assertSame(la, injector.getInstance(EagerAnnotated.class));
assertSame(la, p.get());
}
public void testEagerBoundByClassAnnotation() throws Exception {
assertFalse(FOO_CONSTRUCTED);
Injector injector = Guice.createInjector(Stage.DEVELOPMENT, new AbstractModule() {
@Override
protected void configure() {
install(new LimeWireInjectModule());
bind(Foo.class).in(EagerSingleton.class);
}
});
GuiceUtils.loadEagerSingletons(injector);
assertTrue(FOO_CONSTRUCTED);
Provider<?> p = injector.getProvider(Foo.class);
assertTrue(FOO_CONSTRUCTED);
Foo foo = injector.getInstance(Foo.class);
assertTrue(FOO_CONSTRUCTED);
assertSame(foo, injector.getInstance(Foo.class));
assertSame(foo, p.get());
}
public void testEagerBoundByScopeEagerAnnotation() throws Exception {
assertFalse(FOO_CONSTRUCTED);
Injector injector = Guice.createInjector(Stage.DEVELOPMENT, new AbstractModule() {
@Override
protected void configure() {
install(new LimeWireInjectModule());
bind(Foo.class).asEagerSingleton();
}
});
GuiceUtils.loadEagerSingletons(injector);
assertTrue(FOO_CONSTRUCTED);
Provider<?> p = injector.getProvider(Foo.class);
assertTrue(FOO_CONSTRUCTED);
Foo foo = injector.getInstance(Foo.class);
assertTrue(FOO_CONSTRUCTED);
assertSame(foo, injector.getInstance(Foo.class));
assertSame(foo, p.get());
}
public void testEagerBoundByScope() throws Exception {
assertFalse(FOO_CONSTRUCTED);
Injector injector = Guice.createInjector(Stage.DEVELOPMENT, new AbstractModule() {
@Override
protected void configure() {
install(new LimeWireInjectModule());
bind(Foo.class).in(MoreScopes.EAGER_SINGLETON);
}
});
GuiceUtils.loadEagerSingletons(injector);
assertTrue(FOO_CONSTRUCTED);
Provider<?> p = injector.getProvider(Foo.class);
assertTrue(FOO_CONSTRUCTED);
Foo foo = injector.getInstance(Foo.class);
assertTrue(FOO_CONSTRUCTED);
assertSame(foo, injector.getInstance(Foo.class));
assertSame(foo, p.get());
}
@EagerSingleton
private static class EagerAnnotated {
public EagerAnnotated() {
EAGER_ANNOTATED_CONSTRUCTED = true;
}
}
private static class Foo {
public Foo() {
FOO_CONSTRUCTED = true;
}
}
}