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