1*f585d8a3SJacky Wang /* 2*f585d8a3SJacky Wang * Copyright (C) 2015 The Dagger Authors. 3*f585d8a3SJacky Wang * 4*f585d8a3SJacky Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5*f585d8a3SJacky Wang * you may not use this file except in compliance with the License. 6*f585d8a3SJacky Wang * You may obtain a copy of the License at 7*f585d8a3SJacky Wang * 8*f585d8a3SJacky Wang * http://www.apache.org/licenses/LICENSE-2.0 9*f585d8a3SJacky Wang * 10*f585d8a3SJacky Wang * Unless required by applicable law or agreed to in writing, software 11*f585d8a3SJacky Wang * distributed under the License is distributed on an "AS IS" BASIS, 12*f585d8a3SJacky Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*f585d8a3SJacky Wang * See the License for the specific language governing permissions and 14*f585d8a3SJacky Wang * limitations under the License. 15*f585d8a3SJacky Wang */ 16*f585d8a3SJacky Wang 17*f585d8a3SJacky Wang package dagger.functional.multibindings; 18*f585d8a3SJacky Wang 19*f585d8a3SJacky Wang import static com.google.common.truth.Truth.assertThat; 20*f585d8a3SJacky Wang 21*f585d8a3SJacky Wang import com.google.auto.value.AutoAnnotation; 22*f585d8a3SJacky Wang import dagger.multibindings.ClassKey; 23*f585d8a3SJacky Wang import dagger.multibindings.StringKey; 24*f585d8a3SJacky Wang import java.math.BigDecimal; 25*f585d8a3SJacky Wang import java.math.BigInteger; 26*f585d8a3SJacky Wang import java.util.Map; 27*f585d8a3SJacky Wang import javax.inject.Provider; 28*f585d8a3SJacky Wang import org.junit.Test; 29*f585d8a3SJacky Wang import org.junit.runner.RunWith; 30*f585d8a3SJacky Wang import org.junit.runners.JUnit4; 31*f585d8a3SJacky Wang 32*f585d8a3SJacky Wang /** Tests for {@link MultibindingComponent}. */ 33*f585d8a3SJacky Wang @RunWith(JUnit4.class) 34*f585d8a3SJacky Wang public class MultibindingTest { 35*f585d8a3SJacky Wang 36*f585d8a3SJacky Wang private final MultibindingComponent multibindingComponent = 37*f585d8a3SJacky Wang DaggerMultibindingComponent.builder().multibindingDependency(() -> 0.0).build(); 38*f585d8a3SJacky Wang map()39*f585d8a3SJacky Wang @Test public void map() { 40*f585d8a3SJacky Wang Map<String, String> map = multibindingComponent.map(); 41*f585d8a3SJacky Wang assertThat(map).hasSize(2); 42*f585d8a3SJacky Wang assertThat(map).containsEntry("foo", "foo value"); 43*f585d8a3SJacky Wang assertThat(map).containsEntry("bar", "bar value"); 44*f585d8a3SJacky Wang } 45*f585d8a3SJacky Wang mapOfArrays()46*f585d8a3SJacky Wang @Test public void mapOfArrays() { 47*f585d8a3SJacky Wang Map<String, String[]> map = multibindingComponent.mapOfArrays(); 48*f585d8a3SJacky Wang assertThat(map).hasSize(2); 49*f585d8a3SJacky Wang assertThat(map).containsKey("foo"); 50*f585d8a3SJacky Wang assertThat(map.get("foo")).asList().containsExactly("foo1", "foo2").inOrder(); 51*f585d8a3SJacky Wang assertThat(map).containsKey("bar"); 52*f585d8a3SJacky Wang assertThat(map.get("bar")).asList().containsExactly("bar1", "bar2").inOrder(); 53*f585d8a3SJacky Wang } 54*f585d8a3SJacky Wang mapOfProviders()55*f585d8a3SJacky Wang @Test public void mapOfProviders() { 56*f585d8a3SJacky Wang Map<String, Provider<String>> mapOfProviders = multibindingComponent.mapOfProviders(); 57*f585d8a3SJacky Wang assertThat(mapOfProviders).hasSize(2); 58*f585d8a3SJacky Wang assertThat(mapOfProviders.get("foo").get()).isEqualTo("foo value"); 59*f585d8a3SJacky Wang assertThat(mapOfProviders.get("bar").get()).isEqualTo("bar value"); 60*f585d8a3SJacky Wang } 61*f585d8a3SJacky Wang mapKeysAndValues()62*f585d8a3SJacky Wang @Test public void mapKeysAndValues() { 63*f585d8a3SJacky Wang assertThat(multibindingComponent.mapKeys()) 64*f585d8a3SJacky Wang .containsExactly("foo", "bar"); 65*f585d8a3SJacky Wang assertThat(multibindingComponent.mapValues()) 66*f585d8a3SJacky Wang .containsExactly("foo value", "bar value"); 67*f585d8a3SJacky Wang } 68*f585d8a3SJacky Wang nestedKeyMap()69*f585d8a3SJacky Wang @Test public void nestedKeyMap() { 70*f585d8a3SJacky Wang assertThat(multibindingComponent.nestedKeyMap()) 71*f585d8a3SJacky Wang .containsExactly( 72*f585d8a3SJacky Wang nestedWrappedKey(Integer.class), "integer", nestedWrappedKey(Long.class), "long"); 73*f585d8a3SJacky Wang } 74*f585d8a3SJacky Wang 75*f585d8a3SJacky Wang @Test unwrappedAnnotationKeyMap()76*f585d8a3SJacky Wang public void unwrappedAnnotationKeyMap() { 77*f585d8a3SJacky Wang assertThat(multibindingComponent.unwrappedAnnotationKeyMap()) 78*f585d8a3SJacky Wang .containsExactly(testStringKey("foo\n"), "foo annotation"); 79*f585d8a3SJacky Wang } 80*f585d8a3SJacky Wang 81*f585d8a3SJacky Wang @Test wrappedAnnotationKeyMap()82*f585d8a3SJacky Wang public void wrappedAnnotationKeyMap() { 83*f585d8a3SJacky Wang @SuppressWarnings({"unchecked", "rawtypes"}) 84*f585d8a3SJacky Wang Class<? extends Number>[] classes = new Class[] {Long.class, Integer.class}; 85*f585d8a3SJacky Wang assertThat(multibindingComponent.wrappedAnnotationKeyMap()) 86*f585d8a3SJacky Wang .containsExactly( 87*f585d8a3SJacky Wang testWrappedAnnotationKey( 88*f585d8a3SJacky Wang testStringKey("foo"), new int[] {1, 2, 3}, new ClassKey[] {}, classes), 89*f585d8a3SJacky Wang "wrapped foo annotation"); 90*f585d8a3SJacky Wang } 91*f585d8a3SJacky Wang 92*f585d8a3SJacky Wang @Test booleanKeyMap()93*f585d8a3SJacky Wang public void booleanKeyMap() { 94*f585d8a3SJacky Wang assertThat(multibindingComponent.booleanKeyMap()).containsExactly(true, "true"); 95*f585d8a3SJacky Wang } 96*f585d8a3SJacky Wang 97*f585d8a3SJacky Wang @Test byteKeyMap()98*f585d8a3SJacky Wang public void byteKeyMap() { 99*f585d8a3SJacky Wang assertThat(multibindingComponent.byteKeyMap()).containsExactly((byte) 100, "100 byte"); 100*f585d8a3SJacky Wang } 101*f585d8a3SJacky Wang 102*f585d8a3SJacky Wang @Test charKeyMap()103*f585d8a3SJacky Wang public void charKeyMap() { 104*f585d8a3SJacky Wang assertThat(multibindingComponent.characterKeyMap()) 105*f585d8a3SJacky Wang .containsExactly('a', "a char", '\n', "newline char"); 106*f585d8a3SJacky Wang } 107*f585d8a3SJacky Wang 108*f585d8a3SJacky Wang @Test classKeyMap()109*f585d8a3SJacky Wang public void classKeyMap() { 110*f585d8a3SJacky Wang assertThat(multibindingComponent.classKeyMap()) 111*f585d8a3SJacky Wang .containsExactly(Integer.class, "integer", Long.class, "long"); 112*f585d8a3SJacky Wang } 113*f585d8a3SJacky Wang 114*f585d8a3SJacky Wang @Test numberClassKeyMap()115*f585d8a3SJacky Wang public void numberClassKeyMap() { 116*f585d8a3SJacky Wang assertThat(multibindingComponent.numberClassKeyMap()) 117*f585d8a3SJacky Wang .containsExactly(BigDecimal.class, "bigdecimal", BigInteger.class, "biginteger"); 118*f585d8a3SJacky Wang } 119*f585d8a3SJacky Wang 120*f585d8a3SJacky Wang @Test intKeyMap()121*f585d8a3SJacky Wang public void intKeyMap() { 122*f585d8a3SJacky Wang assertThat(multibindingComponent.integerKeyMap()).containsExactly(100, "100 int"); 123*f585d8a3SJacky Wang } 124*f585d8a3SJacky Wang 125*f585d8a3SJacky Wang @Test longKeyMap()126*f585d8a3SJacky Wang public void longKeyMap() { 127*f585d8a3SJacky Wang assertThat(multibindingComponent.longKeyMap()).containsExactly((long) 100, "100 long"); 128*f585d8a3SJacky Wang } 129*f585d8a3SJacky Wang 130*f585d8a3SJacky Wang @Test shortKeyMap()131*f585d8a3SJacky Wang public void shortKeyMap() { 132*f585d8a3SJacky Wang assertThat(multibindingComponent.shortKeyMap()).containsExactly((short) 100, "100 short"); 133*f585d8a3SJacky Wang } 134*f585d8a3SJacky Wang setBindings()135*f585d8a3SJacky Wang @Test public void setBindings() { 136*f585d8a3SJacky Wang assertThat(multibindingComponent.set()) 137*f585d8a3SJacky Wang .containsExactly(-90, -17, -1, 5, 6, 832, 1742, -101, -102); 138*f585d8a3SJacky Wang } 139*f585d8a3SJacky Wang 140*f585d8a3SJacky Wang @Test complexQualifierSet()141*f585d8a3SJacky Wang public void complexQualifierSet() { 142*f585d8a3SJacky Wang assertThat(multibindingComponent.complexQualifierStringSet()).containsExactly("foo"); 143*f585d8a3SJacky Wang } 144*f585d8a3SJacky Wang 145*f585d8a3SJacky Wang @Test emptySet()146*f585d8a3SJacky Wang public void emptySet() { 147*f585d8a3SJacky Wang assertThat(multibindingComponent.emptySet()).isEmpty(); 148*f585d8a3SJacky Wang } 149*f585d8a3SJacky Wang 150*f585d8a3SJacky Wang @Test emptyQualifiedSet()151*f585d8a3SJacky Wang public void emptyQualifiedSet() { 152*f585d8a3SJacky Wang assertThat(multibindingComponent.emptyQualifiedSet()).isEmpty(); 153*f585d8a3SJacky Wang } 154*f585d8a3SJacky Wang 155*f585d8a3SJacky Wang @Test emptyMap()156*f585d8a3SJacky Wang public void emptyMap() { 157*f585d8a3SJacky Wang assertThat(multibindingComponent.emptyMap()).isEmpty(); 158*f585d8a3SJacky Wang } 159*f585d8a3SJacky Wang 160*f585d8a3SJacky Wang @Test emptyQualifiedMap()161*f585d8a3SJacky Wang public void emptyQualifiedMap() { 162*f585d8a3SJacky Wang assertThat(multibindingComponent.emptyQualifiedMap()).isEmpty(); 163*f585d8a3SJacky Wang } 164*f585d8a3SJacky Wang 165*f585d8a3SJacky Wang @Test maybeEmptySet()166*f585d8a3SJacky Wang public void maybeEmptySet() { 167*f585d8a3SJacky Wang assertThat(multibindingComponent.maybeEmptySet()).containsExactly("foo"); 168*f585d8a3SJacky Wang } 169*f585d8a3SJacky Wang 170*f585d8a3SJacky Wang @Test maybeEmptyQualifiedSet()171*f585d8a3SJacky Wang public void maybeEmptyQualifiedSet() { 172*f585d8a3SJacky Wang assertThat(multibindingComponent.maybeEmptyQualifiedSet()).containsExactly("qualified foo"); 173*f585d8a3SJacky Wang } 174*f585d8a3SJacky Wang 175*f585d8a3SJacky Wang @Test maybeEmptyMap()176*f585d8a3SJacky Wang public void maybeEmptyMap() { 177*f585d8a3SJacky Wang assertThat(multibindingComponent.maybeEmptyMap()).containsEntry("key", "foo value"); 178*f585d8a3SJacky Wang } 179*f585d8a3SJacky Wang 180*f585d8a3SJacky Wang @Test maybeEmptyQualifiedMap()181*f585d8a3SJacky Wang public void maybeEmptyQualifiedMap() { 182*f585d8a3SJacky Wang assertThat(multibindingComponent.maybeEmptyQualifiedMap()) 183*f585d8a3SJacky Wang .containsEntry("key", "qualified foo value"); 184*f585d8a3SJacky Wang } 185*f585d8a3SJacky Wang 186*f585d8a3SJacky Wang @AutoAnnotation testStringKey(String value)187*f585d8a3SJacky Wang static StringKey testStringKey(String value) { 188*f585d8a3SJacky Wang return new AutoAnnotation_MultibindingTest_testStringKey(value); 189*f585d8a3SJacky Wang } 190*f585d8a3SJacky Wang 191*f585d8a3SJacky Wang @AutoAnnotation nestedWrappedKey(Class<?> value)192*f585d8a3SJacky Wang static NestedAnnotationContainer.NestedWrappedKey nestedWrappedKey(Class<?> value) { 193*f585d8a3SJacky Wang return new AutoAnnotation_MultibindingTest_nestedWrappedKey(value); 194*f585d8a3SJacky Wang } 195*f585d8a3SJacky Wang 196*f585d8a3SJacky Wang @AutoAnnotation testWrappedAnnotationKey( StringKey value, int[] integers, ClassKey[] annotations, Class<? extends Number>[] classes)197*f585d8a3SJacky Wang static WrappedAnnotationKey testWrappedAnnotationKey( 198*f585d8a3SJacky Wang StringKey value, int[] integers, ClassKey[] annotations, Class<? extends Number>[] classes) { 199*f585d8a3SJacky Wang return new AutoAnnotation_MultibindingTest_testWrappedAnnotationKey( 200*f585d8a3SJacky Wang value, integers, annotations, classes); 201*f585d8a3SJacky Wang } 202*f585d8a3SJacky Wang } 203