1package org.junit.experimental.results;
2
3import org.hamcrest.BaseMatcher;
4import org.hamcrest.Description;
5import org.hamcrest.Matcher;
6import org.junit.internal.matchers.TypeSafeMatcher;
7
8/**
9 * Matchers on a PrintableResult, to enable JUnit self-tests.
10 * For example:
11 *
12 * <pre>
13 * 		assertThat(testResult(HasExpectedException.class), isSuccessful());
14 * </pre>
15 */
16public class ResultMatchers {
17	/**
18	 * Matches if the tests are all successful
19	 */
20	public static Matcher<PrintableResult> isSuccessful() {
21		return failureCountIs(0);
22	}
23
24	/**
25	 * Matches if there are {@code count} failures
26	 */
27	public static Matcher<PrintableResult> failureCountIs(final int count) {
28		return new TypeSafeMatcher<PrintableResult>() {
29			public void describeTo(Description description) {
30				description.appendText("has " + count + " failures");
31			}
32
33			@Override
34			public boolean matchesSafely(PrintableResult item) {
35				return item.failureCount() == count;
36			}
37		};
38	}
39
40	/**
41	 * Matches if the result has exactly one failure, and it contains {@code string}
42	 */
43	public static Matcher<Object> hasSingleFailureContaining(final String string) {
44		return new BaseMatcher<Object>() {
45			public boolean matches(Object item) {
46				return item.toString().contains(string) && failureCountIs(1).matches(item);
47			}
48
49			public void describeTo(Description description) {
50				description.appendText("has single failure containing " + string);
51			}
52		};
53	}
54
55	/**
56	 * Matches if the result has one or more failures, and at least one of them
57	 * contains {@code string}
58	 */
59	public static Matcher<PrintableResult> hasFailureContaining(final String string) {
60		return new BaseMatcher<PrintableResult>() {
61			public boolean matches(Object item) {
62				return item.toString().contains(string);
63			}
64
65			public void describeTo(Description description) {
66				description.appendText("has failure containing " + string);
67			}
68		};
69	}
70}
71