blob: 4c00458a6ab6695af58cd52bb947ff8978985c97 [file] [log] [blame]
package com.google.inject.spi;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import junit.framework.TestCase;
import com.google.inject.AbstractModule;
import com.google.inject.Asserts;
import com.google.inject.CreationException;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.Provider;
import com.google.inject.Stage;
import com.google.inject.spi.Toolable;
public class ToolStageInjectorTest extends TestCase {
@Override
protected void setUp() throws Exception {
Foo.s = null;
Foo.sm = null;
}
public void testToolStageInjectorRestrictions() {
Injector injector = Guice.createInjector(Stage.TOOL);
try {
injector.injectMembers(new Object());
fail("Non-SPI Injector methods must throw an exception in the TOOL stage.");
} catch (UnsupportedOperationException expected) {
}
try {
injector.getInstance(Injector.class);
fail("Non-SPI Injector methods must throw an exception in the TOOL stage.");
} catch (UnsupportedOperationException expected) {
}
try {
injector.getInstance(Key.get(Injector.class));
fail("Non-SPI Injector methods must throw an exception in the TOOL stage.");
} catch (UnsupportedOperationException expected) {
}
try {
injector.getProvider(Injector.class);
fail("Non-SPI Injector methods must throw an exception in the TOOL stage.");
} catch (UnsupportedOperationException expected) {
}
try {
injector.getProvider(Key.get(Injector.class));
fail("Non-SPI Injector methods must throw an exception in the TOOL stage.");
} catch (UnsupportedOperationException expected) {
}
}
public void testToolStageDoesntInjectInstances() {
final Foo foo = new Foo();
Guice.createInjector(Stage.TOOL, new AbstractModule() {
@Override
protected void configure() {
requestStaticInjection(Foo.class);
requestInjection(foo);
}
});
assertNull(Foo.s);
assertNull(Foo.sm);
assertNull(foo.f);
assertNull(foo.m);
}
public void testToolStageDoesntInjectProviders() {
final Foo foo = new Foo();
Guice.createInjector(Stage.TOOL, new AbstractModule() {
@Override
protected void configure() {
requestStaticInjection(Foo.class);
bind(Object.class).toProvider(foo);
}
});
assertNull(Foo.s);
assertNull(Foo.sm);
assertNull(foo.f);
assertNull(foo.m);
}
public void testToolStageWarnsOfMissingObjectGraph() {
final Bar bar = new Bar();
try {
Guice.createInjector(Stage.TOOL, new AbstractModule() {
@Override
protected void configure() {
requestStaticInjection(Bar.class);
requestInjection(bar);
}
});
fail("expected exception");
} catch(CreationException expected) {
Asserts.assertContains(expected.toString(), "No implementation for java.util.Collection was bound.",
"No implementation for java.util.Map was bound.",
"No implementation for java.util.List was bound.",
"No implementation for java.util.Set was bound.");
}
}
public void testToolStageInjectsTooledMethods() {
final Tooled tooled = new Tooled();
Guice.createInjector(Stage.TOOL, new AbstractModule() {
@Override
protected void configure() {
requestStaticInjection(Tooled.class);
bind(Object.class).toProvider(tooled);
}
});
assertNull(Tooled.s);
assertNotNull(Tooled.sm);
assertNull(tooled.f);
assertNotNull(tooled.m);
}
@SuppressWarnings("unchecked")
private static class Bar {
@SuppressWarnings("unused") @Inject private static List list;
@SuppressWarnings("unused") @Inject private Set set;
@SuppressWarnings("unused") @Inject void method(Collection c) {}
@SuppressWarnings("unused") @Inject static void staticMethod(Map map) {}
}
private static class Foo implements Provider<Object> {
@Inject private static S s;
@Inject private F f;
private M m;
@SuppressWarnings("unused") @Inject void method(M m) { this.m = m; }
private static SM sm;
@SuppressWarnings("unused") @Inject static void staticMethod(SM sm) { Tooled.sm = sm; }
public Object get() {
return null;
}
}
private static class Tooled implements Provider<Object> {
@Inject private static S s;
@Inject private F f;
private M m;
@Toolable @SuppressWarnings("unused") @Inject void method(M m) { this.m = m; }
private static SM sm;
@Toolable @SuppressWarnings("unused") @Inject static void staticMethod(SM sm) { Tooled.sm = sm; }
public Object get() {
return null;
}
}
private static class S {}
private static class F {}
private static class M {}
private static class SM {}
}