1 /* 2 * Copyright (C) 2023 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.assisted 18 19 import com.google.common.truth.Truth.assertThat 20 import dagger.Component 21 import dagger.assisted.Assisted 22 import dagger.assisted.AssistedFactory 23 import dagger.assisted.AssistedInject 24 import org.junit.Test 25 import org.junit.runner.RunWith 26 import org.junit.runners.JUnit4 27 28 // See https://github.com/google/dagger/issues/2281 29 @RunWith(JUnit4::class) 30 internal class AssistedFactoryWithQualifiedTypesTest { 31 @Component 32 interface TestComponent { 33 // Test a factory with duplicate types with unique qualifiers. dupeTypeFactorynull34 fun dupeTypeFactory(): DupeTypeFactory 35 36 // Test a factory with duplicate qualifiers with unique types. 37 fun dupeQualifierFactory(): DupeQualifierFactory 38 39 // Test a factory with unnecessary qualifiers on the factory. 40 fun unnecessaryQualifierFactory(): UnnecessaryQualifierFactory 41 42 // Test a factory with different parameter order than the constructor. 43 fun swappedDupeTypeFactory(): SwappedDupeTypeFactory 44 } 45 46 class DupeType 47 @AssistedInject 48 constructor(@Assisted("1") val str1: String, @Assisted("2") val str2: String) 49 50 @AssistedFactory 51 interface DupeTypeFactory { 52 fun create(@Assisted("1") str1: String, @Assisted("2") str2: String): DupeType 53 } 54 55 @Test testDupeTypeFactorynull56 fun testDupeTypeFactory() { 57 val str1 = "str1" 58 val str2 = "str2" 59 val dupeType: DupeType = 60 DaggerAssistedFactoryWithQualifiedTypesTest_TestComponent.create() 61 .dupeTypeFactory() 62 .create(str1, str2) 63 assertThat(dupeType.str1).isEqualTo(str1) 64 assertThat(dupeType.str2).isEqualTo(str2) 65 } 66 67 @AssistedFactory 68 interface SwappedDupeTypeFactory { createnull69 fun create(@Assisted("2") str2: String, @Assisted("1") str1: String): DupeType 70 } 71 72 @Test 73 fun testSwappedDupeTypeFactory() { 74 val str1 = "str1" 75 val str2 = "str2" 76 val dupeType: DupeType = 77 DaggerAssistedFactoryWithQualifiedTypesTest_TestComponent.create() 78 .swappedDupeTypeFactory() 79 .create(str2, str1) 80 assertThat(dupeType.str1).isEqualTo(str1) 81 assertThat(dupeType.str2).isEqualTo(str2) 82 } 83 84 class DupeQualifier 85 @AssistedInject 86 constructor(@Assisted("1") val str: String, @Assisted("1") val i: Int) 87 88 @AssistedFactory 89 interface DupeQualifierFactory { createnull90 fun create(@Assisted("1") str: String, @Assisted("1") i: Int): DupeQualifier 91 } 92 93 @Test 94 fun testDupeQualifierFactory() { 95 val str = "str" 96 val i = 11 97 val dupeQualifier = 98 DaggerAssistedFactoryWithQualifiedTypesTest_TestComponent.create() 99 .dupeQualifierFactory() 100 .create(str, i) 101 assertThat(dupeQualifier.str).isEqualTo(str) 102 assertThat(dupeQualifier.i).isEqualTo(i) 103 } 104 105 class UnnecessaryQualifier 106 @AssistedInject 107 constructor(@Assisted val str: String, @Assisted val d: Double, @Assisted("") val i: Int) 108 109 @AssistedFactory 110 interface UnnecessaryQualifierFactory { createnull111 fun create(@Assisted i: Int, @Assisted("") str: String, d: Double): UnnecessaryQualifier 112 } 113 114 @Test 115 fun testUnnecessaryQualifierFactory() { 116 val str = "str" 117 val d = 2.2 118 val i = 11 119 val unnecessaryQualifier = 120 DaggerAssistedFactoryWithQualifiedTypesTest_TestComponent.create() 121 .unnecessaryQualifierFactory() 122 .create(i, str, d) 123 assertThat(unnecessaryQualifier.str).isEqualTo(str) 124 assertThat(unnecessaryQualifier.d).isEqualTo(d) 125 assertThat(unnecessaryQualifier.i).isEqualTo(i) 126 } 127 } 128