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 SetBindingRequestFulfillmentWithGuavaTest {
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 
SetBindingRequestFulfillmentWithGuavaTest(CompilerMode compilerMode)40*f585d8a3SJacky Wang   public SetBindingRequestFulfillmentWithGuavaTest(CompilerMode compilerMode) {
41*f585d8a3SJacky Wang     this.compilerMode = compilerMode;
42*f585d8a3SJacky Wang   }
43*f585d8a3SJacky Wang 
44*f585d8a3SJacky Wang   @Test
setBindings()45*f585d8a3SJacky Wang   public void setBindings() throws Exception {
46*f585d8a3SJacky Wang     Source emptySetModuleFile =
47*f585d8a3SJacky Wang         CompilerTests.javaSource(
48*f585d8a3SJacky Wang             "test.EmptySetModule",
49*f585d8a3SJacky Wang             "package test;",
50*f585d8a3SJacky Wang             "",
51*f585d8a3SJacky Wang             "import dagger.Module;",
52*f585d8a3SJacky Wang             "import dagger.Provides;",
53*f585d8a3SJacky Wang             "import dagger.multibindings.ElementsIntoSet;",
54*f585d8a3SJacky Wang             "import dagger.multibindings.Multibinds;",
55*f585d8a3SJacky Wang             "import java.util.Collections;",
56*f585d8a3SJacky Wang             "import java.util.Set;",
57*f585d8a3SJacky Wang             "",
58*f585d8a3SJacky Wang             "@Module",
59*f585d8a3SJacky Wang             "abstract class EmptySetModule {",
60*f585d8a3SJacky Wang             "  @Multibinds abstract Set<Object> objects();",
61*f585d8a3SJacky Wang             "",
62*f585d8a3SJacky Wang             "  @Provides @ElementsIntoSet",
63*f585d8a3SJacky Wang             "  static Set<String> emptySet() { ",
64*f585d8a3SJacky Wang             "    return Collections.emptySet();",
65*f585d8a3SJacky Wang             "  }",
66*f585d8a3SJacky Wang             "  @Provides @ElementsIntoSet",
67*f585d8a3SJacky Wang             "  static Set<Integer> onlyContributionIsElementsIntoSet() { ",
68*f585d8a3SJacky Wang             "    return Collections.emptySet();",
69*f585d8a3SJacky Wang             "  }",
70*f585d8a3SJacky Wang             "}");
71*f585d8a3SJacky Wang     Source setModuleFile =
72*f585d8a3SJacky Wang         CompilerTests.javaSource(
73*f585d8a3SJacky Wang             "test.SetModule",
74*f585d8a3SJacky Wang             "package test;",
75*f585d8a3SJacky Wang             "",
76*f585d8a3SJacky Wang             "import dagger.Module;",
77*f585d8a3SJacky Wang             "import dagger.Provides;",
78*f585d8a3SJacky Wang             "import dagger.multibindings.IntoSet;",
79*f585d8a3SJacky Wang             "",
80*f585d8a3SJacky Wang             "@Module",
81*f585d8a3SJacky Wang             "final class SetModule {",
82*f585d8a3SJacky Wang             "  @Provides @IntoSet static String string() { return \"\"; }",
83*f585d8a3SJacky Wang             "}");
84*f585d8a3SJacky Wang     Source componentFile =
85*f585d8a3SJacky Wang         CompilerTests.javaSource(
86*f585d8a3SJacky Wang             "test.TestComponent",
87*f585d8a3SJacky Wang             "package test;",
88*f585d8a3SJacky Wang             "",
89*f585d8a3SJacky Wang             "import dagger.Component;",
90*f585d8a3SJacky Wang             "import java.util.Set;",
91*f585d8a3SJacky Wang             "import javax.inject.Provider;",
92*f585d8a3SJacky Wang             "",
93*f585d8a3SJacky Wang             "@Component(modules = {EmptySetModule.class, SetModule.class})",
94*f585d8a3SJacky Wang             "interface TestComponent {",
95*f585d8a3SJacky Wang             "  Set<String> strings();",
96*f585d8a3SJacky Wang             "  Set<Object> objects();",
97*f585d8a3SJacky Wang             "  Set<Integer> onlyContributionIsElementsIntoSet();",
98*f585d8a3SJacky Wang             "}");
99*f585d8a3SJacky Wang 
100*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(emptySetModuleFile, setModuleFile, componentFile)
101*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
102*f585d8a3SJacky Wang         .compile(
103*f585d8a3SJacky Wang             subject -> {
104*f585d8a3SJacky Wang               subject.hasErrorCount(0);
105*f585d8a3SJacky Wang               subject.generatedSource(
106*f585d8a3SJacky Wang                   goldenFileRule.goldenSource("test/DaggerTestComponent"));
107*f585d8a3SJacky Wang             });
108*f585d8a3SJacky Wang   }
109*f585d8a3SJacky Wang 
110*f585d8a3SJacky Wang   @Test
inaccessible()111*f585d8a3SJacky Wang   public void inaccessible() throws Exception {
112*f585d8a3SJacky Wang     Source inaccessible =
113*f585d8a3SJacky Wang         CompilerTests.javaSource(
114*f585d8a3SJacky Wang             "other.Inaccessible",
115*f585d8a3SJacky Wang             "package other;",
116*f585d8a3SJacky Wang             "",
117*f585d8a3SJacky Wang             "class Inaccessible {}");
118*f585d8a3SJacky Wang     Source inaccessible2 =
119*f585d8a3SJacky Wang         CompilerTests.javaSource(
120*f585d8a3SJacky Wang             "other.Inaccessible2",
121*f585d8a3SJacky Wang             "package other;",
122*f585d8a3SJacky Wang             "",
123*f585d8a3SJacky Wang             "class Inaccessible2 {}");
124*f585d8a3SJacky Wang     Source usesInaccessible =
125*f585d8a3SJacky Wang         CompilerTests.javaSource(
126*f585d8a3SJacky Wang             "other.UsesInaccessible",
127*f585d8a3SJacky Wang             "package other;",
128*f585d8a3SJacky Wang             "",
129*f585d8a3SJacky Wang             "import java.util.Set;",
130*f585d8a3SJacky Wang             "import javax.inject.Inject;",
131*f585d8a3SJacky Wang             "",
132*f585d8a3SJacky Wang             "public class UsesInaccessible {",
133*f585d8a3SJacky Wang             "  @Inject UsesInaccessible(Set<Inaccessible> set1, Set<Inaccessible2> set2) {}",
134*f585d8a3SJacky Wang             "}");
135*f585d8a3SJacky Wang 
136*f585d8a3SJacky Wang     Source module =
137*f585d8a3SJacky Wang         CompilerTests.javaSource(
138*f585d8a3SJacky Wang             "other.TestModule",
139*f585d8a3SJacky Wang             "package other;",
140*f585d8a3SJacky Wang             "",
141*f585d8a3SJacky Wang             "import dagger.Module;",
142*f585d8a3SJacky Wang             "import dagger.Provides;",
143*f585d8a3SJacky Wang             "import dagger.multibindings.ElementsIntoSet;",
144*f585d8a3SJacky Wang             "import dagger.multibindings.Multibinds;",
145*f585d8a3SJacky Wang             "import java.util.Collections;",
146*f585d8a3SJacky Wang             "import java.util.Set;",
147*f585d8a3SJacky Wang             "",
148*f585d8a3SJacky Wang             "@Module",
149*f585d8a3SJacky Wang             "public abstract class TestModule {",
150*f585d8a3SJacky Wang             "  @Multibinds abstract Set<Inaccessible> objects();",
151*f585d8a3SJacky Wang             "",
152*f585d8a3SJacky Wang             "  @Provides @ElementsIntoSet",
153*f585d8a3SJacky Wang             "  static Set<Inaccessible2> emptySet() { ",
154*f585d8a3SJacky Wang             "    return Collections.emptySet();",
155*f585d8a3SJacky Wang             "  }",
156*f585d8a3SJacky Wang             "}");
157*f585d8a3SJacky Wang     Source componentFile =
158*f585d8a3SJacky Wang         CompilerTests.javaSource(
159*f585d8a3SJacky Wang             "test.TestComponent",
160*f585d8a3SJacky Wang             "package test;",
161*f585d8a3SJacky Wang             "",
162*f585d8a3SJacky Wang             "import dagger.Component;",
163*f585d8a3SJacky Wang             "import java.util.Set;",
164*f585d8a3SJacky Wang             "import javax.inject.Provider;",
165*f585d8a3SJacky Wang             "import other.TestModule;",
166*f585d8a3SJacky Wang             "import other.UsesInaccessible;",
167*f585d8a3SJacky Wang             "",
168*f585d8a3SJacky Wang             "@Component(modules = TestModule.class)",
169*f585d8a3SJacky Wang             "interface TestComponent {",
170*f585d8a3SJacky Wang             "  UsesInaccessible usesInaccessible();",
171*f585d8a3SJacky Wang             "}");
172*f585d8a3SJacky Wang 
173*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(
174*f585d8a3SJacky Wang             module, inaccessible, inaccessible2, usesInaccessible, componentFile)
175*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
176*f585d8a3SJacky Wang         .compile(
177*f585d8a3SJacky Wang             subject -> {
178*f585d8a3SJacky Wang               subject.hasErrorCount(0);
179*f585d8a3SJacky Wang               subject.generatedSource(
180*f585d8a3SJacky Wang                   goldenFileRule.goldenSource("test/DaggerTestComponent"));
181*f585d8a3SJacky Wang             });
182*f585d8a3SJacky Wang   }
183*f585d8a3SJacky Wang 
184*f585d8a3SJacky Wang   @Test
subcomponentOmitsInheritedBindings()185*f585d8a3SJacky Wang   public void subcomponentOmitsInheritedBindings() throws Exception {
186*f585d8a3SJacky Wang     Source parent =
187*f585d8a3SJacky Wang         CompilerTests.javaSource(
188*f585d8a3SJacky Wang             "test.Parent",
189*f585d8a3SJacky Wang             "package test;",
190*f585d8a3SJacky Wang             "",
191*f585d8a3SJacky Wang             "import dagger.Component;",
192*f585d8a3SJacky Wang             "",
193*f585d8a3SJacky Wang             "@Component(modules = ParentModule.class)",
194*f585d8a3SJacky Wang             "interface Parent {",
195*f585d8a3SJacky Wang             "  Child child();",
196*f585d8a3SJacky Wang             "}");
197*f585d8a3SJacky Wang     Source parentModule =
198*f585d8a3SJacky Wang         CompilerTests.javaSource(
199*f585d8a3SJacky Wang             "test.ParentModule",
200*f585d8a3SJacky Wang             "package test;",
201*f585d8a3SJacky Wang             "",
202*f585d8a3SJacky Wang             "import dagger.Module;",
203*f585d8a3SJacky Wang             "import dagger.Provides;",
204*f585d8a3SJacky Wang             "import dagger.multibindings.IntoSet;",
205*f585d8a3SJacky Wang             "import dagger.multibindings.StringKey;",
206*f585d8a3SJacky Wang             "",
207*f585d8a3SJacky Wang             "@Module",
208*f585d8a3SJacky Wang             "class ParentModule {",
209*f585d8a3SJacky Wang             "  @Provides @IntoSet static Object parentObject() {",
210*f585d8a3SJacky Wang             "    return \"parent object\";",
211*f585d8a3SJacky Wang             "  }",
212*f585d8a3SJacky Wang             "}");
213*f585d8a3SJacky Wang     Source child =
214*f585d8a3SJacky Wang         CompilerTests.javaSource(
215*f585d8a3SJacky Wang             "test.Child",
216*f585d8a3SJacky Wang             "package test;",
217*f585d8a3SJacky Wang             "",
218*f585d8a3SJacky Wang             "import dagger.Subcomponent;",
219*f585d8a3SJacky Wang             "import java.util.Set;",
220*f585d8a3SJacky Wang             "",
221*f585d8a3SJacky Wang             "@Subcomponent",
222*f585d8a3SJacky Wang             "interface Child {",
223*f585d8a3SJacky Wang             "  Set<Object> objectSet();",
224*f585d8a3SJacky Wang             "}");
225*f585d8a3SJacky Wang 
226*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(parent, parentModule, child)
227*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
228*f585d8a3SJacky Wang         .compile(
229*f585d8a3SJacky Wang             subject -> {
230*f585d8a3SJacky Wang               subject.hasErrorCount(0);
231*f585d8a3SJacky Wang               subject.generatedSource(
232*f585d8a3SJacky Wang                   goldenFileRule.goldenSource("test/DaggerParent"));
233*f585d8a3SJacky Wang             });
234*f585d8a3SJacky Wang   }
235*f585d8a3SJacky Wang 
236*f585d8a3SJacky Wang   @Test
productionComponents()237*f585d8a3SJacky Wang   public void productionComponents() throws Exception {
238*f585d8a3SJacky Wang     Source emptySetModuleFile =
239*f585d8a3SJacky Wang         CompilerTests.javaSource(
240*f585d8a3SJacky Wang             "test.EmptySetModule",
241*f585d8a3SJacky Wang             "package test;",
242*f585d8a3SJacky Wang             "",
243*f585d8a3SJacky Wang             "import dagger.Module;",
244*f585d8a3SJacky Wang             "import dagger.Provides;",
245*f585d8a3SJacky Wang             "import dagger.multibindings.ElementsIntoSet;",
246*f585d8a3SJacky Wang             "import java.util.Collections;",
247*f585d8a3SJacky Wang             "import java.util.Set;",
248*f585d8a3SJacky Wang             "",
249*f585d8a3SJacky Wang             "@Module",
250*f585d8a3SJacky Wang             "abstract class EmptySetModule {",
251*f585d8a3SJacky Wang             "  @Provides @ElementsIntoSet",
252*f585d8a3SJacky Wang             "  static Set<String> emptySet() { ",
253*f585d8a3SJacky Wang             "    return Collections.emptySet();",
254*f585d8a3SJacky Wang             "  }",
255*f585d8a3SJacky Wang             "}");
256*f585d8a3SJacky Wang     Source componentFile =
257*f585d8a3SJacky Wang         CompilerTests.javaSource(
258*f585d8a3SJacky Wang             "test.TestComponent",
259*f585d8a3SJacky Wang             "package test;",
260*f585d8a3SJacky Wang             "",
261*f585d8a3SJacky Wang             "import com.google.common.util.concurrent.ListenableFuture;",
262*f585d8a3SJacky Wang             "import dagger.producers.ProductionComponent;",
263*f585d8a3SJacky Wang             "import java.util.Set;",
264*f585d8a3SJacky Wang             "",
265*f585d8a3SJacky Wang             "@ProductionComponent(modules = EmptySetModule.class)",
266*f585d8a3SJacky Wang             "interface TestComponent {",
267*f585d8a3SJacky Wang             "  ListenableFuture<Set<String>> strings();",
268*f585d8a3SJacky Wang             "}");
269*f585d8a3SJacky Wang 
270*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(emptySetModuleFile, componentFile)
271*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
272*f585d8a3SJacky Wang         .compile(
273*f585d8a3SJacky Wang             subject -> {
274*f585d8a3SJacky Wang               subject.hasErrorCount(0);
275*f585d8a3SJacky Wang               subject.generatedSource(
276*f585d8a3SJacky Wang                   goldenFileRule.goldenSource("test/DaggerTestComponent"));
277*f585d8a3SJacky Wang             });
278*f585d8a3SJacky Wang   }
279*f585d8a3SJacky Wang }
280