xref: /aosp_15_r20/external/dagger2/javatests/dagger/internal/codegen/ConflictingEntryPointsTest.java (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
1*f585d8a3SJacky Wang /*
2*f585d8a3SJacky Wang  * Copyright (C) 2018 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 org.junit.Test;
23*f585d8a3SJacky Wang import org.junit.runner.RunWith;
24*f585d8a3SJacky Wang import org.junit.runners.Parameterized;
25*f585d8a3SJacky Wang import org.junit.runners.Parameterized.Parameters;
26*f585d8a3SJacky Wang 
27*f585d8a3SJacky Wang @RunWith(Parameterized.class)
28*f585d8a3SJacky Wang public class ConflictingEntryPointsTest {
29*f585d8a3SJacky Wang   @Parameters(name = "{0}")
parameters()30*f585d8a3SJacky Wang   public static ImmutableList<Object[]> parameters() {
31*f585d8a3SJacky Wang     return CompilerMode.TEST_PARAMETERS;
32*f585d8a3SJacky Wang   }
33*f585d8a3SJacky Wang 
34*f585d8a3SJacky Wang   private final CompilerMode compilerMode;
35*f585d8a3SJacky Wang 
ConflictingEntryPointsTest(CompilerMode compilerMode)36*f585d8a3SJacky Wang   public ConflictingEntryPointsTest(CompilerMode compilerMode) {
37*f585d8a3SJacky Wang     this.compilerMode = compilerMode;
38*f585d8a3SJacky Wang   }
39*f585d8a3SJacky Wang 
40*f585d8a3SJacky Wang   @Test
covariantType()41*f585d8a3SJacky Wang   public void covariantType() {
42*f585d8a3SJacky Wang     Source base1 =
43*f585d8a3SJacky Wang         CompilerTests.javaSource(
44*f585d8a3SJacky Wang             "test.Base1", //
45*f585d8a3SJacky Wang             "package test;",
46*f585d8a3SJacky Wang             "",
47*f585d8a3SJacky Wang             "interface Base1 {",
48*f585d8a3SJacky Wang             "  Long foo();",
49*f585d8a3SJacky Wang             "}");
50*f585d8a3SJacky Wang     Source base2 =
51*f585d8a3SJacky Wang         CompilerTests.javaSource(
52*f585d8a3SJacky Wang             "test.Base2", //
53*f585d8a3SJacky Wang             "package test;",
54*f585d8a3SJacky Wang             "",
55*f585d8a3SJacky Wang             "interface Base2 {",
56*f585d8a3SJacky Wang             "  Number foo();",
57*f585d8a3SJacky Wang             "}");
58*f585d8a3SJacky Wang     Source component =
59*f585d8a3SJacky Wang         CompilerTests.javaSource(
60*f585d8a3SJacky Wang             "test.TestComponent",
61*f585d8a3SJacky Wang             "package test;",
62*f585d8a3SJacky Wang             "",
63*f585d8a3SJacky Wang             "import dagger.BindsInstance;",
64*f585d8a3SJacky Wang             "import dagger.Component;",
65*f585d8a3SJacky Wang             "",
66*f585d8a3SJacky Wang             "@Component",
67*f585d8a3SJacky Wang             "interface TestComponent extends Base1, Base2 {",
68*f585d8a3SJacky Wang             "",
69*f585d8a3SJacky Wang             "  @Component.Builder",
70*f585d8a3SJacky Wang             "  interface Builder {",
71*f585d8a3SJacky Wang             "    @BindsInstance Builder foo(Long foo);",
72*f585d8a3SJacky Wang             "    @BindsInstance Builder foo(Number foo);",
73*f585d8a3SJacky Wang             "    TestComponent build();",
74*f585d8a3SJacky Wang             "  }",
75*f585d8a3SJacky Wang             "}");
76*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(base1, base2, component)
77*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
78*f585d8a3SJacky Wang         .compile(
79*f585d8a3SJacky Wang             subject -> {
80*f585d8a3SJacky Wang               subject.hasErrorCount(1);
81*f585d8a3SJacky Wang               subject.hasErrorContaining(
82*f585d8a3SJacky Wang                       String.join(
83*f585d8a3SJacky Wang                           "\n",
84*f585d8a3SJacky Wang                           "can only implement the method once. Found:",
85*f585d8a3SJacky Wang                           "    Long test.Base1.foo()",
86*f585d8a3SJacky Wang                           "    Number test.Base2.foo()"))
87*f585d8a3SJacky Wang                   .onSource(component)
88*f585d8a3SJacky Wang                   .onLineContaining("interface TestComponent");
89*f585d8a3SJacky Wang             });
90*f585d8a3SJacky Wang   }
91*f585d8a3SJacky Wang 
92*f585d8a3SJacky Wang   @Test
covariantTypeFromGenericSupertypes()93*f585d8a3SJacky Wang   public void covariantTypeFromGenericSupertypes() {
94*f585d8a3SJacky Wang     Source base1 =
95*f585d8a3SJacky Wang         CompilerTests.javaSource(
96*f585d8a3SJacky Wang             "test.Base1", //
97*f585d8a3SJacky Wang             "package test;",
98*f585d8a3SJacky Wang             "",
99*f585d8a3SJacky Wang             "interface Base1<T> {",
100*f585d8a3SJacky Wang             "  T foo();",
101*f585d8a3SJacky Wang             "}");
102*f585d8a3SJacky Wang     Source base2 =
103*f585d8a3SJacky Wang         CompilerTests.javaSource(
104*f585d8a3SJacky Wang             "test.Base2", //
105*f585d8a3SJacky Wang             "package test;",
106*f585d8a3SJacky Wang             "",
107*f585d8a3SJacky Wang             "interface Base2<T> {",
108*f585d8a3SJacky Wang             "  T foo();",
109*f585d8a3SJacky Wang             "}");
110*f585d8a3SJacky Wang     Source component =
111*f585d8a3SJacky Wang         CompilerTests.javaSource(
112*f585d8a3SJacky Wang             "test.TestComponent",
113*f585d8a3SJacky Wang             "package test;",
114*f585d8a3SJacky Wang             "",
115*f585d8a3SJacky Wang             "import dagger.BindsInstance;",
116*f585d8a3SJacky Wang             "import dagger.Component;",
117*f585d8a3SJacky Wang             "",
118*f585d8a3SJacky Wang             "@Component",
119*f585d8a3SJacky Wang             "interface TestComponent extends Base1<Long>, Base2<Number> {",
120*f585d8a3SJacky Wang             "",
121*f585d8a3SJacky Wang             "  @Component.Builder",
122*f585d8a3SJacky Wang             "  interface Builder {",
123*f585d8a3SJacky Wang             "    @BindsInstance Builder foo(Long foo);",
124*f585d8a3SJacky Wang             "    @BindsInstance Builder foo(Number foo);",
125*f585d8a3SJacky Wang             "    TestComponent build();",
126*f585d8a3SJacky Wang             "  }",
127*f585d8a3SJacky Wang             "}");
128*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(base1, base2, component)
129*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
130*f585d8a3SJacky Wang         .compile(
131*f585d8a3SJacky Wang             subject -> {
132*f585d8a3SJacky Wang               subject.hasErrorCount(1);
133*f585d8a3SJacky Wang               subject.hasErrorContaining(
134*f585d8a3SJacky Wang                       String.join(
135*f585d8a3SJacky Wang                           "\n",
136*f585d8a3SJacky Wang                           "can only implement the method once. Found:",
137*f585d8a3SJacky Wang                           "    Long test.Base1.foo()",
138*f585d8a3SJacky Wang                           "    Number test.Base2.foo()"))
139*f585d8a3SJacky Wang                   .onSource(component)
140*f585d8a3SJacky Wang                   .onLineContaining("interface TestComponent");
141*f585d8a3SJacky Wang             });
142*f585d8a3SJacky Wang   }
143*f585d8a3SJacky Wang 
144*f585d8a3SJacky Wang   @Test
differentQualifier()145*f585d8a3SJacky Wang   public void differentQualifier() {
146*f585d8a3SJacky Wang     Source base1 =
147*f585d8a3SJacky Wang         CompilerTests.javaSource(
148*f585d8a3SJacky Wang             "test.Base1", //
149*f585d8a3SJacky Wang             "package test;",
150*f585d8a3SJacky Wang             "",
151*f585d8a3SJacky Wang             "interface Base1 {",
152*f585d8a3SJacky Wang             "  Object foo();",
153*f585d8a3SJacky Wang             "}");
154*f585d8a3SJacky Wang     Source base2 =
155*f585d8a3SJacky Wang         CompilerTests.javaSource(
156*f585d8a3SJacky Wang             "test.Base2", //
157*f585d8a3SJacky Wang             "package test;",
158*f585d8a3SJacky Wang             "",
159*f585d8a3SJacky Wang             "import javax.inject.Named;",
160*f585d8a3SJacky Wang             "",
161*f585d8a3SJacky Wang             "interface Base2 {",
162*f585d8a3SJacky Wang             "  @Named(\"foo\") Object foo();",
163*f585d8a3SJacky Wang             "}");
164*f585d8a3SJacky Wang     Source component =
165*f585d8a3SJacky Wang         CompilerTests.javaSource(
166*f585d8a3SJacky Wang             "test.TestComponent",
167*f585d8a3SJacky Wang             "package test;",
168*f585d8a3SJacky Wang             "",
169*f585d8a3SJacky Wang             "import dagger.BindsInstance;",
170*f585d8a3SJacky Wang             "import dagger.Component;",
171*f585d8a3SJacky Wang             "import javax.inject.Named;",
172*f585d8a3SJacky Wang             "",
173*f585d8a3SJacky Wang             "@Component",
174*f585d8a3SJacky Wang             "interface TestComponent extends Base1, Base2 {",
175*f585d8a3SJacky Wang             "",
176*f585d8a3SJacky Wang             "  @Component.Builder",
177*f585d8a3SJacky Wang             "  interface Builder {",
178*f585d8a3SJacky Wang             "    @BindsInstance Builder foo(Object foo);",
179*f585d8a3SJacky Wang             "    @BindsInstance Builder namedFoo(@Named(\"foo\") Object foo);",
180*f585d8a3SJacky Wang             "    TestComponent build();",
181*f585d8a3SJacky Wang             "  }",
182*f585d8a3SJacky Wang             "}");
183*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(base1, base2, component)
184*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
185*f585d8a3SJacky Wang         .compile(
186*f585d8a3SJacky Wang             subject -> {
187*f585d8a3SJacky Wang               subject.hasErrorCount(1);
188*f585d8a3SJacky Wang               subject.hasErrorContaining(
189*f585d8a3SJacky Wang                       String.join(
190*f585d8a3SJacky Wang                           "\n",
191*f585d8a3SJacky Wang                           "can only implement the method once. Found:",
192*f585d8a3SJacky Wang                           "    Object test.Base1.foo()",
193*f585d8a3SJacky Wang                           "    @Named(\"foo\") Object test.Base2.foo()"))
194*f585d8a3SJacky Wang                   .onSource(component)
195*f585d8a3SJacky Wang                   .onLineContaining("interface TestComponent");
196*f585d8a3SJacky Wang             });
197*f585d8a3SJacky Wang   }
198*f585d8a3SJacky Wang 
199*f585d8a3SJacky Wang   @Test
sameKey()200*f585d8a3SJacky Wang   public void sameKey() {
201*f585d8a3SJacky Wang     Source base1 =
202*f585d8a3SJacky Wang         CompilerTests.javaSource(
203*f585d8a3SJacky Wang             "test.Base1", //
204*f585d8a3SJacky Wang             "package test;",
205*f585d8a3SJacky Wang             "",
206*f585d8a3SJacky Wang             "interface Base1 {",
207*f585d8a3SJacky Wang             "  Object foo();",
208*f585d8a3SJacky Wang             "}");
209*f585d8a3SJacky Wang     Source base2 =
210*f585d8a3SJacky Wang         CompilerTests.javaSource(
211*f585d8a3SJacky Wang             "test.Base2", //
212*f585d8a3SJacky Wang             "package test;",
213*f585d8a3SJacky Wang             "",
214*f585d8a3SJacky Wang             "interface Base2 {",
215*f585d8a3SJacky Wang             "  Object foo();",
216*f585d8a3SJacky Wang             "}");
217*f585d8a3SJacky Wang     Source component =
218*f585d8a3SJacky Wang         CompilerTests.javaSource(
219*f585d8a3SJacky Wang             "test.TestComponent",
220*f585d8a3SJacky Wang             "package test;",
221*f585d8a3SJacky Wang             "",
222*f585d8a3SJacky Wang             "import dagger.BindsInstance;",
223*f585d8a3SJacky Wang             "import dagger.Component;",
224*f585d8a3SJacky Wang             "",
225*f585d8a3SJacky Wang             "@Component",
226*f585d8a3SJacky Wang             "interface TestComponent extends Base1, Base2 {",
227*f585d8a3SJacky Wang             "",
228*f585d8a3SJacky Wang             "  @Component.Builder",
229*f585d8a3SJacky Wang             "  interface Builder {",
230*f585d8a3SJacky Wang             "    @BindsInstance Builder foo(Object foo);",
231*f585d8a3SJacky Wang             "    TestComponent build();",
232*f585d8a3SJacky Wang             "  }",
233*f585d8a3SJacky Wang             "}");
234*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(base1, base2, component)
235*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
236*f585d8a3SJacky Wang         .compile(subject -> subject.hasErrorCount(0));
237*f585d8a3SJacky Wang   }
238*f585d8a3SJacky Wang 
239*f585d8a3SJacky Wang   @Test
sameQualifiedKey()240*f585d8a3SJacky Wang   public void sameQualifiedKey() {
241*f585d8a3SJacky Wang     Source base1 =
242*f585d8a3SJacky Wang         CompilerTests.javaSource(
243*f585d8a3SJacky Wang             "test.Base1", //
244*f585d8a3SJacky Wang             "package test;",
245*f585d8a3SJacky Wang             "",
246*f585d8a3SJacky Wang             "import javax.inject.Named;",
247*f585d8a3SJacky Wang             "",
248*f585d8a3SJacky Wang             "interface Base1 {",
249*f585d8a3SJacky Wang             "  @Named(\"foo\") Object foo();",
250*f585d8a3SJacky Wang             "}");
251*f585d8a3SJacky Wang     Source base2 =
252*f585d8a3SJacky Wang         CompilerTests.javaSource(
253*f585d8a3SJacky Wang             "test.Base2", //
254*f585d8a3SJacky Wang             "package test;",
255*f585d8a3SJacky Wang             "",
256*f585d8a3SJacky Wang             "import javax.inject.Named;",
257*f585d8a3SJacky Wang             "",
258*f585d8a3SJacky Wang             "interface Base2 {",
259*f585d8a3SJacky Wang             "  @Named(\"foo\") Object foo();",
260*f585d8a3SJacky Wang             "}");
261*f585d8a3SJacky Wang     Source component =
262*f585d8a3SJacky Wang         CompilerTests.javaSource(
263*f585d8a3SJacky Wang             "test.TestComponent",
264*f585d8a3SJacky Wang             "package test;",
265*f585d8a3SJacky Wang             "",
266*f585d8a3SJacky Wang             "import dagger.BindsInstance;",
267*f585d8a3SJacky Wang             "import dagger.Component;",
268*f585d8a3SJacky Wang             "import javax.inject.Named;",
269*f585d8a3SJacky Wang             "",
270*f585d8a3SJacky Wang             "@Component",
271*f585d8a3SJacky Wang             "interface TestComponent extends Base1, Base2 {",
272*f585d8a3SJacky Wang             "",
273*f585d8a3SJacky Wang             "  @Component.Builder",
274*f585d8a3SJacky Wang             "  interface Builder {",
275*f585d8a3SJacky Wang             "    @BindsInstance Builder foo(@Named(\"foo\") Object foo);",
276*f585d8a3SJacky Wang             "    TestComponent build();",
277*f585d8a3SJacky Wang             "  }",
278*f585d8a3SJacky Wang             "}");
279*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(base1, base2, component)
280*f585d8a3SJacky Wang         .withProcessingOptions(compilerMode.processorOptions())
281*f585d8a3SJacky Wang         .compile(subject -> subject.hasErrorCount(0));
282*f585d8a3SJacky Wang   }
283*f585d8a3SJacky Wang }
284