aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-testing-harness/src/main
diff options
context:
space:
mode:
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>2015-12-04 10:06:36 +0100
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>2015-12-04 11:49:30 +0100
commit1539baeb94f979d875b4698f0ac873b43d4744b4 (patch)
tree6801a0833df82515480c0171ab6873bf5a11a2db /sonar-testing-harness/src/main
parent9a86ee019c97e81e698e8387d7bc4ff106b8f05b (diff)
downloadsonarqube-1539baeb94f979d875b4698f0ac873b43d4744b4.tar.gz
sonarqube-1539baeb94f979d875b4698f0ac873b43d4744b4.zip
add ExceptionCauseMatcher to sonar-testing-harness
Diffstat (limited to 'sonar-testing-harness/src/main')
-rw-r--r--sonar-testing-harness/src/main/java/org/sonar/test/ExceptionCauseMatcher.java83
1 files changed, 83 insertions, 0 deletions
diff --git a/sonar-testing-harness/src/main/java/org/sonar/test/ExceptionCauseMatcher.java b/sonar-testing-harness/src/main/java/org/sonar/test/ExceptionCauseMatcher.java
new file mode 100644
index 00000000000..9eaf1d6923c
--- /dev/null
+++ b/sonar-testing-harness/src/main/java/org/sonar/test/ExceptionCauseMatcher.java
@@ -0,0 +1,83 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.test;
+
+import java.util.Objects;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+import javax.annotation.concurrent.Immutable;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.TypeSafeMatcher;
+
+/**
+ * Matchers designed to be used as an argument of {@link org.junit.rules.ExpectedException#expectCause(Matcher)} such as:
+ *
+ * <pre>
+ * expectedException.expect(VisitException.class);
+ * expectedException.expectCause(hasType(IllegalArgumentException.class).andMessage("file and otherFile Components can not be the same"));
+ * </pre>
+ *
+ * Class strongly inspired from {@code CauseMatcher} class from {@code http://blog.codeleak.pl/2014/03/junit-expectedexception-rule-beyond.html}
+ */
+@Immutable
+public class ExceptionCauseMatcher extends TypeSafeMatcher<Throwable> {
+ private static final String EXPECT_NO_MESSAGE_CONSTANT = "RQXG8QTUCXOT7HZ3APPKBKUE5";
+
+ private final Class<? extends Throwable> type;
+ @CheckForNull
+ private final String expectedMessage;
+
+ private ExceptionCauseMatcher(Class<? extends Throwable> type, @Nullable String expectedMessage) {
+ this.type = type;
+ this.expectedMessage = expectedMessage;
+ }
+
+ public static ExceptionCauseMatcher hasType(Class<? extends Throwable> type) {
+ return new ExceptionCauseMatcher(type, null);
+ }
+
+ public ExceptionCauseMatcher andMessage(String expectedMessage) {
+ return new ExceptionCauseMatcher(type, Objects.requireNonNull(expectedMessage));
+ }
+
+ public ExceptionCauseMatcher andNoMessage() {
+ return new ExceptionCauseMatcher(type, EXPECT_NO_MESSAGE_CONSTANT);
+ }
+
+ @Override
+ protected boolean matchesSafely(Throwable item) {
+ return item.getClass().isAssignableFrom(type)
+ && (expectedMessage == null || EXPECT_NO_MESSAGE_CONSTANT.equals(expectedMessage) ? item.getMessage() == null : item.getMessage().contains(expectedMessage));
+ }
+
+ @Override
+ public void describeTo(Description description) {
+ description.appendText("of type ")
+ .appendValue(type);
+ if (EXPECT_NO_MESSAGE_CONSTANT.equals(expectedMessage)) {
+ description.appendText(" and no message");
+ } else if (expectedMessage != null) {
+ description.appendText(" and message ")
+ .appendValue(expectedMessage);
+ }
+ description.appendText(" but");
+ }
+}