xref: /aosp_15_r20/external/dagger2/javatests/dagger/hilt/android/ModuleTest.java (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
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.test.ext.junit.runners.AndroidJUnit4;
23*f585d8a3SJacky Wang import dagger.Binds;
24*f585d8a3SJacky Wang import dagger.Module;
25*f585d8a3SJacky Wang import dagger.Provides;
26*f585d8a3SJacky Wang import dagger.hilt.InstallIn;
27*f585d8a3SJacky Wang import dagger.hilt.android.testing.HiltAndroidRule;
28*f585d8a3SJacky Wang import dagger.hilt.android.testing.HiltAndroidTest;
29*f585d8a3SJacky Wang import dagger.hilt.android.testing.HiltTestApplication;
30*f585d8a3SJacky Wang import dagger.hilt.components.SingletonComponent;
31*f585d8a3SJacky Wang import javax.inject.Inject;
32*f585d8a3SJacky Wang import javax.inject.Named;
33*f585d8a3SJacky Wang import org.junit.Before;
34*f585d8a3SJacky Wang import org.junit.Rule;
35*f585d8a3SJacky Wang import org.junit.Test;
36*f585d8a3SJacky Wang import org.junit.runner.RunWith;
37*f585d8a3SJacky Wang import org.robolectric.annotation.Config;
38*f585d8a3SJacky Wang 
39*f585d8a3SJacky Wang @HiltAndroidTest
40*f585d8a3SJacky Wang @RunWith(AndroidJUnit4.class)
41*f585d8a3SJacky Wang // Robolectric requires Java9 to run API 29 and above, so use API 28 instead
42*f585d8a3SJacky Wang @Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
43*f585d8a3SJacky Wang public final class ModuleTest {
44*f585d8a3SJacky Wang   public static class Dep1 {}
45*f585d8a3SJacky Wang   public static class Dep2 {}
46*f585d8a3SJacky Wang   public static class Dep3 {}
Dep4()47*f585d8a3SJacky Wang   public static class Dep4 { @Inject Dep4() {}}
Dep5()48*f585d8a3SJacky Wang   public static class Dep5 { @Inject Dep5() {}}
49*f585d8a3SJacky Wang   public static class Dep6 {}
50*f585d8a3SJacky Wang   public static class Dep7 {}
51*f585d8a3SJacky Wang 
52*f585d8a3SJacky Wang   @Rule public HiltAndroidRule rule = new HiltAndroidRule(this);
53*f585d8a3SJacky Wang 
54*f585d8a3SJacky Wang   // Test that modules with only static methods can have private constructors.
55*f585d8a3SJacky Wang   @Module
56*f585d8a3SJacky Wang   @InstallIn(SingletonComponent.class)
57*f585d8a3SJacky Wang   static final class TestModule1 {
TestModule1()58*f585d8a3SJacky Wang     private TestModule1() {} // This is fine because Dagger doesn't need an instance.
59*f585d8a3SJacky Wang 
60*f585d8a3SJacky Wang     @Provides
provide()61*f585d8a3SJacky Wang     static Dep1 provide() {
62*f585d8a3SJacky Wang       return new Dep1();
63*f585d8a3SJacky Wang     }
64*f585d8a3SJacky Wang   }
65*f585d8a3SJacky Wang 
66*f585d8a3SJacky Wang   // Test that modules with only static methods can have constructors with parameters.
67*f585d8a3SJacky Wang   @Module
68*f585d8a3SJacky Wang   @InstallIn(SingletonComponent.class)
69*f585d8a3SJacky Wang   static final class TestModule2 {
TestModule2(String str)70*f585d8a3SJacky Wang     TestModule2(String str) {} // This is fine because Dagger doesn't need an instance.
71*f585d8a3SJacky Wang 
72*f585d8a3SJacky Wang     @Provides
provide()73*f585d8a3SJacky Wang     static Dep2 provide() {
74*f585d8a3SJacky Wang       return new Dep2();
75*f585d8a3SJacky Wang     }
76*f585d8a3SJacky Wang   }
77*f585d8a3SJacky Wang 
78*f585d8a3SJacky Wang   // Test that modules with non-static methods can have constructors with parameters if no-arg
79*f585d8a3SJacky Wang   // constructor exists.
80*f585d8a3SJacky Wang   @Module
81*f585d8a3SJacky Wang   @InstallIn(SingletonComponent.class)
82*f585d8a3SJacky Wang   public static final class TestModule3 {
TestModule3()83*f585d8a3SJacky Wang     TestModule3() {
84*f585d8a3SJacky Wang       this("");
85*f585d8a3SJacky Wang     }
86*f585d8a3SJacky Wang 
TestModule3(String str)87*f585d8a3SJacky Wang     TestModule3(String str) {} // This is fine because Dagger can use the other constructor
88*f585d8a3SJacky Wang 
89*f585d8a3SJacky Wang     @Provides
provide()90*f585d8a3SJacky Wang     Dep3 provide() {
91*f585d8a3SJacky Wang       return new Dep3();
92*f585d8a3SJacky Wang     }
93*f585d8a3SJacky Wang   }
94*f585d8a3SJacky Wang 
95*f585d8a3SJacky Wang   // Test that modules with only abstract methods can have private constructors.
96*f585d8a3SJacky Wang   @Module
97*f585d8a3SJacky Wang   @InstallIn(SingletonComponent.class)
98*f585d8a3SJacky Wang   @SuppressWarnings("ClassCanBeStatic") // purposely testing non-static class here
99*f585d8a3SJacky Wang   abstract class TestModule4 {
TestModule4()100*f585d8a3SJacky Wang     private TestModule4() {}  // This is fine because Dagger doesn't need an instance.
101*f585d8a3SJacky Wang 
bind(Dep4 impl)102*f585d8a3SJacky Wang     @Binds @Named("Dep4") abstract Object bind(Dep4 impl);
103*f585d8a3SJacky Wang   }
104*f585d8a3SJacky Wang 
105*f585d8a3SJacky Wang   // Test that modules with only abstract methods can have constructors with parameters.
106*f585d8a3SJacky Wang   @Module
107*f585d8a3SJacky Wang   @InstallIn(SingletonComponent.class)
108*f585d8a3SJacky Wang   @SuppressWarnings("ClassCanBeStatic") // purposely testing non-static class here
109*f585d8a3SJacky Wang   abstract class TestModule5 {
TestModule5(String str)110*f585d8a3SJacky Wang     TestModule5(String str) {} // This is fine because Dagger doesn't need an instance.
111*f585d8a3SJacky Wang 
bind(Dep5 impl)112*f585d8a3SJacky Wang     @Binds @Named("Dep5") abstract Object bind(Dep5 impl);
113*f585d8a3SJacky Wang   }
114*f585d8a3SJacky Wang 
115*f585d8a3SJacky Wang   // Test that static modules with no methods can have private constructors.
116*f585d8a3SJacky Wang   @Module
117*f585d8a3SJacky Wang   @InstallIn(SingletonComponent.class)
118*f585d8a3SJacky Wang   static final class TestModule6 {
TestModule6()119*f585d8a3SJacky Wang     private TestModule6() {} // This is fine because Dagger doesn't need an instance.
120*f585d8a3SJacky Wang   }
121*f585d8a3SJacky Wang 
122*f585d8a3SJacky Wang   // Test that static modules with no methods can have constructors with parameters.
123*f585d8a3SJacky Wang   @Module
124*f585d8a3SJacky Wang   @InstallIn(SingletonComponent.class)
125*f585d8a3SJacky Wang   static final class TestModule7 {
TestModule7(String str)126*f585d8a3SJacky Wang     TestModule7(String str) {} // This is fine because Dagger doesn't need an instance.
127*f585d8a3SJacky Wang   }
128*f585d8a3SJacky Wang 
129*f585d8a3SJacky Wang   // Test that abstract modules with no methods can have private constructors.
130*f585d8a3SJacky Wang   @Module
131*f585d8a3SJacky Wang   @InstallIn(SingletonComponent.class)
132*f585d8a3SJacky Wang   @SuppressWarnings("ClassCanBeStatic") // purposely testing non-static class here
133*f585d8a3SJacky Wang   abstract class TestModule8 {
TestModule8()134*f585d8a3SJacky Wang     private TestModule8() {} // This is fine because Dagger doesn't need an instance.
135*f585d8a3SJacky Wang   }
136*f585d8a3SJacky Wang 
137*f585d8a3SJacky Wang   // Test that abstract modules with no methods can have constructors with parameters.
138*f585d8a3SJacky Wang   @Module
139*f585d8a3SJacky Wang   @InstallIn(SingletonComponent.class)
140*f585d8a3SJacky Wang   @SuppressWarnings("ClassCanBeStatic") // purposely testing non-static class here
141*f585d8a3SJacky Wang   abstract class TestModule9 {
TestModule9(String str)142*f585d8a3SJacky Wang     TestModule9(String str) {} // This is fine because Dagger doesn't need an instance.
143*f585d8a3SJacky Wang   }
144*f585d8a3SJacky Wang 
145*f585d8a3SJacky Wang   @Inject Dep1 dep1;
146*f585d8a3SJacky Wang   @Inject Dep2 dep2;
147*f585d8a3SJacky Wang   @Inject Dep5 dep3;
148*f585d8a3SJacky Wang   @Inject @Named("Dep4") Object dep4;
149*f585d8a3SJacky Wang   @Inject @Named("Dep5") Object dep5;
150*f585d8a3SJacky Wang 
151*f585d8a3SJacky Wang   @Before
setup()152*f585d8a3SJacky Wang   public void setup() {
153*f585d8a3SJacky Wang     rule.inject();
154*f585d8a3SJacky Wang   }
155*f585d8a3SJacky Wang 
156*f585d8a3SJacky Wang   @Test
testDep1()157*f585d8a3SJacky Wang   public void testDep1() throws Exception {
158*f585d8a3SJacky Wang     assertThat(dep1).isNotNull();
159*f585d8a3SJacky Wang   }
160*f585d8a3SJacky Wang 
161*f585d8a3SJacky Wang   @Test
testDep2()162*f585d8a3SJacky Wang   public void testDep2() throws Exception {
163*f585d8a3SJacky Wang     assertThat(dep2).isNotNull();
164*f585d8a3SJacky Wang   }
165*f585d8a3SJacky Wang 
166*f585d8a3SJacky Wang   @Test
testDep3()167*f585d8a3SJacky Wang   public void testDep3() throws Exception {
168*f585d8a3SJacky Wang     assertThat(dep3).isNotNull();
169*f585d8a3SJacky Wang   }
170*f585d8a3SJacky Wang 
171*f585d8a3SJacky Wang   @Test
testDep4()172*f585d8a3SJacky Wang   public void testDep4() throws Exception {
173*f585d8a3SJacky Wang     assertThat(dep4).isNotNull();
174*f585d8a3SJacky Wang     assertThat(dep4).isInstanceOf(Dep4.class);
175*f585d8a3SJacky Wang   }
176*f585d8a3SJacky Wang 
177*f585d8a3SJacky Wang   @Test
testDep5()178*f585d8a3SJacky Wang   public void testDep5() throws Exception {
179*f585d8a3SJacky Wang     assertThat(dep5).isNotNull();
180*f585d8a3SJacky Wang     assertThat(dep5).isInstanceOf(Dep5.class);
181*f585d8a3SJacky Wang   }
182*f585d8a3SJacky Wang }
183