diff options
author | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2015-12-04 10:06:36 +0100 |
---|---|---|
committer | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2015-12-04 11:49:30 +0100 |
commit | 1539baeb94f979d875b4698f0ac873b43d4744b4 (patch) | |
tree | 6801a0833df82515480c0171ab6873bf5a11a2db /sonar-testing-harness/src/main | |
parent | 9a86ee019c97e81e698e8387d7bc4ff106b8f05b (diff) | |
download | sonarqube-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.java | 83 |
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"); + } +} |