1*f585d8a3SJacky Wang /* 2*f585d8a3SJacky Wang * Copyright (C) 2017 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.internal.codegen; 18*f585d8a3SJacky Wang 19*f585d8a3SJacky Wang import androidx.room.compiler.processing.util.Source; 20*f585d8a3SJacky Wang import com.google.common.collect.ImmutableList; 21*f585d8a3SJacky Wang import dagger.testing.compile.CompilerTests; 22*f585d8a3SJacky Wang import dagger.testing.golden.GoldenFileRule; 23*f585d8a3SJacky Wang import org.junit.Rule; 24*f585d8a3SJacky Wang import org.junit.Test; 25*f585d8a3SJacky Wang import org.junit.runner.RunWith; 26*f585d8a3SJacky Wang import org.junit.runners.Parameterized; 27*f585d8a3SJacky Wang import org.junit.runners.Parameterized.Parameters; 28*f585d8a3SJacky Wang 29*f585d8a3SJacky Wang @RunWith(Parameterized.class) 30*f585d8a3SJacky Wang public class MapRequestRepresentationWithGuavaTest { 31*f585d8a3SJacky Wang @Parameters(name = "{0}") parameters()32*f585d8a3SJacky Wang public static ImmutableList<Object[]> parameters() { 33*f585d8a3SJacky Wang return CompilerMode.TEST_PARAMETERS; 34*f585d8a3SJacky Wang } 35*f585d8a3SJacky Wang 36*f585d8a3SJacky Wang @Rule public GoldenFileRule goldenFileRule = new GoldenFileRule(); 37*f585d8a3SJacky Wang 38*f585d8a3SJacky Wang private final CompilerMode compilerMode; 39*f585d8a3SJacky Wang MapRequestRepresentationWithGuavaTest(CompilerMode compilerMode)40*f585d8a3SJacky Wang public MapRequestRepresentationWithGuavaTest(CompilerMode compilerMode) { 41*f585d8a3SJacky Wang this.compilerMode = compilerMode; 42*f585d8a3SJacky Wang } 43*f585d8a3SJacky Wang 44*f585d8a3SJacky Wang @Test mapBindings()45*f585d8a3SJacky Wang public void mapBindings() throws Exception { 46*f585d8a3SJacky Wang Source mapModuleFile = 47*f585d8a3SJacky Wang CompilerTests.javaSource( 48*f585d8a3SJacky Wang "test.MapModule", 49*f585d8a3SJacky Wang "package test;", 50*f585d8a3SJacky Wang "", 51*f585d8a3SJacky Wang "import dagger.Module;", 52*f585d8a3SJacky Wang "import dagger.Provides;", 53*f585d8a3SJacky Wang "import dagger.multibindings.IntKey;", 54*f585d8a3SJacky Wang "import dagger.multibindings.IntoMap;", 55*f585d8a3SJacky Wang "import dagger.multibindings.LongKey;", 56*f585d8a3SJacky Wang "import dagger.multibindings.Multibinds;", 57*f585d8a3SJacky Wang "import java.util.Map;", 58*f585d8a3SJacky Wang "", 59*f585d8a3SJacky Wang "@Module", 60*f585d8a3SJacky Wang "interface MapModule {", 61*f585d8a3SJacky Wang " @Multibinds Map<String, String> stringMap();", 62*f585d8a3SJacky Wang " @Provides @IntoMap @IntKey(0) static int provideInt() { return 0; }", 63*f585d8a3SJacky Wang " @Provides @IntoMap @LongKey(0) static long provideLong0() { return 0; }", 64*f585d8a3SJacky Wang " @Provides @IntoMap @LongKey(1) static long provideLong1() { return 1; }", 65*f585d8a3SJacky Wang " @Provides @IntoMap @LongKey(2) static long provideLong2() { return 2; }", 66*f585d8a3SJacky Wang "}"); 67*f585d8a3SJacky Wang Source subcomponentModuleFile = 68*f585d8a3SJacky Wang CompilerTests.javaSource( 69*f585d8a3SJacky Wang "test.SubcomponentMapModule", 70*f585d8a3SJacky Wang "package test;", 71*f585d8a3SJacky Wang "", 72*f585d8a3SJacky Wang "import dagger.Module;", 73*f585d8a3SJacky Wang "import dagger.Provides;", 74*f585d8a3SJacky Wang "import dagger.multibindings.IntKey;", 75*f585d8a3SJacky Wang "import dagger.multibindings.IntoMap;", 76*f585d8a3SJacky Wang "import dagger.multibindings.LongKey;", 77*f585d8a3SJacky Wang "import dagger.multibindings.Multibinds;", 78*f585d8a3SJacky Wang "import java.util.Map;", 79*f585d8a3SJacky Wang "", 80*f585d8a3SJacky Wang "@Module", 81*f585d8a3SJacky Wang "interface SubcomponentMapModule {", 82*f585d8a3SJacky Wang " @Provides @IntoMap @LongKey(3) static long provideLong3() { return 3; }", 83*f585d8a3SJacky Wang " @Provides @IntoMap @LongKey(4) static long provideLong4() { return 4; }", 84*f585d8a3SJacky Wang " @Provides @IntoMap @LongKey(5) static long provideLong5() { return 5; }", 85*f585d8a3SJacky Wang "}"); 86*f585d8a3SJacky Wang Source componentFile = 87*f585d8a3SJacky Wang CompilerTests.javaSource( 88*f585d8a3SJacky Wang "test.TestComponent", 89*f585d8a3SJacky Wang "package test;", 90*f585d8a3SJacky Wang "", 91*f585d8a3SJacky Wang "import dagger.Component;", 92*f585d8a3SJacky Wang "import java.util.Map;", 93*f585d8a3SJacky Wang "import javax.inject.Provider;", 94*f585d8a3SJacky Wang "", 95*f585d8a3SJacky Wang "@Component(modules = MapModule.class)", 96*f585d8a3SJacky Wang "interface TestComponent {", 97*f585d8a3SJacky Wang " Map<String, String> strings();", 98*f585d8a3SJacky Wang " Map<String, Provider<String>> providerStrings();", 99*f585d8a3SJacky Wang "", 100*f585d8a3SJacky Wang " Map<Integer, Integer> ints();", 101*f585d8a3SJacky Wang " Map<Integer, Provider<Integer>> providerInts();", 102*f585d8a3SJacky Wang " Map<Long, Long> longs();", 103*f585d8a3SJacky Wang " Map<Long, Provider<Long>> providerLongs();", 104*f585d8a3SJacky Wang "", 105*f585d8a3SJacky Wang " Sub sub();", 106*f585d8a3SJacky Wang "}"); 107*f585d8a3SJacky Wang Source subcomponent = 108*f585d8a3SJacky Wang CompilerTests.javaSource( 109*f585d8a3SJacky Wang "test.Sub", 110*f585d8a3SJacky Wang "package test;", 111*f585d8a3SJacky Wang "", 112*f585d8a3SJacky Wang "import dagger.Subcomponent;", 113*f585d8a3SJacky Wang "import java.util.Map;", 114*f585d8a3SJacky Wang "import javax.inject.Provider;", 115*f585d8a3SJacky Wang "", 116*f585d8a3SJacky Wang "@Subcomponent(modules = SubcomponentMapModule.class)", 117*f585d8a3SJacky Wang "interface Sub {", 118*f585d8a3SJacky Wang " Map<Long, Long> longs();", 119*f585d8a3SJacky Wang " Map<Long, Provider<Long>> providerLongs();", 120*f585d8a3SJacky Wang "}"); 121*f585d8a3SJacky Wang CompilerTests.daggerCompiler(mapModuleFile, componentFile, subcomponentModuleFile, subcomponent) 122*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 123*f585d8a3SJacky Wang .compile( 124*f585d8a3SJacky Wang subject -> { 125*f585d8a3SJacky Wang subject.hasErrorCount(0); 126*f585d8a3SJacky Wang subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent")); 127*f585d8a3SJacky Wang }); 128*f585d8a3SJacky Wang } 129*f585d8a3SJacky Wang 130*f585d8a3SJacky Wang @Test inaccessible()131*f585d8a3SJacky Wang public void inaccessible() throws Exception { 132*f585d8a3SJacky Wang Source inaccessible = 133*f585d8a3SJacky Wang CompilerTests.javaSource( 134*f585d8a3SJacky Wang "other.Inaccessible", "package other;", "", "class Inaccessible {}"); 135*f585d8a3SJacky Wang Source usesInaccessible = 136*f585d8a3SJacky Wang CompilerTests.javaSource( 137*f585d8a3SJacky Wang "other.UsesInaccessible", 138*f585d8a3SJacky Wang "package other;", 139*f585d8a3SJacky Wang "", 140*f585d8a3SJacky Wang "import java.util.Map;", 141*f585d8a3SJacky Wang "import javax.inject.Inject;", 142*f585d8a3SJacky Wang "", 143*f585d8a3SJacky Wang "public class UsesInaccessible {", 144*f585d8a3SJacky Wang " @Inject UsesInaccessible(Map<Integer, Inaccessible> map) {}", 145*f585d8a3SJacky Wang "}"); 146*f585d8a3SJacky Wang 147*f585d8a3SJacky Wang Source module = 148*f585d8a3SJacky Wang CompilerTests.javaSource( 149*f585d8a3SJacky Wang "other.TestModule", 150*f585d8a3SJacky Wang "package other;", 151*f585d8a3SJacky Wang "", 152*f585d8a3SJacky Wang "import dagger.Module;", 153*f585d8a3SJacky Wang "import dagger.multibindings.Multibinds;", 154*f585d8a3SJacky Wang "import java.util.Map;", 155*f585d8a3SJacky Wang "", 156*f585d8a3SJacky Wang "@Module", 157*f585d8a3SJacky Wang "public abstract class TestModule {", 158*f585d8a3SJacky Wang " @Multibinds abstract Map<Integer, Inaccessible> ints();", 159*f585d8a3SJacky Wang "}"); 160*f585d8a3SJacky Wang Source componentFile = 161*f585d8a3SJacky Wang CompilerTests.javaSource( 162*f585d8a3SJacky Wang "test.TestComponent", 163*f585d8a3SJacky Wang "package test;", 164*f585d8a3SJacky Wang "", 165*f585d8a3SJacky Wang "import dagger.Component;", 166*f585d8a3SJacky Wang "import java.util.Map;", 167*f585d8a3SJacky Wang "import javax.inject.Provider;", 168*f585d8a3SJacky Wang "import other.TestModule;", 169*f585d8a3SJacky Wang "import other.UsesInaccessible;", 170*f585d8a3SJacky Wang "", 171*f585d8a3SJacky Wang "@Component(modules = TestModule.class)", 172*f585d8a3SJacky Wang "interface TestComponent {", 173*f585d8a3SJacky Wang " UsesInaccessible usesInaccessible();", 174*f585d8a3SJacky Wang "}"); 175*f585d8a3SJacky Wang 176*f585d8a3SJacky Wang CompilerTests.daggerCompiler(module, inaccessible, usesInaccessible, componentFile) 177*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 178*f585d8a3SJacky Wang .compile( 179*f585d8a3SJacky Wang subject -> { 180*f585d8a3SJacky Wang subject.hasErrorCount(0); 181*f585d8a3SJacky Wang subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent")); 182*f585d8a3SJacky Wang }); 183*f585d8a3SJacky Wang } 184*f585d8a3SJacky Wang 185*f585d8a3SJacky Wang @Test subcomponentOmitsInheritedBindings()186*f585d8a3SJacky Wang public void subcomponentOmitsInheritedBindings() throws Exception { 187*f585d8a3SJacky Wang Source parent = 188*f585d8a3SJacky Wang CompilerTests.javaSource( 189*f585d8a3SJacky Wang "test.Parent", 190*f585d8a3SJacky Wang "package test;", 191*f585d8a3SJacky Wang "", 192*f585d8a3SJacky Wang "import dagger.Component;", 193*f585d8a3SJacky Wang "", 194*f585d8a3SJacky Wang "@Component(modules = ParentModule.class)", 195*f585d8a3SJacky Wang "interface Parent {", 196*f585d8a3SJacky Wang " Child child();", 197*f585d8a3SJacky Wang "}"); 198*f585d8a3SJacky Wang Source parentModule = 199*f585d8a3SJacky Wang CompilerTests.javaSource( 200*f585d8a3SJacky Wang "test.ParentModule", 201*f585d8a3SJacky Wang "package test;", 202*f585d8a3SJacky Wang "", 203*f585d8a3SJacky Wang "import dagger.Module;", 204*f585d8a3SJacky Wang "import dagger.Provides;", 205*f585d8a3SJacky Wang "import dagger.multibindings.IntoMap;", 206*f585d8a3SJacky Wang "import dagger.multibindings.StringKey;", 207*f585d8a3SJacky Wang "", 208*f585d8a3SJacky Wang "@Module", 209*f585d8a3SJacky Wang "class ParentModule {", 210*f585d8a3SJacky Wang " @Provides @IntoMap @StringKey(\"parent key\") Object parentKeyObject() {", 211*f585d8a3SJacky Wang " return \"parent value\";", 212*f585d8a3SJacky Wang " }", 213*f585d8a3SJacky Wang "}"); 214*f585d8a3SJacky Wang Source child = 215*f585d8a3SJacky Wang CompilerTests.javaSource( 216*f585d8a3SJacky Wang "test.Child", 217*f585d8a3SJacky Wang "package test;", 218*f585d8a3SJacky Wang "", 219*f585d8a3SJacky Wang "import dagger.Subcomponent;", 220*f585d8a3SJacky Wang "import java.util.Map;", 221*f585d8a3SJacky Wang "", 222*f585d8a3SJacky Wang "@Subcomponent", 223*f585d8a3SJacky Wang "interface Child {", 224*f585d8a3SJacky Wang " Map<String, Object> objectMap();", 225*f585d8a3SJacky Wang "}"); 226*f585d8a3SJacky Wang 227*f585d8a3SJacky Wang CompilerTests.daggerCompiler(parent, parentModule, child) 228*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 229*f585d8a3SJacky Wang .compile( 230*f585d8a3SJacky Wang subject -> { 231*f585d8a3SJacky Wang subject.hasErrorCount(0); 232*f585d8a3SJacky Wang subject.generatedSource(goldenFileRule.goldenSource("test/DaggerParent")); 233*f585d8a3SJacky Wang }); 234*f585d8a3SJacky Wang } 235*f585d8a3SJacky Wang 236*f585d8a3SJacky Wang @Test productionComponents()237*f585d8a3SJacky Wang public void productionComponents() throws Exception { 238*f585d8a3SJacky Wang Source mapModuleFile = 239*f585d8a3SJacky Wang CompilerTests.javaSource( 240*f585d8a3SJacky Wang "test.MapModule", 241*f585d8a3SJacky Wang "package test;", 242*f585d8a3SJacky Wang "", 243*f585d8a3SJacky Wang "import dagger.Module;", 244*f585d8a3SJacky Wang "import dagger.multibindings.Multibinds;", 245*f585d8a3SJacky Wang "import java.util.Map;", 246*f585d8a3SJacky Wang "", 247*f585d8a3SJacky Wang "@Module", 248*f585d8a3SJacky Wang "interface MapModule {", 249*f585d8a3SJacky Wang " @Multibinds Map<String, String> stringMap();", 250*f585d8a3SJacky Wang "}"); 251*f585d8a3SJacky Wang Source componentFile = 252*f585d8a3SJacky Wang CompilerTests.javaSource( 253*f585d8a3SJacky Wang "test.TestComponent", 254*f585d8a3SJacky Wang "package test;", 255*f585d8a3SJacky Wang "", 256*f585d8a3SJacky Wang "import com.google.common.util.concurrent.ListenableFuture;", 257*f585d8a3SJacky Wang "import dagger.producers.ProductionComponent;", 258*f585d8a3SJacky Wang "import java.util.Map;", 259*f585d8a3SJacky Wang "", 260*f585d8a3SJacky Wang "@ProductionComponent(modules = MapModule.class)", 261*f585d8a3SJacky Wang "interface TestComponent {", 262*f585d8a3SJacky Wang " ListenableFuture<Map<String, String>> stringMap();", 263*f585d8a3SJacky Wang "}"); 264*f585d8a3SJacky Wang 265*f585d8a3SJacky Wang CompilerTests.daggerCompiler(mapModuleFile, componentFile) 266*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 267*f585d8a3SJacky Wang .compile( 268*f585d8a3SJacky Wang subject -> { 269*f585d8a3SJacky Wang subject.hasErrorCount(0); 270*f585d8a3SJacky Wang subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent")); 271*f585d8a3SJacky Wang }); 272*f585d8a3SJacky Wang } 273*f585d8a3SJacky Wang } 274