From 1539baeb94f979d875b4698f0ac873b43d4744b4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Fri, 4 Dec 2015 10:06:36 +0100 Subject: [PATCH] add ExceptionCauseMatcher to sonar-testing-harness --- .../org/sonar/test/ExceptionCauseMatcher.java | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 sonar-testing-harness/src/main/java/org/sonar/test/ExceptionCauseMatcher.java 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: + * + *
+ * expectedException.expect(VisitException.class);
+ * expectedException.expectCause(hasType(IllegalArgumentException.class).andMessage("file and otherFile Components can not be the same"));
+ * 
+ * + * 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 { + private static final String EXPECT_NO_MESSAGE_CONSTANT = "RQXG8QTUCXOT7HZ3APPKBKUE5"; + + private final Class type; + @CheckForNull + private final String expectedMessage; + + private ExceptionCauseMatcher(Class type, @Nullable String expectedMessage) { + this.type = type; + this.expectedMessage = expectedMessage; + } + + public static ExceptionCauseMatcher hasType(Class 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"); + } +} -- 2.39.5