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