From 4f6c5672a1a685228d2970fc2dea89484430279f Mon Sep 17 00:00:00 2001 From: flan Date: Thu, 6 Nov 2014 14:31:58 -0800 Subject: Adds a test that explicitly tests all of the bindings created by MapBinder. Current tests rely on SpiUtil to validate all bindings, but those tests are hard to read and reason about; this test is explicit. Tested: The new test passes. ------------- Created by MOE: http://code.google.com/p/moe-java MOE_MIGRATED_REVID=79369985 --- .../google/inject/multibindings/MapBinderTest.java | 73 +++++++++++++++++++++- 1 file changed, 71 insertions(+), 2 deletions(-) (limited to 'extensions') diff --git a/extensions/multibindings/test/com/google/inject/multibindings/MapBinderTest.java b/extensions/multibindings/test/com/google/inject/multibindings/MapBinderTest.java index 67d12298..303cf2fe 100644 --- a/extensions/multibindings/test/com/google/inject/multibindings/MapBinderTest.java +++ b/extensions/multibindings/test/com/google/inject/multibindings/MapBinderTest.java @@ -18,11 +18,11 @@ package com.google.inject.multibindings; import static com.google.inject.Asserts.asModuleChain; import static com.google.inject.Asserts.assertContains; +import static com.google.inject.multibindings.SpiUtils.VisitType.BOTH; +import static com.google.inject.multibindings.SpiUtils.VisitType.MODULE; import static com.google.inject.multibindings.SpiUtils.assertMapVisitor; import static com.google.inject.multibindings.SpiUtils.instance; import static com.google.inject.multibindings.SpiUtils.providerInstance; -import static com.google.inject.multibindings.SpiUtils.VisitType.BOTH; -import static com.google.inject.multibindings.SpiUtils.VisitType.MODULE; import static com.google.inject.name.Names.named; import static java.lang.annotation.RetentionPolicy.RUNTIME; @@ -53,6 +53,7 @@ import com.google.inject.spi.HasDependencies; import com.google.inject.spi.InstanceBinding; import com.google.inject.util.Modules; import com.google.inject.util.Providers; +import com.google.inject.util.Types; import junit.framework.TestCase; @@ -63,7 +64,9 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.ref.WeakReference; import java.lang.reflect.Method; +import java.lang.reflect.Type; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -78,6 +81,12 @@ import java.util.concurrent.atomic.AtomicReference; */ public class MapBinderTest extends TestCase { + private static final Set> FRAMEWORK_KEYS = ImmutableSet.of( + Key.get(java.util.logging.Logger.class), + Key.get(Stage.class), + Key.get(Injector.class) + ); + final TypeLiteral>> mapOfStringJavaxProvider = new TypeLiteral>>() {}; final TypeLiteral>> mapOfStringProvider = @@ -92,6 +101,66 @@ public class MapBinderTest extends TestCase { private final TypeLiteral stringType = TypeLiteral.get(String.class); private final TypeLiteral intType = TypeLiteral.get(Integer.class); + private Type javaxProviderOf(Type type) { + return Types.newParameterizedType(javax.inject.Provider.class, type); + } + + private Type mapEntryOf(Type keyType, Type valueType) { + return Types.newParameterizedTypeWithOwner(Map.class, Map.Entry.class, keyType, valueType); + } + + private Type collectionOf(Type type) { + return Types.newParameterizedType(Collection.class, type); + } + + public void testAllBindings() { + Module module = new AbstractModule() { + @Override + protected void configure() { + MapBinder.newMapBinder(binder(), String.class, String.class).permitDuplicates(); + } + }; + + Injector injector = Guice.createInjector(module); + + Map, Binding> bindings = injector.getBindings(); + + ImmutableSet> expectedBindings = ImmutableSet.>builder() + .add( + // Map + Key.get(Types.mapOf(String.class, String.class)), + // Map> + Key.get(Types.mapOf(String.class, Types.providerOf(String.class))), + // Map> + Key.get(Types.mapOf(String.class, javaxProviderOf(String.class))), + // Map> + Key.get(Types.mapOf(String.class, Types.setOf(String.class))), + // Map> + Key.get(Types.mapOf(String.class, Types.setOf(Types.providerOf(String.class)))), + // Set>> + Key.get(Types.setOf(mapEntryOf(String.class, Types.providerOf(String.class)))), + // Collection>>> + Key.get(collectionOf(Types.providerOf( + mapEntryOf(String.class, Types.providerOf(String.class))))), + // Collection>>> + Key.get(collectionOf(javaxProviderOf( + mapEntryOf(String.class, Types.providerOf(String.class))))), + // @Named(...) Boolean + Key.get(Boolean.class, + named("Multibinder>> permits duplicates")) + ) + .addAll(FRAMEWORK_KEYS).build(); + + Set> missingBindings = Sets.difference(expectedBindings, bindings.keySet()); + Set> extraBindings = Sets.difference(bindings.keySet(), expectedBindings); + + assertTrue("There should be no missing bindings. Missing: " + missingBindings, + missingBindings.isEmpty()); + assertTrue("There should be no extra bindings. Extra: " + extraBindings, + extraBindings.isEmpty()); + } + public void testMapBinderAggregatesMultipleModules() { Module abc = new AbstractModule() { @Override protected void configure() { -- cgit v1.2.3