xref: /aosp_15_r20/external/dagger2/javatests/dagger/functional/membersinject/MembersInjectTest.java (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
1 /*
2  * Copyright (C) 2015 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.functional.membersinject;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import dagger.BindsInstance;
22 import dagger.Component;
23 import dagger.MembersInjector;
24 import dagger.functional.membersinject.subpackage.a.AGrandchild;
25 import dagger.functional.membersinject.subpackage.a.AParent;
26 import dagger.functional.membersinject.subpackage.b.BChild;
27 import dagger.internal.Provider;
28 import javax.inject.Inject;
29 import org.junit.Test;
30 import org.junit.runner.RunWith;
31 import org.junit.runners.JUnit4;
32 
33 @RunWith(JUnit4.class)
34 public class MembersInjectTest {
testMembersInject_arrays()35   @Test public void testMembersInject_arrays() {
36     MembersInjectComponent component = DaggerMembersInjectComponent.builder().build();
37 
38     ChildOfStringArray childOfStringArray = new ChildOfStringArray();
39     component.inject(childOfStringArray);
40   }
41 
testMembersInject_nestedArrays()42   @Test public void testMembersInject_nestedArrays() {
43     MembersInjectComponent component = DaggerMembersInjectComponent.builder().build();
44 
45     ChildOfArrayOfParentOfStringArray childOfArrayOfParentOfStringArray =
46         new ChildOfArrayOfParentOfStringArray();
47     component.inject(childOfArrayOfParentOfStringArray);
48   }
49 
testMembersInject_primitives()50   @Test public void testMembersInject_primitives() {
51     MembersInjectComponent component = DaggerMembersInjectComponent.builder().build();
52 
53     ChildOfPrimitiveIntArray childOfPrimitiveIntArray = new ChildOfPrimitiveIntArray();
54     component.inject(childOfPrimitiveIntArray);
55   }
56 
57   @Test
testMembersInject_overrides()58   public void testMembersInject_overrides() {
59     MembersInjectionVisibilityComponent component =
60         DaggerMembersInjectionVisibilityComponent.create();
61     AParent aParent = new AParent();
62     component.inject(aParent);
63     assertThat(aParent.aParentField()).isNotNull();
64     assertThat(aParent.aParentMethod()).isNotNull();
65 
66     BChild aChild = new BChild();
67     component.inject(aChild);
68     assertThat(aChild.aParentField()).isNotNull();
69     assertThat(aChild.aParentMethod()).isNull();
70     assertThat(aChild.aChildField()).isNotNull();
71     assertThat(aChild.aChildMethod()).isNotNull();
72 
73     AGrandchild aGrandchild = new AGrandchild();
74     component.inject(aGrandchild);
75     assertThat(aGrandchild.aParentField()).isNotNull();
76     assertThat(aGrandchild.aParentMethod()).isNotNull();
77     assertThat(aGrandchild.aChildField()).isNotNull();
78     assertThat(aGrandchild.aChildMethod()).isNull();
79     assertThat(aGrandchild.aGrandchildField()).isNotNull();
80     assertThat(aGrandchild.aGrandchildMethod()).isNotNull();
81   }
82 
83   @Test
testNonRequestedMembersInjector()84   public void testNonRequestedMembersInjector() {
85     NonRequestedChild child = new NonRequestedChild();
86     Provider<String> provider =
87         new Provider<String>() {
88           @Override
89           public String get() {
90             return "field!";
91           }
92         };
93     MembersInjector<NonRequestedChild> injector = new NonRequestedChild_MembersInjector(provider);
94     injector.injectMembers(child);
95     assertThat(child.t).isEqualTo("field!");
96   }
97 
98   public static final class A extends B {
99     // No injected members
100   }
101 
102   public static class B extends C {
103     // No injected members
104   }
105 
106   public static class C {
107     @Inject String value;
108   }
109 
110   @Component
111   interface NonLocalMembersComponent {
getAMembersInjector()112     MembersInjector<A> getAMembersInjector();
113 
114     @Component.Factory
115     interface Factory {
create(@indsInstance String value)116       NonLocalMembersComponent create(@BindsInstance String value);
117     }
118   }
119 
120   @Test
testNonLocalMembersInjection()121   public void testNonLocalMembersInjection() {
122     MembersInjector<A> membersInjector = DaggerMembersInjectTest_NonLocalMembersComponent.factory()
123         .create("test").getAMembersInjector();
124     A testA = new A();
125     membersInjector.injectMembers(testA);
126     assertThat(testA.value).isEqualTo("test");
127   }
128 }
129