/*
* Copyright 2015 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.errorprone;
import static com.google.common.truth.Truth.assertThat;
import static com.google.errorprone.BugPattern.Category.JDK;
import com.google.errorprone.BugPattern.SeverityLevel;
import com.google.errorprone.bugpatterns.BugChecker;
import com.google.errorprone.bugpatterns.BugChecker.ReturnTreeMatcher;
import com.google.errorprone.matchers.Description;
import com.google.errorprone.scanner.ScannerSupplier;
import com.sun.source.tree.ReturnTree;
import com.sun.tools.javac.main.Main.Result;
import java.util.Arrays;
import javax.tools.Diagnostic;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
* Tests that {@link BugPattern.SeverityLevel}s map to appropriate
* {@link javax.tools.Diagnostic.Kind}s and are displayed in some reasonable way on the command
* line.
*/
@RunWith(JUnit4.class)
public class DiagnosticKindTest {
/**
* The mock code we are going to analyze in our tests. Only needs a return for the matcher
* to match on.
*/
private static final String[] TEST_CODE = {
"class Test {",
" void doIt() {",
" return;",
" }",
"}"
};
private DiagnosticTestHelper diagnosticHelper;
private ErrorProneTestCompiler.Builder compilerBuilder;
@Before
public void setUp() {
diagnosticHelper = new DiagnosticTestHelper();
compilerBuilder = new ErrorProneTestCompiler.Builder()
.listenToDiagnostics(diagnosticHelper.collector);
}
@BugPattern(
name = "ErrorChecker",
summary = "This is an error!",
explanation = "Don't do this!",
category = JDK,
severity = SeverityLevel.ERROR
)
public static class ErrorChecker extends BugChecker implements ReturnTreeMatcher {
@Override
public Description matchReturn(ReturnTree tree, VisitorState state) {
return describeMatch(tree);
}
}
@Test
public void testError() throws Exception {
compilerBuilder.report(ScannerSupplier.fromBugCheckerClasses(ErrorChecker.class));
ErrorProneTestCompiler compiler = compilerBuilder.build();
Result result = compiler.compile(Arrays.asList(
compiler.fileManager().forSourceLines("Test.java", TEST_CODE)));
assertThat(diagnosticHelper.getDiagnostics()).hasSize(1);
assertThat(diagnosticHelper.getDiagnostics().get(0).getKind()).isEqualTo(Diagnostic.Kind.ERROR);
assertThat(diagnosticHelper.getDiagnostics().get(0).toString()).contains("error:");
assertThat(result).isEqualTo(Result.ERROR);
}
@BugPattern(
name = "WarningChecker",
summary = "This is a warning!",
explanation = "Please don't do this!",
category = JDK,
severity = SeverityLevel.WARNING
)
public static class WarningChecker extends BugChecker implements ReturnTreeMatcher {
@Override
public Description matchReturn(ReturnTree tree, VisitorState state) {
return describeMatch(tree);
}
}
@Test
public void testWarning() throws Exception {
compilerBuilder.report(ScannerSupplier.fromBugCheckerClasses(WarningChecker.class));
ErrorProneTestCompiler compiler = compilerBuilder.build();
Result result = compiler.compile(Arrays.asList(
compiler.fileManager().forSourceLines("Test.java", TEST_CODE)));
assertThat(diagnosticHelper.getDiagnostics()).hasSize(1);
assertThat(diagnosticHelper.getDiagnostics().get(0).getKind())
.isEqualTo(Diagnostic.Kind.WARNING);
assertThat(diagnosticHelper.getDiagnostics().get(0).toString()).contains("warning:");
assertThat(result).isEqualTo(Result.OK);
}
@BugPattern(
name = "SuggestionChecker",
summary = "This is a suggestion!",
explanation = "Don't do this. Or do it. I'm a suggestion, not a cop.",
category = JDK,
severity = SeverityLevel.SUGGESTION
)
public static class SuggestionChecker extends BugChecker implements ReturnTreeMatcher {
@Override
public Description matchReturn(ReturnTree tree, VisitorState state) {
return describeMatch(tree);
}
}
@Test
public void testSuggestion() throws Exception {
compilerBuilder.report(ScannerSupplier.fromBugCheckerClasses(SuggestionChecker.class));
ErrorProneTestCompiler compiler = compilerBuilder.build();
Result result = compiler.compile(Arrays.asList(
compiler.fileManager().forSourceLines("Test.java", TEST_CODE)));
assertThat(diagnosticHelper.getDiagnostics()).hasSize(1);
assertThat(diagnosticHelper.getDiagnostics().get(0).getKind()).isEqualTo(Diagnostic.Kind.NOTE);
assertThat(diagnosticHelper.getDiagnostics().get(0).toString()).contains("Note:");
assertThat(result).isEqualTo(Result.OK);
}
}