1 /* 2 * Copyright (C) 2017 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.internal.codegen; 18 19 import static com.google.testing.compile.CompilationSubject.assertThat; 20 import static dagger.internal.codegen.Compilers.compilerWithOptions; 21 22 import com.google.common.collect.ImmutableList; 23 import com.google.testing.compile.Compilation; 24 import com.google.testing.compile.JavaFileObjects; 25 import dagger.testing.golden.GoldenFileRule; 26 import javax.tools.JavaFileObject; 27 import org.junit.Rule; 28 import org.junit.Test; 29 import org.junit.runner.RunWith; 30 import org.junit.runners.Parameterized; 31 import org.junit.runners.Parameterized.Parameters; 32 33 @RunWith(Parameterized.class) 34 public class OptionalBindingRequestFulfillmentTest { 35 @Parameters(name = "{0}") parameters()36 public static ImmutableList<Object[]> parameters() { 37 return CompilerMode.TEST_PARAMETERS; 38 } 39 40 @Rule public GoldenFileRule goldenFileRule = new GoldenFileRule(); 41 42 private final CompilerMode compilerMode; 43 OptionalBindingRequestFulfillmentTest(CompilerMode compilerMode)44 public OptionalBindingRequestFulfillmentTest(CompilerMode compilerMode) { 45 this.compilerMode = compilerMode; 46 } 47 48 @Test inlinedOptionalBindings()49 public void inlinedOptionalBindings() throws Exception { 50 JavaFileObject module = 51 JavaFileObjects.forSourceLines( 52 "test.TestModule", 53 "package test;", 54 "", 55 "import dagger.Module;", 56 "import dagger.BindsOptionalOf;", 57 "import other.Maybe;", 58 "import other.DefinitelyNot;", 59 "", 60 "@Module", 61 "interface TestModule {", 62 " @BindsOptionalOf Maybe maybe();", 63 " @BindsOptionalOf DefinitelyNot definitelyNot();", 64 "}"); 65 JavaFileObject maybe = 66 JavaFileObjects.forSourceLines( 67 "other.Maybe", 68 "package other;", 69 "", 70 "import dagger.Module;", 71 "import dagger.Provides;", 72 "", 73 "public class Maybe {", 74 " @Module", 75 " public static class MaybeModule {", 76 " @Provides static Maybe provideMaybe() { return new Maybe(); }", 77 " }", 78 "}"); 79 JavaFileObject definitelyNot = 80 JavaFileObjects.forSourceLines( 81 "other.DefinitelyNot", 82 "package other;", 83 "", 84 "public class DefinitelyNot {}"); 85 86 JavaFileObject component = 87 JavaFileObjects.forSourceLines( 88 "test.TestComponent", 89 "package test;", 90 "", 91 "import com.google.common.base.Optional;", 92 "import dagger.Component;", 93 "import dagger.Lazy;", 94 "import javax.inject.Provider;", 95 "import other.Maybe;", 96 "import other.DefinitelyNot;", 97 "", 98 "@Component(modules = {TestModule.class, Maybe.MaybeModule.class})", 99 "interface TestComponent {", 100 " Optional<Maybe> maybe();", 101 " Optional<Provider<Lazy<Maybe>>> providerOfLazyOfMaybe();", 102 " Optional<DefinitelyNot> definitelyNot();", 103 " Optional<Provider<Lazy<DefinitelyNot>>> providerOfLazyOfDefinitelyNot();", 104 "}"); 105 106 Compilation compilation = 107 compilerWithOptions(compilerMode) 108 .compile(module, maybe, definitelyNot, component); 109 assertThat(compilation).succeeded(); 110 assertThat(compilation) 111 .generatedSourceFile("test.DaggerTestComponent") 112 .hasSourceEquivalentTo(goldenFileRule.goldenFile("test.DaggerTestComponent")); 113 } 114 115 @Test requestForFuture()116 public void requestForFuture() throws Exception { 117 JavaFileObject module = 118 JavaFileObjects.forSourceLines( 119 "test.TestModule", 120 "package test;", 121 "", 122 "import dagger.Module;", 123 "import dagger.BindsOptionalOf;", 124 "import other.Maybe;", 125 "import other.DefinitelyNot;", 126 "", 127 "@Module", 128 "interface TestModule {", 129 " @BindsOptionalOf Maybe maybe();", 130 " @BindsOptionalOf DefinitelyNot definitelyNot();", 131 "}"); 132 JavaFileObject maybe = 133 JavaFileObjects.forSourceLines( 134 "other.Maybe", 135 "package other;", 136 "", 137 "import dagger.Module;", 138 "import dagger.Provides;", 139 "", 140 "public class Maybe {", 141 " @Module", 142 " public static class MaybeModule {", 143 " @Provides static Maybe provideMaybe() { return new Maybe(); }", 144 " }", 145 "}"); 146 JavaFileObject definitelyNot = 147 JavaFileObjects.forSourceLines( 148 "other.DefinitelyNot", 149 "package other;", 150 "", 151 "public class DefinitelyNot {}"); 152 153 JavaFileObject component = 154 JavaFileObjects.forSourceLines( 155 "test.TestComponent", 156 "package test;", 157 "", 158 "import com.google.common.base.Optional;", 159 "import com.google.common.util.concurrent.ListenableFuture;", 160 "import dagger.producers.ProductionComponent;", 161 "import javax.inject.Provider;", 162 "import other.Maybe;", 163 "import other.DefinitelyNot;", 164 "", 165 "@ProductionComponent(modules = {TestModule.class, Maybe.MaybeModule.class})", 166 "interface TestComponent {", 167 " ListenableFuture<Optional<Maybe>> maybe();", 168 " ListenableFuture<Optional<DefinitelyNot>> definitelyNot();", 169 "}"); 170 171 Compilation compilation = 172 compilerWithOptions(compilerMode).compile(module, maybe, definitelyNot, component); 173 assertThat(compilation).succeeded(); 174 assertThat(compilation) 175 .generatedSourceFile("test.DaggerTestComponent") 176 .hasSourceEquivalentTo(goldenFileRule.goldenFile("test.DaggerTestComponent")); 177 } 178 } 179