• 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 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