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