1*f585d8a3SJacky Wang /* 2*f585d8a3SJacky Wang * Copyright (C) 2014 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 SwitchingProviderTest { 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 SwitchingProviderTest(CompilerMode compilerMode)40*f585d8a3SJacky Wang public SwitchingProviderTest(CompilerMode compilerMode) { 41*f585d8a3SJacky Wang this.compilerMode = compilerMode; 42*f585d8a3SJacky Wang } 43*f585d8a3SJacky Wang 44*f585d8a3SJacky Wang @Test switchingProviderTest()45*f585d8a3SJacky Wang public void switchingProviderTest() throws Exception { 46*f585d8a3SJacky Wang ImmutableList.Builder<Source> sources = ImmutableList.builder(); 47*f585d8a3SJacky Wang StringBuilder entryPoints = new StringBuilder(); 48*f585d8a3SJacky Wang for (int i = 0; i <= 100; i++) { 49*f585d8a3SJacky Wang String bindingName = "Binding" + i; 50*f585d8a3SJacky Wang sources.add( 51*f585d8a3SJacky Wang CompilerTests.javaSource( 52*f585d8a3SJacky Wang "test." + bindingName, 53*f585d8a3SJacky Wang "package test;", 54*f585d8a3SJacky Wang "", 55*f585d8a3SJacky Wang "import javax.inject.Inject;", 56*f585d8a3SJacky Wang "", 57*f585d8a3SJacky Wang "final class " + bindingName + " {", 58*f585d8a3SJacky Wang " @Inject", 59*f585d8a3SJacky Wang " " + bindingName + "() {}", 60*f585d8a3SJacky Wang "}")); 61*f585d8a3SJacky Wang entryPoints.append(String.format(" Provider<%1$s> get%1$sProvider();\n", bindingName)); 62*f585d8a3SJacky Wang } 63*f585d8a3SJacky Wang 64*f585d8a3SJacky Wang sources.add( 65*f585d8a3SJacky Wang CompilerTests.javaSource( 66*f585d8a3SJacky Wang "test.TestComponent", 67*f585d8a3SJacky Wang "package test;", 68*f585d8a3SJacky Wang "", 69*f585d8a3SJacky Wang "import dagger.Component;", 70*f585d8a3SJacky Wang "import javax.inject.Provider;", 71*f585d8a3SJacky Wang "", 72*f585d8a3SJacky Wang "@Component", 73*f585d8a3SJacky Wang "interface TestComponent {", 74*f585d8a3SJacky Wang entryPoints.toString(), 75*f585d8a3SJacky Wang "}")); 76*f585d8a3SJacky Wang 77*f585d8a3SJacky Wang CompilerTests.daggerCompiler(sources.build()) 78*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 79*f585d8a3SJacky Wang .compile( 80*f585d8a3SJacky Wang subject -> { 81*f585d8a3SJacky Wang subject.hasErrorCount(0); 82*f585d8a3SJacky Wang subject.hasWarningCount(0); 83*f585d8a3SJacky Wang subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent")); 84*f585d8a3SJacky Wang }); 85*f585d8a3SJacky Wang } 86*f585d8a3SJacky Wang 87*f585d8a3SJacky Wang @Test unscopedBinds()88*f585d8a3SJacky Wang public void unscopedBinds() throws Exception { 89*f585d8a3SJacky Wang Source module = 90*f585d8a3SJacky Wang CompilerTests.javaSource( 91*f585d8a3SJacky Wang "test.TestModule", 92*f585d8a3SJacky Wang "package test;", 93*f585d8a3SJacky Wang "", 94*f585d8a3SJacky Wang "import dagger.Binds;", 95*f585d8a3SJacky Wang "import dagger.Module;", 96*f585d8a3SJacky Wang "import dagger.Provides;", 97*f585d8a3SJacky Wang "", 98*f585d8a3SJacky Wang "@Module", 99*f585d8a3SJacky Wang "interface TestModule {", 100*f585d8a3SJacky Wang " @Provides", 101*f585d8a3SJacky Wang " static String s() {", 102*f585d8a3SJacky Wang " return new String();", 103*f585d8a3SJacky Wang " }", 104*f585d8a3SJacky Wang "", 105*f585d8a3SJacky Wang " @Binds CharSequence c(String s);", 106*f585d8a3SJacky Wang " @Binds Object o(CharSequence c);", 107*f585d8a3SJacky Wang "}"); 108*f585d8a3SJacky Wang Source component = 109*f585d8a3SJacky Wang CompilerTests.javaSource( 110*f585d8a3SJacky Wang "test.TestComponent", 111*f585d8a3SJacky Wang "package test;", 112*f585d8a3SJacky Wang "", 113*f585d8a3SJacky Wang "import dagger.Component;", 114*f585d8a3SJacky Wang "import javax.inject.Provider;", 115*f585d8a3SJacky Wang "", 116*f585d8a3SJacky Wang "@Component(modules = TestModule.class)", 117*f585d8a3SJacky Wang "interface TestComponent {", 118*f585d8a3SJacky Wang " Provider<Object> objectProvider();", 119*f585d8a3SJacky Wang " Provider<CharSequence> charSequenceProvider();", 120*f585d8a3SJacky Wang "}"); 121*f585d8a3SJacky Wang 122*f585d8a3SJacky Wang CompilerTests.daggerCompiler(module, component) 123*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 124*f585d8a3SJacky Wang .compile( 125*f585d8a3SJacky Wang subject -> { 126*f585d8a3SJacky Wang subject.hasErrorCount(0); 127*f585d8a3SJacky Wang subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent")); 128*f585d8a3SJacky Wang }); 129*f585d8a3SJacky Wang } 130*f585d8a3SJacky Wang 131*f585d8a3SJacky Wang @Test scopedBinds()132*f585d8a3SJacky Wang public void scopedBinds() throws Exception { 133*f585d8a3SJacky Wang Source module = 134*f585d8a3SJacky Wang CompilerTests.javaSource( 135*f585d8a3SJacky Wang "test.TestModule", 136*f585d8a3SJacky Wang "package test;", 137*f585d8a3SJacky Wang "", 138*f585d8a3SJacky Wang "import dagger.Binds;", 139*f585d8a3SJacky Wang "import dagger.Module;", 140*f585d8a3SJacky Wang "import dagger.Provides;", 141*f585d8a3SJacky Wang "import javax.inject.Singleton;", 142*f585d8a3SJacky Wang "", 143*f585d8a3SJacky Wang "@Module", 144*f585d8a3SJacky Wang "interface TestModule {", 145*f585d8a3SJacky Wang " @Provides", 146*f585d8a3SJacky Wang " static String s() {", 147*f585d8a3SJacky Wang " return new String();", 148*f585d8a3SJacky Wang " }", 149*f585d8a3SJacky Wang "", 150*f585d8a3SJacky Wang " @Binds @Singleton Object o(CharSequence s);", 151*f585d8a3SJacky Wang " @Binds @Singleton CharSequence c(String s);", 152*f585d8a3SJacky Wang "}"); 153*f585d8a3SJacky Wang Source component = 154*f585d8a3SJacky Wang CompilerTests.javaSource( 155*f585d8a3SJacky Wang "test.TestComponent", 156*f585d8a3SJacky Wang "package test;", 157*f585d8a3SJacky Wang "", 158*f585d8a3SJacky Wang "import dagger.Component;", 159*f585d8a3SJacky Wang "import javax.inject.Provider;", 160*f585d8a3SJacky Wang "import javax.inject.Singleton;", 161*f585d8a3SJacky Wang "", 162*f585d8a3SJacky Wang "@Singleton", 163*f585d8a3SJacky Wang "@Component(modules = TestModule.class)", 164*f585d8a3SJacky Wang "interface TestComponent {", 165*f585d8a3SJacky Wang " Provider<Object> objectProvider();", 166*f585d8a3SJacky Wang " Provider<CharSequence> charSequenceProvider();", 167*f585d8a3SJacky Wang "}"); 168*f585d8a3SJacky Wang 169*f585d8a3SJacky Wang CompilerTests.daggerCompiler(module, component) 170*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 171*f585d8a3SJacky Wang .compile( 172*f585d8a3SJacky Wang subject -> { 173*f585d8a3SJacky Wang subject.hasErrorCount(0); 174*f585d8a3SJacky Wang subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent")); 175*f585d8a3SJacky Wang }); 176*f585d8a3SJacky Wang } 177*f585d8a3SJacky Wang 178*f585d8a3SJacky Wang @Test emptyMultibindings_avoidSwitchProviders()179*f585d8a3SJacky Wang public void emptyMultibindings_avoidSwitchProviders() throws Exception { 180*f585d8a3SJacky Wang Source module = 181*f585d8a3SJacky Wang CompilerTests.javaSource( 182*f585d8a3SJacky Wang "test.TestModule", 183*f585d8a3SJacky Wang "package test;", 184*f585d8a3SJacky Wang "", 185*f585d8a3SJacky Wang "import dagger.multibindings.Multibinds;", 186*f585d8a3SJacky Wang "import dagger.Module;", 187*f585d8a3SJacky Wang "import java.util.Map;", 188*f585d8a3SJacky Wang "import java.util.Set;", 189*f585d8a3SJacky Wang "", 190*f585d8a3SJacky Wang "@Module", 191*f585d8a3SJacky Wang "interface TestModule {", 192*f585d8a3SJacky Wang " @Multibinds Set<String> set();", 193*f585d8a3SJacky Wang " @Multibinds Map<String, String> map();", 194*f585d8a3SJacky Wang "}"); 195*f585d8a3SJacky Wang Source component = 196*f585d8a3SJacky Wang CompilerTests.javaSource( 197*f585d8a3SJacky Wang "test.TestComponent", 198*f585d8a3SJacky Wang "package test;", 199*f585d8a3SJacky Wang "", 200*f585d8a3SJacky Wang "import dagger.Component;", 201*f585d8a3SJacky Wang "import java.util.Map;", 202*f585d8a3SJacky Wang "import java.util.Set;", 203*f585d8a3SJacky Wang "import javax.inject.Provider;", 204*f585d8a3SJacky Wang "", 205*f585d8a3SJacky Wang "@Component(modules = TestModule.class)", 206*f585d8a3SJacky Wang "interface TestComponent {", 207*f585d8a3SJacky Wang " Provider<Set<String>> setProvider();", 208*f585d8a3SJacky Wang " Provider<Map<String, String>> mapProvider();", 209*f585d8a3SJacky Wang "}"); 210*f585d8a3SJacky Wang 211*f585d8a3SJacky Wang CompilerTests.daggerCompiler(module, component) 212*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 213*f585d8a3SJacky Wang .compile( 214*f585d8a3SJacky Wang subject -> { 215*f585d8a3SJacky Wang subject.hasErrorCount(0); 216*f585d8a3SJacky Wang subject.hasWarningCount(0); 217*f585d8a3SJacky Wang subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent")); 218*f585d8a3SJacky Wang }); 219*f585d8a3SJacky Wang } 220*f585d8a3SJacky Wang 221*f585d8a3SJacky Wang @Test memberInjectors()222*f585d8a3SJacky Wang public void memberInjectors() throws Exception { 223*f585d8a3SJacky Wang Source foo = 224*f585d8a3SJacky Wang CompilerTests.javaSource( 225*f585d8a3SJacky Wang "test.Foo", 226*f585d8a3SJacky Wang "package test;", 227*f585d8a3SJacky Wang "", 228*f585d8a3SJacky Wang "class Foo {}"); 229*f585d8a3SJacky Wang Source component = 230*f585d8a3SJacky Wang CompilerTests.javaSource( 231*f585d8a3SJacky Wang "test.TestComponent", 232*f585d8a3SJacky Wang "package test;", 233*f585d8a3SJacky Wang "", 234*f585d8a3SJacky Wang "import dagger.Component;", 235*f585d8a3SJacky Wang "import dagger.MembersInjector;", 236*f585d8a3SJacky Wang "import javax.inject.Provider;", 237*f585d8a3SJacky Wang "", 238*f585d8a3SJacky Wang "@Component", 239*f585d8a3SJacky Wang "interface TestComponent {", 240*f585d8a3SJacky Wang " Provider<MembersInjector<Foo>> providerOfMembersInjector();", 241*f585d8a3SJacky Wang "}"); 242*f585d8a3SJacky Wang 243*f585d8a3SJacky Wang CompilerTests.daggerCompiler(foo, component) 244*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 245*f585d8a3SJacky Wang .compile( 246*f585d8a3SJacky Wang subject -> { 247*f585d8a3SJacky Wang subject.hasErrorCount(0); 248*f585d8a3SJacky Wang subject.hasWarningCount(0); 249*f585d8a3SJacky Wang subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent")); 250*f585d8a3SJacky Wang }); 251*f585d8a3SJacky Wang } 252*f585d8a3SJacky Wang 253*f585d8a3SJacky Wang @Test optionals()254*f585d8a3SJacky Wang public void optionals() throws Exception { 255*f585d8a3SJacky Wang Source present = 256*f585d8a3SJacky Wang CompilerTests.javaSource( 257*f585d8a3SJacky Wang "test.Present", 258*f585d8a3SJacky Wang "package test;", 259*f585d8a3SJacky Wang "", 260*f585d8a3SJacky Wang "class Present {}"); 261*f585d8a3SJacky Wang Source absent = 262*f585d8a3SJacky Wang CompilerTests.javaSource( 263*f585d8a3SJacky Wang "test.Absent", 264*f585d8a3SJacky Wang "package test;", 265*f585d8a3SJacky Wang "", 266*f585d8a3SJacky Wang "class Absent {}"); 267*f585d8a3SJacky Wang Source module = 268*f585d8a3SJacky Wang CompilerTests.javaSource( 269*f585d8a3SJacky Wang "test.TestModule", 270*f585d8a3SJacky Wang "package test;", 271*f585d8a3SJacky Wang "", 272*f585d8a3SJacky Wang "import dagger.BindsOptionalOf;", 273*f585d8a3SJacky Wang "import dagger.Module;", 274*f585d8a3SJacky Wang "import dagger.Provides;", 275*f585d8a3SJacky Wang "", 276*f585d8a3SJacky Wang "@Module", 277*f585d8a3SJacky Wang "interface TestModule {", 278*f585d8a3SJacky Wang " @BindsOptionalOf Present bindOptionalOfPresent();", 279*f585d8a3SJacky Wang " @BindsOptionalOf Absent bindOptionalOfAbsent();", 280*f585d8a3SJacky Wang "", 281*f585d8a3SJacky Wang " @Provides static Present p() { return new Present(); }", 282*f585d8a3SJacky Wang "}"); 283*f585d8a3SJacky Wang Source component = 284*f585d8a3SJacky Wang CompilerTests.javaSource( 285*f585d8a3SJacky Wang "test.TestComponent", 286*f585d8a3SJacky Wang "package test;", 287*f585d8a3SJacky Wang "", 288*f585d8a3SJacky Wang "import dagger.Component;", 289*f585d8a3SJacky Wang "import java.util.Optional;", 290*f585d8a3SJacky Wang "import javax.inject.Provider;", 291*f585d8a3SJacky Wang "", 292*f585d8a3SJacky Wang "@Component(modules = TestModule.class)", 293*f585d8a3SJacky Wang "interface TestComponent {", 294*f585d8a3SJacky Wang " Provider<Optional<Present>> providerOfOptionalOfPresent();", 295*f585d8a3SJacky Wang " Provider<Optional<Absent>> providerOfOptionalOfAbsent();", 296*f585d8a3SJacky Wang "}"); 297*f585d8a3SJacky Wang 298*f585d8a3SJacky Wang CompilerTests.daggerCompiler(present, absent, module, component) 299*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 300*f585d8a3SJacky Wang .compile( 301*f585d8a3SJacky Wang subject -> { 302*f585d8a3SJacky Wang subject.hasErrorCount(0); 303*f585d8a3SJacky Wang subject.hasWarningCount(0); 304*f585d8a3SJacky Wang subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent")); 305*f585d8a3SJacky Wang }); 306*f585d8a3SJacky Wang } 307*f585d8a3SJacky Wang } 308