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.builder; 18*f585d8a3SJacky Wang 19*f585d8a3SJacky Wang import static com.google.common.truth.Truth.assertThat; 20*f585d8a3SJacky Wang import static java.lang.annotation.RetentionPolicy.RUNTIME; 21*f585d8a3SJacky Wang import static org.junit.Assert.fail; 22*f585d8a3SJacky Wang 23*f585d8a3SJacky Wang import dagger.Component; 24*f585d8a3SJacky Wang import dagger.Module; 25*f585d8a3SJacky Wang import dagger.Provides; 26*f585d8a3SJacky Wang import dagger.Subcomponent; 27*f585d8a3SJacky Wang import java.lang.annotation.Retention; 28*f585d8a3SJacky Wang import javax.inject.Inject; 29*f585d8a3SJacky Wang import javax.inject.Provider; 30*f585d8a3SJacky Wang import javax.inject.Scope; 31*f585d8a3SJacky Wang import javax.inject.Singleton; 32*f585d8a3SJacky Wang import org.junit.Test; 33*f585d8a3SJacky Wang import org.junit.runner.RunWith; 34*f585d8a3SJacky Wang import org.junit.runners.JUnit4; 35*f585d8a3SJacky Wang 36*f585d8a3SJacky Wang @RunWith(JUnit4.class) 37*f585d8a3SJacky Wang public class BuilderTest { 38*f585d8a3SJacky Wang @Subcomponent( 39*f585d8a3SJacky Wang modules = { 40*f585d8a3SJacky Wang StringModule.class, 41*f585d8a3SJacky Wang IntModuleIncludingDoubleAndFloat.class, 42*f585d8a3SJacky Wang LongModule.class, 43*f585d8a3SJacky Wang ByteModule.class 44*f585d8a3SJacky Wang }) 45*f585d8a3SJacky Wang interface TestChildComponentWithBuilderAbstractClass { s()46*f585d8a3SJacky Wang String s(); 47*f585d8a3SJacky Wang i()48*f585d8a3SJacky Wang int i(); 49*f585d8a3SJacky Wang l()50*f585d8a3SJacky Wang long l(); 51*f585d8a3SJacky Wang f()52*f585d8a3SJacky Wang float f(); 53*f585d8a3SJacky Wang d()54*f585d8a3SJacky Wang double d(); 55*f585d8a3SJacky Wang b()56*f585d8a3SJacky Wang byte b(); 57*f585d8a3SJacky Wang 58*f585d8a3SJacky Wang abstract static class SharedBuilder<B, C, M1, M2> { build()59*f585d8a3SJacky Wang abstract C build(); // Test resolving return type of build() 60*f585d8a3SJacky Wang setM1(M1 m1)61*f585d8a3SJacky Wang abstract B setM1(M1 m1); // Test resolving return type & param of setter 62*f585d8a3SJacky Wang setM2(M2 m2)63*f585d8a3SJacky Wang abstract SharedBuilder<B, C, M1, M2> setM2(M2 m2); // Test being overridden 64*f585d8a3SJacky Wang setM3(DoubleModule doubleModule)65*f585d8a3SJacky Wang abstract void setM3(DoubleModule doubleModule); // Test being overridden 66*f585d8a3SJacky Wang set( FloatModule floatModule)67*f585d8a3SJacky Wang abstract SharedBuilder<B, C, M1, M2> set( 68*f585d8a3SJacky Wang FloatModule floatModule); // Test returning supertype. 69*f585d8a3SJacky Wang } 70*f585d8a3SJacky Wang 71*f585d8a3SJacky Wang @Subcomponent.Builder 72*f585d8a3SJacky Wang abstract static class Builder 73*f585d8a3SJacky Wang extends TestChildComponentWithBuilderAbstractClass.SharedBuilder< 74*f585d8a3SJacky Wang Builder, 75*f585d8a3SJacky Wang TestChildComponentWithBuilderAbstractClass, 76*f585d8a3SJacky Wang StringModule, 77*f585d8a3SJacky Wang IntModuleIncludingDoubleAndFloat> { 78*f585d8a3SJacky Wang @Override setM2(IntModuleIncludingDoubleAndFloat m2)79*f585d8a3SJacky Wang abstract Builder setM2(IntModuleIncludingDoubleAndFloat m2); // Test covariance 80*f585d8a3SJacky Wang 81*f585d8a3SJacky Wang @Override setM3(DoubleModule doubleModule)82*f585d8a3SJacky Wang abstract void setM3(DoubleModule doubleModule); // Test simple overrides allowed 83*f585d8a3SJacky Wang set(ByteModule byteModule)84*f585d8a3SJacky Wang abstract void set(ByteModule byteModule); 85*f585d8a3SJacky Wang 86*f585d8a3SJacky Wang // Note we're missing LongModule -- it's implicit 87*f585d8a3SJacky Wang } 88*f585d8a3SJacky Wang } 89*f585d8a3SJacky Wang 90*f585d8a3SJacky Wang @Subcomponent( 91*f585d8a3SJacky Wang modules = { 92*f585d8a3SJacky Wang StringModule.class, 93*f585d8a3SJacky Wang IntModuleIncludingDoubleAndFloat.class, 94*f585d8a3SJacky Wang LongModule.class, 95*f585d8a3SJacky Wang ByteModule.class 96*f585d8a3SJacky Wang }) 97*f585d8a3SJacky Wang interface TestChildComponentWithBuilderInterface { s()98*f585d8a3SJacky Wang String s(); 99*f585d8a3SJacky Wang i()100*f585d8a3SJacky Wang int i(); 101*f585d8a3SJacky Wang l()102*f585d8a3SJacky Wang long l(); 103*f585d8a3SJacky Wang f()104*f585d8a3SJacky Wang float f(); 105*f585d8a3SJacky Wang d()106*f585d8a3SJacky Wang double d(); 107*f585d8a3SJacky Wang b()108*f585d8a3SJacky Wang byte b(); 109*f585d8a3SJacky Wang 110*f585d8a3SJacky Wang interface SharedBuilder<B, C, M1, M2> { build()111*f585d8a3SJacky Wang C build(); // Test resolving return type of build() 112*f585d8a3SJacky Wang setM1(M1 m1)113*f585d8a3SJacky Wang B setM1(M1 m1); // Test resolving return type & param of setter 114*f585d8a3SJacky Wang setM2(M2 m2)115*f585d8a3SJacky Wang SharedBuilder<B, C, M1, M2> setM2(M2 m2); // Test being overridden 116*f585d8a3SJacky Wang setM3(DoubleModule doubleModule)117*f585d8a3SJacky Wang void setM3(DoubleModule doubleModule); // Test being overridden 118*f585d8a3SJacky Wang set(FloatModule floatModule)119*f585d8a3SJacky Wang SharedBuilder<B, C, M1, M2> set(FloatModule floatModule); // Test return type is supertype. 120*f585d8a3SJacky Wang } 121*f585d8a3SJacky Wang 122*f585d8a3SJacky Wang @Subcomponent.Builder 123*f585d8a3SJacky Wang interface Builder 124*f585d8a3SJacky Wang extends TestChildComponentWithBuilderInterface.SharedBuilder< 125*f585d8a3SJacky Wang Builder, 126*f585d8a3SJacky Wang TestChildComponentWithBuilderInterface, 127*f585d8a3SJacky Wang StringModule, 128*f585d8a3SJacky Wang IntModuleIncludingDoubleAndFloat> { 129*f585d8a3SJacky Wang @Override setM2(IntModuleIncludingDoubleAndFloat m2)130*f585d8a3SJacky Wang Builder setM2(IntModuleIncludingDoubleAndFloat m2); // Test covariant overrides 131*f585d8a3SJacky Wang 132*f585d8a3SJacky Wang @Override setM3(DoubleModule doubleModule)133*f585d8a3SJacky Wang void setM3(DoubleModule doubleModule); // Test simple overrides allowed 134*f585d8a3SJacky Wang set(ByteModule byteModule)135*f585d8a3SJacky Wang void set(ByteModule byteModule); 136*f585d8a3SJacky Wang 137*f585d8a3SJacky Wang // Note we're missing LongModule -- it's implicit 138*f585d8a3SJacky Wang } 139*f585d8a3SJacky Wang } 140*f585d8a3SJacky Wang 141*f585d8a3SJacky Wang @Component( 142*f585d8a3SJacky Wang modules = {StringModule.class, IntModuleIncludingDoubleAndFloat.class, LongModule.class}, 143*f585d8a3SJacky Wang dependencies = DepComponent.class) 144*f585d8a3SJacky Wang abstract static class TestComponentWithBuilderAbstractClass { 145*f585d8a3SJacky Wang builder()146*f585d8a3SJacky Wang static Builder builder() { 147*f585d8a3SJacky Wang return DaggerBuilderTest_TestComponentWithBuilderAbstractClass.builder(); 148*f585d8a3SJacky Wang } 149*f585d8a3SJacky Wang s()150*f585d8a3SJacky Wang abstract String s(); 151*f585d8a3SJacky Wang i()152*f585d8a3SJacky Wang abstract int i(); 153*f585d8a3SJacky Wang l()154*f585d8a3SJacky Wang abstract long l(); 155*f585d8a3SJacky Wang f()156*f585d8a3SJacky Wang abstract float f(); 157*f585d8a3SJacky Wang d()158*f585d8a3SJacky Wang abstract double d(); 159*f585d8a3SJacky Wang 160*f585d8a3SJacky Wang abstract static class SharedBuilder { 161*f585d8a3SJacky Wang // Make sure we use the overriding signature. build()162*f585d8a3SJacky Wang abstract Object build(); 163*f585d8a3SJacky Wang stringModule(@uppressWarnings"unused") StringModule stringModule)164*f585d8a3SJacky Wang Object stringModule(@SuppressWarnings("unused") StringModule stringModule) { 165*f585d8a3SJacky Wang return null; 166*f585d8a3SJacky Wang } 167*f585d8a3SJacky Wang ignoredLongModule(@uppressWarnings"unused") LongModule longModule)168*f585d8a3SJacky Wang SharedBuilder ignoredLongModule(@SuppressWarnings("unused") LongModule longModule) { 169*f585d8a3SJacky Wang return null; 170*f585d8a3SJacky Wang } 171*f585d8a3SJacky Wang } 172*f585d8a3SJacky Wang 173*f585d8a3SJacky Wang @Component.Builder 174*f585d8a3SJacky Wang abstract static class Builder extends TestComponentWithBuilderAbstractClass.SharedBuilder { 175*f585d8a3SJacky Wang @Override build()176*f585d8a3SJacky Wang abstract TestComponentWithBuilderAbstractClass build(); // Narrowing return type 177*f585d8a3SJacky Wang 178*f585d8a3SJacky Wang @Override stringModule(StringModule stringModule)179*f585d8a3SJacky Wang abstract Builder stringModule(StringModule stringModule); // Make abstract & narrow 180*f585d8a3SJacky Wang intModule(IntModuleIncludingDoubleAndFloat intModule)181*f585d8a3SJacky Wang abstract Builder intModule(IntModuleIncludingDoubleAndFloat intModule); 182*f585d8a3SJacky Wang doubleModule(DoubleModule doubleModule)183*f585d8a3SJacky Wang abstract void doubleModule(DoubleModule doubleModule); // Module w/o args 184*f585d8a3SJacky Wang depComponent(DepComponent depComponent)185*f585d8a3SJacky Wang abstract void depComponent(DepComponent depComponent); 186*f585d8a3SJacky Wang ignoredIntModule( @uppressWarnings"unused") IntModuleIncludingDoubleAndFloat intModule)187*f585d8a3SJacky Wang Builder ignoredIntModule( 188*f585d8a3SJacky Wang @SuppressWarnings("unused") IntModuleIncludingDoubleAndFloat intModule) { 189*f585d8a3SJacky Wang return null; 190*f585d8a3SJacky Wang } 191*f585d8a3SJacky Wang 192*f585d8a3SJacky Wang // Note we're missing LongModule & FloatModule -- they/re implicit 193*f585d8a3SJacky Wang } 194*f585d8a3SJacky Wang } 195*f585d8a3SJacky Wang 196*f585d8a3SJacky Wang @Component( 197*f585d8a3SJacky Wang modules = {StringModule.class, IntModuleIncludingDoubleAndFloat.class, LongModule.class}, 198*f585d8a3SJacky Wang dependencies = DepComponent.class) 199*f585d8a3SJacky Wang interface TestComponentWithBuilderInterface { s()200*f585d8a3SJacky Wang String s(); 201*f585d8a3SJacky Wang i()202*f585d8a3SJacky Wang int i(); 203*f585d8a3SJacky Wang l()204*f585d8a3SJacky Wang long l(); 205*f585d8a3SJacky Wang f()206*f585d8a3SJacky Wang float f(); 207*f585d8a3SJacky Wang d()208*f585d8a3SJacky Wang double d(); 209*f585d8a3SJacky Wang 210*f585d8a3SJacky Wang interface SharedBuilder { 211*f585d8a3SJacky Wang // Make sure we use the overriding signature. build()212*f585d8a3SJacky Wang Object build(); 213*f585d8a3SJacky Wang stringModule(StringModule m1)214*f585d8a3SJacky Wang Object stringModule(StringModule m1); 215*f585d8a3SJacky Wang } 216*f585d8a3SJacky Wang 217*f585d8a3SJacky Wang @Component.Builder 218*f585d8a3SJacky Wang interface Builder extends TestComponentWithBuilderInterface.SharedBuilder { 219*f585d8a3SJacky Wang @Override build()220*f585d8a3SJacky Wang TestComponentWithBuilderInterface build(); // Narrowing return type 221*f585d8a3SJacky Wang 222*f585d8a3SJacky Wang @Override stringModule(StringModule stringModule)223*f585d8a3SJacky Wang Builder stringModule(StringModule stringModule); // Narrowing return type 224*f585d8a3SJacky Wang intModule(IntModuleIncludingDoubleAndFloat intModule)225*f585d8a3SJacky Wang Builder intModule(IntModuleIncludingDoubleAndFloat intModule); 226*f585d8a3SJacky Wang doubleModule(DoubleModule doubleModule)227*f585d8a3SJacky Wang void doubleModule(DoubleModule doubleModule); // Module w/o args 228*f585d8a3SJacky Wang depComponent(DepComponent depComponent)229*f585d8a3SJacky Wang void depComponent(DepComponent depComponent); 230*f585d8a3SJacky Wang 231*f585d8a3SJacky Wang // Note we're missing LongModule & FloatModule -- they/re implicit 232*f585d8a3SJacky Wang } 233*f585d8a3SJacky Wang } 234*f585d8a3SJacky Wang 235*f585d8a3SJacky Wang @Component( 236*f585d8a3SJacky Wang modules = {StringModule.class, IntModuleIncludingDoubleAndFloat.class, LongModule.class}, 237*f585d8a3SJacky Wang dependencies = DepComponent.class) 238*f585d8a3SJacky Wang interface TestComponentWithGenericBuilderAbstractClass { s()239*f585d8a3SJacky Wang String s(); 240*f585d8a3SJacky Wang i()241*f585d8a3SJacky Wang int i(); 242*f585d8a3SJacky Wang l()243*f585d8a3SJacky Wang long l(); 244*f585d8a3SJacky Wang f()245*f585d8a3SJacky Wang float f(); 246*f585d8a3SJacky Wang d()247*f585d8a3SJacky Wang double d(); 248*f585d8a3SJacky Wang 249*f585d8a3SJacky Wang abstract static class SharedBuilder<B, C, M1, M2> { build()250*f585d8a3SJacky Wang abstract C build(); // Test resolving return type of build() 251*f585d8a3SJacky Wang setM1(M1 m1)252*f585d8a3SJacky Wang abstract B setM1(M1 m1); // Test resolving return type & param of setter 253*f585d8a3SJacky Wang setM2(M2 m2)254*f585d8a3SJacky Wang abstract SharedBuilder<B, C, M1, M2> setM2(M2 m2); // Test being overridden 255*f585d8a3SJacky Wang doubleModule(DoubleModule doubleModule)256*f585d8a3SJacky Wang abstract void doubleModule(DoubleModule doubleModule); // Test being overridden 257*f585d8a3SJacky Wang depComponent( FloatModule floatModule)258*f585d8a3SJacky Wang abstract SharedBuilder<B, C, M1, M2> depComponent( 259*f585d8a3SJacky Wang FloatModule floatModule); // Test return type 260*f585d8a3SJacky Wang } 261*f585d8a3SJacky Wang 262*f585d8a3SJacky Wang @Component.Builder 263*f585d8a3SJacky Wang abstract static class Builder 264*f585d8a3SJacky Wang extends TestComponentWithGenericBuilderAbstractClass.SharedBuilder< 265*f585d8a3SJacky Wang Builder, 266*f585d8a3SJacky Wang TestComponentWithGenericBuilderAbstractClass, 267*f585d8a3SJacky Wang StringModule, 268*f585d8a3SJacky Wang IntModuleIncludingDoubleAndFloat> { 269*f585d8a3SJacky Wang @Override setM2(IntModuleIncludingDoubleAndFloat m2)270*f585d8a3SJacky Wang abstract Builder setM2(IntModuleIncludingDoubleAndFloat m2); // Test covariant overrides 271*f585d8a3SJacky Wang 272*f585d8a3SJacky Wang @Override doubleModule(DoubleModule module3)273*f585d8a3SJacky Wang abstract void doubleModule(DoubleModule module3); // Test simple overrides allowed 274*f585d8a3SJacky Wang depComponent(DepComponent depComponent)275*f585d8a3SJacky Wang abstract void depComponent(DepComponent depComponent); 276*f585d8a3SJacky Wang 277*f585d8a3SJacky Wang // Note we're missing LongModule & FloatModule -- they're implicit 278*f585d8a3SJacky Wang } 279*f585d8a3SJacky Wang } 280*f585d8a3SJacky Wang 281*f585d8a3SJacky Wang @Component( 282*f585d8a3SJacky Wang modules = {StringModule.class, IntModuleIncludingDoubleAndFloat.class, LongModule.class}, 283*f585d8a3SJacky Wang dependencies = DepComponent.class) 284*f585d8a3SJacky Wang interface TestComponentWithGenericBuilderInterface { s()285*f585d8a3SJacky Wang String s(); 286*f585d8a3SJacky Wang i()287*f585d8a3SJacky Wang int i(); 288*f585d8a3SJacky Wang l()289*f585d8a3SJacky Wang long l(); 290*f585d8a3SJacky Wang f()291*f585d8a3SJacky Wang float f(); 292*f585d8a3SJacky Wang d()293*f585d8a3SJacky Wang double d(); 294*f585d8a3SJacky Wang 295*f585d8a3SJacky Wang interface SharedBuilder<B, C, M1, M2> { build()296*f585d8a3SJacky Wang C build(); // Test resolving return type of build() 297*f585d8a3SJacky Wang setM1(M1 m1)298*f585d8a3SJacky Wang B setM1(M1 m1); // Test resolving return type & param of setter 299*f585d8a3SJacky Wang setM2(M2 m2)300*f585d8a3SJacky Wang SharedBuilder<B, C, M1, M2> setM2(M2 m2); // Test being overridden 301*f585d8a3SJacky Wang doubleModule(DoubleModule doubleModule)302*f585d8a3SJacky Wang void doubleModule(DoubleModule doubleModule); // Test being overridden 303*f585d8a3SJacky Wang set(FloatModule floatModule)304*f585d8a3SJacky Wang SharedBuilder<B, C, M1, M2> set(FloatModule floatModule); // Test return type is supertype. 305*f585d8a3SJacky Wang } 306*f585d8a3SJacky Wang 307*f585d8a3SJacky Wang @Component.Builder 308*f585d8a3SJacky Wang interface Builder 309*f585d8a3SJacky Wang extends TestComponentWithGenericBuilderInterface.SharedBuilder< 310*f585d8a3SJacky Wang Builder, 311*f585d8a3SJacky Wang TestComponentWithGenericBuilderInterface, 312*f585d8a3SJacky Wang StringModule, 313*f585d8a3SJacky Wang IntModuleIncludingDoubleAndFloat> { 314*f585d8a3SJacky Wang @Override setM2(IntModuleIncludingDoubleAndFloat m2)315*f585d8a3SJacky Wang Builder setM2(IntModuleIncludingDoubleAndFloat m2); // Test covariant overrides allowed 316*f585d8a3SJacky Wang 317*f585d8a3SJacky Wang @Override doubleModule(DoubleModule module3)318*f585d8a3SJacky Wang void doubleModule(DoubleModule module3); // Test simple overrides allowed 319*f585d8a3SJacky Wang depComponent(DepComponent depComponent)320*f585d8a3SJacky Wang void depComponent(DepComponent depComponent); 321*f585d8a3SJacky Wang 322*f585d8a3SJacky Wang // Note we're missing M5 -- that's implicit. 323*f585d8a3SJacky Wang } 324*f585d8a3SJacky Wang } 325*f585d8a3SJacky Wang 326*f585d8a3SJacky Wang @Component 327*f585d8a3SJacky Wang interface DepComponent {} 328*f585d8a3SJacky Wang 329*f585d8a3SJacky Wang @Singleton 330*f585d8a3SJacky Wang @Component 331*f585d8a3SJacky Wang interface ParentComponent { childAbstractClassBuilder()332*f585d8a3SJacky Wang TestChildComponentWithBuilderAbstractClass.Builder childAbstractClassBuilder(); 333*f585d8a3SJacky Wang childInterfaceBuilder()334*f585d8a3SJacky Wang TestChildComponentWithBuilderInterface.Builder childInterfaceBuilder(); 335*f585d8a3SJacky Wang middleBuilder()336*f585d8a3SJacky Wang MiddleChild.Builder middleBuilder(); 337*f585d8a3SJacky Wang otherBuilder()338*f585d8a3SJacky Wang OtherMiddleChild.Builder otherBuilder(); 339*f585d8a3SJacky Wang requiresMiddleChildBuilder()340*f585d8a3SJacky Wang RequiresSubcomponentBuilder<MiddleChild.Builder> requiresMiddleChildBuilder(); 341*f585d8a3SJacky Wang } 342*f585d8a3SJacky Wang 343*f585d8a3SJacky Wang @Scope 344*f585d8a3SJacky Wang @Retention(RUNTIME) 345*f585d8a3SJacky Wang @interface MiddleScope {} 346*f585d8a3SJacky Wang 347*f585d8a3SJacky Wang @MiddleScope 348*f585d8a3SJacky Wang @Subcomponent(modules = StringModule.class) 349*f585d8a3SJacky Wang interface MiddleChild { s()350*f585d8a3SJacky Wang String s(); 351*f585d8a3SJacky Wang grandchildBuilder()352*f585d8a3SJacky Wang Grandchild.Builder grandchildBuilder(); 353*f585d8a3SJacky Wang requiresGrandchildBuilder()354*f585d8a3SJacky Wang RequiresSubcomponentBuilder<Grandchild.Builder> requiresGrandchildBuilder(); 355*f585d8a3SJacky Wang 356*f585d8a3SJacky Wang @Subcomponent.Builder 357*f585d8a3SJacky Wang interface Builder { build()358*f585d8a3SJacky Wang MiddleChild build(); 359*f585d8a3SJacky Wang set(StringModule stringModule)360*f585d8a3SJacky Wang Builder set(StringModule stringModule); 361*f585d8a3SJacky Wang } 362*f585d8a3SJacky Wang } 363*f585d8a3SJacky Wang 364*f585d8a3SJacky Wang static class RequiresSubcomponentBuilder<B> { 365*f585d8a3SJacky Wang private final Provider<B> subcomponentBuilderProvider; 366*f585d8a3SJacky Wang private final B subcomponentBuilder; 367*f585d8a3SJacky Wang 368*f585d8a3SJacky Wang @Inject RequiresSubcomponentBuilder(Provider<B> subcomponentBuilderProvider, B subcomponentBuilder)369*f585d8a3SJacky Wang RequiresSubcomponentBuilder(Provider<B> subcomponentBuilderProvider, B subcomponentBuilder) { 370*f585d8a3SJacky Wang this.subcomponentBuilderProvider = subcomponentBuilderProvider; 371*f585d8a3SJacky Wang this.subcomponentBuilder = subcomponentBuilder; 372*f585d8a3SJacky Wang } 373*f585d8a3SJacky Wang subcomponentBuilderProvider()374*f585d8a3SJacky Wang Provider<B> subcomponentBuilderProvider() { 375*f585d8a3SJacky Wang return subcomponentBuilderProvider; 376*f585d8a3SJacky Wang } 377*f585d8a3SJacky Wang subcomponentBuilder()378*f585d8a3SJacky Wang B subcomponentBuilder() { 379*f585d8a3SJacky Wang return subcomponentBuilder; 380*f585d8a3SJacky Wang } 381*f585d8a3SJacky Wang } 382*f585d8a3SJacky Wang 383*f585d8a3SJacky Wang @MiddleScope 384*f585d8a3SJacky Wang @Subcomponent(modules = {StringModule.class, LongModule.class}) 385*f585d8a3SJacky Wang interface OtherMiddleChild { l()386*f585d8a3SJacky Wang long l(); 387*f585d8a3SJacky Wang s()388*f585d8a3SJacky Wang String s(); 389*f585d8a3SJacky Wang grandchildBuilder()390*f585d8a3SJacky Wang Grandchild.Builder grandchildBuilder(); 391*f585d8a3SJacky Wang 392*f585d8a3SJacky Wang @Subcomponent.Builder 393*f585d8a3SJacky Wang interface Builder { build()394*f585d8a3SJacky Wang OtherMiddleChild build(); 395*f585d8a3SJacky Wang set(StringModule stringModule)396*f585d8a3SJacky Wang Builder set(StringModule stringModule); 397*f585d8a3SJacky Wang } 398*f585d8a3SJacky Wang } 399*f585d8a3SJacky Wang 400*f585d8a3SJacky Wang @Component(modules = StringModule.class) 401*f585d8a3SJacky Wang @Singleton 402*f585d8a3SJacky Wang interface ParentOfGenericComponent extends GenericParent<Grandchild.Builder> {} 403*f585d8a3SJacky Wang 404*f585d8a3SJacky Wang @Subcomponent(modules = IntModuleIncludingDoubleAndFloat.class) 405*f585d8a3SJacky Wang interface Grandchild { i()406*f585d8a3SJacky Wang int i(); 407*f585d8a3SJacky Wang s()408*f585d8a3SJacky Wang String s(); 409*f585d8a3SJacky Wang 410*f585d8a3SJacky Wang @Subcomponent.Builder 411*f585d8a3SJacky Wang interface Builder { build()412*f585d8a3SJacky Wang Grandchild build(); 413*f585d8a3SJacky Wang set(IntModuleIncludingDoubleAndFloat intModule)414*f585d8a3SJacky Wang Builder set(IntModuleIncludingDoubleAndFloat intModule); 415*f585d8a3SJacky Wang } 416*f585d8a3SJacky Wang } 417*f585d8a3SJacky Wang 418*f585d8a3SJacky Wang interface GenericParent<B> { subcomponentBuilder()419*f585d8a3SJacky Wang B subcomponentBuilder(); 420*f585d8a3SJacky Wang } 421*f585d8a3SJacky Wang 422*f585d8a3SJacky Wang @Module 423*f585d8a3SJacky Wang static class ByteModule { 424*f585d8a3SJacky Wang final byte b; 425*f585d8a3SJacky Wang ByteModule(byte b)426*f585d8a3SJacky Wang ByteModule(byte b) { 427*f585d8a3SJacky Wang this.b = b; 428*f585d8a3SJacky Wang } 429*f585d8a3SJacky Wang 430*f585d8a3SJacky Wang @Provides b()431*f585d8a3SJacky Wang byte b() { 432*f585d8a3SJacky Wang return b; 433*f585d8a3SJacky Wang } 434*f585d8a3SJacky Wang } 435*f585d8a3SJacky Wang 436*f585d8a3SJacky Wang @Module 437*f585d8a3SJacky Wang static class DoubleModule { 438*f585d8a3SJacky Wang @Provides d()439*f585d8a3SJacky Wang double d() { 440*f585d8a3SJacky Wang return 4.2d; 441*f585d8a3SJacky Wang } 442*f585d8a3SJacky Wang } 443*f585d8a3SJacky Wang 444*f585d8a3SJacky Wang @Module 445*f585d8a3SJacky Wang static class LongModule { 446*f585d8a3SJacky Wang @Provides l()447*f585d8a3SJacky Wang long l() { 448*f585d8a3SJacky Wang return 6L; 449*f585d8a3SJacky Wang } 450*f585d8a3SJacky Wang } 451*f585d8a3SJacky Wang 452*f585d8a3SJacky Wang @Module 453*f585d8a3SJacky Wang static class FloatModule { 454*f585d8a3SJacky Wang @Provides f()455*f585d8a3SJacky Wang float f() { 456*f585d8a3SJacky Wang return 5.5f; 457*f585d8a3SJacky Wang } 458*f585d8a3SJacky Wang } 459*f585d8a3SJacky Wang 460*f585d8a3SJacky Wang @Module 461*f585d8a3SJacky Wang static class StringModule { 462*f585d8a3SJacky Wang final String string; 463*f585d8a3SJacky Wang StringModule(String string)464*f585d8a3SJacky Wang StringModule(String string) { 465*f585d8a3SJacky Wang this.string = string; 466*f585d8a3SJacky Wang } 467*f585d8a3SJacky Wang 468*f585d8a3SJacky Wang @Provides string()469*f585d8a3SJacky Wang String string() { 470*f585d8a3SJacky Wang return string; 471*f585d8a3SJacky Wang } 472*f585d8a3SJacky Wang } 473*f585d8a3SJacky Wang 474*f585d8a3SJacky Wang @Module(includes = {DoubleModule.class, FloatModule.class}) 475*f585d8a3SJacky Wang static class IntModuleIncludingDoubleAndFloat { 476*f585d8a3SJacky Wang final int integer; 477*f585d8a3SJacky Wang IntModuleIncludingDoubleAndFloat(int integer)478*f585d8a3SJacky Wang IntModuleIncludingDoubleAndFloat(int integer) { 479*f585d8a3SJacky Wang this.integer = integer; 480*f585d8a3SJacky Wang } 481*f585d8a3SJacky Wang 482*f585d8a3SJacky Wang @Provides integer()483*f585d8a3SJacky Wang int integer() { 484*f585d8a3SJacky Wang return integer; 485*f585d8a3SJacky Wang } 486*f585d8a3SJacky Wang } 487*f585d8a3SJacky Wang 488*f585d8a3SJacky Wang @Test interfaceBuilder()489*f585d8a3SJacky Wang public void interfaceBuilder() { 490*f585d8a3SJacky Wang TestComponentWithBuilderInterface.Builder builder = 491*f585d8a3SJacky Wang DaggerBuilderTest_TestComponentWithBuilderInterface.builder(); 492*f585d8a3SJacky Wang 493*f585d8a3SJacky Wang // Make sure things fail if we don't set our required modules. 494*f585d8a3SJacky Wang try { 495*f585d8a3SJacky Wang builder.build(); 496*f585d8a3SJacky Wang fail(); 497*f585d8a3SJacky Wang } catch (IllegalStateException expected) { 498*f585d8a3SJacky Wang } 499*f585d8a3SJacky Wang 500*f585d8a3SJacky Wang builder 501*f585d8a3SJacky Wang .intModule(new IntModuleIncludingDoubleAndFloat(1)) 502*f585d8a3SJacky Wang .stringModule(new StringModule("sam")) 503*f585d8a3SJacky Wang .depComponent(new DepComponent() {}); 504*f585d8a3SJacky Wang builder.doubleModule(new DoubleModule()); 505*f585d8a3SJacky Wang // Don't set other modules -- make sure it works. 506*f585d8a3SJacky Wang 507*f585d8a3SJacky Wang TestComponentWithBuilderInterface component = builder.build(); 508*f585d8a3SJacky Wang assertThat(component.s()).isEqualTo("sam"); 509*f585d8a3SJacky Wang assertThat(component.i()).isEqualTo(1); 510*f585d8a3SJacky Wang assertThat(component.d()).isEqualTo(4.2d); 511*f585d8a3SJacky Wang assertThat(component.f()).isEqualTo(5.5f); 512*f585d8a3SJacky Wang assertThat(component.l()).isEqualTo(6L); 513*f585d8a3SJacky Wang } 514*f585d8a3SJacky Wang 515*f585d8a3SJacky Wang @Test abstractClassBuilder()516*f585d8a3SJacky Wang public void abstractClassBuilder() { 517*f585d8a3SJacky Wang TestComponentWithBuilderAbstractClass.Builder builder = 518*f585d8a3SJacky Wang TestComponentWithBuilderAbstractClass.builder(); 519*f585d8a3SJacky Wang 520*f585d8a3SJacky Wang // Make sure things fail if we don't set our required modules. 521*f585d8a3SJacky Wang try { 522*f585d8a3SJacky Wang builder.build(); 523*f585d8a3SJacky Wang fail(); 524*f585d8a3SJacky Wang } catch (IllegalStateException expected) { 525*f585d8a3SJacky Wang } 526*f585d8a3SJacky Wang 527*f585d8a3SJacky Wang builder 528*f585d8a3SJacky Wang .intModule(new IntModuleIncludingDoubleAndFloat(1)) 529*f585d8a3SJacky Wang .stringModule(new StringModule("sam")) 530*f585d8a3SJacky Wang .depComponent(new DepComponent() {}); 531*f585d8a3SJacky Wang builder.doubleModule(new DoubleModule()); 532*f585d8a3SJacky Wang // Don't set other modules -- make sure it works. 533*f585d8a3SJacky Wang 534*f585d8a3SJacky Wang TestComponentWithBuilderAbstractClass component = builder.build(); 535*f585d8a3SJacky Wang assertThat(component.s()).isEqualTo("sam"); 536*f585d8a3SJacky Wang assertThat(component.i()).isEqualTo(1); 537*f585d8a3SJacky Wang assertThat(component.d()).isEqualTo(4.2d); 538*f585d8a3SJacky Wang assertThat(component.f()).isEqualTo(5.5f); 539*f585d8a3SJacky Wang assertThat(component.l()).isEqualTo(6L); 540*f585d8a3SJacky Wang } 541*f585d8a3SJacky Wang 542*f585d8a3SJacky Wang @Test interfaceGenericBuilder()543*f585d8a3SJacky Wang public void interfaceGenericBuilder() { 544*f585d8a3SJacky Wang TestComponentWithGenericBuilderInterface.Builder builder = 545*f585d8a3SJacky Wang DaggerBuilderTest_TestComponentWithGenericBuilderInterface.builder(); 546*f585d8a3SJacky Wang 547*f585d8a3SJacky Wang // Make sure things fail if we don't set our required modules. 548*f585d8a3SJacky Wang try { 549*f585d8a3SJacky Wang builder.build(); 550*f585d8a3SJacky Wang fail(); 551*f585d8a3SJacky Wang } catch (IllegalStateException expected) { 552*f585d8a3SJacky Wang } 553*f585d8a3SJacky Wang 554*f585d8a3SJacky Wang builder 555*f585d8a3SJacky Wang .setM2(new IntModuleIncludingDoubleAndFloat(1)) 556*f585d8a3SJacky Wang .setM1(new StringModule("sam")) 557*f585d8a3SJacky Wang .depComponent(new DepComponent() {}); 558*f585d8a3SJacky Wang builder.doubleModule(new DoubleModule()); 559*f585d8a3SJacky Wang // Don't set other modules -- make sure it works. 560*f585d8a3SJacky Wang 561*f585d8a3SJacky Wang TestComponentWithGenericBuilderInterface component = builder.build(); 562*f585d8a3SJacky Wang assertThat(component.s()).isEqualTo("sam"); 563*f585d8a3SJacky Wang assertThat(component.i()).isEqualTo(1); 564*f585d8a3SJacky Wang assertThat(component.d()).isEqualTo(4.2d); 565*f585d8a3SJacky Wang assertThat(component.f()).isEqualTo(5.5f); 566*f585d8a3SJacky Wang assertThat(component.l()).isEqualTo(6L); 567*f585d8a3SJacky Wang } 568*f585d8a3SJacky Wang 569*f585d8a3SJacky Wang @Test abstractClassGenericBuilder()570*f585d8a3SJacky Wang public void abstractClassGenericBuilder() { 571*f585d8a3SJacky Wang TestComponentWithGenericBuilderAbstractClass.Builder builder = 572*f585d8a3SJacky Wang DaggerBuilderTest_TestComponentWithGenericBuilderAbstractClass.builder(); 573*f585d8a3SJacky Wang 574*f585d8a3SJacky Wang // Make sure things fail if we don't set our required modules. 575*f585d8a3SJacky Wang try { 576*f585d8a3SJacky Wang builder.build(); 577*f585d8a3SJacky Wang fail(); 578*f585d8a3SJacky Wang } catch (IllegalStateException expected) { 579*f585d8a3SJacky Wang } 580*f585d8a3SJacky Wang 581*f585d8a3SJacky Wang builder 582*f585d8a3SJacky Wang .setM2(new IntModuleIncludingDoubleAndFloat(1)) 583*f585d8a3SJacky Wang .setM1(new StringModule("sam")) 584*f585d8a3SJacky Wang .depComponent(new DepComponent() {}); 585*f585d8a3SJacky Wang builder.doubleModule(new DoubleModule()); 586*f585d8a3SJacky Wang // Don't set other modules -- make sure it works. 587*f585d8a3SJacky Wang 588*f585d8a3SJacky Wang TestComponentWithGenericBuilderAbstractClass component = builder.build(); 589*f585d8a3SJacky Wang assertThat(component.s()).isEqualTo("sam"); 590*f585d8a3SJacky Wang assertThat(component.i()).isEqualTo(1); 591*f585d8a3SJacky Wang assertThat(component.d()).isEqualTo(4.2d); 592*f585d8a3SJacky Wang assertThat(component.f()).isEqualTo(5.5f); 593*f585d8a3SJacky Wang assertThat(component.l()).isEqualTo(6L); 594*f585d8a3SJacky Wang } 595*f585d8a3SJacky Wang 596*f585d8a3SJacky Wang @Test subcomponents_interface()597*f585d8a3SJacky Wang public void subcomponents_interface() { 598*f585d8a3SJacky Wang ParentComponent parent = DaggerBuilderTest_ParentComponent.create(); 599*f585d8a3SJacky Wang TestChildComponentWithBuilderInterface.Builder builder1 = parent.childInterfaceBuilder(); 600*f585d8a3SJacky Wang try { 601*f585d8a3SJacky Wang builder1.build(); 602*f585d8a3SJacky Wang fail(); 603*f585d8a3SJacky Wang } catch (IllegalStateException expected) { 604*f585d8a3SJacky Wang } 605*f585d8a3SJacky Wang 606*f585d8a3SJacky Wang builder1 607*f585d8a3SJacky Wang .setM2(new IntModuleIncludingDoubleAndFloat(1)) 608*f585d8a3SJacky Wang .setM1(new StringModule("sam")) 609*f585d8a3SJacky Wang .set(new ByteModule((byte) 7)); 610*f585d8a3SJacky Wang builder1.set(new FloatModule()); 611*f585d8a3SJacky Wang TestChildComponentWithBuilderInterface child1 = builder1.build(); 612*f585d8a3SJacky Wang assertThat(child1.s()).isEqualTo("sam"); 613*f585d8a3SJacky Wang assertThat(child1.i()).isEqualTo(1); 614*f585d8a3SJacky Wang assertThat(child1.d()).isEqualTo(4.2d); 615*f585d8a3SJacky Wang assertThat(child1.f()).isEqualTo(5.5f); 616*f585d8a3SJacky Wang assertThat(child1.l()).isEqualTo(6L); 617*f585d8a3SJacky Wang assertThat(child1.b()).isEqualTo((byte) 7); 618*f585d8a3SJacky Wang } 619*f585d8a3SJacky Wang 620*f585d8a3SJacky Wang @Test subcomponents_abstractclass()621*f585d8a3SJacky Wang public void subcomponents_abstractclass() { 622*f585d8a3SJacky Wang ParentComponent parent = DaggerBuilderTest_ParentComponent.create(); 623*f585d8a3SJacky Wang TestChildComponentWithBuilderAbstractClass.Builder builder2 = 624*f585d8a3SJacky Wang parent.childAbstractClassBuilder(); 625*f585d8a3SJacky Wang try { 626*f585d8a3SJacky Wang builder2.build(); 627*f585d8a3SJacky Wang fail(); 628*f585d8a3SJacky Wang } catch (IllegalStateException expected) { 629*f585d8a3SJacky Wang } 630*f585d8a3SJacky Wang 631*f585d8a3SJacky Wang builder2 632*f585d8a3SJacky Wang .setM2(new IntModuleIncludingDoubleAndFloat(10)) 633*f585d8a3SJacky Wang .setM1(new StringModule("tara")) 634*f585d8a3SJacky Wang .set(new ByteModule((byte) 70)); 635*f585d8a3SJacky Wang builder2.set(new FloatModule()); 636*f585d8a3SJacky Wang TestChildComponentWithBuilderAbstractClass child2 = builder2.build(); 637*f585d8a3SJacky Wang assertThat(child2.s()).isEqualTo("tara"); 638*f585d8a3SJacky Wang assertThat(child2.i()).isEqualTo(10); 639*f585d8a3SJacky Wang assertThat(child2.d()).isEqualTo(4.2d); 640*f585d8a3SJacky Wang assertThat(child2.f()).isEqualTo(5.5f); 641*f585d8a3SJacky Wang assertThat(child2.l()).isEqualTo(6L); 642*f585d8a3SJacky Wang assertThat(child2.b()).isEqualTo((byte) 70); 643*f585d8a3SJacky Wang } 644*f585d8a3SJacky Wang 645*f585d8a3SJacky Wang @Test grandchildren()646*f585d8a3SJacky Wang public void grandchildren() { 647*f585d8a3SJacky Wang ParentComponent parent = DaggerBuilderTest_ParentComponent.create(); 648*f585d8a3SJacky Wang MiddleChild middle1 = parent.middleBuilder().set(new StringModule("sam")).build(); 649*f585d8a3SJacky Wang Grandchild grandchild1 = 650*f585d8a3SJacky Wang middle1.grandchildBuilder().set(new IntModuleIncludingDoubleAndFloat(21)).build(); 651*f585d8a3SJacky Wang Grandchild grandchild2 = 652*f585d8a3SJacky Wang middle1.grandchildBuilder().set(new IntModuleIncludingDoubleAndFloat(22)).build(); 653*f585d8a3SJacky Wang 654*f585d8a3SJacky Wang assertThat(middle1.s()).isEqualTo("sam"); 655*f585d8a3SJacky Wang assertThat(grandchild1.i()).isEqualTo(21); 656*f585d8a3SJacky Wang assertThat(grandchild1.s()).isEqualTo("sam"); 657*f585d8a3SJacky Wang assertThat(grandchild2.i()).isEqualTo(22); 658*f585d8a3SJacky Wang assertThat(grandchild2.s()).isEqualTo("sam"); 659*f585d8a3SJacky Wang 660*f585d8a3SJacky Wang // Make sure grandchildren from newer children have no relation to the older ones. 661*f585d8a3SJacky Wang MiddleChild middle2 = parent.middleBuilder().set(new StringModule("tara")).build(); 662*f585d8a3SJacky Wang Grandchild grandchild3 = 663*f585d8a3SJacky Wang middle2.grandchildBuilder().set(new IntModuleIncludingDoubleAndFloat(23)).build(); 664*f585d8a3SJacky Wang Grandchild grandchild4 = 665*f585d8a3SJacky Wang middle2.grandchildBuilder().set(new IntModuleIncludingDoubleAndFloat(24)).build(); 666*f585d8a3SJacky Wang 667*f585d8a3SJacky Wang assertThat(middle2.s()).isEqualTo("tara"); 668*f585d8a3SJacky Wang assertThat(grandchild3.i()).isEqualTo(23); 669*f585d8a3SJacky Wang assertThat(grandchild3.s()).isEqualTo("tara"); 670*f585d8a3SJacky Wang assertThat(grandchild4.i()).isEqualTo(24); 671*f585d8a3SJacky Wang assertThat(grandchild4.s()).isEqualTo("tara"); 672*f585d8a3SJacky Wang } 673*f585d8a3SJacky Wang 674*f585d8a3SJacky Wang @Test diamondGrandchildren()675*f585d8a3SJacky Wang public void diamondGrandchildren() { 676*f585d8a3SJacky Wang ParentComponent parent = DaggerBuilderTest_ParentComponent.create(); 677*f585d8a3SJacky Wang MiddleChild middle = parent.middleBuilder().set(new StringModule("sam")).build(); 678*f585d8a3SJacky Wang OtherMiddleChild other = parent.otherBuilder().set(new StringModule("tara")).build(); 679*f585d8a3SJacky Wang 680*f585d8a3SJacky Wang Grandchild middlegrand = 681*f585d8a3SJacky Wang middle.grandchildBuilder().set(new IntModuleIncludingDoubleAndFloat(21)).build(); 682*f585d8a3SJacky Wang Grandchild othergrand = 683*f585d8a3SJacky Wang other.grandchildBuilder().set(new IntModuleIncludingDoubleAndFloat(22)).build(); 684*f585d8a3SJacky Wang 685*f585d8a3SJacky Wang assertThat(middle.s()).isEqualTo("sam"); 686*f585d8a3SJacky Wang assertThat(other.s()).isEqualTo("tara"); 687*f585d8a3SJacky Wang assertThat(middlegrand.s()).isEqualTo("sam"); 688*f585d8a3SJacky Wang assertThat(othergrand.s()).isEqualTo("tara"); 689*f585d8a3SJacky Wang assertThat(middlegrand.i()).isEqualTo(21); 690*f585d8a3SJacky Wang assertThat(othergrand.i()).isEqualTo(22); 691*f585d8a3SJacky Wang } 692*f585d8a3SJacky Wang 693*f585d8a3SJacky Wang @Test genericSubcomponentMethod()694*f585d8a3SJacky Wang public void genericSubcomponentMethod() { 695*f585d8a3SJacky Wang ParentOfGenericComponent parent = 696*f585d8a3SJacky Wang DaggerBuilderTest_ParentOfGenericComponent.builder() 697*f585d8a3SJacky Wang .stringModule(new StringModule("sam")) 698*f585d8a3SJacky Wang .build(); 699*f585d8a3SJacky Wang Grandchild.Builder builder = parent.subcomponentBuilder(); 700*f585d8a3SJacky Wang Grandchild child = builder.set(new IntModuleIncludingDoubleAndFloat(21)).build(); 701*f585d8a3SJacky Wang assertThat(child.s()).isEqualTo("sam"); 702*f585d8a3SJacky Wang assertThat(child.i()).isEqualTo(21); 703*f585d8a3SJacky Wang } 704*f585d8a3SJacky Wang 705*f585d8a3SJacky Wang @Test requireSubcomponentBuilderProviders()706*f585d8a3SJacky Wang public void requireSubcomponentBuilderProviders() { 707*f585d8a3SJacky Wang ParentComponent parent = DaggerBuilderTest_ParentComponent.create(); 708*f585d8a3SJacky Wang MiddleChild middle = 709*f585d8a3SJacky Wang parent 710*f585d8a3SJacky Wang .requiresMiddleChildBuilder() 711*f585d8a3SJacky Wang .subcomponentBuilderProvider() 712*f585d8a3SJacky Wang .get() 713*f585d8a3SJacky Wang .set(new StringModule("sam")) 714*f585d8a3SJacky Wang .build(); 715*f585d8a3SJacky Wang Grandchild grandchild = 716*f585d8a3SJacky Wang middle 717*f585d8a3SJacky Wang .requiresGrandchildBuilder() 718*f585d8a3SJacky Wang .subcomponentBuilderProvider() 719*f585d8a3SJacky Wang .get() 720*f585d8a3SJacky Wang .set(new IntModuleIncludingDoubleAndFloat(12)) 721*f585d8a3SJacky Wang .build(); 722*f585d8a3SJacky Wang assertThat(middle.s()).isEqualTo("sam"); 723*f585d8a3SJacky Wang assertThat(grandchild.i()).isEqualTo(12); 724*f585d8a3SJacky Wang assertThat(grandchild.s()).isEqualTo("sam"); 725*f585d8a3SJacky Wang } 726*f585d8a3SJacky Wang 727*f585d8a3SJacky Wang @Test requireSubcomponentBuilders()728*f585d8a3SJacky Wang public void requireSubcomponentBuilders() { 729*f585d8a3SJacky Wang ParentComponent parent = DaggerBuilderTest_ParentComponent.create(); 730*f585d8a3SJacky Wang MiddleChild middle = 731*f585d8a3SJacky Wang parent 732*f585d8a3SJacky Wang .requiresMiddleChildBuilder() 733*f585d8a3SJacky Wang .subcomponentBuilder() 734*f585d8a3SJacky Wang .set(new StringModule("sam")) 735*f585d8a3SJacky Wang .build(); 736*f585d8a3SJacky Wang Grandchild grandchild = 737*f585d8a3SJacky Wang middle 738*f585d8a3SJacky Wang .requiresGrandchildBuilder() 739*f585d8a3SJacky Wang .subcomponentBuilder() 740*f585d8a3SJacky Wang .set(new IntModuleIncludingDoubleAndFloat(12)) 741*f585d8a3SJacky Wang .build(); 742*f585d8a3SJacky Wang assertThat(middle.s()).isEqualTo("sam"); 743*f585d8a3SJacky Wang assertThat(grandchild.i()).isEqualTo(12); 744*f585d8a3SJacky Wang assertThat(grandchild.s()).isEqualTo("sam"); 745*f585d8a3SJacky Wang } 746*f585d8a3SJacky Wang } 747