xref: /aosp_15_r20/external/dagger2/javatests/dagger/functional/builder/BuilderTest.java (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
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