xref: /aosp_15_r20/external/dagger2/javatests/dagger/internal/codegen/MapRequestRepresentationTest.java (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
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 static com.google.testing.compile.CompilationSubject.assertThat;
20*f585d8a3SJacky Wang import static dagger.internal.codegen.Compilers.CLASS_PATH_WITHOUT_GUAVA_OPTION;
21*f585d8a3SJacky Wang import static dagger.internal.codegen.Compilers.compilerWithOptions;
22*f585d8a3SJacky Wang 
23*f585d8a3SJacky Wang import com.google.testing.compile.Compilation;
24*f585d8a3SJacky Wang import com.google.testing.compile.Compiler;
25*f585d8a3SJacky Wang import com.google.testing.compile.JavaFileObjects;
26*f585d8a3SJacky Wang import dagger.testing.golden.GoldenFileRule;
27*f585d8a3SJacky Wang import java.util.Collection;
28*f585d8a3SJacky Wang import javax.tools.JavaFileObject;
29*f585d8a3SJacky Wang import org.junit.Rule;
30*f585d8a3SJacky Wang import org.junit.Test;
31*f585d8a3SJacky Wang import org.junit.runner.RunWith;
32*f585d8a3SJacky Wang import org.junit.runners.Parameterized;
33*f585d8a3SJacky Wang import org.junit.runners.Parameterized.Parameters;
34*f585d8a3SJacky Wang 
35*f585d8a3SJacky Wang @RunWith(Parameterized.class)
36*f585d8a3SJacky Wang public class MapRequestRepresentationTest {
37*f585d8a3SJacky Wang   @Parameters(name = "{0}")
parameters()38*f585d8a3SJacky Wang   public static Collection<Object[]> parameters() {
39*f585d8a3SJacky Wang     return CompilerMode.TEST_PARAMETERS;
40*f585d8a3SJacky Wang   }
41*f585d8a3SJacky Wang 
42*f585d8a3SJacky Wang   @Rule public GoldenFileRule goldenFileRule = new GoldenFileRule();
43*f585d8a3SJacky Wang 
44*f585d8a3SJacky Wang   private final CompilerMode compilerMode;
45*f585d8a3SJacky Wang 
MapRequestRepresentationTest(CompilerMode compilerMode)46*f585d8a3SJacky Wang   public MapRequestRepresentationTest(CompilerMode compilerMode) {
47*f585d8a3SJacky Wang     this.compilerMode = compilerMode;
48*f585d8a3SJacky Wang   }
49*f585d8a3SJacky Wang 
50*f585d8a3SJacky Wang   @Test
mapBindings()51*f585d8a3SJacky Wang   public void mapBindings() throws Exception {
52*f585d8a3SJacky Wang     JavaFileObject mapModuleFile = JavaFileObjects.forSourceLines("test.MapModule",
53*f585d8a3SJacky Wang         "package test;",
54*f585d8a3SJacky Wang         "",
55*f585d8a3SJacky Wang         "import dagger.Module;",
56*f585d8a3SJacky Wang         "import dagger.Provides;",
57*f585d8a3SJacky Wang         "import dagger.multibindings.IntKey;",
58*f585d8a3SJacky Wang         "import dagger.multibindings.IntoMap;",
59*f585d8a3SJacky Wang         "import dagger.multibindings.LongKey;",
60*f585d8a3SJacky Wang         "import dagger.multibindings.Multibinds;",
61*f585d8a3SJacky Wang         "import java.util.Map;",
62*f585d8a3SJacky Wang         "",
63*f585d8a3SJacky Wang         "@Module",
64*f585d8a3SJacky Wang         "interface MapModule {",
65*f585d8a3SJacky Wang         "  @Multibinds Map<String, String> stringMap();",
66*f585d8a3SJacky Wang         "  @Provides @IntoMap @IntKey(0) static int provideInt() { return 0; }",
67*f585d8a3SJacky Wang         "  @Provides @IntoMap @LongKey(0) static long provideLong0() { return 0; }",
68*f585d8a3SJacky Wang         "  @Provides @IntoMap @LongKey(1) static long provideLong1() { return 1; }",
69*f585d8a3SJacky Wang         "  @Provides @IntoMap @LongKey(2) static long provideLong2() { return 2; }",
70*f585d8a3SJacky Wang         "}");
71*f585d8a3SJacky Wang     JavaFileObject componentFile = JavaFileObjects.forSourceLines("test.TestComponent",
72*f585d8a3SJacky Wang         "package test;",
73*f585d8a3SJacky Wang         "",
74*f585d8a3SJacky Wang         "import dagger.Component;",
75*f585d8a3SJacky Wang         "import java.util.Map;",
76*f585d8a3SJacky Wang         "import javax.inject.Provider;",
77*f585d8a3SJacky Wang         "",
78*f585d8a3SJacky Wang         "@Component(modules = MapModule.class)",
79*f585d8a3SJacky Wang         "interface TestComponent {",
80*f585d8a3SJacky Wang         "  Map<String, String> strings();",
81*f585d8a3SJacky Wang         "  Map<String, Provider<String>> providerStrings();",
82*f585d8a3SJacky Wang         "",
83*f585d8a3SJacky Wang         "  Map<Integer, Integer> ints();",
84*f585d8a3SJacky Wang         "  Map<Integer, Provider<Integer>> providerInts();",
85*f585d8a3SJacky Wang         "  Map<Long, Long> longs();",
86*f585d8a3SJacky Wang         "  Map<Long, Provider<Long>> providerLongs();",
87*f585d8a3SJacky Wang         "}");
88*f585d8a3SJacky Wang 
89*f585d8a3SJacky Wang     Compilation compilation = daggerCompilerWithoutGuava().compile(mapModuleFile, componentFile);
90*f585d8a3SJacky Wang     assertThat(compilation).succeeded();
91*f585d8a3SJacky Wang     assertThat(compilation)
92*f585d8a3SJacky Wang         .generatedSourceFile("test.DaggerTestComponent")
93*f585d8a3SJacky Wang         .hasSourceEquivalentTo(goldenFileRule.goldenFile("test.DaggerTestComponent"));
94*f585d8a3SJacky Wang   }
95*f585d8a3SJacky Wang 
96*f585d8a3SJacky Wang   @Test
inaccessible()97*f585d8a3SJacky Wang   public void inaccessible() throws Exception {
98*f585d8a3SJacky Wang     JavaFileObject inaccessible =
99*f585d8a3SJacky Wang         JavaFileObjects.forSourceLines(
100*f585d8a3SJacky Wang             "other.Inaccessible",
101*f585d8a3SJacky Wang             "package other;",
102*f585d8a3SJacky Wang             "",
103*f585d8a3SJacky Wang             "class Inaccessible {}");
104*f585d8a3SJacky Wang     JavaFileObject usesInaccessible =
105*f585d8a3SJacky Wang         JavaFileObjects.forSourceLines(
106*f585d8a3SJacky Wang             "other.UsesInaccessible",
107*f585d8a3SJacky Wang             "package other;",
108*f585d8a3SJacky Wang             "",
109*f585d8a3SJacky Wang             "import java.util.Map;",
110*f585d8a3SJacky Wang             "import javax.inject.Inject;",
111*f585d8a3SJacky Wang             "",
112*f585d8a3SJacky Wang             "public class UsesInaccessible {",
113*f585d8a3SJacky Wang             "  @Inject UsesInaccessible(Map<Integer, Inaccessible> map) {}",
114*f585d8a3SJacky Wang             "}");
115*f585d8a3SJacky Wang 
116*f585d8a3SJacky Wang     JavaFileObject module =
117*f585d8a3SJacky Wang         JavaFileObjects.forSourceLines(
118*f585d8a3SJacky Wang             "other.TestModule",
119*f585d8a3SJacky Wang             "package other;",
120*f585d8a3SJacky Wang             "",
121*f585d8a3SJacky Wang             "import dagger.Module;",
122*f585d8a3SJacky Wang             "import dagger.multibindings.Multibinds;",
123*f585d8a3SJacky Wang             "import java.util.Map;",
124*f585d8a3SJacky Wang             "",
125*f585d8a3SJacky Wang             "@Module",
126*f585d8a3SJacky Wang             "public abstract class TestModule {",
127*f585d8a3SJacky Wang             "  @Multibinds abstract Map<Integer, Inaccessible> ints();",
128*f585d8a3SJacky Wang             "}");
129*f585d8a3SJacky Wang     JavaFileObject componentFile =
130*f585d8a3SJacky Wang         JavaFileObjects.forSourceLines(
131*f585d8a3SJacky Wang             "test.TestComponent",
132*f585d8a3SJacky Wang             "package test;",
133*f585d8a3SJacky Wang             "",
134*f585d8a3SJacky Wang             "import dagger.Component;",
135*f585d8a3SJacky Wang             "import java.util.Map;",
136*f585d8a3SJacky Wang             "import javax.inject.Provider;",
137*f585d8a3SJacky Wang             "import other.TestModule;",
138*f585d8a3SJacky Wang             "import other.UsesInaccessible;",
139*f585d8a3SJacky Wang             "",
140*f585d8a3SJacky Wang             "@Component(modules = TestModule.class)",
141*f585d8a3SJacky Wang             "interface TestComponent {",
142*f585d8a3SJacky Wang             "  UsesInaccessible usesInaccessible();",
143*f585d8a3SJacky Wang             "}");
144*f585d8a3SJacky Wang 
145*f585d8a3SJacky Wang     Compilation compilation =
146*f585d8a3SJacky Wang         daggerCompilerWithoutGuava().compile(module, inaccessible, usesInaccessible, componentFile);
147*f585d8a3SJacky Wang     assertThat(compilation).succeeded();
148*f585d8a3SJacky Wang     assertThat(compilation)
149*f585d8a3SJacky Wang         .generatedSourceFile("test.DaggerTestComponent")
150*f585d8a3SJacky Wang         .hasSourceEquivalentTo(goldenFileRule.goldenFile("test.DaggerTestComponent"));
151*f585d8a3SJacky Wang   }
152*f585d8a3SJacky Wang 
153*f585d8a3SJacky Wang   @Test
subcomponentOmitsInheritedBindings()154*f585d8a3SJacky Wang   public void subcomponentOmitsInheritedBindings() throws Exception {
155*f585d8a3SJacky Wang     JavaFileObject parent =
156*f585d8a3SJacky Wang         JavaFileObjects.forSourceLines(
157*f585d8a3SJacky Wang             "test.Parent",
158*f585d8a3SJacky Wang             "package test;",
159*f585d8a3SJacky Wang             "",
160*f585d8a3SJacky Wang             "import dagger.Component;",
161*f585d8a3SJacky Wang             "",
162*f585d8a3SJacky Wang             "@Component(modules = ParentModule.class)",
163*f585d8a3SJacky Wang             "interface Parent {",
164*f585d8a3SJacky Wang             "  Child child();",
165*f585d8a3SJacky Wang             "}");
166*f585d8a3SJacky Wang     JavaFileObject parentModule =
167*f585d8a3SJacky Wang         JavaFileObjects.forSourceLines(
168*f585d8a3SJacky Wang             "test.ParentModule",
169*f585d8a3SJacky Wang             "package test;",
170*f585d8a3SJacky Wang             "",
171*f585d8a3SJacky Wang             "import dagger.Module;",
172*f585d8a3SJacky Wang             "import dagger.Provides;",
173*f585d8a3SJacky Wang             "import dagger.multibindings.IntoMap;",
174*f585d8a3SJacky Wang             "import dagger.multibindings.StringKey;",
175*f585d8a3SJacky Wang             "",
176*f585d8a3SJacky Wang             "@Module",
177*f585d8a3SJacky Wang             "class ParentModule {",
178*f585d8a3SJacky Wang             "  @Provides @IntoMap @StringKey(\"parent key\") Object parentKeyObject() {",
179*f585d8a3SJacky Wang             "    return \"parent value\";",
180*f585d8a3SJacky Wang             "  }",
181*f585d8a3SJacky Wang             "}");
182*f585d8a3SJacky Wang     JavaFileObject child =
183*f585d8a3SJacky Wang         JavaFileObjects.forSourceLines(
184*f585d8a3SJacky Wang             "test.Child",
185*f585d8a3SJacky Wang             "package test;",
186*f585d8a3SJacky Wang             "",
187*f585d8a3SJacky Wang             "import dagger.Subcomponent;",
188*f585d8a3SJacky Wang             "import java.util.Map;",
189*f585d8a3SJacky Wang             "import java.util.Map;",
190*f585d8a3SJacky Wang             "",
191*f585d8a3SJacky Wang             "@Subcomponent",
192*f585d8a3SJacky Wang             "interface Child {",
193*f585d8a3SJacky Wang             "  Map<String, Object> objectMap();",
194*f585d8a3SJacky Wang             "}");
195*f585d8a3SJacky Wang 
196*f585d8a3SJacky Wang     Compilation compilation = daggerCompilerWithoutGuava().compile(parent, parentModule, child);
197*f585d8a3SJacky Wang     assertThat(compilation).succeeded();
198*f585d8a3SJacky Wang     assertThat(compilation)
199*f585d8a3SJacky Wang         .generatedSourceFile("test.DaggerParent")
200*f585d8a3SJacky Wang         .hasSourceEquivalentTo(goldenFileRule.goldenFile("test.DaggerParent"));
201*f585d8a3SJacky Wang   }
202*f585d8a3SJacky Wang 
daggerCompilerWithoutGuava()203*f585d8a3SJacky Wang   private Compiler daggerCompilerWithoutGuava() {
204*f585d8a3SJacky Wang     return compilerWithOptions(compilerMode.javacopts())
205*f585d8a3SJacky Wang         .withClasspath(CLASS_PATH_WITHOUT_GUAVA_OPTION);
206*f585d8a3SJacky Wang   }
207*f585d8a3SJacky Wang }
208