• 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;
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 javax.tools.JavaFileObject;
25 import org.junit.Test;
26 import org.junit.runner.RunWith;
27 import org.junit.runners.JUnit4;
28 
29 @RunWith(JUnit4.class)
30 public final class GeneratorsTest {
31 
32   @Test
copyConstructorParametersCopiesExternalNullables()33   public void copyConstructorParametersCopiesExternalNullables() {
34     JavaFileObject baseActivity =
35         JavaFileObjects.forSourceLines(
36             "test.BaseActivity",
37             "package test;",
38             "",
39             "import androidx.fragment.app.FragmentActivity;",
40             "",
41             "public abstract class BaseActivity extends FragmentActivity {",
42             "  protected BaseActivity(",
43             "      @androidx.annotation.Nullable String supportNullable,",
44             "      @androidx.annotation.Nullable String androidxNullable,",
45             "      @javax.annotation.Nullable String javaxNullable) { }",
46             "}");
47     JavaFileObject myActivity =
48         JavaFileObjects.forSourceLines(
49             "test.MyActivity",
50             "package test;",
51             "",
52             "import dagger.hilt.android.AndroidEntryPoint;",
53             "",
54             "@AndroidEntryPoint(BaseActivity.class)",
55             "public class MyActivity extends Hilt_MyActivity {",
56             "  public MyActivity(",
57             "      String supportNullable,",
58             "      String androidxNullable,",
59             "      String javaxNullable) {",
60             "    super(supportNullable, androidxNullable, javaxNullable);",
61             "  }",
62             "}");
63     Compilation compilation = compiler().compile(baseActivity, myActivity);
64     assertThat(compilation).succeeded();
65     assertThat(compilation)
66         .generatedSourceFile("test/Hilt_MyActivity")
67         .containsElementsIn(
68             JavaFileObjects.forSourceLines(
69                 "test.Hilt_MyActivity",
70                 "package test;",
71                 "",
72                 "import androidx.annotation.Nullable;",
73                 "",
74                 "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.ActivityGenerator\")",
75                 "abstract class Hilt_MyActivity extends BaseActivity implements",
76                 "    GeneratedComponentManagerHolder {",
77                 "  Hilt_MyActivity(",
78                 "      @Nullable String supportNullable,",
79                 "      @Nullable String androidxNullable,",
80                 "      @javax.annotation.Nullable String javaxNullable) {",
81                 "    super(supportNullable, androidxNullable, javaxNullable);",
82                 "    _initHiltInternal();",
83                 "  }",
84                 "}"));
85   }
86 
87   @Test
copyConstructorParametersConvertsAndroidInternalNullableToExternal()88   public void copyConstructorParametersConvertsAndroidInternalNullableToExternal() {
89     // Relies on View(Context, AttributeSet), which has android-internal
90     // @android.annotation.Nullable on AttributeSet.
91     JavaFileObject myView =
92         JavaFileObjects.forSourceLines(
93             "test.MyView",
94             "package test;",
95             "",
96             "import android.content.Context;",
97             "import android.util.AttributeSet;",
98             "import android.view.View;",
99             "import dagger.hilt.android.AndroidEntryPoint;",
100             "",
101             "@AndroidEntryPoint(View.class)",
102             "public class MyView extends Hilt_MyView {",
103             "  public MyView(Context context, AttributeSet attrs) {",
104             "    super(context, attrs);",
105             "  }",
106             "}");
107     Compilation compilation = compiler().compile(myView);
108     assertThat(compilation).succeeded();
109     assertThat(compilation)
110         .generatedSourceFile("test/Hilt_MyView")
111         .containsElementsIn(
112             JavaFileObjects.forSourceLines(
113                 "test.Hilt_MyView",
114                 "package test;",
115                 "",
116                 "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.ViewGenerator\")",
117                 "abstract class Hilt_MyView extends View implements",
118                 "GeneratedComponentManagerHolder {",
119                 // The generated parameter names are copied from the base class. Since we only have
120                 // the jar and not the source for these base classes the parameter names are missing
121                 "  Hilt_MyView(Context arg0, @Nullable AttributeSet arg1) {",
122                 "    super(arg0, arg1);",
123                 "    inject();",
124                 "  }",
125                 "}"));
126   }
127 
128   @Test
copyTargetApiAnnotationActivity()129   public void copyTargetApiAnnotationActivity() {
130     JavaFileObject myActivity =
131         JavaFileObjects.forSourceLines(
132             "test.MyActivity",
133             "package test;",
134             "",
135             "import android.annotation.TargetApi;",
136             "import androidx.fragment.app.FragmentActivity;",
137             "import dagger.hilt.android.AndroidEntryPoint;",
138             "",
139             "@TargetApi(24)",
140             "@AndroidEntryPoint(FragmentActivity.class)",
141             "public class MyActivity extends Hilt_MyActivity {}");
142     Compilation compilation = compiler().compile(myActivity);
143     assertThat(compilation).succeeded();
144     assertThat(compilation)
145         .generatedSourceFile("test/Hilt_MyActivity")
146         .containsElementsIn(
147             JavaFileObjects.forSourceLines(
148                 "test.Hilt_MyActivity",
149                 " package test;",
150                 "",
151                 "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.ActivityGenerator\")",
152                 "@TargetApi(24)",
153                 "abstract class Hilt_MyActivity extends FragmentActivity ",
154                 "implements GeneratedComponentManagerHolder {",
155                 "}"));
156   }
157 
158   @Test
copyTargetApiAnnotationOverView()159   public void copyTargetApiAnnotationOverView() {
160     JavaFileObject myView =
161         JavaFileObjects.forSourceLines(
162             "test.MyView",
163             "package test;",
164             "",
165             "import android.annotation.TargetApi;",
166             "import android.widget.LinearLayout;",
167             "import android.content.Context;",
168             "import android.util.AttributeSet;",
169             "import dagger.hilt.android.AndroidEntryPoint;",
170             "",
171             "@TargetApi(24)",
172             "@AndroidEntryPoint(LinearLayout.class)",
173             "public class MyView extends Hilt_MyView {",
174             " public MyView(Context context, AttributeSet attributeSet){",
175             "   super(context, attributeSet);",
176             " }",
177             "}");
178     Compilation compilation = compiler().compile(myView);
179     assertThat(compilation).succeeded();
180     assertThat(compilation)
181         .generatedSourceFile("test/Hilt_MyView")
182         .containsElementsIn(
183             JavaFileObjects.forSourceLines(
184                 "test.Hilt_MyView",
185                 "",
186                 "package test;",
187                 "",
188                 "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.ViewGenerator\")",
189                 "@TargetApi(24)",
190                 "abstract class Hilt_MyView extends LinearLayout implements"
191                     + " GeneratedComponentManagerHolder {",
192                 "}"));
193   }
194 
195   @Test
copyTargetApiAnnotationApplication()196   public void copyTargetApiAnnotationApplication() {
197     JavaFileObject myApplication =
198         JavaFileObjects.forSourceLines(
199             "test.MyApplication",
200             "package test;",
201             "",
202             "import android.annotation.TargetApi;",
203             "import android.app.Application;",
204             "import dagger.hilt.android.HiltAndroidApp;",
205             "",
206             "@TargetApi(24)",
207             "@HiltAndroidApp(Application.class)",
208             "public class MyApplication extends Hilt_MyApplication {}");
209     Compilation compilation = compiler().compile(myApplication);
210     assertThat(compilation).succeeded();
211     assertThat(compilation)
212         .generatedSourceFile("test/Hilt_MyApplication")
213         .containsElementsIn(
214             JavaFileObjects.forSourceLines(
215                 "test.Hilt_MyApplication",
216                 " package test;",
217                 "",
218                 "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.ApplicationGenerator\")",
219                 "@TargetApi(24)",
220                 "abstract class Hilt_MyApplication extends Application implements"
221                     + " GeneratedComponentManagerHolder {}"));
222   }
223 
224   @Test
copyTargetApiAnnotationFragment()225   public void copyTargetApiAnnotationFragment() {
226     JavaFileObject myApplication =
227         JavaFileObjects.forSourceLines(
228             "test.MyFragment",
229             "package test;",
230             "",
231             "import android.annotation.TargetApi;",
232             "import androidx.fragment.app.Fragment;",
233             "import dagger.hilt.android.AndroidEntryPoint;",
234             "",
235             "@TargetApi(24)",
236             "@AndroidEntryPoint(Fragment.class)",
237             "public class MyFragment extends Hilt_MyFragment {}");
238     Compilation compilation = compiler().compile(myApplication);
239     assertThat(compilation).succeeded();
240     assertThat(compilation)
241         .generatedSourceFile("test/Hilt_MyFragment")
242         .containsElementsIn(
243             JavaFileObjects.forSourceLines(
244                 "test.Hilt_MyFragment",
245                 "package test;",
246                 "",
247                 "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.FragmentGenerator\")",
248                 "@TargetApi(24)",
249                 "abstract class Hilt_MyFragment extends Fragment implements"
250                     + " GeneratedComponentManagerHolder {}"));
251   }
252 
253   @Test
copyTargetApiBroadcastRecieverGenerator()254   public void copyTargetApiBroadcastRecieverGenerator() {
255     JavaFileObject myBroadcastReceiver =
256         JavaFileObjects.forSourceLines(
257             "test.MyBroadcastReceiver",
258             "package test;",
259             "",
260             "import android.content.BroadcastReceiver;",
261             "import android.annotation.TargetApi;",
262             "import dagger.hilt.android.AndroidEntryPoint;",
263             "",
264             "@TargetApi(24)",
265             "@AndroidEntryPoint(BroadcastReceiver.class)",
266             "public class MyBroadcastReceiver extends Hilt_MyBroadcastReceiver {}");
267     Compilation compilation = compiler().compile(myBroadcastReceiver);
268     assertThat(compilation).succeeded();
269     assertThat(compilation)
270         .generatedSourceFile("test/Hilt_MyBroadcastReceiver")
271         .containsElementsIn(
272             JavaFileObjects.forSourceLines(
273                 "test.Hilt_MyBroadcastReceiver",
274                 "package test;",
275                 "",
276                 "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.BroadcastReceiverGenerator\")",
277                 "@TargetApi(24)",
278                 "abstract class Hilt_MyBroadcastReceiver extends BroadcastReceiver {}"));
279   }
280 
281   @Test
copyTargetApiServiceGenerator()282   public void copyTargetApiServiceGenerator() {
283     JavaFileObject myService =
284         JavaFileObjects.forSourceLines(
285             "test.MyService",
286             "package test;",
287             "",
288             "import android.annotation.TargetApi;",
289             "import android.content.Intent;",
290             "import android.app.Service;",
291             "import android.os.IBinder;",
292             "import dagger.hilt.android.AndroidEntryPoint;",
293             "",
294             "@TargetApi(24)",
295             "@AndroidEntryPoint(Service.class)",
296             "public class MyService extends Hilt_MyService {",
297             "   @Override",
298             "   public IBinder onBind(Intent intent){",
299             "     return null;",
300             "   }",
301             "}");
302     Compilation compilation = compiler().compile(myService);
303     assertThat(compilation).succeeded();
304     assertThat(compilation)
305         .generatedSourceFile("test/Hilt_MyService")
306         .containsElementsIn(
307             JavaFileObjects.forSourceLines(
308                 "test.Hilt_MyService",
309                 "package test;",
310                 "",
311                 "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.ServiceGenerator\")",
312                 "@TargetApi(24)",
313                 "abstract class Hilt_MyService extends Service implements"
314                     + " GeneratedComponentManagerHolder{}"));
315   }
316 
317   @Test
copySuppressWarningsAnnotationActivity_annotationCopied()318   public void copySuppressWarningsAnnotationActivity_annotationCopied() {
319     JavaFileObject myActivity =
320         JavaFileObjects.forSourceLines(
321             "test.MyActivity",
322             "package test;",
323             "",
324             "import android.annotation.TargetApi;",
325             "import androidx.fragment.app.FragmentActivity;",
326             "import dagger.hilt.android.AndroidEntryPoint;",
327             "",
328             "@SuppressWarnings(\"deprecation\")",
329             "@AndroidEntryPoint(FragmentActivity.class)",
330             "public class MyActivity extends Hilt_MyActivity {}");
331     Compilation compilation = compiler().compile(myActivity);
332     assertThat(compilation).succeeded();
333     assertThat(compilation)
334         .generatedSourceFile("test/Hilt_MyActivity")
335         .containsElementsIn(
336             JavaFileObjects.forSourceLines(
337                 "test.Hilt_MyActivity",
338                 " package test;",
339                 "",
340                 "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.ActivityGenerator\")",
341                 "@SuppressWarnings(\"deprecation\")",
342                 "abstract class Hilt_MyActivity extends FragmentActivity ",
343                 "implements GeneratedComponentManagerHolder {",
344                 "}"));
345   }
346 
347   @Test
copySuppressWarningsAnnotation_onView_annotationCopied()348   public void copySuppressWarningsAnnotation_onView_annotationCopied() {
349     JavaFileObject myView =
350         JavaFileObjects.forSourceLines(
351             "test.MyView",
352             "package test;",
353             "",
354             "import android.annotation.TargetApi;",
355             "import android.widget.LinearLayout;",
356             "import android.content.Context;",
357             "import android.util.AttributeSet;",
358             "import dagger.hilt.android.AndroidEntryPoint;",
359             "",
360             "@SuppressWarnings(\"deprecation\")",
361             "@AndroidEntryPoint(LinearLayout.class)",
362             "public class MyView extends Hilt_MyView {",
363             " public MyView(Context context, AttributeSet attributeSet){",
364             "   super(context, attributeSet);",
365             " }",
366             "}");
367     Compilation compilation = compiler().compile(myView);
368     assertThat(compilation).succeeded();
369     assertThat(compilation)
370         .generatedSourceFile("test/Hilt_MyView")
371         .containsElementsIn(
372             JavaFileObjects.forSourceLines(
373                 "test.Hilt_MyView",
374                 "",
375                 "package test;",
376                 "",
377                 "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.ViewGenerator\")",
378                 "@SuppressWarnings(\"deprecation\")",
379                 "abstract class Hilt_MyView extends LinearLayout implements"
380                     + " GeneratedComponentManagerHolder {",
381                 "}"));
382   }
383 
384   @Test
copySuppressWarningsAnnotation_onApplication_annotationCopied()385   public void copySuppressWarningsAnnotation_onApplication_annotationCopied() {
386     JavaFileObject myApplication =
387         JavaFileObjects.forSourceLines(
388             "test.MyApplication",
389             "package test;",
390             "",
391             "import android.annotation.TargetApi;",
392             "import android.app.Application;",
393             "import dagger.hilt.android.HiltAndroidApp;",
394             "",
395             "@SuppressWarnings(\"deprecation\")",
396             "@HiltAndroidApp(Application.class)",
397             "public class MyApplication extends Hilt_MyApplication {}");
398     Compilation compilation = compiler().compile(myApplication);
399     assertThat(compilation).succeeded();
400     assertThat(compilation)
401         .generatedSourceFile("test/Hilt_MyApplication")
402         .containsElementsIn(
403             JavaFileObjects.forSourceLines(
404                 "test.Hilt_MyApplication",
405                 " package test;",
406                 "",
407                 "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.ApplicationGenerator\")",
408                 "@SuppressWarnings(\"deprecation\")",
409                 "abstract class Hilt_MyApplication extends Application implements"
410                     + " GeneratedComponentManagerHolder {}"));
411   }
412 
413   @Test
copySuppressWarningsAnnotation_onFragment_annotationCopied()414   public void copySuppressWarningsAnnotation_onFragment_annotationCopied() {
415     JavaFileObject myApplication =
416         JavaFileObjects.forSourceLines(
417             "test.MyFragment",
418             "package test;",
419             "",
420             "import android.annotation.TargetApi;",
421             "import androidx.fragment.app.Fragment;",
422             "import dagger.hilt.android.AndroidEntryPoint;",
423             "",
424             "@SuppressWarnings(\"rawtypes\")",
425             "@AndroidEntryPoint(Fragment.class)",
426             "public class MyFragment extends Hilt_MyFragment {}");
427     Compilation compilation = compiler().compile(myApplication);
428     assertThat(compilation).succeeded();
429     assertThat(compilation)
430         .generatedSourceFile("test/Hilt_MyFragment")
431         .containsElementsIn(
432             JavaFileObjects.forSourceLines(
433                 "test.Hilt_MyFragment",
434                 "package test;",
435                 "",
436                 "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.FragmentGenerator\")",
437                 "@SuppressWarnings(\"rawtypes\")",
438                 "abstract class Hilt_MyFragment extends Fragment implements"
439                     + " GeneratedComponentManagerHolder {}"));
440   }
441 
442   @Test
copySuppressWarnings_onBroadcastRecieverGenerator_annotationCopied()443   public void copySuppressWarnings_onBroadcastRecieverGenerator_annotationCopied() {
444     JavaFileObject myBroadcastReceiver =
445         JavaFileObjects.forSourceLines(
446             "test.MyBroadcastReceiver",
447             "package test;",
448             "",
449             "import android.content.BroadcastReceiver;",
450             "import android.annotation.TargetApi;",
451             "import dagger.hilt.android.AndroidEntryPoint;",
452             "",
453             "@SuppressWarnings(\"deprecation\")",
454             "@AndroidEntryPoint(BroadcastReceiver.class)",
455             "public class MyBroadcastReceiver extends Hilt_MyBroadcastReceiver {}");
456     Compilation compilation = compiler().compile(myBroadcastReceiver);
457     assertThat(compilation).succeeded();
458     assertThat(compilation)
459         .generatedSourceFile("test/Hilt_MyBroadcastReceiver")
460         .containsElementsIn(
461             JavaFileObjects.forSourceLines(
462                 "test.Hilt_MyBroadcastReceiver",
463                 "package test;",
464                 "",
465                 "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.BroadcastReceiverGenerator\")",
466                 "@SuppressWarnings(\"deprecation\")",
467                 "abstract class Hilt_MyBroadcastReceiver extends BroadcastReceiver {}"));
468   }
469 
470   @Test
copySuppressWarnings_onServiceGenerator_annotationCopied()471   public void copySuppressWarnings_onServiceGenerator_annotationCopied() {
472     JavaFileObject myService =
473         JavaFileObjects.forSourceLines(
474             "test.MyService",
475             "package test;",
476             "",
477             "import android.annotation.TargetApi;",
478             "import android.content.Intent;",
479             "import android.app.Service;",
480             "import android.os.IBinder;",
481             "import dagger.hilt.android.AndroidEntryPoint;",
482             "",
483             "@SuppressWarnings(\"deprecation\")",
484             "@AndroidEntryPoint(Service.class)",
485             "public class MyService extends Hilt_MyService {",
486             "   @Override",
487             "   public IBinder onBind(Intent intent){",
488             "     return null;",
489             "   }",
490             "}");
491     Compilation compilation = compiler().compile(myService);
492     assertThat(compilation).succeeded();
493     assertThat(compilation)
494         .generatedSourceFile("test/Hilt_MyService")
495         .containsElementsIn(
496             JavaFileObjects.forSourceLines(
497                 "test.Hilt_MyService",
498                 "package test;",
499                 "",
500                 "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.ServiceGenerator\")",
501                 "@SuppressWarnings(\"deprecation\")",
502                 "abstract class Hilt_MyService extends Service implements"
503                     + " GeneratedComponentManagerHolder{}"));
504   }
505 }
506