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 }