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