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 LazySingletonTest extends BaseTestCase {
private static boolean LAZY_ANNOTATED_CONSTRUCTED;
private static boolean FOO_CONSTRUCTED;
public LazySingletonTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(LazySingletonTest.class);
}
@Override
protected void setUp() throws Exception {
LAZY_ANNOTATED_CONSTRUCTED = false;
FOO_CONSTRUCTED = false;
}
public void testLazyAnnotated() throws Exception {
assertFalse(LAZY_ANNOTATED_CONSTRUCTED);
Injector injector = Guice.createInjector(Stage.DEVELOPMENT, new AbstractModule() {
@Override
protected void configure() {
install(new LimeWireInjectModule());
bind(LazyAnnotated.class);
}
});
assertFalse(LAZY_ANNOTATED_CONSTRUCTED);
Provider<?> p = injector.getProvider(LazyAnnotated.class);
assertFalse(LAZY_ANNOTATED_CONSTRUCTED);
LazyAnnotated la = injector.getInstance(LazyAnnotated.class);
assertTrue(LAZY_ANNOTATED_CONSTRUCTED);
assertSame(la, injector.getInstance(LazyAnnotated.class));
assertSame(la, p.get());
}
public void testLazyBoundByClassAnnotation() throws Exception {
assertFalse(FOO_CONSTRUCTED);
Injector injector = Guice.createInjector(Stage.DEVELOPMENT, new AbstractModule() {
@Override
protected void configure() {
install(new LimeWireInjectModule());
bind(Foo.class).in(LazySingleton.class);
}
});
assertFalse(FOO_CONSTRUCTED);
Provider<?> p = injector.getProvider(Foo.class);
assertFalse(FOO_CONSTRUCTED);
Foo foo = injector.getInstance(Foo.class);
assertTrue(FOO_CONSTRUCTED);
assertSame(foo, injector.getInstance(Foo.class));
assertSame(foo, p.get());
}
public void testLazyBoundByScope() 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.LAZY_SINGLETON);
}
});
assertFalse(FOO_CONSTRUCTED);
Provider<?> p = injector.getProvider(Foo.class);
assertFalse(FOO_CONSTRUCTED);
Foo foo = injector.getInstance(Foo.class);
assertTrue(FOO_CONSTRUCTED);
assertSame(foo, injector.getInstance(Foo.class));
assertSame(foo, p.get());
}
@LazySingleton
private static class LazyAnnotated {
public LazyAnnotated() {
LAZY_ANNOTATED_CONSTRUCTED = true;
}
}
private static class Foo {
public Foo() {
FOO_CONSTRUCTED = true;
}
}
}