001package org.hamcrest.core;
002
003import org.hamcrest.BaseMatcher;
004import org.hamcrest.Description;
005import org.hamcrest.Factory;
006import org.hamcrest.Matcher;
007
008import static org.hamcrest.core.IsEqual.equalTo;
009import static org.hamcrest.core.IsInstanceOf.instanceOf;
010
011/**
012 * Decorates another Matcher, retaining the behaviour but allowing tests
013 * to be slightly more expressive.
014 *
015 * For example:  assertThat(cheese, equalTo(smelly))
016 *          vs.  assertThat(cheese, is(equalTo(smelly)))
017 */
018public class Is<T> extends BaseMatcher<T> {
019    private final Matcher<T> matcher;
020
021    public Is(Matcher<T> matcher) {
022        this.matcher = matcher;
023    }
024
025    @Override
026    public boolean matches(Object arg) {
027        return matcher.matches(arg);
028    }
029
030    @Override
031    public void describeTo(Description description) {
032        description.appendText("is ").appendDescriptionOf(matcher);
033    }
034
035    @Override
036    public void describeMismatch(Object item, Description mismatchDescription) {
037        matcher.describeMismatch(item, mismatchDescription);
038    }
039
040    /**
041     * Decorates another Matcher, retaining its behaviour, but allowing tests
042     * to be slightly more expressive.
043     * <p/>
044     * For example:
045     * <pre>assertThat(cheese, is(equalTo(smelly)))</pre>
046     * instead of:
047     * <pre>assertThat(cheese, equalTo(smelly))</pre>
048     * 
049     */
050    @Factory
051    public static <T> Matcher<T> is(Matcher<T> matcher) {
052        return new Is<T>(matcher);
053    }
054
055    /**
056     * A shortcut to the frequently used <code>is(equalTo(x))</code>.
057     * <p/>
058     * For example:
059     * <pre>assertThat(cheese, is(smelly))</pre>
060     * instead of:
061     * <pre>assertThat(cheese, is(equalTo(smelly)))</pre>
062     * 
063     */
064    @Factory
065    public static <T> Matcher<T> is(T value) {
066        return is(equalTo(value));
067    }
068
069    /**
070     * A shortcut to the frequently used <code>is(instanceOf(SomeClass.class))</code>.
071     * <p/>
072     * For example:
073     * <pre>assertThat(cheese, is(Cheddar.class))</pre>
074     * instead of:
075     * <pre>assertThat(cheese, is(instanceOf(Cheddar.class)))</pre>
076     *
077     * @deprecated use isA(Class<T> type) instead.
078     */
079    @Factory
080    @Deprecated
081    public static <T> Matcher<T> is(Class<T> type) {
082        final Matcher<T> typeMatcher = instanceOf(type);
083        return is(typeMatcher);
084    }
085
086    /**
087     * A shortcut to the frequently used <code>is(instanceOf(SomeClass.class))</code>.
088     * <p/>
089     * For example:
090     * <pre>assertThat(cheese, isA(Cheddar.class))</pre>
091     * instead of:
092     * <pre>assertThat(cheese, is(instanceOf(Cheddar.class)))</pre>
093     * 
094     */
095    @Factory
096    public static <T> Matcher<T> isA(Class<T> type) {
097        final Matcher<T> typeMatcher = instanceOf(type);
098        return is(typeMatcher);
099    }
100}