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