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 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 MapRequestRepresentationWithGuavaTest {
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 
MapRequestRepresentationWithGuavaTest(CompilerMode compilerMode)40*f585d8a3SJacky Wang   public MapRequestRepresentationWithGuavaTest(CompilerMode compilerMode) {
41*f585d8a3SJacky Wang     this.compilerMode = compilerMode;
42*f585d8a3SJacky Wang   }
43*f585d8a3SJacky Wang 
44*f585d8a3SJacky Wang   @Test
mapBindings()45*f585d8a3SJacky Wang   public void mapBindings() throws Exception {
46*f585d8a3SJacky Wang     Source mapModuleFile =
47*f585d8a3SJacky Wang         CompilerTests.javaSource(
48*f585d8a3SJacky Wang             "test.MapModule",
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.IntKey;",
54*f585d8a3SJacky Wang             "import dagger.multibindings.IntoMap;",
55*f585d8a3SJacky Wang             "import dagger.multibindings.LongKey;",
56*f585d8a3SJacky Wang             "import dagger.multibindings.Multibinds;",
57*f585d8a3SJacky Wang             "import java.util.Map;",
58*f585d8a3SJacky Wang             "",
59*f585d8a3SJacky Wang             "@Module",
60*f585d8a3SJacky Wang             "interface MapModule {",
61*f585d8a3SJacky Wang             "  @Multibinds Map<String, String> stringMap();",
62*f585d8a3SJacky Wang             "  @Provides @IntoMap @IntKey(0) static int provideInt() { return 0; }",
63*f585d8a3SJacky Wang             "  @Provides @IntoMap @LongKey(0) static long provideLong0() { return 0; }",
64*f585d8a3SJacky Wang             "  @Provides @IntoMap @LongKey(1) static long provideLong1() { return 1; }",
65*f585d8a3SJacky Wang             "  @Provides @IntoMap @LongKey(2) static long provideLong2() { return 2; }",
66*f585d8a3SJacky Wang             "}");
67*f585d8a3SJacky Wang     Source subcomponentModuleFile =
68*f585d8a3SJacky Wang         CompilerTests.javaSource(
69*f585d8a3SJacky Wang             "test.SubcomponentMapModule",
70*f585d8a3SJacky Wang             "package test;",
71*f585d8a3SJacky Wang             "",
72*f585d8a3SJacky Wang             "import dagger.Module;",
73*f585d8a3SJacky Wang             "import dagger.Provides;",
74*f585d8a3SJacky Wang             "import dagger.multibindings.IntKey;",
75*f585d8a3SJacky Wang             "import dagger.multibindings.IntoMap;",
76*f585d8a3SJacky Wang             "import dagger.multibindings.LongKey;",
77*f585d8a3SJacky Wang             "import dagger.multibindings.Multibinds;",
78*f585d8a3SJacky Wang             "import java.util.Map;",
79*f585d8a3SJacky Wang             "",
80*f585d8a3SJacky Wang             "@Module",
81*f585d8a3SJacky Wang             "interface SubcomponentMapModule {",
82*f585d8a3SJacky Wang             "  @Provides @IntoMap @LongKey(3) static long provideLong3() { return 3; }",
83*f585d8a3SJacky Wang             "  @Provides @IntoMap @LongKey(4) static long provideLong4() { return 4; }",
84*f585d8a3SJacky Wang             "  @Provides @IntoMap @LongKey(5) static long provideLong5() { return 5; }",
85*f585d8a3SJacky Wang             "}");
86*f585d8a3SJacky Wang     Source componentFile =
87*f585d8a3SJacky Wang         CompilerTests.javaSource(
88*f585d8a3SJacky Wang             "test.TestComponent",
89*f585d8a3SJacky Wang             "package test;",
90*f585d8a3SJacky Wang             "",
91*f585d8a3SJacky Wang             "import dagger.Component;",
92*f585d8a3SJacky Wang             "import java.util.Map;",
93*f585d8a3SJacky Wang             "import javax.inject.Provider;",
94*f585d8a3SJacky Wang             "",
95*f585d8a3SJacky Wang             "@Component(modules = MapModule.class)",
96*f585d8a3SJacky Wang             "interface TestComponent {",
97*f585d8a3SJacky Wang             "  Map<String, String> strings();",
98*f585d8a3SJacky Wang             "  Map<String, Provider<String>> providerStrings();",
99*f585d8a3SJacky Wang             "",
100*f585d8a3SJacky Wang             "  Map<Integer, Integer> ints();",
101*f585d8a3SJacky Wang             "  Map<Integer, Provider<Integer>> providerInts();",
102*f585d8a3SJacky Wang             "  Map<Long, Long> longs();",
103*f585d8a3SJacky Wang             "  Map<Long, Provider<Long>> providerLongs();",
104*f585d8a3SJacky Wang             "",
105*f585d8a3SJacky Wang             "  Sub sub();",
106*f585d8a3SJacky Wang             "}");
107*f585d8a3SJacky Wang     Source subcomponent =
108*f585d8a3SJacky Wang         CompilerTests.javaSource(
109*f585d8a3SJacky Wang             "test.Sub",
110*f585d8a3SJacky Wang             "package test;",
111*f585d8a3SJacky Wang             "",
112*f585d8a3SJacky Wang             "import dagger.Subcomponent;",
113*f585d8a3SJacky Wang             "import java.util.Map;",
114*f585d8a3SJacky Wang             "import javax.inject.Provider;",
115*f585d8a3SJacky Wang             "",
116*f585d8a3SJacky Wang             "@Subcomponent(modules = SubcomponentMapModule.class)",
117*f585d8a3SJacky Wang             "interface Sub {",
118*f585d8a3SJacky Wang             "  Map<Long, Long> longs();",
119*f585d8a3SJacky Wang             "  Map<Long, Provider<Long>> providerLongs();",
120*f585d8a3SJacky Wang             "}");
121*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(mapModuleFile, componentFile, subcomponentModuleFile, subcomponent)
122*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
123*f585d8a3SJacky Wang         .compile(
124*f585d8a3SJacky Wang             subject -> {
125*f585d8a3SJacky Wang               subject.hasErrorCount(0);
126*f585d8a3SJacky Wang               subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent"));
127*f585d8a3SJacky Wang             });
128*f585d8a3SJacky Wang   }
129*f585d8a3SJacky Wang 
130*f585d8a3SJacky Wang   @Test
inaccessible()131*f585d8a3SJacky Wang   public void inaccessible() throws Exception {
132*f585d8a3SJacky Wang     Source inaccessible =
133*f585d8a3SJacky Wang         CompilerTests.javaSource(
134*f585d8a3SJacky Wang             "other.Inaccessible", "package other;", "", "class Inaccessible {}");
135*f585d8a3SJacky Wang     Source usesInaccessible =
136*f585d8a3SJacky Wang         CompilerTests.javaSource(
137*f585d8a3SJacky Wang             "other.UsesInaccessible",
138*f585d8a3SJacky Wang             "package other;",
139*f585d8a3SJacky Wang             "",
140*f585d8a3SJacky Wang             "import java.util.Map;",
141*f585d8a3SJacky Wang             "import javax.inject.Inject;",
142*f585d8a3SJacky Wang             "",
143*f585d8a3SJacky Wang             "public class UsesInaccessible {",
144*f585d8a3SJacky Wang             "  @Inject UsesInaccessible(Map<Integer, Inaccessible> map) {}",
145*f585d8a3SJacky Wang             "}");
146*f585d8a3SJacky Wang 
147*f585d8a3SJacky Wang     Source module =
148*f585d8a3SJacky Wang         CompilerTests.javaSource(
149*f585d8a3SJacky Wang             "other.TestModule",
150*f585d8a3SJacky Wang             "package other;",
151*f585d8a3SJacky Wang             "",
152*f585d8a3SJacky Wang             "import dagger.Module;",
153*f585d8a3SJacky Wang             "import dagger.multibindings.Multibinds;",
154*f585d8a3SJacky Wang             "import java.util.Map;",
155*f585d8a3SJacky Wang             "",
156*f585d8a3SJacky Wang             "@Module",
157*f585d8a3SJacky Wang             "public abstract class TestModule {",
158*f585d8a3SJacky Wang             "  @Multibinds abstract Map<Integer, Inaccessible> ints();",
159*f585d8a3SJacky Wang             "}");
160*f585d8a3SJacky Wang     Source componentFile =
161*f585d8a3SJacky Wang         CompilerTests.javaSource(
162*f585d8a3SJacky Wang             "test.TestComponent",
163*f585d8a3SJacky Wang             "package test;",
164*f585d8a3SJacky Wang             "",
165*f585d8a3SJacky Wang             "import dagger.Component;",
166*f585d8a3SJacky Wang             "import java.util.Map;",
167*f585d8a3SJacky Wang             "import javax.inject.Provider;",
168*f585d8a3SJacky Wang             "import other.TestModule;",
169*f585d8a3SJacky Wang             "import other.UsesInaccessible;",
170*f585d8a3SJacky Wang             "",
171*f585d8a3SJacky Wang             "@Component(modules = TestModule.class)",
172*f585d8a3SJacky Wang             "interface TestComponent {",
173*f585d8a3SJacky Wang             "  UsesInaccessible usesInaccessible();",
174*f585d8a3SJacky Wang             "}");
175*f585d8a3SJacky Wang 
176*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(module, inaccessible, usesInaccessible, componentFile)
177*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
178*f585d8a3SJacky Wang         .compile(
179*f585d8a3SJacky Wang             subject -> {
180*f585d8a3SJacky Wang               subject.hasErrorCount(0);
181*f585d8a3SJacky Wang               subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent"));
182*f585d8a3SJacky Wang             });
183*f585d8a3SJacky Wang   }
184*f585d8a3SJacky Wang 
185*f585d8a3SJacky Wang   @Test
subcomponentOmitsInheritedBindings()186*f585d8a3SJacky Wang   public void subcomponentOmitsInheritedBindings() throws Exception {
187*f585d8a3SJacky Wang     Source parent =
188*f585d8a3SJacky Wang         CompilerTests.javaSource(
189*f585d8a3SJacky Wang             "test.Parent",
190*f585d8a3SJacky Wang             "package test;",
191*f585d8a3SJacky Wang             "",
192*f585d8a3SJacky Wang             "import dagger.Component;",
193*f585d8a3SJacky Wang             "",
194*f585d8a3SJacky Wang             "@Component(modules = ParentModule.class)",
195*f585d8a3SJacky Wang             "interface Parent {",
196*f585d8a3SJacky Wang             "  Child child();",
197*f585d8a3SJacky Wang             "}");
198*f585d8a3SJacky Wang     Source parentModule =
199*f585d8a3SJacky Wang         CompilerTests.javaSource(
200*f585d8a3SJacky Wang             "test.ParentModule",
201*f585d8a3SJacky Wang             "package test;",
202*f585d8a3SJacky Wang             "",
203*f585d8a3SJacky Wang             "import dagger.Module;",
204*f585d8a3SJacky Wang             "import dagger.Provides;",
205*f585d8a3SJacky Wang             "import dagger.multibindings.IntoMap;",
206*f585d8a3SJacky Wang             "import dagger.multibindings.StringKey;",
207*f585d8a3SJacky Wang             "",
208*f585d8a3SJacky Wang             "@Module",
209*f585d8a3SJacky Wang             "class ParentModule {",
210*f585d8a3SJacky Wang             "  @Provides @IntoMap @StringKey(\"parent key\") Object parentKeyObject() {",
211*f585d8a3SJacky Wang             "    return \"parent value\";",
212*f585d8a3SJacky Wang             "  }",
213*f585d8a3SJacky Wang             "}");
214*f585d8a3SJacky Wang     Source child =
215*f585d8a3SJacky Wang         CompilerTests.javaSource(
216*f585d8a3SJacky Wang             "test.Child",
217*f585d8a3SJacky Wang             "package test;",
218*f585d8a3SJacky Wang             "",
219*f585d8a3SJacky Wang             "import dagger.Subcomponent;",
220*f585d8a3SJacky Wang             "import java.util.Map;",
221*f585d8a3SJacky Wang             "",
222*f585d8a3SJacky Wang             "@Subcomponent",
223*f585d8a3SJacky Wang             "interface Child {",
224*f585d8a3SJacky Wang             "  Map<String, Object> objectMap();",
225*f585d8a3SJacky Wang             "}");
226*f585d8a3SJacky Wang 
227*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(parent, parentModule, child)
228*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
229*f585d8a3SJacky Wang         .compile(
230*f585d8a3SJacky Wang             subject -> {
231*f585d8a3SJacky Wang               subject.hasErrorCount(0);
232*f585d8a3SJacky Wang               subject.generatedSource(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 mapModuleFile =
239*f585d8a3SJacky Wang         CompilerTests.javaSource(
240*f585d8a3SJacky Wang             "test.MapModule",
241*f585d8a3SJacky Wang             "package test;",
242*f585d8a3SJacky Wang             "",
243*f585d8a3SJacky Wang             "import dagger.Module;",
244*f585d8a3SJacky Wang             "import dagger.multibindings.Multibinds;",
245*f585d8a3SJacky Wang             "import java.util.Map;",
246*f585d8a3SJacky Wang             "",
247*f585d8a3SJacky Wang             "@Module",
248*f585d8a3SJacky Wang             "interface MapModule {",
249*f585d8a3SJacky Wang             "  @Multibinds Map<String, String> stringMap();",
250*f585d8a3SJacky Wang             "}");
251*f585d8a3SJacky Wang     Source componentFile =
252*f585d8a3SJacky Wang         CompilerTests.javaSource(
253*f585d8a3SJacky Wang             "test.TestComponent",
254*f585d8a3SJacky Wang             "package test;",
255*f585d8a3SJacky Wang             "",
256*f585d8a3SJacky Wang             "import com.google.common.util.concurrent.ListenableFuture;",
257*f585d8a3SJacky Wang             "import dagger.producers.ProductionComponent;",
258*f585d8a3SJacky Wang             "import java.util.Map;",
259*f585d8a3SJacky Wang             "",
260*f585d8a3SJacky Wang             "@ProductionComponent(modules = MapModule.class)",
261*f585d8a3SJacky Wang             "interface TestComponent {",
262*f585d8a3SJacky Wang             "  ListenableFuture<Map<String, String>> stringMap();",
263*f585d8a3SJacky Wang             "}");
264*f585d8a3SJacky Wang 
265*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(mapModuleFile, componentFile)
266*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
267*f585d8a3SJacky Wang         .compile(
268*f585d8a3SJacky Wang             subject -> {
269*f585d8a3SJacky Wang               subject.hasErrorCount(0);
270*f585d8a3SJacky Wang               subject.generatedSource(goldenFileRule.goldenSource("test/DaggerTestComponent"));
271*f585d8a3SJacky Wang             });
272*f585d8a3SJacky Wang   }
273*f585d8a3SJacky Wang }
274