• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 Google, Inc.
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 package dagger.internal.codegen;
17 
18 import com.google.common.collect.ImmutableSet;
19 import com.google.testing.compile.JavaFileObjects;
20 import dagger.internal.codegen.ValidationReport.Builder;
21 import java.util.Set;
22 import javax.annotation.processing.AbstractProcessor;
23 import javax.annotation.processing.RoundEnvironment;
24 import javax.lang.model.element.TypeElement;
25 import javax.tools.JavaFileObject;
26 import org.junit.Test;
27 import org.junit.runner.RunWith;
28 import org.junit.runners.JUnit4;
29 
30 import static com.google.common.truth.Truth.assertAbout;
31 import static com.google.common.truth.Truth.assertThat;
32 import static com.google.testing.compile.JavaSourceSubjectFactory.javaSource;
33 
34 @RunWith(JUnit4.class)
35 public class ValidationReportTest {
36   private static final JavaFileObject TEST_CLASS_FILE =
37       JavaFileObjects.forSourceLines("test.TestClass",
38           "package test;",
39           "",
40           "final class TestClass {}");
41 
42   @Test
basicReport()43   public void basicReport() {
44     assertAbout(javaSource())
45         .that(TEST_CLASS_FILE)
46         .processedWith(
47             new SimpleTestProcessor() {
48               @Override
49               void test() {
50                 Builder<TypeElement> reportBuilder =
51                     ValidationReport.about(getTypeElement("test.TestClass"));
52                 reportBuilder.addError("simple error");
53                 reportBuilder.build().printMessagesTo(processingEnv.getMessager());
54               }
55             })
56         .failsToCompile()
57         .withErrorContaining("simple error")
58         .in(TEST_CLASS_FILE)
59         .onLine(3);
60   }
61 
62   @Test
messageOnDifferentElement()63   public void messageOnDifferentElement() {
64     assertAbout(javaSource())
65         .that(TEST_CLASS_FILE)
66         .processedWith(
67             new SimpleTestProcessor() {
68               @Override
69               void test() {
70                 Builder<TypeElement> reportBuilder =
71                     ValidationReport.about(getTypeElement("test.TestClass"));
72                 reportBuilder.addError("simple error", getTypeElement(String.class));
73                 reportBuilder.build().printMessagesTo(processingEnv.getMessager());
74               }
75             })
76         .failsToCompile()
77         .withErrorContaining("[java.lang.String] simple error")
78         .in(TEST_CLASS_FILE)
79         .onLine(3);
80   }
81 
82   @Test
subreport()83   public void subreport() {
84     assertAbout(javaSource())
85         .that(TEST_CLASS_FILE)
86         .processedWith(
87             new SimpleTestProcessor() {
88               @Override
89               void test() {
90                 Builder<TypeElement> reportBuilder =
91                     ValidationReport.about(getTypeElement("test.TestClass"));
92                 reportBuilder.addError("simple error");
93                 ValidationReport<TypeElement> parentReport =
94                     ValidationReport.about(getTypeElement(String.class))
95                         .addSubreport(reportBuilder.build())
96                         .build();
97                 assertThat(parentReport.isClean()).isFalse();
98                 parentReport.printMessagesTo(processingEnv.getMessager());
99               }
100             })
101         .failsToCompile()
102         .withErrorContaining("simple error")
103         .in(TEST_CLASS_FILE)
104         .onLine(3);
105   }
106 
107   private static abstract class SimpleTestProcessor extends AbstractProcessor {
108     @Override
getSupportedAnnotationTypes()109     public Set<String> getSupportedAnnotationTypes() {
110       return ImmutableSet.of("*");
111     }
112 
113     @Override
process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv)114     public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
115       test();
116       return false;
117     }
118 
getTypeElement(Class<?> clazz)119     protected final TypeElement getTypeElement(Class<?> clazz) {
120       return getTypeElement(clazz.getCanonicalName());
121     }
122 
getTypeElement(String canonicalName)123     protected final TypeElement getTypeElement(String canonicalName) {
124       return processingEnv.getElementUtils().getTypeElement(canonicalName);
125     }
126 
test()127     abstract void test();
128   }
129 }
130