    001    /*  Copyright (c) 2000-2009 hamcrest.org
    002     */
    003    package org.hamcrest.core;
    004
    005    import org.hamcrest.BaseMatcher;
    006    import org.hamcrest.Description;
    007    import org.hamcrest.Factory;
    008    import org.hamcrest.Matcher;
    009
    010    import static org.hamcrest.core.IsEqual.equalTo;
    011
    012
    013    /**
    014     * Calculates the logical negation of a matcher.
    015     */
    016    public class IsNot<T> extends BaseMatcher<T>  {
    017        private final Matcher<T> matcher;
    018
    019        public IsNot(Matcher<T> matcher) {
    020            this.matcher = matcher;
    021        }
    022
    023        @Override
    024        public boolean matches(Object arg) {
    025            return !matcher.matches(arg);
    026        }
    027
    028        @Override
    029        public void describeTo(Description description) {
    030            description.appendText("not ").appendDescriptionOf(matcher);
    031        }
    032
    033
    034        /**
    035         * Creates a matcher that wraps an existing matcher, but inverts the logic by which
    036         * it will match.
    037         * <p/>
    038         * For example:
    039         * <pre>assertThat(cheese, is(not(equalTo(smelly))))</pre>
    040         *
    041         * @param matcher
    042         *     the matcher whose sense should be inverted
    043         */
    044        @Factory
    045        public static <T> Matcher<T> not(Matcher<T> matcher) {
    046            return new IsNot<T>(matcher);
    047        }
    048
    049        /**
    050         * A shortcut to the frequently used <code>not(equalTo(x))</code>.
    051         * <p/>
    052         * For example:
    053         * <pre>assertThat(cheese, is(not(smelly)))</pre>
    054         * instead of:
    055         * <pre>assertThat(cheese, is(not(equalTo(smelly))))</pre>
    056         *
    057         * @param value
    058         *     the value that any examined object should <b>not</b> equal
    059         */
    060        @Factory
    061        public static <T> Matcher<T> not(T value) {
    062            return not(equalTo(value));
    063        }
    064    }