package tc.oc.commons.core.inject;
import javax.inject.Inject;
import javax.inject.Named;
import com.google.inject.CreationException;
import com.google.inject.Guice;
import com.google.inject.Key;
import com.google.inject.name.Names;
import org.junit.Test;
import tc.oc.test.InjectedTestCase;
import static org.junit.Assert.*;
import static tc.oc.test.Assert.*;
public class TransformableBinderTest extends InjectedTestCase {
@Test
public void noTransformers() throws Exception {
String hi = Guice.createInjector(binder -> {
TransformableBinder<String> tb = new TransformableBinder<>(binder, String.class);
tb.bindOriginal().toInstance("hi");
}).getInstance(String.class);
assertEquals("hi", hi);
}
@Test
public void someTransformers() throws Exception {
String hi = Guice.createInjector(binder -> {
TransformableBinder<String> tb = new TransformableBinder<>(binder, String.class);
tb.bindOriginal().toInstance("hello");
tb.bindTransformer().toInstance(p -> p.get().toUpperCase());
tb.bindTransformer().toInstance(p -> p.get().replace('L', 'X'));
}).getInstance(String.class);
assertEquals("HEXXO", hi);
}
@Test
public void originalKeyAnnotationsPreserved() throws Exception {
class Woot {
@Inject @Named("upper") String upper;
@Inject @Named("lower") String lower;
}
Woot woot = new Woot();
Guice.createInjector(binder -> {
TransformableBinder<String> upper = new TransformableBinder<>(binder, Key.get(String.class, Names.named("upper")));
upper.bindOriginal().toInstance("Hello");
upper.bindTransformer().toInstance(p -> p.get().toUpperCase());
TransformableBinder<String> lower = new TransformableBinder<>(binder, Key.get(String.class, Names.named("lower")));
lower.bindOriginal().toInstance("Hello");
lower.bindTransformer().toInstance(p -> p.get().toLowerCase());
}).injectMembers(woot);
assertEquals("HELLO", woot.upper);
assertEquals("hello", woot.lower);
}
@Test
public void transformersAppliedInBindingOrder() throws Exception {
String hi = Guice.createInjector(binder -> {
TransformableBinder<String> tb = new TransformableBinder<>(binder, String.class);
tb.bindOriginal().toInstance("0");
for(int i = 1; i <= 3; i++) {
final int fi = i;
tb.bindTransformer().toInstance(p -> fi + p.get() + fi);
}
}).getInstance(String.class);
assertEquals("3210123", hi);
}
@Test
public void originalBindingRequired() throws Exception {
assertThrows(CreationException.class, () -> {
Guice.createInjector(binder -> {
new TransformableBinder<>(binder, String.class);
});
});
}
@Test
public void regularBindingConflictsWithTransformableBinding() throws Exception {
assertThrows(CreationException.class, () -> {
Guice.createInjector(binder -> {
binder.bind(String.class).toInstance("hi");
new TransformableBinder<>(binder, String.class);
});
});
}
}