1*f585d8a3SJacky Wang /* 2*f585d8a3SJacky Wang * Copyright (C) 2020 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.hilt.android; 18*f585d8a3SJacky Wang 19*f585d8a3SJacky Wang import static com.google.common.truth.Truth.assertThat; 20*f585d8a3SJacky Wang 21*f585d8a3SJacky Wang import android.os.Build; 22*f585d8a3SJacky Wang import androidx.activity.ComponentActivity; 23*f585d8a3SJacky Wang import androidx.test.ext.junit.runners.AndroidJUnit4; 24*f585d8a3SJacky Wang import dagger.hilt.android.other.pkg.AndroidEntryPointBaseClassOtherPkg; 25*f585d8a3SJacky Wang import org.junit.Test; 26*f585d8a3SJacky Wang import org.junit.runner.RunWith; 27*f585d8a3SJacky Wang import org.robolectric.annotation.Config; 28*f585d8a3SJacky Wang 29*f585d8a3SJacky Wang /** 30*f585d8a3SJacky Wang * Regression test for https://github.com/google/dagger/issues/1910 31*f585d8a3SJacky Wang * 32*f585d8a3SJacky Wang * <p>There are 8 different tests to cover 3 levels of inheritance where each level uses either the 33*f585d8a3SJacky Wang * long-form (L) or short-form (S) of @AndroidEntryPoint: 34*f585d8a3SJacky Wang * 35*f585d8a3SJacky Wang * <ol> 36*f585d8a3SJacky Wang * <li> L -> L -> L 37*f585d8a3SJacky Wang * <li> L -> L -> S 38*f585d8a3SJacky Wang * <li> L -> S -> L 39*f585d8a3SJacky Wang * <li> L -> S -> S 40*f585d8a3SJacky Wang * <li> S -> L -> L 41*f585d8a3SJacky Wang * <li> S -> L -> S 42*f585d8a3SJacky Wang * <li> S -> S -> L 43*f585d8a3SJacky Wang * <li> S -> S -> S 44*f585d8a3SJacky Wang * </ol> 45*f585d8a3SJacky Wang * 46*f585d8a3SJacky Wang * Note: We don't actually test injection in this class because Bazel doesn't do bytecode injection. 47*f585d8a3SJacky Wang * We're only testing that the classes build, and verifying their inheritance matches what we 48*f585d8a3SJacky Wang * expect. 49*f585d8a3SJacky Wang */ 50*f585d8a3SJacky Wang @RunWith(AndroidJUnit4.class) 51*f585d8a3SJacky Wang // Robolectric requires Java9 to run API 29 and above, so use API 28 instead 52*f585d8a3SJacky Wang @Config(sdk = Build.VERSION_CODES.P) 53*f585d8a3SJacky Wang public final class AndroidEntryPointBaseClassTest { 54*f585d8a3SJacky Wang 55*f585d8a3SJacky Wang @AndroidEntryPoint 56*f585d8a3SJacky Wang public static final class SSActivity extends AndroidEntryPointBaseClassOtherPkg.SBaseActivity {} 57*f585d8a3SJacky Wang 58*f585d8a3SJacky Wang @AndroidEntryPoint 59*f585d8a3SJacky Wang public static final class SLActivity extends AndroidEntryPointBaseClassOtherPkg.LBaseActivity {} 60*f585d8a3SJacky Wang 61*f585d8a3SJacky Wang @AndroidEntryPoint(AndroidEntryPointBaseClassOtherPkg.SBaseActivity.class) 62*f585d8a3SJacky Wang public static final class LSActivity extends Hilt_AndroidEntryPointBaseClassTest_LSActivity {} 63*f585d8a3SJacky Wang 64*f585d8a3SJacky Wang @AndroidEntryPoint(AndroidEntryPointBaseClassOtherPkg.LBaseActivity.class) 65*f585d8a3SJacky Wang public static final class LLActivity extends Hilt_AndroidEntryPointBaseClassTest_LLActivity {} 66*f585d8a3SJacky Wang 67*f585d8a3SJacky Wang @AndroidEntryPoint(LL.class) 68*f585d8a3SJacky Wang public static final class LLL extends Hilt_AndroidEntryPointBaseClassTest_LLL {} 69*f585d8a3SJacky Wang 70*f585d8a3SJacky Wang @AndroidEntryPoint(LS.class) 71*f585d8a3SJacky Wang public static final class LLS extends Hilt_AndroidEntryPointBaseClassTest_LLS {} 72*f585d8a3SJacky Wang 73*f585d8a3SJacky Wang @AndroidEntryPoint(SL.class) 74*f585d8a3SJacky Wang public static final class LSL extends Hilt_AndroidEntryPointBaseClassTest_LSL {} 75*f585d8a3SJacky Wang 76*f585d8a3SJacky Wang @AndroidEntryPoint(SS.class) 77*f585d8a3SJacky Wang public static final class LSS extends Hilt_AndroidEntryPointBaseClassTest_LSS {} 78*f585d8a3SJacky Wang 79*f585d8a3SJacky Wang @AndroidEntryPoint 80*f585d8a3SJacky Wang public static final class SLL extends LL {} 81*f585d8a3SJacky Wang 82*f585d8a3SJacky Wang @AndroidEntryPoint 83*f585d8a3SJacky Wang public static final class SLS extends LS {} 84*f585d8a3SJacky Wang 85*f585d8a3SJacky Wang @AndroidEntryPoint 86*f585d8a3SJacky Wang public static final class SSL extends SL {} 87*f585d8a3SJacky Wang 88*f585d8a3SJacky Wang @AndroidEntryPoint 89*f585d8a3SJacky Wang public static final class SSS extends SS {} 90*f585d8a3SJacky Wang 91*f585d8a3SJacky Wang @AndroidEntryPoint(L.class) 92*f585d8a3SJacky Wang public static class LL extends Hilt_AndroidEntryPointBaseClassTest_LL {} 93*f585d8a3SJacky Wang 94*f585d8a3SJacky Wang @AndroidEntryPoint(S.class) 95*f585d8a3SJacky Wang public static class LS extends Hilt_AndroidEntryPointBaseClassTest_LS {} 96*f585d8a3SJacky Wang 97*f585d8a3SJacky Wang @AndroidEntryPoint 98*f585d8a3SJacky Wang public static class SL extends L {} 99*f585d8a3SJacky Wang 100*f585d8a3SJacky Wang @AndroidEntryPoint 101*f585d8a3SJacky Wang public static class SS extends S {} 102*f585d8a3SJacky Wang 103*f585d8a3SJacky Wang @AndroidEntryPoint(ComponentActivity.class) 104*f585d8a3SJacky Wang public static class L extends Hilt_AndroidEntryPointBaseClassTest_L {} 105*f585d8a3SJacky Wang 106*f585d8a3SJacky Wang @AndroidEntryPoint 107*f585d8a3SJacky Wang public static class S extends ComponentActivity {} 108*f585d8a3SJacky Wang 109*f585d8a3SJacky Wang @Test checkGeneratedClassHierarchy_shortForm()110*f585d8a3SJacky Wang public void checkGeneratedClassHierarchy_shortForm() throws Exception { 111*f585d8a3SJacky Wang // When using the short form notation, the generated top level class is not actually assignable 112*f585d8a3SJacky Wang // to the generated base classes at compile time 113*f585d8a3SJacky Wang assertIsNotAssignableTo( 114*f585d8a3SJacky Wang Hilt_AndroidEntryPointBaseClassTest_SSS.class, 115*f585d8a3SJacky Wang Hilt_AndroidEntryPointBaseClassTest_S.class); 116*f585d8a3SJacky Wang assertIsNotAssignableTo( 117*f585d8a3SJacky Wang Hilt_AndroidEntryPointBaseClassTest_SS.class, 118*f585d8a3SJacky Wang Hilt_AndroidEntryPointBaseClassTest_S.class); 119*f585d8a3SJacky Wang } 120*f585d8a3SJacky Wang 121*f585d8a3SJacky Wang @Test checkGeneratedClassHierarchy_longForm()122*f585d8a3SJacky Wang public void checkGeneratedClassHierarchy_longForm() throws Exception { 123*f585d8a3SJacky Wang // When using the long form notation, they are assignable at compile time 124*f585d8a3SJacky Wang assertIsAssignableTo( 125*f585d8a3SJacky Wang Hilt_AndroidEntryPointBaseClassTest_LLL.class, 126*f585d8a3SJacky Wang Hilt_AndroidEntryPointBaseClassTest_LL.class); 127*f585d8a3SJacky Wang assertIsAssignableTo( 128*f585d8a3SJacky Wang Hilt_AndroidEntryPointBaseClassTest_LL.class, 129*f585d8a3SJacky Wang Hilt_AndroidEntryPointBaseClassTest_L.class); 130*f585d8a3SJacky Wang } 131*f585d8a3SJacky Wang 132*f585d8a3SJacky Wang @Test checkGeneratedClassHierarchy_shortFormRoot()133*f585d8a3SJacky Wang public void checkGeneratedClassHierarchy_shortFormRoot() throws Exception { 134*f585d8a3SJacky Wang // If the root is short-form, then the child class cannot be assigned to it. 135*f585d8a3SJacky Wang assertIsNotAssignableTo( 136*f585d8a3SJacky Wang Hilt_AndroidEntryPointBaseClassTest_LLS.class, 137*f585d8a3SJacky Wang Hilt_AndroidEntryPointBaseClassTest_S.class); 138*f585d8a3SJacky Wang assertIsNotAssignableTo( 139*f585d8a3SJacky Wang Hilt_AndroidEntryPointBaseClassTest_LS.class, 140*f585d8a3SJacky Wang Hilt_AndroidEntryPointBaseClassTest_S.class); 141*f585d8a3SJacky Wang } 142*f585d8a3SJacky Wang 143*f585d8a3SJacky Wang @Test checkGeneratedClassHierarchy_longFormRoot()144*f585d8a3SJacky Wang public void checkGeneratedClassHierarchy_longFormRoot() throws Exception { 145*f585d8a3SJacky Wang // If the root is long-form, then the child class can be assigned to it. 146*f585d8a3SJacky Wang assertIsAssignableTo( 147*f585d8a3SJacky Wang Hilt_AndroidEntryPointBaseClassTest_SSL.class, 148*f585d8a3SJacky Wang Hilt_AndroidEntryPointBaseClassTest_L.class); 149*f585d8a3SJacky Wang assertIsAssignableTo( 150*f585d8a3SJacky Wang Hilt_AndroidEntryPointBaseClassTest_SL.class, 151*f585d8a3SJacky Wang Hilt_AndroidEntryPointBaseClassTest_L.class); 152*f585d8a3SJacky Wang } 153*f585d8a3SJacky Wang 154*f585d8a3SJacky Wang /** Asserts that the {@code class1} is not assignable to the {@code class2}. */ assertIsNotAssignableTo(Class<?> class1, Class<?> class2)155*f585d8a3SJacky Wang private static void assertIsNotAssignableTo(Class<?> class1, Class<?> class2) { 156*f585d8a3SJacky Wang assertThat(class2.isAssignableFrom(class1)).isFalse(); 157*f585d8a3SJacky Wang } 158*f585d8a3SJacky Wang 159*f585d8a3SJacky Wang /** Asserts that the {@code class1} is assignable to the {@code class2}. */ assertIsAssignableTo(Class<?> class1, Class<?> class2)160*f585d8a3SJacky Wang private static void assertIsAssignableTo(Class<?> class1, Class<?> class2) { 161*f585d8a3SJacky Wang assertThat(class1).isAssignableTo(class2); 162*f585d8a3SJacky Wang } 163*f585d8a3SJacky Wang } 164