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 dagger.testing.compile.CompilerTests; 21*f585d8a3SJacky Wang import dagger.testing.golden.GoldenFileRule; 22*f585d8a3SJacky Wang import java.util.Collection; 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 DelegateRequestRepresentationTest { 31*f585d8a3SJacky Wang @Parameters(name = "{0}") parameters()32*f585d8a3SJacky Wang public static Collection<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 DelegateRequestRepresentationTest(CompilerMode compilerMode)40*f585d8a3SJacky Wang public DelegateRequestRepresentationTest(CompilerMode compilerMode) { 41*f585d8a3SJacky Wang this.compilerMode = compilerMode; 42*f585d8a3SJacky Wang } 43*f585d8a3SJacky Wang 44*f585d8a3SJacky Wang private static final Source REGULAR_SCOPED = 45*f585d8a3SJacky Wang CompilerTests.javaSource( 46*f585d8a3SJacky Wang "test.RegularScoped", 47*f585d8a3SJacky Wang "package test;", 48*f585d8a3SJacky Wang "", 49*f585d8a3SJacky Wang "import javax.inject.Scope;", 50*f585d8a3SJacky Wang "import javax.inject.Inject;", 51*f585d8a3SJacky Wang "", 52*f585d8a3SJacky Wang "@RegularScoped.CustomScope", 53*f585d8a3SJacky Wang "class RegularScoped {", 54*f585d8a3SJacky Wang " @Inject RegularScoped() {}", 55*f585d8a3SJacky Wang "", 56*f585d8a3SJacky Wang " @Scope @interface CustomScope {}", 57*f585d8a3SJacky Wang "}"); 58*f585d8a3SJacky Wang 59*f585d8a3SJacky Wang private static final Source REUSABLE_SCOPED = 60*f585d8a3SJacky Wang CompilerTests.javaSource( 61*f585d8a3SJacky Wang "test.ReusableScoped", 62*f585d8a3SJacky Wang "package test;", 63*f585d8a3SJacky Wang "", 64*f585d8a3SJacky Wang "import dagger.Reusable;", 65*f585d8a3SJacky Wang "import javax.inject.Inject;", 66*f585d8a3SJacky Wang "", 67*f585d8a3SJacky Wang "@Reusable", 68*f585d8a3SJacky Wang "class ReusableScoped {", 69*f585d8a3SJacky Wang " @Inject ReusableScoped() {}", 70*f585d8a3SJacky Wang "}"); 71*f585d8a3SJacky Wang 72*f585d8a3SJacky Wang private static final Source UNSCOPED = 73*f585d8a3SJacky Wang CompilerTests.javaSource( 74*f585d8a3SJacky Wang "test.Unscoped", 75*f585d8a3SJacky Wang "package test;", 76*f585d8a3SJacky Wang "", 77*f585d8a3SJacky Wang "import javax.inject.Inject;", 78*f585d8a3SJacky Wang "", 79*f585d8a3SJacky Wang "class Unscoped {", 80*f585d8a3SJacky Wang " @Inject Unscoped() {}", 81*f585d8a3SJacky Wang "}"); 82*f585d8a3SJacky Wang 83*f585d8a3SJacky Wang private static final Source COMPONENT = 84*f585d8a3SJacky Wang CompilerTests.javaSource( 85*f585d8a3SJacky Wang "test.TestComponent", 86*f585d8a3SJacky Wang "package test;", 87*f585d8a3SJacky Wang "", 88*f585d8a3SJacky Wang "import dagger.Component;", 89*f585d8a3SJacky Wang "", 90*f585d8a3SJacky Wang "@Component(modules = TestModule.class)", 91*f585d8a3SJacky Wang "@RegularScoped.CustomScope", 92*f585d8a3SJacky Wang "interface TestComponent {", 93*f585d8a3SJacky Wang " @Qualifier(RegularScoped.class)", 94*f585d8a3SJacky Wang " Object regular();", 95*f585d8a3SJacky Wang "", 96*f585d8a3SJacky Wang " @Qualifier(ReusableScoped.class)", 97*f585d8a3SJacky Wang " Object reusable();", 98*f585d8a3SJacky Wang "", 99*f585d8a3SJacky Wang " @Qualifier(Unscoped.class)", 100*f585d8a3SJacky Wang " Object unscoped();", 101*f585d8a3SJacky Wang "}"); 102*f585d8a3SJacky Wang 103*f585d8a3SJacky Wang private static final Source QUALIFIER = 104*f585d8a3SJacky Wang CompilerTests.javaSource( 105*f585d8a3SJacky Wang "test.Qualifier", 106*f585d8a3SJacky Wang "package test;", 107*f585d8a3SJacky Wang "", 108*f585d8a3SJacky Wang "@javax.inject.Qualifier", 109*f585d8a3SJacky Wang "@interface Qualifier {", 110*f585d8a3SJacky Wang " Class<?> value();", 111*f585d8a3SJacky Wang "}"); 112*f585d8a3SJacky Wang 113*f585d8a3SJacky Wang @Test toDoubleCheck()114*f585d8a3SJacky Wang public void toDoubleCheck() throws Exception { 115*f585d8a3SJacky Wang Source module = 116*f585d8a3SJacky Wang CompilerTests.javaSource( 117*f585d8a3SJacky Wang "test.TestModule", 118*f585d8a3SJacky Wang "package test;", 119*f585d8a3SJacky Wang "", 120*f585d8a3SJacky Wang "import dagger.Binds;", 121*f585d8a3SJacky Wang "import dagger.Module;", 122*f585d8a3SJacky Wang "", 123*f585d8a3SJacky Wang "@Module", 124*f585d8a3SJacky Wang "interface TestModule {", 125*f585d8a3SJacky Wang " @Binds @RegularScoped.CustomScope @Qualifier(RegularScoped.class)", 126*f585d8a3SJacky Wang " Object regular(RegularScoped delegate);", 127*f585d8a3SJacky Wang "", 128*f585d8a3SJacky Wang " @Binds @RegularScoped.CustomScope @Qualifier(ReusableScoped.class)", 129*f585d8a3SJacky Wang " Object reusable(ReusableScoped delegate);", 130*f585d8a3SJacky Wang "", 131*f585d8a3SJacky Wang " @Binds @RegularScoped.CustomScope @Qualifier(Unscoped.class)", 132*f585d8a3SJacky Wang " Object unscoped(Unscoped delegate);", 133*f585d8a3SJacky Wang "}"); 134*f585d8a3SJacky Wang 135*f585d8a3SJacky Wang CompilerTests.daggerCompiler( 136*f585d8a3SJacky Wang module, COMPONENT, QUALIFIER, REGULAR_SCOPED, REUSABLE_SCOPED, UNSCOPED) 137*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 138*f585d8a3SJacky Wang .compile( 139*f585d8a3SJacky Wang subject -> { 140*f585d8a3SJacky Wang subject.hasErrorCount(0); 141*f585d8a3SJacky Wang subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent")); 142*f585d8a3SJacky Wang }); 143*f585d8a3SJacky Wang } 144*f585d8a3SJacky Wang 145*f585d8a3SJacky Wang @Test toSingleCheck()146*f585d8a3SJacky Wang public void toSingleCheck() throws Exception { 147*f585d8a3SJacky Wang Source module = 148*f585d8a3SJacky Wang CompilerTests.javaSource( 149*f585d8a3SJacky Wang "test.TestModule", 150*f585d8a3SJacky Wang "package test;", 151*f585d8a3SJacky Wang "", 152*f585d8a3SJacky Wang "import dagger.Binds;", 153*f585d8a3SJacky Wang "import dagger.Module;", 154*f585d8a3SJacky Wang "import dagger.Reusable;", 155*f585d8a3SJacky Wang "", 156*f585d8a3SJacky Wang "@Module", 157*f585d8a3SJacky Wang "interface TestModule {", 158*f585d8a3SJacky Wang " @Binds @Reusable @Qualifier(RegularScoped.class)", 159*f585d8a3SJacky Wang " Object regular(RegularScoped delegate);", 160*f585d8a3SJacky Wang "", 161*f585d8a3SJacky Wang " @Binds @Reusable @Qualifier(ReusableScoped.class)", 162*f585d8a3SJacky Wang " Object reusable(ReusableScoped delegate);", 163*f585d8a3SJacky Wang "", 164*f585d8a3SJacky Wang " @Binds @Reusable @Qualifier(Unscoped.class)", 165*f585d8a3SJacky Wang " Object unscoped(Unscoped delegate);", 166*f585d8a3SJacky Wang "}"); 167*f585d8a3SJacky Wang 168*f585d8a3SJacky Wang CompilerTests.daggerCompiler( 169*f585d8a3SJacky Wang module, COMPONENT, QUALIFIER, REGULAR_SCOPED, REUSABLE_SCOPED, UNSCOPED) 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 toUnscoped()179*f585d8a3SJacky Wang public void toUnscoped() 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.Binds;", 186*f585d8a3SJacky Wang "import dagger.Module;", 187*f585d8a3SJacky Wang "", 188*f585d8a3SJacky Wang "@Module", 189*f585d8a3SJacky Wang "interface TestModule {", 190*f585d8a3SJacky Wang " @Binds @Qualifier(RegularScoped.class)", 191*f585d8a3SJacky Wang " Object regular(RegularScoped delegate);", 192*f585d8a3SJacky Wang "", 193*f585d8a3SJacky Wang " @Binds @Qualifier(ReusableScoped.class)", 194*f585d8a3SJacky Wang " Object reusable(ReusableScoped delegate);", 195*f585d8a3SJacky Wang "", 196*f585d8a3SJacky Wang " @Binds @Qualifier(Unscoped.class)", 197*f585d8a3SJacky Wang " Object unscoped(Unscoped delegate);", 198*f585d8a3SJacky Wang "}"); 199*f585d8a3SJacky Wang 200*f585d8a3SJacky Wang CompilerTests.daggerCompiler( 201*f585d8a3SJacky Wang module, COMPONENT, QUALIFIER, REGULAR_SCOPED, REUSABLE_SCOPED, UNSCOPED) 202*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 203*f585d8a3SJacky Wang .compile( 204*f585d8a3SJacky Wang subject -> { 205*f585d8a3SJacky Wang subject.hasErrorCount(0); 206*f585d8a3SJacky Wang subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent")); 207*f585d8a3SJacky Wang }); 208*f585d8a3SJacky Wang } 209*f585d8a3SJacky Wang 210*f585d8a3SJacky Wang @Test castNeeded_rawTypes_Provider_get()211*f585d8a3SJacky Wang public void castNeeded_rawTypes_Provider_get() throws Exception { 212*f585d8a3SJacky Wang Source accessibleSupertype = 213*f585d8a3SJacky Wang CompilerTests.javaSource( 214*f585d8a3SJacky Wang "other.Supertype", 215*f585d8a3SJacky Wang "package other;", 216*f585d8a3SJacky Wang "", 217*f585d8a3SJacky Wang // accessible from the component, but the subtype is not 218*f585d8a3SJacky Wang "public interface Supertype {}"); 219*f585d8a3SJacky Wang Source inaccessibleSubtype = 220*f585d8a3SJacky Wang CompilerTests.javaSource( 221*f585d8a3SJacky Wang "other.Subtype", 222*f585d8a3SJacky Wang "package other;", 223*f585d8a3SJacky Wang "", 224*f585d8a3SJacky Wang "import javax.inject.Inject;", 225*f585d8a3SJacky Wang "import javax.inject.Singleton;", 226*f585d8a3SJacky Wang "", 227*f585d8a3SJacky Wang "@Singleton", 228*f585d8a3SJacky Wang "class Subtype implements Supertype {", 229*f585d8a3SJacky Wang " @Inject Subtype() {}", 230*f585d8a3SJacky Wang "}"); 231*f585d8a3SJacky Wang Source module = 232*f585d8a3SJacky Wang CompilerTests.javaSource( 233*f585d8a3SJacky Wang "other.SupertypeModule", 234*f585d8a3SJacky Wang "package other;", 235*f585d8a3SJacky Wang "", 236*f585d8a3SJacky Wang "import dagger.Binds;", 237*f585d8a3SJacky Wang "import dagger.Module;", 238*f585d8a3SJacky Wang "", 239*f585d8a3SJacky Wang "@Module", 240*f585d8a3SJacky Wang "public interface SupertypeModule {", 241*f585d8a3SJacky Wang " @Binds Supertype to(Subtype subtype);", 242*f585d8a3SJacky Wang "}"); 243*f585d8a3SJacky Wang Source component = 244*f585d8a3SJacky Wang CompilerTests.javaSource( 245*f585d8a3SJacky Wang "test.TestComponent", 246*f585d8a3SJacky Wang "package test;", 247*f585d8a3SJacky Wang "", 248*f585d8a3SJacky Wang "import dagger.Component;", 249*f585d8a3SJacky Wang "import javax.inject.Singleton;", 250*f585d8a3SJacky Wang "", 251*f585d8a3SJacky Wang "@Singleton", 252*f585d8a3SJacky Wang "@Component(modules = other.SupertypeModule.class)", 253*f585d8a3SJacky Wang "interface TestComponent {", 254*f585d8a3SJacky Wang " other.Supertype supertype();", 255*f585d8a3SJacky Wang "}"); 256*f585d8a3SJacky Wang 257*f585d8a3SJacky Wang CompilerTests.daggerCompiler(accessibleSupertype, inaccessibleSubtype, module, component) 258*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 259*f585d8a3SJacky Wang .compile( 260*f585d8a3SJacky Wang subject -> { 261*f585d8a3SJacky Wang subject.hasErrorCount(0); 262*f585d8a3SJacky Wang subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent")); 263*f585d8a3SJacky Wang }); 264*f585d8a3SJacky Wang } 265*f585d8a3SJacky Wang 266*f585d8a3SJacky Wang @Test noCast_rawTypes_Provider_get_toInaccessibleType()267*f585d8a3SJacky Wang public void noCast_rawTypes_Provider_get_toInaccessibleType() throws Exception { 268*f585d8a3SJacky Wang Source supertype = 269*f585d8a3SJacky Wang CompilerTests.javaSource( 270*f585d8a3SJacky Wang "other.Supertype", 271*f585d8a3SJacky Wang "package other;", 272*f585d8a3SJacky Wang "", 273*f585d8a3SJacky Wang "interface Supertype {}"); 274*f585d8a3SJacky Wang Source subtype = 275*f585d8a3SJacky Wang CompilerTests.javaSource( 276*f585d8a3SJacky Wang "other.Subtype", 277*f585d8a3SJacky Wang "package other;", 278*f585d8a3SJacky Wang "", 279*f585d8a3SJacky Wang "import javax.inject.Inject;", 280*f585d8a3SJacky Wang "import javax.inject.Singleton;", 281*f585d8a3SJacky Wang "", 282*f585d8a3SJacky Wang "@Singleton", 283*f585d8a3SJacky Wang "class Subtype implements Supertype {", 284*f585d8a3SJacky Wang " @Inject Subtype() {}", 285*f585d8a3SJacky Wang "}"); 286*f585d8a3SJacky Wang Source usesSupertype = 287*f585d8a3SJacky Wang CompilerTests.javaSource( 288*f585d8a3SJacky Wang "other.UsesSupertype", 289*f585d8a3SJacky Wang "package other;", 290*f585d8a3SJacky Wang "", 291*f585d8a3SJacky Wang "import javax.inject.Inject;", 292*f585d8a3SJacky Wang "", 293*f585d8a3SJacky Wang "public class UsesSupertype {", 294*f585d8a3SJacky Wang " @Inject UsesSupertype(Supertype supertype) {}", 295*f585d8a3SJacky Wang "}"); 296*f585d8a3SJacky Wang Source module = 297*f585d8a3SJacky Wang CompilerTests.javaSource( 298*f585d8a3SJacky Wang "other.SupertypeModule", 299*f585d8a3SJacky Wang "package other;", 300*f585d8a3SJacky Wang "", 301*f585d8a3SJacky Wang "import dagger.Binds;", 302*f585d8a3SJacky Wang "import dagger.Module;", 303*f585d8a3SJacky Wang "", 304*f585d8a3SJacky Wang "@Module", 305*f585d8a3SJacky Wang "public interface SupertypeModule {", 306*f585d8a3SJacky Wang " @Binds Supertype to(Subtype subtype);", 307*f585d8a3SJacky Wang "}"); 308*f585d8a3SJacky Wang Source component = 309*f585d8a3SJacky Wang CompilerTests.javaSource( 310*f585d8a3SJacky Wang "test.TestComponent", 311*f585d8a3SJacky Wang "package test;", 312*f585d8a3SJacky Wang "", 313*f585d8a3SJacky Wang "import dagger.Component;", 314*f585d8a3SJacky Wang "import javax.inject.Singleton;", 315*f585d8a3SJacky Wang "", 316*f585d8a3SJacky Wang "@Singleton", 317*f585d8a3SJacky Wang "@Component(modules = other.SupertypeModule.class)", 318*f585d8a3SJacky Wang "interface TestComponent {", 319*f585d8a3SJacky Wang " other.UsesSupertype usesSupertype();", 320*f585d8a3SJacky Wang "}"); 321*f585d8a3SJacky Wang 322*f585d8a3SJacky Wang CompilerTests.daggerCompiler(supertype, subtype, usesSupertype, module, component) 323*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 324*f585d8a3SJacky Wang .compile( 325*f585d8a3SJacky Wang subject -> { 326*f585d8a3SJacky Wang subject.hasErrorCount(0); 327*f585d8a3SJacky Wang subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent")); 328*f585d8a3SJacky Wang }); 329*f585d8a3SJacky Wang } 330*f585d8a3SJacky Wang 331*f585d8a3SJacky Wang @Test castedToRawType()332*f585d8a3SJacky Wang public void castedToRawType() throws Exception { 333*f585d8a3SJacky Wang Source module = 334*f585d8a3SJacky Wang CompilerTests.javaSource( 335*f585d8a3SJacky Wang "test.TestModule", 336*f585d8a3SJacky Wang "package test;", 337*f585d8a3SJacky Wang "", 338*f585d8a3SJacky Wang "import dagger.Binds;", 339*f585d8a3SJacky Wang "import dagger.Module;", 340*f585d8a3SJacky Wang "import dagger.Provides;", 341*f585d8a3SJacky Wang "import javax.inject.Named;", 342*f585d8a3SJacky Wang "", 343*f585d8a3SJacky Wang "@Module", 344*f585d8a3SJacky Wang "interface TestModule {", 345*f585d8a3SJacky Wang " @Provides", 346*f585d8a3SJacky Wang " static String provideString() { return new String(); }", 347*f585d8a3SJacky Wang "", 348*f585d8a3SJacky Wang " @Binds", 349*f585d8a3SJacky Wang " CharSequence charSequence(String string);", 350*f585d8a3SJacky Wang "", 351*f585d8a3SJacky Wang " @Binds", 352*f585d8a3SJacky Wang " @Named(\"named\")", 353*f585d8a3SJacky Wang " String namedString(String string);", 354*f585d8a3SJacky Wang "}"); 355*f585d8a3SJacky Wang Source component = 356*f585d8a3SJacky Wang CompilerTests.javaSource( 357*f585d8a3SJacky Wang "test.TestComponent", 358*f585d8a3SJacky Wang "package test;", 359*f585d8a3SJacky Wang "", 360*f585d8a3SJacky Wang "import dagger.Component;", 361*f585d8a3SJacky Wang "import javax.inject.Named;", 362*f585d8a3SJacky Wang "import javax.inject.Provider;", 363*f585d8a3SJacky Wang "", 364*f585d8a3SJacky Wang "@Component(modules = TestModule.class)", 365*f585d8a3SJacky Wang "interface TestComponent {", 366*f585d8a3SJacky Wang " Provider<CharSequence> charSequence();", 367*f585d8a3SJacky Wang " CharSequence charSequenceInstance();", 368*f585d8a3SJacky Wang "", 369*f585d8a3SJacky Wang " @Named(\"named\") Provider<String> namedString();", 370*f585d8a3SJacky Wang "}"); 371*f585d8a3SJacky Wang 372*f585d8a3SJacky Wang CompilerTests.daggerCompiler(module, component) 373*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 374*f585d8a3SJacky Wang .compile( 375*f585d8a3SJacky Wang subject -> { 376*f585d8a3SJacky Wang subject.hasErrorCount(0); 377*f585d8a3SJacky Wang subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent")); 378*f585d8a3SJacky Wang }); 379*f585d8a3SJacky Wang } 380*f585d8a3SJacky Wang 381*f585d8a3SJacky Wang @Test doubleBinds()382*f585d8a3SJacky Wang public void doubleBinds() throws Exception { 383*f585d8a3SJacky Wang Source module = 384*f585d8a3SJacky Wang CompilerTests.javaSource( 385*f585d8a3SJacky Wang "test.TestModule", 386*f585d8a3SJacky Wang "package test;", 387*f585d8a3SJacky Wang "", 388*f585d8a3SJacky Wang "import dagger.Binds;", 389*f585d8a3SJacky Wang "import dagger.Module;", 390*f585d8a3SJacky Wang "import dagger.Provides;", 391*f585d8a3SJacky Wang "", 392*f585d8a3SJacky Wang "@Module", 393*f585d8a3SJacky Wang "interface TestModule {", 394*f585d8a3SJacky Wang " @Provides", 395*f585d8a3SJacky Wang " static String provideString() { return new String(); }", 396*f585d8a3SJacky Wang "", 397*f585d8a3SJacky Wang " @Binds", 398*f585d8a3SJacky Wang " CharSequence charSequence(String string);", 399*f585d8a3SJacky Wang "", 400*f585d8a3SJacky Wang " @Binds", 401*f585d8a3SJacky Wang " Object object(CharSequence charSequence);", 402*f585d8a3SJacky Wang "}"); 403*f585d8a3SJacky Wang Source component = 404*f585d8a3SJacky Wang CompilerTests.javaSource( 405*f585d8a3SJacky Wang "test.TestComponent", 406*f585d8a3SJacky Wang "package test;", 407*f585d8a3SJacky Wang "", 408*f585d8a3SJacky Wang "import dagger.Component;", 409*f585d8a3SJacky Wang "import javax.inject.Named;", 410*f585d8a3SJacky Wang "import javax.inject.Provider;", 411*f585d8a3SJacky Wang "", 412*f585d8a3SJacky Wang "@Component(modules = TestModule.class)", 413*f585d8a3SJacky Wang "interface TestComponent {", 414*f585d8a3SJacky Wang " Provider<CharSequence> charSequence();", 415*f585d8a3SJacky Wang " Provider<Object> object();", 416*f585d8a3SJacky Wang "}"); 417*f585d8a3SJacky Wang 418*f585d8a3SJacky Wang CompilerTests.daggerCompiler(module, component) 419*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 420*f585d8a3SJacky Wang .compile( 421*f585d8a3SJacky Wang subject -> { 422*f585d8a3SJacky Wang subject.hasErrorCount(0); 423*f585d8a3SJacky Wang subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent")); 424*f585d8a3SJacky Wang }); 425*f585d8a3SJacky Wang } 426*f585d8a3SJacky Wang 427*f585d8a3SJacky Wang @Test inlineFactoryOfInacessibleType()428*f585d8a3SJacky Wang public void inlineFactoryOfInacessibleType() throws Exception { 429*f585d8a3SJacky Wang Source supertype = 430*f585d8a3SJacky Wang CompilerTests.javaSource( 431*f585d8a3SJacky Wang "other.Supertype", 432*f585d8a3SJacky Wang "package other;", 433*f585d8a3SJacky Wang "", 434*f585d8a3SJacky Wang "public interface Supertype {}"); 435*f585d8a3SJacky Wang Source injectableSubtype = 436*f585d8a3SJacky Wang CompilerTests.javaSource( 437*f585d8a3SJacky Wang "other.Subtype", 438*f585d8a3SJacky Wang "package other;", 439*f585d8a3SJacky Wang "", 440*f585d8a3SJacky Wang "import javax.inject.Inject;", 441*f585d8a3SJacky Wang "", 442*f585d8a3SJacky Wang "final class Subtype implements Supertype {", 443*f585d8a3SJacky Wang // important: this doesn't have any dependencies and therefore the factory will be able 444*f585d8a3SJacky Wang // to be referenced with an inline Subtype_Factory.create() 445*f585d8a3SJacky Wang " @Inject Subtype() {}", 446*f585d8a3SJacky Wang "}"); 447*f585d8a3SJacky Wang Source module = 448*f585d8a3SJacky Wang CompilerTests.javaSource( 449*f585d8a3SJacky Wang "other.TestModule", 450*f585d8a3SJacky Wang "package other;", 451*f585d8a3SJacky Wang "", 452*f585d8a3SJacky Wang "import dagger.Binds;", 453*f585d8a3SJacky Wang "import dagger.Module;", 454*f585d8a3SJacky Wang "", 455*f585d8a3SJacky Wang "@Module", 456*f585d8a3SJacky Wang "public interface TestModule {", 457*f585d8a3SJacky Wang " @Binds Supertype to(Subtype subtype);", 458*f585d8a3SJacky Wang "}"); 459*f585d8a3SJacky Wang Source component = 460*f585d8a3SJacky Wang CompilerTests.javaSource( 461*f585d8a3SJacky Wang "test.RequestsSubtypeAsProvider", 462*f585d8a3SJacky Wang "package test;", 463*f585d8a3SJacky Wang "", 464*f585d8a3SJacky Wang "import dagger.Component;", 465*f585d8a3SJacky Wang "import javax.inject.Provider;", 466*f585d8a3SJacky Wang "", 467*f585d8a3SJacky Wang "@Component(modules = other.TestModule.class)", 468*f585d8a3SJacky Wang "interface RequestsSubtypeAsProvider {", 469*f585d8a3SJacky Wang " Provider<other.Supertype> supertypeProvider();", 470*f585d8a3SJacky Wang "}"); 471*f585d8a3SJacky Wang 472*f585d8a3SJacky Wang CompilerTests.daggerCompiler(supertype, injectableSubtype, module, component) 473*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 474*f585d8a3SJacky Wang .compile( 475*f585d8a3SJacky Wang subject -> { 476*f585d8a3SJacky Wang subject.hasErrorCount(0); 477*f585d8a3SJacky Wang subject.generatedSource( 478*f585d8a3SJacky Wang goldenFileRule.goldenSource("test/DaggerRequestsSubtypeAsProvider")); 479*f585d8a3SJacky Wang }); 480*f585d8a3SJacky Wang } 481*f585d8a3SJacky Wang 482*f585d8a3SJacky Wang @Test providerWhenBindsScopeGreaterThanDependencyScope()483*f585d8a3SJacky Wang public void providerWhenBindsScopeGreaterThanDependencyScope() throws Exception { 484*f585d8a3SJacky Wang Source module = 485*f585d8a3SJacky Wang CompilerTests.javaSource( 486*f585d8a3SJacky Wang "test.TestModule", 487*f585d8a3SJacky Wang "package test;", 488*f585d8a3SJacky Wang "", 489*f585d8a3SJacky Wang "import dagger.Binds;", 490*f585d8a3SJacky Wang "import dagger.Module;", 491*f585d8a3SJacky Wang "import dagger.Provides;", 492*f585d8a3SJacky Wang "import dagger.Reusable;", 493*f585d8a3SJacky Wang "import javax.inject.Singleton;", 494*f585d8a3SJacky Wang "", 495*f585d8a3SJacky Wang "@Module", 496*f585d8a3SJacky Wang "public abstract class TestModule {", 497*f585d8a3SJacky Wang " @Reusable", 498*f585d8a3SJacky Wang " @Provides", 499*f585d8a3SJacky Wang " static String provideString() {", 500*f585d8a3SJacky Wang " return \"\";", 501*f585d8a3SJacky Wang " }", 502*f585d8a3SJacky Wang "", 503*f585d8a3SJacky Wang " @Binds", 504*f585d8a3SJacky Wang " @Singleton", 505*f585d8a3SJacky Wang " abstract Object bindString(String str);", 506*f585d8a3SJacky Wang "}"); 507*f585d8a3SJacky Wang Source component = 508*f585d8a3SJacky Wang CompilerTests.javaSource( 509*f585d8a3SJacky Wang "test.TestComponent", 510*f585d8a3SJacky Wang "package test;", 511*f585d8a3SJacky Wang "", 512*f585d8a3SJacky Wang "import dagger.Component;", 513*f585d8a3SJacky Wang "import javax.inject.Singleton;", 514*f585d8a3SJacky Wang "import javax.inject.Provider;", 515*f585d8a3SJacky Wang "", 516*f585d8a3SJacky Wang "@Singleton", 517*f585d8a3SJacky Wang "@Component(modules = TestModule.class)", 518*f585d8a3SJacky Wang "interface TestComponent {", 519*f585d8a3SJacky Wang " Provider<Object> object();", 520*f585d8a3SJacky Wang "}"); 521*f585d8a3SJacky Wang 522*f585d8a3SJacky Wang CompilerTests.daggerCompiler(module, component) 523*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 524*f585d8a3SJacky Wang .compile( 525*f585d8a3SJacky Wang subject -> { 526*f585d8a3SJacky Wang subject.hasErrorCount(0); 527*f585d8a3SJacky Wang subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent")); 528*f585d8a3SJacky Wang }); 529*f585d8a3SJacky Wang } 530*f585d8a3SJacky Wang } 531