And update tests to use this new class.
--- /dev/null
+/*
+ * Sonar, open source software quality management tool.
+ * Copyright (C) 2008-2011 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * Sonar 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.
+ *
+ * Sonar 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 Sonar; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
+ */
+package org.sonar.java;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+
+import org.apache.commons.lang.ObjectUtils;
+import org.sonar.squid.api.CheckMessage;
+import org.sonar.squid.api.SourceFile;
+
+import com.google.common.collect.Ordering;
+
+/**
+ * Utility class to simplify assertions in tests for checks.
+ * It can be used as following:
+ * <pre>
+ * CheckMessages = new CheckMessages(SourceFile);
+ * checkMessages.assertNext().atLine(1).withMessage("Message").withCost(1.0);
+ * checkMessages.assertNoMore();
+ * </pre>
+ * TODO Godin: I think that this class can be reused by consumers of sonar-squid, thus can be moved to test-library for sonar-squid.
+ */
+public class CheckMessages {
+
+ private final List<CheckMessage> findings;
+ private final Iterator<CheckMessage> findingsIterator;
+
+ public CheckMessages(SourceFile file) {
+ findings = CHECK_MESSAGE_ORDERING.immutableSortedCopy(file.getCheckMessages());
+ findingsIterator = findings.iterator();
+ }
+
+ private static final Ordering<CheckMessage> CHECK_MESSAGE_ORDERING = new Ordering<CheckMessage>() {
+ public int compare(CheckMessage o1, CheckMessage o2) {
+ return ObjectUtils.compare(o1.getLine(), o2.getLine());
+ }
+ };
+
+ public Next assertNext() {
+ assertTrue("There is no more violations", findingsIterator.hasNext());
+ return new Next(findingsIterator.next());
+ }
+
+ public void assertNoMore() {
+ assertFalse(findingsIterator.hasNext());
+ }
+
+ public static final class Next {
+ private final CheckMessage checkMessage;
+
+ private Next(CheckMessage checkMessage) {
+ this.checkMessage = checkMessage;
+ }
+
+ public Next atLine(Integer expected) {
+ assertThat(checkMessage.getLine(), is(expected));
+ return this;
+ }
+
+ public Next withMessage(String expected) {
+ assertThat(checkMessage.getText(Locale.getDefault()), equalTo(expected));
+ return this;
+ }
+
+ public Next withCost(double expected) {
+ assertThat(checkMessage.getCost(), is(expected));
+ return this;
+ }
+ }
+
+}
package org.sonar.java.ast.check;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
+import java.io.File;
+import java.util.Collection;
import org.apache.commons.io.FileUtils;
import org.junit.Before;
import org.junit.Test;
import org.sonar.api.resources.InputFileUtils;
+import org.sonar.java.CheckMessages;
import org.sonar.java.ast.JavaAstScanner;
import org.sonar.java.ast.SquidTestUtils;
import org.sonar.java.squid.JavaSquidConfiguration;
import org.sonar.squid.Squid;
-import org.sonar.squid.api.CheckMessage;
import org.sonar.squid.api.SourceFile;
-import java.io.File;
-import java.util.Collection;
-
public class BreakCheckTest {
private Squid squid;
@Test
public void testAvoidUsageOfBreakOutsideSwitch() {
- SourceFile file = (SourceFile) squid.search("org/apache/commons/collections/map/LRUMap.java");
- assertThat(file.getCheckMessages().size(), is(1));
- CheckMessage message = file.getCheckMessages().iterator().next();
- assertThat(message.getLine(), is(244));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("org/apache/commons/collections/map/LRUMap.java"));
+ checkMessages.assertNext().atLine(244);
+ checkMessages.assertNoMore();
}
@Test
public void testAlowUsageOfBreakInsideSwitch() {
- SourceFile file = (SourceFile) squid.search("org/apache/commons/collections/map/Flat3Map.java");
- assertThat(file.getCheckMessages().size(), is(0));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("org/apache/commons/collections/map/Flat3Map.java"));
+ checkMessages.assertNoMore();
}
}
package org.sonar.java.ast.check;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
import org.junit.Before;
import org.junit.Test;
+import org.sonar.java.CheckMessages;
import org.sonar.java.ast.JavaAstScanner;
import org.sonar.java.ast.SquidTestUtils;
import org.sonar.java.squid.JavaSquidConfiguration;
import org.sonar.squid.Squid;
-import org.sonar.squid.api.CheckMessage;
import org.sonar.squid.api.SourceFile;
public class ContinueCheckTest {
@Test
public void testAvoidUsageOfContinue() {
- SourceFile file = (SourceFile) squid.search("org/apache/commons/collections/ExtendedProperties.java");
- assertThat(file.getCheckMessages().size(), is(1));
- CheckMessage message = file.getCheckMessages().iterator().next();
- assertThat(message.getLine(), is(566));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("org/apache/commons/collections/ExtendedProperties.java"));
+ checkMessages.assertNext().atLine(566);
+ checkMessages.assertNoMore();
}
}
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
import org.junit.Before;
import org.junit.Test;
+import org.sonar.java.CheckMessages;
import org.sonar.java.ast.JavaAstScanner;
import org.sonar.java.ast.SquidTestUtils;
import org.sonar.java.squid.JavaSquidConfiguration;
import org.sonar.java.squid.SquidScanner;
import org.sonar.squid.Squid;
-import org.sonar.squid.api.CheckMessage;
import org.sonar.squid.api.SourceFile;
import org.sonar.squid.measures.Metric;
-import com.google.common.collect.Lists;
-
public class UndocumentedApiCheckTest {
private Squid squid;
public void testUndocumentedApi() {
SourceFile file = (SourceFile) squid.search("UndocumentedApi.java");
- List<CheckMessage> messages = Lists.newArrayList(file.getCheckMessages());
- Collections.sort(messages, new Comparator<CheckMessage>() {
- public int compare(CheckMessage o1, CheckMessage o2) {
- return o1.getLine() - o2.getLine();
- }
- });
-
assertThat(file.getInt(Metric.PUBLIC_API) - file.getInt(Metric.PUBLIC_DOC_API), is(3));
- assertThat(file.getCheckMessages().size(), is(3));
- assertThat(messages.get(0).getLine(), is(10));
- assertThat(messages.get(1).getLine(), is(14));
- assertThat(messages.get(2).getLine(), is(17));
+ CheckMessages checkMessages = new CheckMessages(file);
+ checkMessages.assertNext().atLine(10);
+ checkMessages.assertNext().atLine(14);
+ checkMessages.assertNext().atLine(17);
+ checkMessages.assertNoMore();
}
}
package org.sonar.java.bytecode.check;
import org.junit.Test;
+import org.sonar.java.CheckMessages;
import org.sonar.java.ast.JavaAstScanner;
import org.sonar.java.ast.SquidTestUtils;
import org.sonar.java.bytecode.BytecodeScanner;
import org.sonar.java.squid.JavaSquidConfiguration;
import org.sonar.squid.Squid;
-import org.sonar.squid.api.CheckMessage;
import org.sonar.squid.api.SourceFile;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.is;
-
public class ArchitectureCheckTest {
private Squid squid;
public void testDependencyCheckOneErrorMessage() {
check("", "java.**.Pattern");
- SourceFile file = (SourceFile) squid.search("ArchitectureCheckOneErrorMessage.java");
- assertThat(file.getCheckMessages().size(), is(1));
- CheckMessage message = file.getCheckMessages().iterator().next();
- assertThat(message.getDefaultMessage(), is("ArchitectureCheckOneErrorMessage must not use java/util/regex/Pattern"));
- assertThat(message.getLine(), is(6));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("ArchitectureCheckOneErrorMessage.java"));
+ checkMessages.assertNext().atLine(6).withMessage("ArchitectureCheckOneErrorMessage must not use java/util/regex/Pattern");
+ checkMessages.assertNoMore();
}
@Test
public void testDependencyCheckDateForbidden() {
check("", "**.Date");
- SourceFile file = (SourceFile) squid.search("ArchitectureCheckDateForbidden.java");
- assertThat(file.getCheckMessages().size(), is(2));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("ArchitectureCheckDateForbidden.java"));
+ checkMessages.assertNext().atLine(7);
+ checkMessages.assertNext().atLine(9);
+ checkMessages.assertNoMore();
}
@Test
public void testDependencyCheckToSqlFromUI() {
check("*UI", "java.sql.*");
- SourceFile file = (SourceFile) squid.search("ArchitectureCheckToSqlFromUI.java");
- assertThat(file.getCheckMessages().size(), is(1));
- CheckMessage message = file.getCheckMessages().iterator().next();
- assertThat(message.getLine(), is(4));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("ArchitectureCheckToSqlFromUI.java"));
+ checkMessages.assertNext().atLine(4);
+ checkMessages.assertNoMore();
}
@Test
public void testDependencyCheckOKFromClassesToClasses() {
check("*SA", "java.sql.*");
- SourceFile file = (SourceFile) squid.search("ArchitectureCheckToSqlFromUI.java");
- assertThat(file.getCheckMessages().size(), is(0));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("ArchitectureCheckToSqlFromUI.java"));
+ checkMessages.assertNoMore();
}
private void check(String fromClasses, String toClasses) {
*/
package org.sonar.java.bytecode.check;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
import org.junit.BeforeClass;
import org.junit.Test;
+import org.sonar.java.CheckMessages;
import org.sonar.java.ast.JavaAstScanner;
import org.sonar.java.ast.SquidTestUtils;
import org.sonar.java.bytecode.BytecodeScanner;
import org.sonar.java.squid.JavaSquidConfiguration;
import org.sonar.squid.Squid;
-import org.sonar.squid.api.CheckMessage;
import org.sonar.squid.api.SourceFile;
public class CallToDeprecatedMethodCheckTest {
@Test
public void testCallToDeprecatedMethod() {
- SourceFile file = (SourceFile) squid.search("CallToDeprecatedMethod.java");
- assertThat(file.getCheckMessages().size(), is(1));
- CheckMessage message = file.getCheckMessages().iterator().next();
- assertThat(message.getLine(), is(6));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("CallToDeprecatedMethod.java"));
+ checkMessages.assertNext().atLine(6);
+ checkMessages.assertNoMore();
}
}
*/
package org.sonar.java.bytecode.check;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
import org.junit.BeforeClass;
import org.junit.Test;
+import org.sonar.java.CheckMessages;
import org.sonar.java.ast.JavaAstScanner;
import org.sonar.java.ast.SquidTestUtils;
import org.sonar.java.bytecode.BytecodeScanner;
import org.sonar.java.squid.JavaSquidConfiguration;
import org.sonar.squid.Squid;
-import org.sonar.squid.api.CheckMessage;
import org.sonar.squid.api.SourceFile;
public class UnusedPrivateMethodCheckTest {
@Test
public void testDetectUnusedPrivateMethod() {
- SourceFile file = (SourceFile) squid.search("UnusedPrivateMethod.java");
-
- assertThat(file.getCheckMessages().size(), is(1));
- CheckMessage message = file.getCheckMessages().iterator().next();
- assertThat(message.getLine(), is(33));
- assertThat(message.getDefaultMessage(), is("Private method 'unusedPrivateMethod(...)' is never used."));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("UnusedPrivateMethod.java"));
+ checkMessages.assertNext().atLine(33).withMessage("Private method 'unusedPrivateMethod(...)' is never used.");
+ checkMessages.assertNoMore();
}
@Test
public void testDetectUnusedGenericPrivateMethod() {
- SourceFile file = (SourceFile) squid.search("UnusedGenericPrivateMethod.java");
-
- assertThat(file.getCheckMessages().size(), is(1));
- CheckMessage message = file.getCheckMessages().iterator().next();
- assertThat(message.getLine(), is(7));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("UnusedGenericPrivateMethod.java"));
+ checkMessages.assertNext().atLine(7);
+ checkMessages.assertNoMore();
}
@Test
public void testDetectUnusedPrivateConstructor() {
- SourceFile file = (SourceFile) squid.search("UnusedPrivateConstructor.java");
-
- assertThat(file.getCheckMessages().size(), is(1));
- CheckMessage message = file.getCheckMessages().iterator().next();
- assertThat(message.getLine(), is(10));
- assertThat(message.getDefaultMessage(), is("Private method '<init>(...)' is never used."));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("UnusedPrivateConstructor.java"));
+ checkMessages.assertNext().atLine(10).withMessage("Private method '<init>(...)' is never used.");
+ checkMessages.assertNoMore();
}
}
*/
package org.sonar.java.bytecode.check;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
import org.junit.BeforeClass;
import org.junit.Test;
+import org.sonar.java.CheckMessages;
import org.sonar.java.ast.JavaAstScanner;
import org.sonar.java.ast.SquidTestUtils;
import org.sonar.java.bytecode.BytecodeScanner;
import org.sonar.java.squid.JavaSquidConfiguration;
import org.sonar.squid.Squid;
-import org.sonar.squid.api.CheckMessage;
import org.sonar.squid.api.SourceFile;
public class UnusedProtectedMethodCheckTest {
@Test
public void testDetectUnusedProtectedMethod() {
- SourceFile file = (SourceFile) squid.search("UnusedProtectedMethod.java");
-
- assertThat(file.getCheckMessages().size(), is(1));
- CheckMessage message = file.getCheckMessages().iterator().next();
- assertThat(message.getLine(), is(17));
- assertThat(message.getDefaultMessage(), is("Protected method 'unusedProtectedMethod(...)' is never used."));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("UnusedProtectedMethod.java"));
+ checkMessages.assertNext().atLine(17).withMessage("Protected method 'unusedProtectedMethod(...)' is never used.");
+ checkMessages.assertNoMore();
}
@Test
public void testIgnoreUnusedProtectedMethodFromAbstractClass() {
- SourceFile file = (SourceFile) squid.search("UnusedProtectedMethodFromAbstractClass.java");
- assertThat(file.getCheckMessages().size(), is(0));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("UnusedProtectedMethodFromAbstractClass.java"));
+ checkMessages.assertNoMore();
}
}
package org.sonar.java.squid.check;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
import org.junit.Before;
import org.junit.Test;
+import org.sonar.java.CheckMessages;
import org.sonar.java.ast.JavaAstScanner;
import org.sonar.java.ast.SquidTestUtils;
import org.sonar.java.squid.JavaSquidConfiguration;
import org.sonar.java.squid.SquidScanner;
import org.sonar.squid.Squid;
-import org.sonar.squid.api.CheckMessage;
import org.sonar.squid.api.SourceFile;
import org.sonar.squid.measures.Metric;
@Test
public void testComplexityExceedsThreshold() {
- SourceFile file = (SourceFile) squid.search("ComplexBranches.java");
- assertThat(file.getCheckMessages().size(), is(1));
- CheckMessage message = file.getCheckMessages().iterator().next();
- assertThat(message.getLine(), is(3));
- assertThat(message.getCost(), is(3.0));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("ComplexBranches.java"));
+ checkMessages.assertNext().atLine(3).withCost(3.0);
+ checkMessages.assertNoMore();
}
@Test
public void testComplexityNotExceedsThreshold() {
- SourceFile file = (SourceFile) squid.search("NoBranches.java");
- assertThat(file.getCheckMessages().size(), is(0));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("NoBranches.java"));
+ checkMessages.assertNoMore();
}
}
*/
package org.sonar.java.squid.check;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.*;
-
import org.junit.Before;
import org.junit.Test;
+import org.sonar.java.CheckMessages;
import org.sonar.java.ast.JavaAstScanner;
import org.sonar.java.ast.SquidTestUtils;
import org.sonar.java.squid.JavaSquidConfiguration;
@Test
public void testDetection() {
- SourceFile file = (SourceFile) squid.search("CommentedCode.java");
- assertThat(file.getCheckMessages().size(), is(4));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("CommentedCode.java"));
+ checkMessages.assertNext().atLine(4);
+ checkMessages.assertNext().atLine(17);
+ checkMessages.assertNext().atLine(18);
+ checkMessages.assertNext().atLine(19);
+ checkMessages.assertNoMore();
}
}
package org.sonar.java.squid.check;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
import org.junit.BeforeClass;
import org.junit.Test;
+import org.sonar.java.CheckMessages;
import org.sonar.java.ast.JavaAstScanner;
import org.sonar.java.ast.SquidTestUtils;
import org.sonar.java.bytecode.BytecodeScanner;
import org.sonar.java.squid.JavaSquidConfiguration;
import org.sonar.java.squid.SquidScanner;
import org.sonar.squid.Squid;
-import org.sonar.squid.api.CheckMessage;
import org.sonar.squid.api.SourceFile;
public class DITCheckTest {
@Test
public void testDepthOfInheritanceGreaterThanMaximum() {
- SourceFile file = (SourceFile) squid.search("UnusedProtectedMethod.java");
- assertThat(file.getCheckMessages().size(), is(1));
- CheckMessage message = file.getCheckMessages().iterator().next();
- assertThat(message.getLine(), is(7));
- assertThat(message.getCost(), is(1.0));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("UnusedProtectedMethod.java"));
+ checkMessages.assertNext().atLine(7).withCost(1.0);
+ checkMessages.assertNoMore();
}
@Test
public void testDepthOfInheritanceLowerThanMaximum() {
- SourceFile file = (SourceFile) squid.search("Job.java");
- assertThat(file.getCheckMessages().size(), is(0));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("Job.java"));
+ checkMessages.assertNoMore();
}
}
package org.sonar.java.squid.check;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.nullValue;
-import static org.junit.Assert.assertThat;
-
import org.junit.Before;
import org.junit.Test;
+import org.sonar.java.CheckMessages;
import org.sonar.java.ast.JavaAstScanner;
import org.sonar.java.ast.SquidTestUtils;
import org.sonar.java.squid.JavaSquidConfiguration;
import org.sonar.java.squid.SquidScanner;
import org.sonar.squid.Squid;
-import org.sonar.squid.api.CheckMessage;
import org.sonar.squid.api.SourceFile;
import org.sonar.squid.measures.Metric;
@Test
public void shouldDetectEmptyFiles() {
- SourceFile file = (SourceFile) squid.search("org/foo/CommentedOutFile.java");
- assertThat(file.getCheckMessages().size(), is(1));
- CheckMessage message = file.getCheckMessages().iterator().next();
- assertThat(message.getLine(), nullValue());
- assertThat(message.getDefaultMessage(), is("This Java file is empty"));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("org/foo/CommentedOutFile.java"));
+ checkMessages.assertNext().atLine(null).withMessage("This Java file is empty");
+ checkMessages.assertNoMore();
}
@Test
public void shouldNotLogOnCorrectFiles() {
- SourceFile file = (SourceFile) squid.search("CommentedCode.java");
- assertThat(file.getCheckMessages().size(), is(0));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("CommentedCode.java"));
+ checkMessages.assertNoMore();
}
}
package org.sonar.java.squid.check;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
import org.junit.Before;
import org.junit.Test;
+import org.sonar.java.CheckMessages;
import org.sonar.java.ast.JavaAstScanner;
import org.sonar.java.ast.SquidTestUtils;
import org.sonar.java.squid.JavaSquidConfiguration;
import org.sonar.java.squid.SquidScanner;
import org.sonar.squid.Squid;
-import org.sonar.squid.api.CheckMessage;
import org.sonar.squid.api.SourceFile;
import org.sonar.squid.measures.Metric;
@Test
public void testMethodComplexityExceedsThreshold() {
- SourceFile file = (SourceFile) squid.search("ComplexBranches.java");
- assertThat(file.getCheckMessages().size(), is(1));
- CheckMessage message = file.getCheckMessages().iterator().next();
- assertThat(message.getLine(), is(10));
- assertThat(message.getCost(), is(2.0));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("ComplexBranches.java"));
+ checkMessages.assertNext().atLine(10).withCost(2.0);
+ checkMessages.assertNoMore();
}
}
*/
package org.sonar.java.squid.check;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
import org.junit.Before;
import org.junit.Test;
+import org.sonar.java.CheckMessages;
import org.sonar.java.ast.JavaAstScanner;
import org.sonar.java.ast.SquidTestUtils;
import org.sonar.java.squid.JavaSquidConfiguration;
@Test
public void testNoSonarTagDetection() {
- SourceFile file = (SourceFile) squid.search("FileWithNOSONARTags.java");
- assertThat(file.getCheckMessages().size(), is(2));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("FileWithNOSONARTags.java"));
+ checkMessages.assertNext().atLine(5);
+ checkMessages.assertNext().atLine(10);
+ checkMessages.assertNoMore();
}
@Test
public void testNoSonarTagDetectionWhenNoTag() {
- SourceFile file = (SourceFile) squid.search("FileWithoutNOSONARTags.java");
- assertThat(file.getCheckMessages().size(), is(0));
+ CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("FileWithoutNOSONARTags.java"));
+ checkMessages.assertNoMore();
}
}