1*f585d8a3SJacky Wang /* 2*f585d8a3SJacky Wang * Copyright (C) 2017 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 dagger.testing.compile.CompilerTests; 21*f585d8a3SJacky Wang import dagger.testing.golden.GoldenFileRule; 22*f585d8a3SJacky Wang import java.util.Collection; 23*f585d8a3SJacky Wang import org.junit.Rule; 24*f585d8a3SJacky Wang import org.junit.Test; 25*f585d8a3SJacky Wang import org.junit.runner.RunWith; 26*f585d8a3SJacky Wang import org.junit.runners.Parameterized; 27*f585d8a3SJacky Wang import org.junit.runners.Parameterized.Parameters; 28*f585d8a3SJacky Wang 29*f585d8a3SJacky Wang @RunWith(Parameterized.class) 30*f585d8a3SJacky Wang public class SetBindingRequestFulfillmentWithGuavaTest { 31*f585d8a3SJacky Wang @Parameters(name = "{0}") parameters()32*f585d8a3SJacky Wang public static Collection<Object[]> parameters() { 33*f585d8a3SJacky Wang return CompilerMode.TEST_PARAMETERS; 34*f585d8a3SJacky Wang } 35*f585d8a3SJacky Wang 36*f585d8a3SJacky Wang @Rule public GoldenFileRule goldenFileRule = new GoldenFileRule(); 37*f585d8a3SJacky Wang 38*f585d8a3SJacky Wang private final CompilerMode compilerMode; 39*f585d8a3SJacky Wang SetBindingRequestFulfillmentWithGuavaTest(CompilerMode compilerMode)40*f585d8a3SJacky Wang public SetBindingRequestFulfillmentWithGuavaTest(CompilerMode compilerMode) { 41*f585d8a3SJacky Wang this.compilerMode = compilerMode; 42*f585d8a3SJacky Wang } 43*f585d8a3SJacky Wang 44*f585d8a3SJacky Wang @Test setBindings()45*f585d8a3SJacky Wang public void setBindings() throws Exception { 46*f585d8a3SJacky Wang Source emptySetModuleFile = 47*f585d8a3SJacky Wang CompilerTests.javaSource( 48*f585d8a3SJacky Wang "test.EmptySetModule", 49*f585d8a3SJacky Wang "package test;", 50*f585d8a3SJacky Wang "", 51*f585d8a3SJacky Wang "import dagger.Module;", 52*f585d8a3SJacky Wang "import dagger.Provides;", 53*f585d8a3SJacky Wang "import dagger.multibindings.ElementsIntoSet;", 54*f585d8a3SJacky Wang "import dagger.multibindings.Multibinds;", 55*f585d8a3SJacky Wang "import java.util.Collections;", 56*f585d8a3SJacky Wang "import java.util.Set;", 57*f585d8a3SJacky Wang "", 58*f585d8a3SJacky Wang "@Module", 59*f585d8a3SJacky Wang "abstract class EmptySetModule {", 60*f585d8a3SJacky Wang " @Multibinds abstract Set<Object> objects();", 61*f585d8a3SJacky Wang "", 62*f585d8a3SJacky Wang " @Provides @ElementsIntoSet", 63*f585d8a3SJacky Wang " static Set<String> emptySet() { ", 64*f585d8a3SJacky Wang " return Collections.emptySet();", 65*f585d8a3SJacky Wang " }", 66*f585d8a3SJacky Wang " @Provides @ElementsIntoSet", 67*f585d8a3SJacky Wang " static Set<Integer> onlyContributionIsElementsIntoSet() { ", 68*f585d8a3SJacky Wang " return Collections.emptySet();", 69*f585d8a3SJacky Wang " }", 70*f585d8a3SJacky Wang "}"); 71*f585d8a3SJacky Wang Source setModuleFile = 72*f585d8a3SJacky Wang CompilerTests.javaSource( 73*f585d8a3SJacky Wang "test.SetModule", 74*f585d8a3SJacky Wang "package test;", 75*f585d8a3SJacky Wang "", 76*f585d8a3SJacky Wang "import dagger.Module;", 77*f585d8a3SJacky Wang "import dagger.Provides;", 78*f585d8a3SJacky Wang "import dagger.multibindings.IntoSet;", 79*f585d8a3SJacky Wang "", 80*f585d8a3SJacky Wang "@Module", 81*f585d8a3SJacky Wang "final class SetModule {", 82*f585d8a3SJacky Wang " @Provides @IntoSet static String string() { return \"\"; }", 83*f585d8a3SJacky Wang "}"); 84*f585d8a3SJacky Wang Source componentFile = 85*f585d8a3SJacky Wang CompilerTests.javaSource( 86*f585d8a3SJacky Wang "test.TestComponent", 87*f585d8a3SJacky Wang "package test;", 88*f585d8a3SJacky Wang "", 89*f585d8a3SJacky Wang "import dagger.Component;", 90*f585d8a3SJacky Wang "import java.util.Set;", 91*f585d8a3SJacky Wang "import javax.inject.Provider;", 92*f585d8a3SJacky Wang "", 93*f585d8a3SJacky Wang "@Component(modules = {EmptySetModule.class, SetModule.class})", 94*f585d8a3SJacky Wang "interface TestComponent {", 95*f585d8a3SJacky Wang " Set<String> strings();", 96*f585d8a3SJacky Wang " Set<Object> objects();", 97*f585d8a3SJacky Wang " Set<Integer> onlyContributionIsElementsIntoSet();", 98*f585d8a3SJacky Wang "}"); 99*f585d8a3SJacky Wang 100*f585d8a3SJacky Wang CompilerTests.daggerCompiler(emptySetModuleFile, setModuleFile, componentFile) 101*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 102*f585d8a3SJacky Wang .compile( 103*f585d8a3SJacky Wang subject -> { 104*f585d8a3SJacky Wang subject.hasErrorCount(0); 105*f585d8a3SJacky Wang subject.generatedSource( 106*f585d8a3SJacky Wang goldenFileRule.goldenSource("test/DaggerTestComponent")); 107*f585d8a3SJacky Wang }); 108*f585d8a3SJacky Wang } 109*f585d8a3SJacky Wang 110*f585d8a3SJacky Wang @Test inaccessible()111*f585d8a3SJacky Wang public void inaccessible() throws Exception { 112*f585d8a3SJacky Wang Source inaccessible = 113*f585d8a3SJacky Wang CompilerTests.javaSource( 114*f585d8a3SJacky Wang "other.Inaccessible", 115*f585d8a3SJacky Wang "package other;", 116*f585d8a3SJacky Wang "", 117*f585d8a3SJacky Wang "class Inaccessible {}"); 118*f585d8a3SJacky Wang Source inaccessible2 = 119*f585d8a3SJacky Wang CompilerTests.javaSource( 120*f585d8a3SJacky Wang "other.Inaccessible2", 121*f585d8a3SJacky Wang "package other;", 122*f585d8a3SJacky Wang "", 123*f585d8a3SJacky Wang "class Inaccessible2 {}"); 124*f585d8a3SJacky Wang Source usesInaccessible = 125*f585d8a3SJacky Wang CompilerTests.javaSource( 126*f585d8a3SJacky Wang "other.UsesInaccessible", 127*f585d8a3SJacky Wang "package other;", 128*f585d8a3SJacky Wang "", 129*f585d8a3SJacky Wang "import java.util.Set;", 130*f585d8a3SJacky Wang "import javax.inject.Inject;", 131*f585d8a3SJacky Wang "", 132*f585d8a3SJacky Wang "public class UsesInaccessible {", 133*f585d8a3SJacky Wang " @Inject UsesInaccessible(Set<Inaccessible> set1, Set<Inaccessible2> set2) {}", 134*f585d8a3SJacky Wang "}"); 135*f585d8a3SJacky Wang 136*f585d8a3SJacky Wang Source module = 137*f585d8a3SJacky Wang CompilerTests.javaSource( 138*f585d8a3SJacky Wang "other.TestModule", 139*f585d8a3SJacky Wang "package other;", 140*f585d8a3SJacky Wang "", 141*f585d8a3SJacky Wang "import dagger.Module;", 142*f585d8a3SJacky Wang "import dagger.Provides;", 143*f585d8a3SJacky Wang "import dagger.multibindings.ElementsIntoSet;", 144*f585d8a3SJacky Wang "import dagger.multibindings.Multibinds;", 145*f585d8a3SJacky Wang "import java.util.Collections;", 146*f585d8a3SJacky Wang "import java.util.Set;", 147*f585d8a3SJacky Wang "", 148*f585d8a3SJacky Wang "@Module", 149*f585d8a3SJacky Wang "public abstract class TestModule {", 150*f585d8a3SJacky Wang " @Multibinds abstract Set<Inaccessible> objects();", 151*f585d8a3SJacky Wang "", 152*f585d8a3SJacky Wang " @Provides @ElementsIntoSet", 153*f585d8a3SJacky Wang " static Set<Inaccessible2> emptySet() { ", 154*f585d8a3SJacky Wang " return Collections.emptySet();", 155*f585d8a3SJacky Wang " }", 156*f585d8a3SJacky Wang "}"); 157*f585d8a3SJacky Wang Source componentFile = 158*f585d8a3SJacky Wang CompilerTests.javaSource( 159*f585d8a3SJacky Wang "test.TestComponent", 160*f585d8a3SJacky Wang "package test;", 161*f585d8a3SJacky Wang "", 162*f585d8a3SJacky Wang "import dagger.Component;", 163*f585d8a3SJacky Wang "import java.util.Set;", 164*f585d8a3SJacky Wang "import javax.inject.Provider;", 165*f585d8a3SJacky Wang "import other.TestModule;", 166*f585d8a3SJacky Wang "import other.UsesInaccessible;", 167*f585d8a3SJacky Wang "", 168*f585d8a3SJacky Wang "@Component(modules = TestModule.class)", 169*f585d8a3SJacky Wang "interface TestComponent {", 170*f585d8a3SJacky Wang " UsesInaccessible usesInaccessible();", 171*f585d8a3SJacky Wang "}"); 172*f585d8a3SJacky Wang 173*f585d8a3SJacky Wang CompilerTests.daggerCompiler( 174*f585d8a3SJacky Wang module, inaccessible, inaccessible2, usesInaccessible, componentFile) 175*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 176*f585d8a3SJacky Wang .compile( 177*f585d8a3SJacky Wang subject -> { 178*f585d8a3SJacky Wang subject.hasErrorCount(0); 179*f585d8a3SJacky Wang subject.generatedSource( 180*f585d8a3SJacky Wang goldenFileRule.goldenSource("test/DaggerTestComponent")); 181*f585d8a3SJacky Wang }); 182*f585d8a3SJacky Wang } 183*f585d8a3SJacky Wang 184*f585d8a3SJacky Wang @Test subcomponentOmitsInheritedBindings()185*f585d8a3SJacky Wang public void subcomponentOmitsInheritedBindings() throws Exception { 186*f585d8a3SJacky Wang Source parent = 187*f585d8a3SJacky Wang CompilerTests.javaSource( 188*f585d8a3SJacky Wang "test.Parent", 189*f585d8a3SJacky Wang "package test;", 190*f585d8a3SJacky Wang "", 191*f585d8a3SJacky Wang "import dagger.Component;", 192*f585d8a3SJacky Wang "", 193*f585d8a3SJacky Wang "@Component(modules = ParentModule.class)", 194*f585d8a3SJacky Wang "interface Parent {", 195*f585d8a3SJacky Wang " Child child();", 196*f585d8a3SJacky Wang "}"); 197*f585d8a3SJacky Wang Source parentModule = 198*f585d8a3SJacky Wang CompilerTests.javaSource( 199*f585d8a3SJacky Wang "test.ParentModule", 200*f585d8a3SJacky Wang "package test;", 201*f585d8a3SJacky Wang "", 202*f585d8a3SJacky Wang "import dagger.Module;", 203*f585d8a3SJacky Wang "import dagger.Provides;", 204*f585d8a3SJacky Wang "import dagger.multibindings.IntoSet;", 205*f585d8a3SJacky Wang "import dagger.multibindings.StringKey;", 206*f585d8a3SJacky Wang "", 207*f585d8a3SJacky Wang "@Module", 208*f585d8a3SJacky Wang "class ParentModule {", 209*f585d8a3SJacky Wang " @Provides @IntoSet static Object parentObject() {", 210*f585d8a3SJacky Wang " return \"parent object\";", 211*f585d8a3SJacky Wang " }", 212*f585d8a3SJacky Wang "}"); 213*f585d8a3SJacky Wang Source child = 214*f585d8a3SJacky Wang CompilerTests.javaSource( 215*f585d8a3SJacky Wang "test.Child", 216*f585d8a3SJacky Wang "package test;", 217*f585d8a3SJacky Wang "", 218*f585d8a3SJacky Wang "import dagger.Subcomponent;", 219*f585d8a3SJacky Wang "import java.util.Set;", 220*f585d8a3SJacky Wang "", 221*f585d8a3SJacky Wang "@Subcomponent", 222*f585d8a3SJacky Wang "interface Child {", 223*f585d8a3SJacky Wang " Set<Object> objectSet();", 224*f585d8a3SJacky Wang "}"); 225*f585d8a3SJacky Wang 226*f585d8a3SJacky Wang CompilerTests.daggerCompiler(parent, parentModule, child) 227*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 228*f585d8a3SJacky Wang .compile( 229*f585d8a3SJacky Wang subject -> { 230*f585d8a3SJacky Wang subject.hasErrorCount(0); 231*f585d8a3SJacky Wang subject.generatedSource( 232*f585d8a3SJacky Wang goldenFileRule.goldenSource("test/DaggerParent")); 233*f585d8a3SJacky Wang }); 234*f585d8a3SJacky Wang } 235*f585d8a3SJacky Wang 236*f585d8a3SJacky Wang @Test productionComponents()237*f585d8a3SJacky Wang public void productionComponents() throws Exception { 238*f585d8a3SJacky Wang Source emptySetModuleFile = 239*f585d8a3SJacky Wang CompilerTests.javaSource( 240*f585d8a3SJacky Wang "test.EmptySetModule", 241*f585d8a3SJacky Wang "package test;", 242*f585d8a3SJacky Wang "", 243*f585d8a3SJacky Wang "import dagger.Module;", 244*f585d8a3SJacky Wang "import dagger.Provides;", 245*f585d8a3SJacky Wang "import dagger.multibindings.ElementsIntoSet;", 246*f585d8a3SJacky Wang "import java.util.Collections;", 247*f585d8a3SJacky Wang "import java.util.Set;", 248*f585d8a3SJacky Wang "", 249*f585d8a3SJacky Wang "@Module", 250*f585d8a3SJacky Wang "abstract class EmptySetModule {", 251*f585d8a3SJacky Wang " @Provides @ElementsIntoSet", 252*f585d8a3SJacky Wang " static Set<String> emptySet() { ", 253*f585d8a3SJacky Wang " return Collections.emptySet();", 254*f585d8a3SJacky Wang " }", 255*f585d8a3SJacky Wang "}"); 256*f585d8a3SJacky Wang Source componentFile = 257*f585d8a3SJacky Wang CompilerTests.javaSource( 258*f585d8a3SJacky Wang "test.TestComponent", 259*f585d8a3SJacky Wang "package test;", 260*f585d8a3SJacky Wang "", 261*f585d8a3SJacky Wang "import com.google.common.util.concurrent.ListenableFuture;", 262*f585d8a3SJacky Wang "import dagger.producers.ProductionComponent;", 263*f585d8a3SJacky Wang "import java.util.Set;", 264*f585d8a3SJacky Wang "", 265*f585d8a3SJacky Wang "@ProductionComponent(modules = EmptySetModule.class)", 266*f585d8a3SJacky Wang "interface TestComponent {", 267*f585d8a3SJacky Wang " ListenableFuture<Set<String>> strings();", 268*f585d8a3SJacky Wang "}"); 269*f585d8a3SJacky Wang 270*f585d8a3SJacky Wang CompilerTests.daggerCompiler(emptySetModuleFile, componentFile) 271*f585d8a3SJacky Wang .withProcessingOptions(compilerMode.processorOptions()) 272*f585d8a3SJacky Wang .compile( 273*f585d8a3SJacky Wang subject -> { 274*f585d8a3SJacky Wang subject.hasErrorCount(0); 275*f585d8a3SJacky Wang subject.generatedSource( 276*f585d8a3SJacky Wang goldenFileRule.goldenSource("test/DaggerTestComponent")); 277*f585d8a3SJacky Wang }); 278*f585d8a3SJacky Wang } 279*f585d8a3SJacky Wang } 280