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