xref: /aosp_15_r20/external/dagger2/javatests/dagger/internal/codegen/SwitchingProviderTest.java (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
1*f585d8a3SJacky Wang /*
2*f585d8a3SJacky Wang  * Copyright (C) 2014 The Dagger Authors.
3*f585d8a3SJacky Wang  *
4*f585d8a3SJacky Wang  * Licensed under the Apache License, Version 2.0 (the "License");
5*f585d8a3SJacky Wang  * you may not use this file except in compliance with the License.
6*f585d8a3SJacky Wang  * You may obtain a copy of the License at
7*f585d8a3SJacky Wang  *
8*f585d8a3SJacky Wang  * http://www.apache.org/licenses/LICENSE-2.0
9*f585d8a3SJacky Wang  *
10*f585d8a3SJacky Wang  * Unless required by applicable law or agreed to in writing, software
11*f585d8a3SJacky Wang  * distributed under the License is distributed on an "AS IS" BASIS,
12*f585d8a3SJacky Wang  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*f585d8a3SJacky Wang  * See the License for the specific language governing permissions and
14*f585d8a3SJacky Wang  * limitations under the License.
15*f585d8a3SJacky Wang  */
16*f585d8a3SJacky Wang 
17*f585d8a3SJacky Wang package dagger.internal.codegen;
18*f585d8a3SJacky Wang 
19*f585d8a3SJacky Wang import androidx.room.compiler.processing.util.Source;
20*f585d8a3SJacky Wang import com.google.common.collect.ImmutableList;
21*f585d8a3SJacky Wang import dagger.testing.compile.CompilerTests;
22*f585d8a3SJacky Wang import dagger.testing.golden.GoldenFileRule;
23*f585d8a3SJacky Wang import org.junit.Rule;
24*f585d8a3SJacky Wang import org.junit.Test;
25*f585d8a3SJacky Wang import org.junit.runner.RunWith;
26*f585d8a3SJacky Wang import org.junit.runners.Parameterized;
27*f585d8a3SJacky Wang import org.junit.runners.Parameterized.Parameters;
28*f585d8a3SJacky Wang 
29*f585d8a3SJacky Wang @RunWith(Parameterized.class)
30*f585d8a3SJacky Wang public class SwitchingProviderTest {
31*f585d8a3SJacky Wang   @Parameters(name = "{0}")
parameters()32*f585d8a3SJacky Wang   public static ImmutableList<Object[]> parameters() {
33*f585d8a3SJacky Wang     return CompilerMode.TEST_PARAMETERS;
34*f585d8a3SJacky Wang   }
35*f585d8a3SJacky Wang 
36*f585d8a3SJacky Wang   @Rule public GoldenFileRule goldenFileRule = new GoldenFileRule();
37*f585d8a3SJacky Wang 
38*f585d8a3SJacky Wang   private final CompilerMode compilerMode;
39*f585d8a3SJacky Wang 
SwitchingProviderTest(CompilerMode compilerMode)40*f585d8a3SJacky Wang   public SwitchingProviderTest(CompilerMode compilerMode) {
41*f585d8a3SJacky Wang     this.compilerMode = compilerMode;
42*f585d8a3SJacky Wang   }
43*f585d8a3SJacky Wang 
44*f585d8a3SJacky Wang   @Test
switchingProviderTest()45*f585d8a3SJacky Wang   public void switchingProviderTest() throws Exception {
46*f585d8a3SJacky Wang     ImmutableList.Builder<Source> sources = ImmutableList.builder();
47*f585d8a3SJacky Wang     StringBuilder entryPoints = new StringBuilder();
48*f585d8a3SJacky Wang     for (int i = 0; i <= 100; i++) {
49*f585d8a3SJacky Wang       String bindingName = "Binding" + i;
50*f585d8a3SJacky Wang       sources.add(
51*f585d8a3SJacky Wang           CompilerTests.javaSource(
52*f585d8a3SJacky Wang               "test." + bindingName,
53*f585d8a3SJacky Wang               "package test;",
54*f585d8a3SJacky Wang               "",
55*f585d8a3SJacky Wang               "import javax.inject.Inject;",
56*f585d8a3SJacky Wang               "",
57*f585d8a3SJacky Wang               "final class " + bindingName + " {",
58*f585d8a3SJacky Wang               "  @Inject",
59*f585d8a3SJacky Wang               "  " + bindingName + "() {}",
60*f585d8a3SJacky Wang               "}"));
61*f585d8a3SJacky Wang       entryPoints.append(String.format("  Provider<%1$s> get%1$sProvider();\n", bindingName));
62*f585d8a3SJacky Wang     }
63*f585d8a3SJacky Wang 
64*f585d8a3SJacky Wang     sources.add(
65*f585d8a3SJacky Wang         CompilerTests.javaSource(
66*f585d8a3SJacky Wang             "test.TestComponent",
67*f585d8a3SJacky Wang             "package test;",
68*f585d8a3SJacky Wang             "",
69*f585d8a3SJacky Wang             "import dagger.Component;",
70*f585d8a3SJacky Wang             "import javax.inject.Provider;",
71*f585d8a3SJacky Wang             "",
72*f585d8a3SJacky Wang             "@Component",
73*f585d8a3SJacky Wang             "interface TestComponent {",
74*f585d8a3SJacky Wang             entryPoints.toString(),
75*f585d8a3SJacky Wang             "}"));
76*f585d8a3SJacky Wang 
77*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(sources.build())
78*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
79*f585d8a3SJacky Wang         .compile(
80*f585d8a3SJacky Wang             subject -> {
81*f585d8a3SJacky Wang               subject.hasErrorCount(0);
82*f585d8a3SJacky Wang               subject.hasWarningCount(0);
83*f585d8a3SJacky Wang               subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent"));
84*f585d8a3SJacky Wang             });
85*f585d8a3SJacky Wang   }
86*f585d8a3SJacky Wang 
87*f585d8a3SJacky Wang   @Test
unscopedBinds()88*f585d8a3SJacky Wang   public void unscopedBinds() throws Exception {
89*f585d8a3SJacky Wang     Source module =
90*f585d8a3SJacky Wang         CompilerTests.javaSource(
91*f585d8a3SJacky Wang             "test.TestModule",
92*f585d8a3SJacky Wang             "package test;",
93*f585d8a3SJacky Wang             "",
94*f585d8a3SJacky Wang             "import dagger.Binds;",
95*f585d8a3SJacky Wang             "import dagger.Module;",
96*f585d8a3SJacky Wang             "import dagger.Provides;",
97*f585d8a3SJacky Wang             "",
98*f585d8a3SJacky Wang             "@Module",
99*f585d8a3SJacky Wang             "interface TestModule {",
100*f585d8a3SJacky Wang             "  @Provides",
101*f585d8a3SJacky Wang             "  static String s() {",
102*f585d8a3SJacky Wang             "    return new String();",
103*f585d8a3SJacky Wang             "  }",
104*f585d8a3SJacky Wang             "",
105*f585d8a3SJacky Wang             "  @Binds CharSequence c(String s);",
106*f585d8a3SJacky Wang             "  @Binds Object o(CharSequence c);",
107*f585d8a3SJacky Wang             "}");
108*f585d8a3SJacky Wang     Source component =
109*f585d8a3SJacky Wang         CompilerTests.javaSource(
110*f585d8a3SJacky Wang             "test.TestComponent",
111*f585d8a3SJacky Wang             "package test;",
112*f585d8a3SJacky Wang             "",
113*f585d8a3SJacky Wang             "import dagger.Component;",
114*f585d8a3SJacky Wang             "import javax.inject.Provider;",
115*f585d8a3SJacky Wang             "",
116*f585d8a3SJacky Wang             "@Component(modules = TestModule.class)",
117*f585d8a3SJacky Wang             "interface TestComponent {",
118*f585d8a3SJacky Wang             "  Provider<Object> objectProvider();",
119*f585d8a3SJacky Wang             "  Provider<CharSequence> charSequenceProvider();",
120*f585d8a3SJacky Wang             "}");
121*f585d8a3SJacky Wang 
122*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(module, component)
123*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
124*f585d8a3SJacky Wang         .compile(
125*f585d8a3SJacky Wang             subject -> {
126*f585d8a3SJacky Wang               subject.hasErrorCount(0);
127*f585d8a3SJacky Wang               subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent"));
128*f585d8a3SJacky Wang             });
129*f585d8a3SJacky Wang   }
130*f585d8a3SJacky Wang 
131*f585d8a3SJacky Wang   @Test
scopedBinds()132*f585d8a3SJacky Wang   public void scopedBinds() throws Exception {
133*f585d8a3SJacky Wang     Source module =
134*f585d8a3SJacky Wang         CompilerTests.javaSource(
135*f585d8a3SJacky Wang             "test.TestModule",
136*f585d8a3SJacky Wang             "package test;",
137*f585d8a3SJacky Wang             "",
138*f585d8a3SJacky Wang             "import dagger.Binds;",
139*f585d8a3SJacky Wang             "import dagger.Module;",
140*f585d8a3SJacky Wang             "import dagger.Provides;",
141*f585d8a3SJacky Wang             "import javax.inject.Singleton;",
142*f585d8a3SJacky Wang             "",
143*f585d8a3SJacky Wang             "@Module",
144*f585d8a3SJacky Wang             "interface TestModule {",
145*f585d8a3SJacky Wang             "  @Provides",
146*f585d8a3SJacky Wang             "  static String s() {",
147*f585d8a3SJacky Wang             "    return new String();",
148*f585d8a3SJacky Wang             "  }",
149*f585d8a3SJacky Wang             "",
150*f585d8a3SJacky Wang             "  @Binds @Singleton Object o(CharSequence s);",
151*f585d8a3SJacky Wang             "  @Binds @Singleton CharSequence c(String s);",
152*f585d8a3SJacky Wang             "}");
153*f585d8a3SJacky Wang     Source component =
154*f585d8a3SJacky Wang         CompilerTests.javaSource(
155*f585d8a3SJacky Wang             "test.TestComponent",
156*f585d8a3SJacky Wang             "package test;",
157*f585d8a3SJacky Wang             "",
158*f585d8a3SJacky Wang             "import dagger.Component;",
159*f585d8a3SJacky Wang             "import javax.inject.Provider;",
160*f585d8a3SJacky Wang             "import javax.inject.Singleton;",
161*f585d8a3SJacky Wang             "",
162*f585d8a3SJacky Wang             "@Singleton",
163*f585d8a3SJacky Wang             "@Component(modules = TestModule.class)",
164*f585d8a3SJacky Wang             "interface TestComponent {",
165*f585d8a3SJacky Wang             "  Provider<Object> objectProvider();",
166*f585d8a3SJacky Wang             "  Provider<CharSequence> charSequenceProvider();",
167*f585d8a3SJacky Wang             "}");
168*f585d8a3SJacky Wang 
169*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(module, component)
170*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
171*f585d8a3SJacky Wang         .compile(
172*f585d8a3SJacky Wang             subject -> {
173*f585d8a3SJacky Wang               subject.hasErrorCount(0);
174*f585d8a3SJacky Wang               subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent"));
175*f585d8a3SJacky Wang             });
176*f585d8a3SJacky Wang   }
177*f585d8a3SJacky Wang 
178*f585d8a3SJacky Wang   @Test
emptyMultibindings_avoidSwitchProviders()179*f585d8a3SJacky Wang   public void emptyMultibindings_avoidSwitchProviders() throws Exception {
180*f585d8a3SJacky Wang     Source module =
181*f585d8a3SJacky Wang         CompilerTests.javaSource(
182*f585d8a3SJacky Wang             "test.TestModule",
183*f585d8a3SJacky Wang             "package test;",
184*f585d8a3SJacky Wang             "",
185*f585d8a3SJacky Wang             "import dagger.multibindings.Multibinds;",
186*f585d8a3SJacky Wang             "import dagger.Module;",
187*f585d8a3SJacky Wang             "import java.util.Map;",
188*f585d8a3SJacky Wang             "import java.util.Set;",
189*f585d8a3SJacky Wang             "",
190*f585d8a3SJacky Wang             "@Module",
191*f585d8a3SJacky Wang             "interface TestModule {",
192*f585d8a3SJacky Wang             "  @Multibinds Set<String> set();",
193*f585d8a3SJacky Wang             "  @Multibinds Map<String, String> map();",
194*f585d8a3SJacky Wang             "}");
195*f585d8a3SJacky Wang     Source component =
196*f585d8a3SJacky Wang         CompilerTests.javaSource(
197*f585d8a3SJacky Wang             "test.TestComponent",
198*f585d8a3SJacky Wang             "package test;",
199*f585d8a3SJacky Wang             "",
200*f585d8a3SJacky Wang             "import dagger.Component;",
201*f585d8a3SJacky Wang             "import java.util.Map;",
202*f585d8a3SJacky Wang             "import java.util.Set;",
203*f585d8a3SJacky Wang             "import javax.inject.Provider;",
204*f585d8a3SJacky Wang             "",
205*f585d8a3SJacky Wang             "@Component(modules = TestModule.class)",
206*f585d8a3SJacky Wang             "interface TestComponent {",
207*f585d8a3SJacky Wang             "  Provider<Set<String>> setProvider();",
208*f585d8a3SJacky Wang             "  Provider<Map<String, String>> mapProvider();",
209*f585d8a3SJacky Wang             "}");
210*f585d8a3SJacky Wang 
211*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(module, component)
212*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
213*f585d8a3SJacky Wang         .compile(
214*f585d8a3SJacky Wang             subject -> {
215*f585d8a3SJacky Wang               subject.hasErrorCount(0);
216*f585d8a3SJacky Wang               subject.hasWarningCount(0);
217*f585d8a3SJacky Wang               subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent"));
218*f585d8a3SJacky Wang             });
219*f585d8a3SJacky Wang   }
220*f585d8a3SJacky Wang 
221*f585d8a3SJacky Wang   @Test
memberInjectors()222*f585d8a3SJacky Wang   public void memberInjectors() throws Exception {
223*f585d8a3SJacky Wang     Source foo =
224*f585d8a3SJacky Wang         CompilerTests.javaSource(
225*f585d8a3SJacky Wang             "test.Foo",
226*f585d8a3SJacky Wang             "package test;",
227*f585d8a3SJacky Wang             "",
228*f585d8a3SJacky Wang             "class Foo {}");
229*f585d8a3SJacky Wang     Source component =
230*f585d8a3SJacky Wang         CompilerTests.javaSource(
231*f585d8a3SJacky Wang             "test.TestComponent",
232*f585d8a3SJacky Wang             "package test;",
233*f585d8a3SJacky Wang             "",
234*f585d8a3SJacky Wang             "import dagger.Component;",
235*f585d8a3SJacky Wang             "import dagger.MembersInjector;",
236*f585d8a3SJacky Wang             "import javax.inject.Provider;",
237*f585d8a3SJacky Wang             "",
238*f585d8a3SJacky Wang             "@Component",
239*f585d8a3SJacky Wang             "interface TestComponent {",
240*f585d8a3SJacky Wang             "  Provider<MembersInjector<Foo>> providerOfMembersInjector();",
241*f585d8a3SJacky Wang             "}");
242*f585d8a3SJacky Wang 
243*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(foo, component)
244*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
245*f585d8a3SJacky Wang         .compile(
246*f585d8a3SJacky Wang             subject -> {
247*f585d8a3SJacky Wang               subject.hasErrorCount(0);
248*f585d8a3SJacky Wang               subject.hasWarningCount(0);
249*f585d8a3SJacky Wang               subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent"));
250*f585d8a3SJacky Wang             });
251*f585d8a3SJacky Wang   }
252*f585d8a3SJacky Wang 
253*f585d8a3SJacky Wang   @Test
optionals()254*f585d8a3SJacky Wang   public void optionals() throws Exception {
255*f585d8a3SJacky Wang     Source present =
256*f585d8a3SJacky Wang         CompilerTests.javaSource(
257*f585d8a3SJacky Wang             "test.Present",
258*f585d8a3SJacky Wang             "package test;",
259*f585d8a3SJacky Wang             "",
260*f585d8a3SJacky Wang             "class Present {}");
261*f585d8a3SJacky Wang     Source absent =
262*f585d8a3SJacky Wang         CompilerTests.javaSource(
263*f585d8a3SJacky Wang             "test.Absent",
264*f585d8a3SJacky Wang             "package test;",
265*f585d8a3SJacky Wang             "",
266*f585d8a3SJacky Wang             "class Absent {}");
267*f585d8a3SJacky Wang     Source module =
268*f585d8a3SJacky Wang         CompilerTests.javaSource(
269*f585d8a3SJacky Wang             "test.TestModule",
270*f585d8a3SJacky Wang             "package test;",
271*f585d8a3SJacky Wang             "",
272*f585d8a3SJacky Wang             "import dagger.BindsOptionalOf;",
273*f585d8a3SJacky Wang             "import dagger.Module;",
274*f585d8a3SJacky Wang             "import dagger.Provides;",
275*f585d8a3SJacky Wang             "",
276*f585d8a3SJacky Wang             "@Module",
277*f585d8a3SJacky Wang             "interface TestModule {",
278*f585d8a3SJacky Wang             "  @BindsOptionalOf Present bindOptionalOfPresent();",
279*f585d8a3SJacky Wang             "  @BindsOptionalOf Absent bindOptionalOfAbsent();",
280*f585d8a3SJacky Wang             "",
281*f585d8a3SJacky Wang             "  @Provides static Present p() { return new Present(); }",
282*f585d8a3SJacky Wang             "}");
283*f585d8a3SJacky Wang     Source component =
284*f585d8a3SJacky Wang         CompilerTests.javaSource(
285*f585d8a3SJacky Wang             "test.TestComponent",
286*f585d8a3SJacky Wang             "package test;",
287*f585d8a3SJacky Wang             "",
288*f585d8a3SJacky Wang             "import dagger.Component;",
289*f585d8a3SJacky Wang             "import java.util.Optional;",
290*f585d8a3SJacky Wang             "import javax.inject.Provider;",
291*f585d8a3SJacky Wang             "",
292*f585d8a3SJacky Wang             "@Component(modules = TestModule.class)",
293*f585d8a3SJacky Wang             "interface TestComponent {",
294*f585d8a3SJacky Wang             "  Provider<Optional<Present>> providerOfOptionalOfPresent();",
295*f585d8a3SJacky Wang             "  Provider<Optional<Absent>> providerOfOptionalOfAbsent();",
296*f585d8a3SJacky Wang             "}");
297*f585d8a3SJacky Wang 
298*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(present, absent, module, component)
299*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
300*f585d8a3SJacky Wang         .compile(
301*f585d8a3SJacky Wang             subject -> {
302*f585d8a3SJacky Wang               subject.hasErrorCount(0);
303*f585d8a3SJacky Wang               subject.hasWarningCount(0);
304*f585d8a3SJacky Wang               subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent"));
305*f585d8a3SJacky Wang             });
306*f585d8a3SJacky Wang   }
307*f585d8a3SJacky Wang }
308