1*f585d8a3SJacky Wang /* 2*f585d8a3SJacky Wang * Copyright (C) 2018 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.internal.codegen; 18*f585d8a3SJacky Wang 19*f585d8a3SJacky Wang import androidx.room.compiler.processing.util.Source; 20*f585d8a3SJacky Wang import com.google.common.collect.ImmutableList; 21*f585d8a3SJacky Wang import dagger.testing.compile.CompilerTests; 22*f585d8a3SJacky Wang import org.junit.Test; 23*f585d8a3SJacky Wang import org.junit.runner.RunWith; 24*f585d8a3SJacky Wang import org.junit.runners.Parameterized; 25*f585d8a3SJacky Wang import org.junit.runners.Parameterized.Parameters; 26*f585d8a3SJacky Wang 27*f585d8a3SJacky Wang @RunWith(Parameterized.class) 28*f585d8a3SJacky Wang public class ConflictingEntryPointsTest { 29*f585d8a3SJacky Wang @Parameters(name = "{0}") parameters()30*f585d8a3SJacky Wang public static ImmutableList<Object[]> parameters() { 31*f585d8a3SJacky Wang return CompilerMode.TEST_PARAMETERS; 32*f585d8a3SJacky Wang } 33*f585d8a3SJacky Wang 34*f585d8a3SJacky Wang private final CompilerMode compilerMode; 35*f585d8a3SJacky Wang ConflictingEntryPointsTest(CompilerMode compilerMode)36*f585d8a3SJacky Wang public ConflictingEntryPointsTest(CompilerMode compilerMode) { 37*f585d8a3SJacky Wang this.compilerMode = compilerMode; 38*f585d8a3SJacky Wang } 39*f585d8a3SJacky Wang 40*f585d8a3SJacky Wang @Test covariantType()41*f585d8a3SJacky Wang public void covariantType() { 42*f585d8a3SJacky Wang Source base1 = 43*f585d8a3SJacky Wang CompilerTests.javaSource( 44*f585d8a3SJacky Wang "test.Base1", // 45*f585d8a3SJacky Wang "package test;", 46*f585d8a3SJacky Wang "", 47*f585d8a3SJacky Wang "interface Base1 {", 48*f585d8a3SJacky Wang " Long foo();", 49*f585d8a3SJacky Wang "}"); 50*f585d8a3SJacky Wang Source base2 = 51*f585d8a3SJacky Wang CompilerTests.javaSource( 52*f585d8a3SJacky Wang "test.Base2", // 53*f585d8a3SJacky Wang "package test;", 54*f585d8a3SJacky Wang "", 55*f585d8a3SJacky Wang "interface Base2 {", 56*f585d8a3SJacky Wang " Number foo();", 57*f585d8a3SJacky Wang "}"); 58*f585d8a3SJacky Wang Source component = 59*f585d8a3SJacky Wang CompilerTests.javaSource( 60*f585d8a3SJacky Wang "test.TestComponent", 61*f585d8a3SJacky Wang "package test;", 62*f585d8a3SJacky Wang "", 63*f585d8a3SJacky Wang "import dagger.BindsInstance;", 64*f585d8a3SJacky Wang "import dagger.Component;", 65*f585d8a3SJacky Wang "", 66*f585d8a3SJacky Wang "@Component", 67*f585d8a3SJacky Wang "interface TestComponent extends Base1, Base2 {", 68*f585d8a3SJacky Wang "", 69*f585d8a3SJacky Wang " @Component.Builder", 70*f585d8a3SJacky Wang " interface Builder {", 71*f585d8a3SJacky Wang " @BindsInstance Builder foo(Long foo);", 72*f585d8a3SJacky Wang " @BindsInstance Builder foo(Number foo);", 73*f585d8a3SJacky Wang " TestComponent build();", 74*f585d8a3SJacky Wang " }", 75*f585d8a3SJacky Wang "}"); 76*f585d8a3SJacky Wang CompilerTests.daggerCompiler(base1, base2, component) 77*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 78*f585d8a3SJacky Wang .compile( 79*f585d8a3SJacky Wang subject -> { 80*f585d8a3SJacky Wang subject.hasErrorCount(1); 81*f585d8a3SJacky Wang subject.hasErrorContaining( 82*f585d8a3SJacky Wang String.join( 83*f585d8a3SJacky Wang "\n", 84*f585d8a3SJacky Wang "can only implement the method once. Found:", 85*f585d8a3SJacky Wang " Long test.Base1.foo()", 86*f585d8a3SJacky Wang " Number test.Base2.foo()")) 87*f585d8a3SJacky Wang .onSource(component) 88*f585d8a3SJacky Wang .onLineContaining("interface TestComponent"); 89*f585d8a3SJacky Wang }); 90*f585d8a3SJacky Wang } 91*f585d8a3SJacky Wang 92*f585d8a3SJacky Wang @Test covariantTypeFromGenericSupertypes()93*f585d8a3SJacky Wang public void covariantTypeFromGenericSupertypes() { 94*f585d8a3SJacky Wang Source base1 = 95*f585d8a3SJacky Wang CompilerTests.javaSource( 96*f585d8a3SJacky Wang "test.Base1", // 97*f585d8a3SJacky Wang "package test;", 98*f585d8a3SJacky Wang "", 99*f585d8a3SJacky Wang "interface Base1<T> {", 100*f585d8a3SJacky Wang " T foo();", 101*f585d8a3SJacky Wang "}"); 102*f585d8a3SJacky Wang Source base2 = 103*f585d8a3SJacky Wang CompilerTests.javaSource( 104*f585d8a3SJacky Wang "test.Base2", // 105*f585d8a3SJacky Wang "package test;", 106*f585d8a3SJacky Wang "", 107*f585d8a3SJacky Wang "interface Base2<T> {", 108*f585d8a3SJacky Wang " T foo();", 109*f585d8a3SJacky Wang "}"); 110*f585d8a3SJacky Wang Source component = 111*f585d8a3SJacky Wang CompilerTests.javaSource( 112*f585d8a3SJacky Wang "test.TestComponent", 113*f585d8a3SJacky Wang "package test;", 114*f585d8a3SJacky Wang "", 115*f585d8a3SJacky Wang "import dagger.BindsInstance;", 116*f585d8a3SJacky Wang "import dagger.Component;", 117*f585d8a3SJacky Wang "", 118*f585d8a3SJacky Wang "@Component", 119*f585d8a3SJacky Wang "interface TestComponent extends Base1<Long>, Base2<Number> {", 120*f585d8a3SJacky Wang "", 121*f585d8a3SJacky Wang " @Component.Builder", 122*f585d8a3SJacky Wang " interface Builder {", 123*f585d8a3SJacky Wang " @BindsInstance Builder foo(Long foo);", 124*f585d8a3SJacky Wang " @BindsInstance Builder foo(Number foo);", 125*f585d8a3SJacky Wang " TestComponent build();", 126*f585d8a3SJacky Wang " }", 127*f585d8a3SJacky Wang "}"); 128*f585d8a3SJacky Wang CompilerTests.daggerCompiler(base1, base2, component) 129*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 130*f585d8a3SJacky Wang .compile( 131*f585d8a3SJacky Wang subject -> { 132*f585d8a3SJacky Wang subject.hasErrorCount(1); 133*f585d8a3SJacky Wang subject.hasErrorContaining( 134*f585d8a3SJacky Wang String.join( 135*f585d8a3SJacky Wang "\n", 136*f585d8a3SJacky Wang "can only implement the method once. Found:", 137*f585d8a3SJacky Wang " Long test.Base1.foo()", 138*f585d8a3SJacky Wang " Number test.Base2.foo()")) 139*f585d8a3SJacky Wang .onSource(component) 140*f585d8a3SJacky Wang .onLineContaining("interface TestComponent"); 141*f585d8a3SJacky Wang }); 142*f585d8a3SJacky Wang } 143*f585d8a3SJacky Wang 144*f585d8a3SJacky Wang @Test differentQualifier()145*f585d8a3SJacky Wang public void differentQualifier() { 146*f585d8a3SJacky Wang Source base1 = 147*f585d8a3SJacky Wang CompilerTests.javaSource( 148*f585d8a3SJacky Wang "test.Base1", // 149*f585d8a3SJacky Wang "package test;", 150*f585d8a3SJacky Wang "", 151*f585d8a3SJacky Wang "interface Base1 {", 152*f585d8a3SJacky Wang " Object foo();", 153*f585d8a3SJacky Wang "}"); 154*f585d8a3SJacky Wang Source base2 = 155*f585d8a3SJacky Wang CompilerTests.javaSource( 156*f585d8a3SJacky Wang "test.Base2", // 157*f585d8a3SJacky Wang "package test;", 158*f585d8a3SJacky Wang "", 159*f585d8a3SJacky Wang "import javax.inject.Named;", 160*f585d8a3SJacky Wang "", 161*f585d8a3SJacky Wang "interface Base2 {", 162*f585d8a3SJacky Wang " @Named(\"foo\") Object foo();", 163*f585d8a3SJacky Wang "}"); 164*f585d8a3SJacky Wang Source component = 165*f585d8a3SJacky Wang CompilerTests.javaSource( 166*f585d8a3SJacky Wang "test.TestComponent", 167*f585d8a3SJacky Wang "package test;", 168*f585d8a3SJacky Wang "", 169*f585d8a3SJacky Wang "import dagger.BindsInstance;", 170*f585d8a3SJacky Wang "import dagger.Component;", 171*f585d8a3SJacky Wang "import javax.inject.Named;", 172*f585d8a3SJacky Wang "", 173*f585d8a3SJacky Wang "@Component", 174*f585d8a3SJacky Wang "interface TestComponent extends Base1, Base2 {", 175*f585d8a3SJacky Wang "", 176*f585d8a3SJacky Wang " @Component.Builder", 177*f585d8a3SJacky Wang " interface Builder {", 178*f585d8a3SJacky Wang " @BindsInstance Builder foo(Object foo);", 179*f585d8a3SJacky Wang " @BindsInstance Builder namedFoo(@Named(\"foo\") Object foo);", 180*f585d8a3SJacky Wang " TestComponent build();", 181*f585d8a3SJacky Wang " }", 182*f585d8a3SJacky Wang "}"); 183*f585d8a3SJacky Wang CompilerTests.daggerCompiler(base1, base2, component) 184*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 185*f585d8a3SJacky Wang .compile( 186*f585d8a3SJacky Wang subject -> { 187*f585d8a3SJacky Wang subject.hasErrorCount(1); 188*f585d8a3SJacky Wang subject.hasErrorContaining( 189*f585d8a3SJacky Wang String.join( 190*f585d8a3SJacky Wang "\n", 191*f585d8a3SJacky Wang "can only implement the method once. Found:", 192*f585d8a3SJacky Wang " Object test.Base1.foo()", 193*f585d8a3SJacky Wang " @Named(\"foo\") Object test.Base2.foo()")) 194*f585d8a3SJacky Wang .onSource(component) 195*f585d8a3SJacky Wang .onLineContaining("interface TestComponent"); 196*f585d8a3SJacky Wang }); 197*f585d8a3SJacky Wang } 198*f585d8a3SJacky Wang 199*f585d8a3SJacky Wang @Test sameKey()200*f585d8a3SJacky Wang public void sameKey() { 201*f585d8a3SJacky Wang Source base1 = 202*f585d8a3SJacky Wang CompilerTests.javaSource( 203*f585d8a3SJacky Wang "test.Base1", // 204*f585d8a3SJacky Wang "package test;", 205*f585d8a3SJacky Wang "", 206*f585d8a3SJacky Wang "interface Base1 {", 207*f585d8a3SJacky Wang " Object foo();", 208*f585d8a3SJacky Wang "}"); 209*f585d8a3SJacky Wang Source base2 = 210*f585d8a3SJacky Wang CompilerTests.javaSource( 211*f585d8a3SJacky Wang "test.Base2", // 212*f585d8a3SJacky Wang "package test;", 213*f585d8a3SJacky Wang "", 214*f585d8a3SJacky Wang "interface Base2 {", 215*f585d8a3SJacky Wang " Object foo();", 216*f585d8a3SJacky Wang "}"); 217*f585d8a3SJacky Wang Source component = 218*f585d8a3SJacky Wang CompilerTests.javaSource( 219*f585d8a3SJacky Wang "test.TestComponent", 220*f585d8a3SJacky Wang "package test;", 221*f585d8a3SJacky Wang "", 222*f585d8a3SJacky Wang "import dagger.BindsInstance;", 223*f585d8a3SJacky Wang "import dagger.Component;", 224*f585d8a3SJacky Wang "", 225*f585d8a3SJacky Wang "@Component", 226*f585d8a3SJacky Wang "interface TestComponent extends Base1, Base2 {", 227*f585d8a3SJacky Wang "", 228*f585d8a3SJacky Wang " @Component.Builder", 229*f585d8a3SJacky Wang " interface Builder {", 230*f585d8a3SJacky Wang " @BindsInstance Builder foo(Object foo);", 231*f585d8a3SJacky Wang " TestComponent build();", 232*f585d8a3SJacky Wang " }", 233*f585d8a3SJacky Wang "}"); 234*f585d8a3SJacky Wang CompilerTests.daggerCompiler(base1, base2, component) 235*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 236*f585d8a3SJacky Wang .compile(subject -> subject.hasErrorCount(0)); 237*f585d8a3SJacky Wang } 238*f585d8a3SJacky Wang 239*f585d8a3SJacky Wang @Test sameQualifiedKey()240*f585d8a3SJacky Wang public void sameQualifiedKey() { 241*f585d8a3SJacky Wang Source base1 = 242*f585d8a3SJacky Wang CompilerTests.javaSource( 243*f585d8a3SJacky Wang "test.Base1", // 244*f585d8a3SJacky Wang "package test;", 245*f585d8a3SJacky Wang "", 246*f585d8a3SJacky Wang "import javax.inject.Named;", 247*f585d8a3SJacky Wang "", 248*f585d8a3SJacky Wang "interface Base1 {", 249*f585d8a3SJacky Wang " @Named(\"foo\") Object foo();", 250*f585d8a3SJacky Wang "}"); 251*f585d8a3SJacky Wang Source base2 = 252*f585d8a3SJacky Wang CompilerTests.javaSource( 253*f585d8a3SJacky Wang "test.Base2", // 254*f585d8a3SJacky Wang "package test;", 255*f585d8a3SJacky Wang "", 256*f585d8a3SJacky Wang "import javax.inject.Named;", 257*f585d8a3SJacky Wang "", 258*f585d8a3SJacky Wang "interface Base2 {", 259*f585d8a3SJacky Wang " @Named(\"foo\") Object foo();", 260*f585d8a3SJacky Wang "}"); 261*f585d8a3SJacky Wang Source component = 262*f585d8a3SJacky Wang CompilerTests.javaSource( 263*f585d8a3SJacky Wang "test.TestComponent", 264*f585d8a3SJacky Wang "package test;", 265*f585d8a3SJacky Wang "", 266*f585d8a3SJacky Wang "import dagger.BindsInstance;", 267*f585d8a3SJacky Wang "import dagger.Component;", 268*f585d8a3SJacky Wang "import javax.inject.Named;", 269*f585d8a3SJacky Wang "", 270*f585d8a3SJacky Wang "@Component", 271*f585d8a3SJacky Wang "interface TestComponent extends Base1, Base2 {", 272*f585d8a3SJacky Wang "", 273*f585d8a3SJacky Wang " @Component.Builder", 274*f585d8a3SJacky Wang " interface Builder {", 275*f585d8a3SJacky Wang " @BindsInstance Builder foo(@Named(\"foo\") Object foo);", 276*f585d8a3SJacky Wang " TestComponent build();", 277*f585d8a3SJacky Wang " }", 278*f585d8a3SJacky Wang "}"); 279*f585d8a3SJacky Wang CompilerTests.daggerCompiler(base1, base2, component) 280*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 281*f585d8a3SJacky Wang .compile(subject -> subject.hasErrorCount(0)); 282*f585d8a3SJacky Wang } 283*f585d8a3SJacky Wang } 284