/* * SonarQube Java * Copyright (C) 2012-2016 SonarSource SA * mailto:contact AT sonarsource DOT com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.sonar.java; import org.assertj.core.api.Fail; import org.junit.Test; import org.sonar.java.AnalyzerMessage.TextSpan; import org.sonar.java.ast.parser.JavaParser; import org.sonar.plugins.java.api.JavaCheck; import org.sonar.plugins.java.api.tree.ClassTree; import org.sonar.plugins.java.api.tree.CompilationUnitTree; import java.io.File; import java.nio.charset.StandardCharsets; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; public class AnalyzerMessageTest { @Test public void testAnalyzerMessage() { JavaCheck javaCheck = mock(JavaCheck.class); File file = new File("a"); int line = 5; String message = "analyzer message"; int cost = 3; AnalyzerMessage analyzerMessage = new AnalyzerMessage(javaCheck, file, line, message, cost); assertThat(analyzerMessage.getCheck()).isEqualTo(javaCheck); assertThat(analyzerMessage.getFile()).isEqualTo(file); assertThat(analyzerMessage.getLine()).isEqualTo(line); assertThat(analyzerMessage.getMessage()).isEqualTo(message); assertThat(analyzerMessage.getCost()).isEqualTo(cost); AnalyzerMessage.TextSpan location = analyzerMessage.primaryLocation(); assertThat(location.startLine).isEqualTo(line); assertThat(location.startCharacter).isEqualTo(-1); assertThat(location.endLine).isEqualTo(line); assertThat(location.endCharacter).isEqualTo(-1); assertThat(location.isEmpty()).isTrue(); assertThat(location.toString()).isEqualTo("(5:-1)-(5:-1)"); } @Test public void testAnalyzerMessageOnFile2() { JavaCheck javaCheck = mock(JavaCheck.class); File file = new File("a"); String message = "analyzer message"; int cost = 3; AnalyzerMessage analyzerMessage = new AnalyzerMessage(javaCheck, file, -5, message, cost); assertThat(analyzerMessage.getCheck()).isEqualTo(javaCheck); assertThat(analyzerMessage.getFile()).isEqualTo(file); assertThat(analyzerMessage.getLine()).isEqualTo(null); assertThat(analyzerMessage.getMessage()).isEqualTo(message); assertThat(analyzerMessage.getCost()).isEqualTo(cost); assertThat(analyzerMessage.primaryLocation()).isNull(); } @Test public void emptyTextSpan() { // same line, same offset assertThat(new AnalyzerMessage.TextSpan(42, 2, 42, 2).isEmpty()).isTrue(); // different offset assertThat(new AnalyzerMessage.TextSpan(42, 2, 42, 5).isEmpty()).isFalse(); // different lines, different offset assertThat(new AnalyzerMessage.TextSpan(42, 2, 43, 5).isEmpty()).isFalse(); // different lines, same offset assertThat(new AnalyzerMessage.TextSpan(42, 2, 43, 2).isEmpty()).isFalse(); } @Test public void textSpanOnLine() { assertThat(new AnalyzerMessage.TextSpan(42).onLine()).isTrue(); assertThat(new AnalyzerMessage.TextSpan(0, -1, 0, 5).onLine()).isTrue(); assertThat(new AnalyzerMessage.TextSpan(0, 2, 0, 2).onLine()).isFalse(); } @Test public void textSpanForTrees() { CompilationUnitTree cut = (CompilationUnitTree) JavaParser.createParser(StandardCharsets.UTF_8).parse("class A {\n}\n"); ClassTree classTree = (ClassTree) cut.types().get(0); TextSpan textSpan; textSpan = AnalyzerMessage.textSpanFor(classTree); assertThat(textSpan.startLine).isEqualTo(1); assertThat(textSpan.startCharacter).isEqualTo(0); assertThat(textSpan.endLine).isEqualTo(2); assertThat(textSpan.endCharacter).isEqualTo(1); textSpan = AnalyzerMessage.textSpanBetween(classTree.declarationKeyword(), classTree.openBraceToken()); assertThat(textSpan.startLine).isEqualTo(1); assertThat(textSpan.startCharacter).isEqualTo(0); assertThat(textSpan.endLine).isEqualTo(1); assertThat(textSpan.endCharacter).isEqualTo(9); } @Test public void shouldFailOnEmptyTrees() { CompilationUnitTree cut = (CompilationUnitTree) JavaParser.createParser(StandardCharsets.UTF_8) .parse("class A {\n}\n"); try { AnalyzerMessage.textSpanFor(cut.eofToken()); Fail.fail("Should have failed on empty issue location"); } catch (Exception e) { assertThat(e).isInstanceOf(IllegalStateException.class); assertThat(e.getMessage()).isEqualTo("Invalid issue location: Text span is empty when trying reporting on (l:3, c:0)."); } } @Test public void testAnalyzerMessageOnFile() { JavaCheck javaCheck = mock(JavaCheck.class); File file = new File("a"); String message = "analyzer message"; int cost = 3; AnalyzerMessage analyzerMessage = new AnalyzerMessage(javaCheck, file, null, message, cost); assertThat(analyzerMessage.getCheck()).isEqualTo(javaCheck); assertThat(analyzerMessage.getFile()).isEqualTo(file); assertThat(analyzerMessage.getLine()).isEqualTo(null); assertThat(analyzerMessage.getMessage()).isEqualTo(message); assertThat(analyzerMessage.getCost()).isEqualTo(cost); assertThat(analyzerMessage.primaryLocation()).isNull(); } @Test public void testAnalyzerMessageWithoutCost() { JavaCheck javaCheck = mock(JavaCheck.class); File file = new File("a"); String message = "analyzer message"; int cost = 0; AnalyzerMessage analyzerMessage = new AnalyzerMessage(javaCheck, file, null, message, cost); assertThat(analyzerMessage.getCheck()).isEqualTo(javaCheck); assertThat(analyzerMessage.getFile()).isEqualTo(file); assertThat(analyzerMessage.getLine()).isEqualTo(null); assertThat(analyzerMessage.getMessage()).isEqualTo(message); assertThat(analyzerMessage.getCost()).isNull(); assertThat(analyzerMessage.primaryLocation()).isNull(); } @Test public void toString_test() throws Exception { JavaCheck javaCheck = mock(JavaCheck.class); File file = new File("file"); String message = "analyzer message"; int cost = 0; AnalyzerMessage analyzerMessage = new AnalyzerMessage(javaCheck, file, 12, message, cost); assertThat(analyzerMessage.toString()).isEqualTo("'analyzer message' in file:12"); analyzerMessage = new AnalyzerMessage(javaCheck, null, null, null, cost); assertThat(analyzerMessage.toString()).isEqualTo("'null' in null:null"); } }