1facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffinpackage org.junit.rules;
2facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin
3facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffinimport static org.hamcrest.CoreMatchers.allOf;
4facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffinimport static org.junit.matchers.JUnitMatchers.isThrowable;
5facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin
6facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffinimport java.util.ArrayList;
7facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffinimport java.util.List;
8facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin
9facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffinimport org.hamcrest.Matcher;
10facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin
11facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin/**
12facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin * Builds special matcher used by {@link ExpectedException}.
13facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin */
14facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffinclass ExpectedExceptionMatcherBuilder {
15facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin
16facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin    private final List<Matcher<?>> matchers = new ArrayList<Matcher<?>>();
17facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin
18facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin    void add(Matcher<?> matcher) {
19facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin        matchers.add(matcher);
20facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin    }
21facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin
22facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin    boolean expectsThrowable() {
23facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin        return !matchers.isEmpty();
24facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin    }
25facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin
26facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin    Matcher<Throwable> build() {
27facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin        return isThrowable(allOfTheMatchers());
28facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin    }
29facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin
30facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin    private Matcher<Throwable> allOfTheMatchers() {
31facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin        if (matchers.size() == 1) {
32facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin            return cast(matchers.get(0));
33facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin        }
34facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin        return allOf(castedMatchers());
35facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin    }
36facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin
37facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin    @SuppressWarnings({"unchecked", "rawtypes"})
38facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin    private List<Matcher<? super Throwable>> castedMatchers() {
39facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin        return new ArrayList<Matcher<? super Throwable>>((List) matchers);
40facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin    }
41facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin
42facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin    @SuppressWarnings("unchecked")
43facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin    private Matcher<Throwable> cast(Matcher<?> singleMatcher) {
44facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin        return (Matcher<Throwable>) singleMatcher;
45facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin    }
46facdecc8e055d722b8c0e0c8fbf8a8644e7fec57Paul Duffin}
47