xref: /aosp_15_r20/external/dagger2/javatests/dagger/hilt/android/OptionalInjectWithoutHiltTest.java (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
1 /*
2  * Copyright (C) 2021 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;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 import static dagger.hilt.android.migration.OptionalInjectCheck.wasInjectedByHilt;
21 import static org.junit.Assert.assertThrows;
22 
23 import android.content.Intent;
24 import android.os.Build;
25 import androidx.lifecycle.ViewModelProvider;
26 import androidx.test.core.app.ApplicationProvider;
27 import androidx.test.ext.junit.runners.AndroidJUnit4;
28 import dagger.hilt.android.OptionalInjectTestClasses.NonHiltViewModel;
29 import dagger.hilt.android.OptionalInjectTestClasses.OptionalSubclassActivity;
30 import dagger.hilt.android.OptionalInjectTestClasses.TestActivity;
31 import dagger.hilt.android.OptionalInjectTestClasses.TestBroadcastReceiver;
32 import dagger.hilt.android.OptionalInjectTestClasses.TestFragment;
33 import dagger.hilt.android.OptionalInjectTestClasses.TestIntentService;
34 import dagger.hilt.android.OptionalInjectTestClasses.TestService;
35 import dagger.hilt.android.OptionalInjectTestClasses.TestView;
36 import dagger.hilt.android.OptionalInjectTestClasses.TestViewModel;
37 import dagger.hilt.android.OptionalInjectTestClasses.TestWithFragmentBindingsView;
38 import org.junit.Test;
39 import org.junit.runner.RunWith;
40 import org.robolectric.Robolectric;
41 import org.robolectric.annotation.Config;
42 
43 /** Tests that optional inject work without a Hilt root. */
44 @RunWith(AndroidJUnit4.class)
45 // Robolectric requires Java9 to run API 29 and above, so use API 28 instead
46 @Config(sdk = Build.VERSION_CODES.P)
47 public final class OptionalInjectWithoutHiltTest {
48   @Test
testActivityInjection()49   public void testActivityInjection() throws Exception {
50     TestActivity testActivity = Robolectric.setupActivity(TestActivity.class);
51     assertThat(testActivity.testActivityBinding).isNull();
52     assertThat(testActivity.wasInjectedByHilt()).isFalse();
53     assertThat(wasInjectedByHilt(testActivity)).isFalse();
54   }
55 
56   @Test
testOptionalSubclassActivityInjection()57   public void testOptionalSubclassActivityInjection() throws Exception {
58     OptionalSubclassActivity testActivity = Robolectric.setupActivity(
59         OptionalSubclassActivity.class);
60     assertThat(testActivity.testActivityBinding).isNull();
61     assertThat(testActivity.testActivitySubclassBinding).isNull();
62     assertThat(testActivity.wasInjectedByHilt()).isFalse();
63     assertThat(wasInjectedByHilt(testActivity)).isFalse();
64   }
65 
66   @Test
testFragmentInjection()67   public void testFragmentInjection() throws Exception {
68     TestActivity testActivity = Robolectric.setupActivity(TestActivity.class);
69     TestFragment testFragment = new TestFragment();
70     testActivity.getSupportFragmentManager()
71         .beginTransaction()
72         .add(testFragment, null)
73         .commitNow();
74     assertThat(testFragment.testFragmentBinding).isNull();
75     assertThat(testFragment.wasInjectedByHilt()).isFalse();
76     assertThat(wasInjectedByHilt(testFragment)).isFalse();
77   }
78 
79   @Test
testViewInjection()80   public void testViewInjection() throws Exception {
81     TestActivity testActivity = Robolectric.setupActivity(TestActivity.class);
82     TestView testView = new TestView(testActivity);
83     assertThat(testView.testViewBinding).isNull();
84     assertThat(testView.wasInjectedByHilt()).isFalse();
85     assertThat(wasInjectedByHilt(testView)).isFalse();
86   }
87 
88   @Test
testViewWithFragmentBindingsInjection()89   public void testViewWithFragmentBindingsInjection() throws Exception {
90     TestActivity testActivity = Robolectric.setupActivity(TestActivity.class);
91     TestFragment testFragment = new TestFragment();
92     testActivity.getSupportFragmentManager()
93         .beginTransaction()
94         .add(testFragment, null)
95         .commitNow();
96 
97     TestWithFragmentBindingsView testView = new TestWithFragmentBindingsView(
98         testFragment.getLayoutInflater().getContext());
99     assertThat(testView.testViewBinding).isNull();
100     assertThat(testView.wasInjectedByHilt()).isFalse();
101     assertThat(wasInjectedByHilt(testView)).isFalse();
102   }
103 
104   @Test
testViewModels()105   public void testViewModels() {
106     TestActivity testActivity = Robolectric.setupActivity(TestActivity.class);
107     TestFragment testFragment = new TestFragment();
108     testActivity.getSupportFragmentManager()
109         .beginTransaction()
110         .add(testFragment, null)
111         .commitNow();
112     assertThat(new ViewModelProvider(testActivity).get(NonHiltViewModel.class)).isNotNull();
113     assertThat(new ViewModelProvider(testFragment).get(NonHiltViewModel.class)).isNotNull();
114 
115     // Hilt View Models aren't usable in this case, so check that it throws.
116     RuntimeException activityException =
117         assertThrows(
118             RuntimeException.class,
119             () -> new ViewModelProvider(testFragment).get(TestViewModel.class));
120     assertThat(activityException)
121         .hasMessageThat()
122         .contains("TestViewModel");
123     RuntimeException fragmentException =
124         assertThrows(
125             RuntimeException.class,
126             () -> new ViewModelProvider(testFragment).get(TestViewModel.class));
127     assertThat(fragmentException)
128         .hasMessageThat()
129         .contains("TestViewModel");
130   }
131 
132   @Test
testServiceInjection()133   public void testServiceInjection() throws Exception {
134     TestService testService = Robolectric.setupService(TestService.class);
135     assertThat(testService.testAppBinding).isNull();
136     assertThat(testService.wasInjectedByHilt()).isFalse();
137     assertThat(wasInjectedByHilt(testService)).isFalse();
138   }
139 
140   @Test
testIntentServiceInjection()141   public void testIntentServiceInjection() throws Exception {
142     TestIntentService testIntentService = Robolectric.setupService(TestIntentService.class);
143     assertThat(testIntentService.testAppBinding).isNull();
144     assertThat(testIntentService.wasInjectedByHilt()).isFalse();
145     assertThat(wasInjectedByHilt(testIntentService)).isFalse();
146   }
147 
148   @Test
testBroadcastReceiverInjection()149   public void testBroadcastReceiverInjection() throws Exception {
150     TestBroadcastReceiver testBroadcastReceiver = new TestBroadcastReceiver();
151     Intent intent = new Intent();
152     testBroadcastReceiver.onReceive(ApplicationProvider.getApplicationContext(), intent);
153     assertThat(testBroadcastReceiver.testAppBinding).isNull();
154     assertThat(testBroadcastReceiver.wasInjectedByHilt()).isFalse();
155     assertThat(wasInjectedByHilt(testBroadcastReceiver)).isFalse();
156   }
157 }
158