• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 The Dagger Authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package dagger.hilt.android.processor.internal.customtestapplication;
18 
19 import static com.google.testing.compile.CompilationSubject.assertThat;
20 import static dagger.hilt.android.testing.compile.HiltCompilerTests.compiler;
21 
22 import com.google.testing.compile.Compilation;
23 import com.google.testing.compile.JavaFileObjects;
24 import org.junit.Test;
25 import org.junit.runner.RunWith;
26 import org.junit.runners.JUnit4;
27 
28 @RunWith(JUnit4.class)
29 public class CustomTestApplicationProcessorTest {
30 
31   @Test
validBaseClass_succeeds()32   public void validBaseClass_succeeds() {
33     Compilation compilation =
34         compiler().compile(
35             JavaFileObjects.forSourceLines(
36                 "test.HiltTest",
37                 "package test;",
38                 "",
39                 "import android.app.Application;",
40                 "import dagger.hilt.android.testing.CustomTestApplication;",
41                 "import dagger.hilt.android.testing.HiltAndroidTest;",
42                 "",
43                 "@CustomTestApplication(Application.class)",
44                 "@HiltAndroidTest",
45                 "public class HiltTest {}"));
46 
47     assertThat(compilation).succeeded();
48   }
49 
50   @Test
incorrectBaseType_fails()51   public void incorrectBaseType_fails() {
52     Compilation compilation =
53         compiler().compile(
54             JavaFileObjects.forSourceLines(
55                 "test.Foo",
56                 "package test;",
57                 "",
58                 "public class Foo {}"),
59             JavaFileObjects.forSourceLines(
60                 "test.HiltTest",
61                 "package test;",
62                 "",
63                 "import dagger.hilt.android.testing.CustomTestApplication;",
64                 "",
65                 "@CustomTestApplication(Foo.class)",
66                 "public class HiltTest {}"));
67 
68     assertThat(compilation).failed();
69     assertThat(compilation)
70         .hadErrorContaining(
71             "@CustomTestApplication value should be an instance of android.app.Application. "
72                 + "Found: test.Foo");
73   }
74 
75   @Test
baseWithHiltAndroidApp_fails()76   public void baseWithHiltAndroidApp_fails() {
77     Compilation compilation =
78         compiler().compile(
79             JavaFileObjects.forSourceLines(
80                 "test.BaseApplication",
81                 "package test;",
82                 "",
83                 "import android.app.Application;",
84                 "import dagger.hilt.android.HiltAndroidApp;",
85                 "",
86                 "@HiltAndroidApp(Application.class)",
87                 "public class BaseApplication extends Hilt_BaseApplication {}"),
88             JavaFileObjects.forSourceLines(
89                 "test.HiltTest",
90                 "package test;",
91                 "",
92                 "import dagger.hilt.android.testing.CustomTestApplication;",
93                 "",
94                 "@CustomTestApplication(BaseApplication.class)",
95                 "public class HiltTest {}"));
96 
97     assertThat(compilation).failed();
98     assertThat(compilation)
99         .hadErrorContaining(
100             "@CustomTestApplication value cannot be annotated with @HiltAndroidApp. "
101                 + "Found: test.BaseApplication");
102   }
103 
104   @Test
superclassWithHiltAndroidApp_fails()105   public void superclassWithHiltAndroidApp_fails() {
106     Compilation compilation =
107         compiler().compile(
108             JavaFileObjects.forSourceLines(
109                 "test.BaseApplication",
110                 "package test;",
111                 "",
112                 "import android.app.Application;",
113                 "import dagger.hilt.android.HiltAndroidApp;",
114                 "",
115                 "@HiltAndroidApp(Application.class)",
116                 "public class BaseApplication extends Hilt_BaseApplication {}"),
117             JavaFileObjects.forSourceLines(
118                 "test.ParentApplication",
119                 "package test;",
120                 "",
121                 "public class ParentApplication extends BaseApplication {}"),
122             JavaFileObjects.forSourceLines(
123                 "test.HiltTest",
124                 "package test;",
125                 "",
126                 "import dagger.hilt.android.testing.CustomTestApplication;",
127                 "",
128                 "@CustomTestApplication(ParentApplication.class)",
129                 "public class HiltTest {}"));
130 
131     assertThat(compilation).failed();
132     assertThat(compilation)
133         .hadErrorContaining(
134             "@CustomTestApplication value cannot be annotated with @HiltAndroidApp. "
135                 + "Found: test.BaseApplication");
136   }
137 
138   @Test
withInjectField_fails()139   public void withInjectField_fails() {
140     Compilation compilation =
141         compiler().compile(
142             JavaFileObjects.forSourceLines(
143                 "test.BaseApplication",
144                 "package test;",
145                 "",
146                 "import android.app.Application;",
147                 "import javax.inject.Inject;",
148                 "",
149                 "public class BaseApplication extends Application {",
150                 "  @Inject String str;",
151                 "}"),
152             JavaFileObjects.forSourceLines(
153                 "test.HiltTest",
154                 "package test;",
155                 "",
156                 "import dagger.hilt.android.testing.CustomTestApplication;",
157                 "",
158                 "@CustomTestApplication(BaseApplication.class)",
159                 "public class HiltTest {}"));
160 
161     assertThat(compilation).failed();
162     assertThat(compilation)
163         .hadErrorContaining(
164             "@CustomTestApplication does not support application classes (or super classes) with "
165                 + "@Inject fields. Found test.BaseApplication with @Inject fields [str]");
166   }
167 
168   @Test
withSuperclassInjectField_fails()169   public void withSuperclassInjectField_fails() {
170     Compilation compilation =
171         compiler().compile(
172             JavaFileObjects.forSourceLines(
173                 "test.BaseApplication",
174                 "package test;",
175                 "",
176                 "import android.app.Application;",
177                 "import javax.inject.Inject;",
178                 "",
179                 "public class BaseApplication extends Application {",
180                 "  @Inject String str;",
181                 "}"),
182             JavaFileObjects.forSourceLines(
183                 "test.ParentApplication",
184                 "package test;",
185                 "",
186                 "public class ParentApplication extends BaseApplication {}"),
187             JavaFileObjects.forSourceLines(
188                 "test.HiltTest",
189                 "package test;",
190                 "",
191                 "import dagger.hilt.android.testing.CustomTestApplication;",
192                 "",
193                 "@CustomTestApplication(ParentApplication.class)",
194                 "public class HiltTest {}"));
195 
196     assertThat(compilation).failed();
197     assertThat(compilation)
198         .hadErrorContaining(
199             "@CustomTestApplication does not support application classes (or super classes) with "
200                 + "@Inject fields. Found test.BaseApplication with @Inject fields [str]");
201   }
202 
203   @Test
withInjectMethod_fails()204   public void withInjectMethod_fails() {
205     Compilation compilation =
206         compiler().compile(
207             JavaFileObjects.forSourceLines(
208                 "test.BaseApplication",
209                 "package test;",
210                 "",
211                 "import android.app.Application;",
212                 "import javax.inject.Inject;",
213                 "",
214                 "public class BaseApplication extends Application {",
215                 "  @Inject String str() { return null; }",
216                 "}"),
217             JavaFileObjects.forSourceLines(
218                 "test.HiltTest",
219                 "package test;",
220                 "",
221                 "import dagger.hilt.android.testing.CustomTestApplication;",
222                 "",
223                 "@CustomTestApplication(BaseApplication.class)",
224                 "public class HiltTest {}"));
225 
226     assertThat(compilation).failed();
227     assertThat(compilation)
228         .hadErrorContaining(
229             "@CustomTestApplication does not support application classes (or super classes) with "
230                 + "@Inject methods. Found test.BaseApplication with @Inject methods [str()]");
231   }
232 
233   @Test
withSuperclassInjectMethod_fails()234   public void withSuperclassInjectMethod_fails() {
235     Compilation compilation =
236         compiler().compile(
237             JavaFileObjects.forSourceLines(
238                 "test.BaseApplication",
239                 "package test;",
240                 "",
241                 "import android.app.Application;",
242                 "import javax.inject.Inject;",
243                 "",
244                 "public class BaseApplication extends Application {",
245                 "  @Inject String str() { return null; }",
246                 "}"),
247             JavaFileObjects.forSourceLines(
248                 "test.ParentApplication",
249                 "package test;",
250                 "",
251                 "public class ParentApplication extends BaseApplication {}"),
252             JavaFileObjects.forSourceLines(
253                 "test.HiltTest",
254                 "package test;",
255                 "",
256                 "import dagger.hilt.android.testing.CustomTestApplication;",
257                 "",
258                 "@CustomTestApplication(ParentApplication.class)",
259                 "public class HiltTest {}"));
260 
261     assertThat(compilation).failed();
262     assertThat(compilation)
263         .hadErrorContaining(
264             "@CustomTestApplication does not support application classes (or super classes) with "
265                 + "@Inject methods. Found test.BaseApplication with @Inject methods [str()]");
266   }
267 
268   @Test
withInjectConstructor_fails()269   public void withInjectConstructor_fails() {
270     Compilation compilation =
271         compiler().compile(
272             JavaFileObjects.forSourceLines(
273                 "test.BaseApplication",
274                 "package test;",
275                 "",
276                 "import android.app.Application;",
277                 "import javax.inject.Inject;",
278                 "",
279                 "public class BaseApplication extends Application {",
280                 "  @Inject BaseApplication() {}",
281                 "}"),
282             JavaFileObjects.forSourceLines(
283                 "test.HiltTest",
284                 "package test;",
285                 "",
286                 "import dagger.hilt.android.testing.CustomTestApplication;",
287                 "",
288                 "@CustomTestApplication(BaseApplication.class)",
289                 "public class HiltTest {}"));
290 
291     assertThat(compilation).failed();
292     assertThat(compilation)
293         .hadErrorContaining(
294             "@CustomTestApplication does not support application classes (or super classes) with "
295                 + "@Inject constructors. Found test.BaseApplication with @Inject constructors "
296                 + "[BaseApplication()]");
297   }
298 
299   @Test
withSuperclassInjectConstructor_fails()300   public void withSuperclassInjectConstructor_fails() {
301     Compilation compilation =
302         compiler().compile(
303             JavaFileObjects.forSourceLines(
304                 "test.BaseApplication",
305                 "package test;",
306                 "",
307                 "import android.app.Application;",
308                 "import javax.inject.Inject;",
309                 "",
310                 "public class BaseApplication extends Application {",
311                 "  @Inject BaseApplication() {}",
312                 "}"),
313             JavaFileObjects.forSourceLines(
314                 "test.ParentApplication",
315                 "package test;",
316                 "",
317                 "public class ParentApplication extends BaseApplication {}"),
318             JavaFileObjects.forSourceLines(
319                 "test.HiltTest",
320                 "package test;",
321                 "",
322                 "import dagger.hilt.android.testing.CustomTestApplication;",
323                 "",
324                 "@CustomTestApplication(ParentApplication.class)",
325                 "public class HiltTest {}"));
326 
327     assertThat(compilation).failed();
328     assertThat(compilation)
329         .hadErrorContaining(
330             "@CustomTestApplication does not support application classes (or super classes) with "
331                 + "@Inject constructors. Found test.BaseApplication with @Inject constructors "
332                 + "[BaseApplication()]");
333   }
334 }
335