/* * Copyright (C) 2017 The Dagger Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package dagger.internal.codegen; import static com.google.testing.compile.CompilationSubject.assertThat; import static dagger.internal.codegen.Compilers.compilerWithOptions; import com.google.common.collect.ImmutableList; import com.google.testing.compile.Compilation; import com.google.testing.compile.JavaFileObjects; import dagger.testing.golden.GoldenFileRule; import java.util.Collection; import javax.tools.JavaFileObject; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) public class OptionalBindingRequestFulfillmentTest { @Parameters(name = "{0}") public static Collection parameters() { return ImmutableList.copyOf( new Object[][] { {CompilerMode.DEFAULT_MODE}, {CompilerMode.DEFAULT_JAVA7_MODE}, {CompilerMode.FAST_INIT_MODE}, {CompilerMode.FAST_INIT_JAVA7_MODE} }); } @Rule public GoldenFileRule goldenFileRule = new GoldenFileRule(); private final CompilerMode compilerMode; public OptionalBindingRequestFulfillmentTest(CompilerMode compilerMode) { this.compilerMode = compilerMode; } @Test public void inlinedOptionalBindings() throws Exception { JavaFileObject module = JavaFileObjects.forSourceLines( "test.TestModule", "package test;", "", "import dagger.Module;", "import dagger.BindsOptionalOf;", "import other.Maybe;", "import other.DefinitelyNot;", "", "@Module", "interface TestModule {", " @BindsOptionalOf Maybe maybe();", " @BindsOptionalOf DefinitelyNot definitelyNot();", "}"); JavaFileObject maybe = JavaFileObjects.forSourceLines( "other.Maybe", "package other;", "", "import dagger.Module;", "import dagger.Provides;", "", "public class Maybe {", " @Module", " public static class MaybeModule {", " @Provides static Maybe provideMaybe() { return new Maybe(); }", " }", "}"); JavaFileObject definitelyNot = JavaFileObjects.forSourceLines( "other.DefinitelyNot", "package other;", "", "public class DefinitelyNot {}"); JavaFileObject component = JavaFileObjects.forSourceLines( "test.TestComponent", "package test;", "", "import com.google.common.base.Optional;", "import dagger.Component;", "import dagger.Lazy;", "import javax.inject.Provider;", "import other.Maybe;", "import other.DefinitelyNot;", "", "@Component(modules = {TestModule.class, Maybe.MaybeModule.class})", "interface TestComponent {", " Optional maybe();", " Optional>> providerOfLazyOfMaybe();", " Optional definitelyNot();", " Optional>> providerOfLazyOfDefinitelyNot();", "}"); Compilation compilation = compilerWithOptions(compilerMode) .compile(module, maybe, definitelyNot, component); assertThat(compilation).succeeded(); assertThat(compilation) .generatedSourceFile("test.DaggerTestComponent") .hasSourceEquivalentTo(goldenFileRule.goldenFile("test.DaggerTestComponent")); } @Test public void requestForFuture() throws Exception { JavaFileObject module = JavaFileObjects.forSourceLines( "test.TestModule", "package test;", "", "import dagger.Module;", "import dagger.BindsOptionalOf;", "import other.Maybe;", "import other.DefinitelyNot;", "", "@Module", "interface TestModule {", " @BindsOptionalOf Maybe maybe();", " @BindsOptionalOf DefinitelyNot definitelyNot();", "}"); JavaFileObject maybe = JavaFileObjects.forSourceLines( "other.Maybe", "package other;", "", "import dagger.Module;", "import dagger.Provides;", "", "public class Maybe {", " @Module", " public static class MaybeModule {", " @Provides static Maybe provideMaybe() { return new Maybe(); }", " }", "}"); JavaFileObject definitelyNot = JavaFileObjects.forSourceLines( "other.DefinitelyNot", "package other;", "", "public class DefinitelyNot {}"); JavaFileObject component = JavaFileObjects.forSourceLines( "test.TestComponent", "package test;", "", "import com.google.common.base.Optional;", "import com.google.common.util.concurrent.ListenableFuture;", "import dagger.producers.ProductionComponent;", "import javax.inject.Provider;", "import other.Maybe;", "import other.DefinitelyNot;", "", "@ProductionComponent(modules = {TestModule.class, Maybe.MaybeModule.class})", "interface TestComponent {", " ListenableFuture> maybe();", " ListenableFuture> definitelyNot();", "}"); Compilation compilation = compilerWithOptions(compilerMode).compile(module, maybe, definitelyNot, component); assertThat(compilation).succeeded(); assertThat(compilation) .generatedSourceFile("test.DaggerTestComponent") .hasSourceEquivalentTo(goldenFileRule.goldenFile("test.DaggerTestComponent")); } }