• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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