1*f585d8a3SJacky Wang /* 2*f585d8a3SJacky Wang * Copyright (C) 2018 The Dagger Authors. 3*f585d8a3SJacky Wang * 4*f585d8a3SJacky Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5*f585d8a3SJacky Wang * you may not use this file except in compliance with the License. 6*f585d8a3SJacky Wang * You may obtain a copy of the License at 7*f585d8a3SJacky Wang * 8*f585d8a3SJacky Wang * http://www.apache.org/licenses/LICENSE-2.0 9*f585d8a3SJacky Wang * 10*f585d8a3SJacky Wang * Unless required by applicable law or agreed to in writing, software 11*f585d8a3SJacky Wang * distributed under the License is distributed on an "AS IS" BASIS, 12*f585d8a3SJacky Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*f585d8a3SJacky Wang * See the License for the specific language governing permissions and 14*f585d8a3SJacky Wang * limitations under the License. 15*f585d8a3SJacky Wang */ 16*f585d8a3SJacky Wang 17*f585d8a3SJacky Wang package dagger.internal.codegen; 18*f585d8a3SJacky Wang 19*f585d8a3SJacky Wang import static dagger.internal.codegen.TestUtils.endsWithMessage; 20*f585d8a3SJacky Wang import static javax.tools.Diagnostic.Kind.ERROR; 21*f585d8a3SJacky Wang 22*f585d8a3SJacky Wang import androidx.room.compiler.processing.util.Source; 23*f585d8a3SJacky Wang import com.google.common.collect.ImmutableMap; 24*f585d8a3SJacky Wang import dagger.spi.model.BindingGraph; 25*f585d8a3SJacky Wang import dagger.spi.model.BindingGraphPlugin; 26*f585d8a3SJacky Wang import dagger.spi.model.DiagnosticReporter; 27*f585d8a3SJacky Wang import dagger.testing.compile.CompilerTests; 28*f585d8a3SJacky Wang import java.util.regex.Pattern; 29*f585d8a3SJacky Wang import org.junit.Test; 30*f585d8a3SJacky Wang import org.junit.runner.RunWith; 31*f585d8a3SJacky Wang import org.junit.runners.JUnit4; 32*f585d8a3SJacky Wang 33*f585d8a3SJacky Wang /** Tests for -Adagger.pluginsVisitFullBindingGraph. */ 34*f585d8a3SJacky Wang @RunWith(JUnit4.class) 35*f585d8a3SJacky Wang public final class PluginsVisitFullBindingGraphTest { 36*f585d8a3SJacky Wang private static final Source MODULE_WITHOUT_ERRORS = 37*f585d8a3SJacky Wang CompilerTests.javaSource( 38*f585d8a3SJacky Wang "test.ModuleWithoutErrors", 39*f585d8a3SJacky Wang "package test;", 40*f585d8a3SJacky Wang "", 41*f585d8a3SJacky Wang "import dagger.Binds;", 42*f585d8a3SJacky Wang "import dagger.Module;", 43*f585d8a3SJacky Wang "", 44*f585d8a3SJacky Wang "@Module", 45*f585d8a3SJacky Wang "interface ModuleWithoutErrors {", 46*f585d8a3SJacky Wang " @Binds Object object(String string);", 47*f585d8a3SJacky Wang "}"); 48*f585d8a3SJacky Wang 49*f585d8a3SJacky Wang private static final Source MODULE_WITH_ERRORS = 50*f585d8a3SJacky Wang CompilerTests.javaSource( 51*f585d8a3SJacky Wang "test.ModuleWithErrors", 52*f585d8a3SJacky Wang "package test;", 53*f585d8a3SJacky Wang "", 54*f585d8a3SJacky Wang "import dagger.Binds;", 55*f585d8a3SJacky Wang "import dagger.Module;", 56*f585d8a3SJacky Wang "", 57*f585d8a3SJacky Wang "@Module", 58*f585d8a3SJacky Wang "interface ModuleWithErrors {", 59*f585d8a3SJacky Wang " @Binds Object object1(String string);", 60*f585d8a3SJacky Wang " @Binds Object object2(Long l);", 61*f585d8a3SJacky Wang "}"); 62*f585d8a3SJacky Wang 63*f585d8a3SJacky Wang private static final Pattern PLUGIN_ERROR_MESSAGE = 64*f585d8a3SJacky Wang endsWithMessage( 65*f585d8a3SJacky Wang "[dagger.internal.codegen.PluginsVisitFullBindingGraphTest.ErrorPlugin] Error!"); 66*f585d8a3SJacky Wang 67*f585d8a3SJacky Wang @Test testNoFlags()68*f585d8a3SJacky Wang public void testNoFlags() { 69*f585d8a3SJacky Wang CompilerTests.daggerCompiler(MODULE_WITH_ERRORS) 70*f585d8a3SJacky Wang .withBindingGraphPlugins(ErrorPlugin::new) 71*f585d8a3SJacky Wang .compile(subject -> subject.hasErrorCount(0)); 72*f585d8a3SJacky Wang } 73*f585d8a3SJacky Wang 74*f585d8a3SJacky Wang @Test testWithVisitPlugins()75*f585d8a3SJacky Wang public void testWithVisitPlugins() { 76*f585d8a3SJacky Wang CompilerTests.daggerCompiler(MODULE_WITH_ERRORS) 77*f585d8a3SJacky Wang .withProcessingOptions(ImmutableMap.of("dagger.pluginsVisitFullBindingGraphs", "Enabled")) 78*f585d8a3SJacky Wang .withBindingGraphPlugins(ErrorPlugin::new) 79*f585d8a3SJacky Wang .compile( 80*f585d8a3SJacky Wang subject -> { 81*f585d8a3SJacky Wang subject.hasErrorCount(1); 82*f585d8a3SJacky Wang subject 83*f585d8a3SJacky Wang .hasErrorContainingMatch(PLUGIN_ERROR_MESSAGE.toString()) 84*f585d8a3SJacky Wang .onSource(MODULE_WITH_ERRORS) 85*f585d8a3SJacky Wang .onLineContaining("interface ModuleWithErrors"); 86*f585d8a3SJacky Wang }); 87*f585d8a3SJacky Wang } 88*f585d8a3SJacky Wang 89*f585d8a3SJacky Wang @Test testWithValidationNone()90*f585d8a3SJacky Wang public void testWithValidationNone() { 91*f585d8a3SJacky Wang CompilerTests.daggerCompiler(MODULE_WITHOUT_ERRORS) 92*f585d8a3SJacky Wang .withProcessingOptions(ImmutableMap.of("dagger.fullBindingGraphValidation", "NONE")) 93*f585d8a3SJacky Wang .withBindingGraphPlugins(ErrorPlugin::new) 94*f585d8a3SJacky Wang .compile(subject -> subject.hasErrorCount(0)); 95*f585d8a3SJacky Wang } 96*f585d8a3SJacky Wang 97*f585d8a3SJacky Wang @Test testWithValidationError()98*f585d8a3SJacky Wang public void testWithValidationError() { 99*f585d8a3SJacky Wang // Test that pluginsVisitFullBindingGraph is enabled with fullBindingGraphValidation. 100*f585d8a3SJacky Wang CompilerTests.daggerCompiler(MODULE_WITHOUT_ERRORS) 101*f585d8a3SJacky Wang .withProcessingOptions(ImmutableMap.of("dagger.fullBindingGraphValidation", "ERROR")) 102*f585d8a3SJacky Wang .withBindingGraphPlugins(ErrorPlugin::new) 103*f585d8a3SJacky Wang .compile( 104*f585d8a3SJacky Wang subject -> { 105*f585d8a3SJacky Wang subject.hasErrorCount(1); 106*f585d8a3SJacky Wang subject 107*f585d8a3SJacky Wang .hasErrorContainingMatch(PLUGIN_ERROR_MESSAGE.toString()) 108*f585d8a3SJacky Wang .onSource(MODULE_WITHOUT_ERRORS) 109*f585d8a3SJacky Wang .onLineContaining("interface ModuleWithoutErrors"); 110*f585d8a3SJacky Wang }); 111*f585d8a3SJacky Wang } 112*f585d8a3SJacky Wang 113*f585d8a3SJacky Wang @Test testWithValidationErrorAndVisitPlugins()114*f585d8a3SJacky Wang public void testWithValidationErrorAndVisitPlugins() { 115*f585d8a3SJacky Wang CompilerTests.daggerCompiler(MODULE_WITHOUT_ERRORS) 116*f585d8a3SJacky Wang .withProcessingOptions( 117*f585d8a3SJacky Wang ImmutableMap.of( 118*f585d8a3SJacky Wang "dagger.fullBindingGraphValidation", "ERROR", 119*f585d8a3SJacky Wang "dagger.pluginsVisitFullBindingGraphs", "Enabled")) 120*f585d8a3SJacky Wang .withBindingGraphPlugins(ErrorPlugin::new) 121*f585d8a3SJacky Wang .compile( 122*f585d8a3SJacky Wang subject -> { 123*f585d8a3SJacky Wang subject.hasErrorCount(1); 124*f585d8a3SJacky Wang subject 125*f585d8a3SJacky Wang .hasErrorContainingMatch(PLUGIN_ERROR_MESSAGE.toString()) 126*f585d8a3SJacky Wang .onSource(MODULE_WITHOUT_ERRORS) 127*f585d8a3SJacky Wang .onLineContaining("interface ModuleWithoutErrors"); 128*f585d8a3SJacky Wang }); 129*f585d8a3SJacky Wang } 130*f585d8a3SJacky Wang 131*f585d8a3SJacky Wang /** A test plugin that just reports each component with the given {@link Diagnostic.Kind}. */ 132*f585d8a3SJacky Wang private static final class ErrorPlugin implements BindingGraphPlugin { 133*f585d8a3SJacky Wang @Override visitGraph(BindingGraph bindingGraph, DiagnosticReporter diagnosticReporter)134*f585d8a3SJacky Wang public void visitGraph(BindingGraph bindingGraph, DiagnosticReporter diagnosticReporter) { 135*f585d8a3SJacky Wang diagnosticReporter.reportComponent(ERROR, bindingGraph.rootComponentNode(), "Error!"); 136*f585d8a3SJacky Wang } 137*f585d8a3SJacky Wang } 138*f585d8a3SJacky Wang } 139