1package org.hamcrest.core;
2
3import org.hamcrest.BaseMatcher;
4import org.hamcrest.Description;
5import org.hamcrest.Matcher;
6
7import static org.hamcrest.core.IsEqual.equalTo;
8import static org.hamcrest.core.IsInstanceOf.instanceOf;
9
10/**
11 * Decorates another Matcher, retaining the behaviour but allowing tests
12 * to be slightly more expressive.
13 *
14 * For example:  assertThat(cheese, equalTo(smelly))
15 *          vs.  assertThat(cheese, is(equalTo(smelly)))
16 */
17public class Is<T> extends BaseMatcher<T> {
18    private final Matcher<T> matcher;
19
20    public Is(Matcher<T> matcher) {
21        this.matcher = matcher;
22    }
23
24    @Override
25    public boolean matches(Object arg) {
26        return matcher.matches(arg);
27    }
28
29    @Override
30    public void describeTo(Description description) {
31        description.appendText("is ").appendDescriptionOf(matcher);
32    }
33
34    @Override
35    public void describeMismatch(Object item, Description mismatchDescription) {
36        matcher.describeMismatch(item, mismatchDescription);
37    }
38
39    /**
40     * Decorates another Matcher, retaining its behaviour, but allowing tests
41     * to be slightly more expressive.
42     * For example:
43     * <pre>assertThat(cheese, is(equalTo(smelly)))</pre>
44     * instead of:
45     * <pre>assertThat(cheese, equalTo(smelly))</pre>
46     *
47     */
48    public static <T> Matcher<T> is(Matcher<T> matcher) {
49        return new Is<T>(matcher);
50    }
51
52    /**
53     * A shortcut to the frequently used <code>is(equalTo(x))</code>.
54     * For example:
55     * <pre>assertThat(cheese, is(smelly))</pre>
56     * instead of:
57     * <pre>assertThat(cheese, is(equalTo(smelly)))</pre>
58     *
59     */
60    public static <T> Matcher<T> is(T value) {
61        return is(equalTo(value));
62    }
63
64    /**
65     * A shortcut to the frequently used <code>is(instanceOf(SomeClass.class))</code>.
66     * For example:
67     * <pre>assertThat(cheese, isA(Cheddar.class))</pre>
68     * instead of:
69     * <pre>assertThat(cheese, is(instanceOf(Cheddar.class)))</pre>
70     *
71     */
72    public static <T> Matcher<T> isA(Class<T> type) {
73        final Matcher<T> typeMatcher = instanceOf(type);
74        return is(typeMatcher);
75    }
76}
77