1 /* 2 * Copyright (C) 2022 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.kotlinsrc.membersinject 18 19 import com.google.common.truth.Truth.assertThat 20 import dagger.BindsInstance 21 import dagger.Component 22 import dagger.MembersInjector 23 import dagger.functional.kotlinsrc.membersinject.subpackage.a.AGrandchild 24 import dagger.functional.kotlinsrc.membersinject.subpackage.a.AParent 25 import dagger.functional.kotlinsrc.membersinject.subpackage.b.BChild 26 import dagger.internal.Provider 27 import javax.inject.Inject 28 import org.junit.Test 29 import org.junit.runner.RunWith 30 import org.junit.runners.JUnit4 31 32 @RunWith(JUnit4::class) 33 class MembersInjectTest { 34 @Test testMembersInject_arraysnull35 fun testMembersInject_arrays() { 36 val component = DaggerMembersInjectComponent.builder().build() 37 val childOfStringArray = ChildOfStringArray() 38 component.inject(childOfStringArray) 39 } 40 41 @Test testMembersInject_nestedArraysnull42 fun testMembersInject_nestedArrays() { 43 val component = DaggerMembersInjectComponent.builder().build() 44 val childOfArrayOfParentOfStringArray = ChildOfArrayOfParentOfStringArray() 45 component.inject(childOfArrayOfParentOfStringArray) 46 } 47 48 @Test testMembersInject_primitivesnull49 fun testMembersInject_primitives() { 50 val component = DaggerMembersInjectComponent.builder().build() 51 val childOfPrimitiveIntArray = ChildOfPrimitiveIntArray() 52 component.inject(childOfPrimitiveIntArray) 53 } 54 55 @Test testMembersInject_overridesnull56 fun testMembersInject_overrides() { 57 val component = DaggerMembersInjectionVisibilityComponent.create() 58 val aParent = AParent() 59 component.inject(aParent) 60 assertThat(aParent.aParentField()).isNotNull() 61 assertThat(aParent.aParentMethod()).isNotNull() 62 val aChild = BChild() 63 component.inject(aChild) 64 assertThat(aChild.aParentField()).isNotNull() 65 assertThat(aChild.aParentMethod()).isNull() 66 assertThat(aChild.aChildField()).isNotNull() 67 assertThat(aChild.aChildMethod()).isNotNull() 68 val aGrandchild = AGrandchild() 69 component.inject(aGrandchild) 70 assertThat(aGrandchild.aParentField()).isNotNull() 71 assertThat(aGrandchild.aParentMethod()).isNotNull() 72 assertThat(aGrandchild.aChildField()).isNotNull() 73 assertThat(aGrandchild.aChildMethod()).isNull() 74 assertThat(aGrandchild.aGrandchildField()).isNotNull() 75 assertThat(aGrandchild.aGrandchildMethod()).isNotNull() 76 } 77 78 @Test testNonRequestedMembersInjectornull79 fun testNonRequestedMembersInjector() { 80 val child = NonRequestedChild() 81 val provider = Provider { "field!" } 82 val injector = NonRequestedChild_MembersInjector(provider) 83 injector.injectMembers(child) 84 assertThat(child.t).isEqualTo("field!") 85 } 86 87 class A : B() // No injected members 88 89 open class B : C() // No injected members 90 91 open class C { 92 @Inject lateinit var value: String 93 } 94 95 @Component 96 internal interface NonLocalMembersComponent { aMembersInjectornull97 fun aMembersInjector(): MembersInjector<A> 98 99 @Component.Factory 100 interface Factory { 101 fun create(@BindsInstance value: String): NonLocalMembersComponent 102 } 103 } 104 105 @Test testNonLocalMembersInjectionnull106 fun testNonLocalMembersInjection() { 107 val membersInjector = 108 DaggerMembersInjectTest_NonLocalMembersComponent.factory().create("test").aMembersInjector() 109 val testA = A() 110 membersInjector.injectMembers(testA) 111 assertThat(testA.value).isEqualTo("test") 112 } 113 } 114