001    /*
002     * Created on Jul 15, 2010
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
005     * the License. You may obtain a copy of the License at
006     *
007     * http://www.apache.org/licenses/LICENSE-2.0
008     *
009     * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
010     * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
011     * specific language governing permissions and limitations under the License.
012     *
013     * Copyright @2010-2011 the original author or authors.
014     */
015    package org.fest.assertions.internal;
016    
017    import static org.fest.assertions.error.ShouldBe.shouldBe;
018    import static org.fest.assertions.error.ShouldHave.shouldHave;
019    import static org.fest.assertions.error.ShouldNotBe.shouldNotBe;
020    import static org.fest.assertions.error.ShouldNotHave.shouldNotHave;
021    
022    import org.fest.assertions.core.*;
023    import org.fest.util.VisibleForTesting;
024    
025    /**
026     * Verifies that a value satisfies a <code>{@link Condition}</code>.
027     *
028     * @author Alex Ruiz
029     */
030    public class Conditions {
031    
032      private static final Conditions INSTANCE = new Conditions();
033    
034      /**
035       * Returns the singleton instance of this class.
036       * @return the singleton instance of this class.
037       */
038      public static Conditions instance() {
039        return INSTANCE;
040      }
041    
042      @VisibleForTesting Failures failures = Failures.instance();
043    
044      @VisibleForTesting Conditions() {}
045    
046      /**
047       * Asserts that the actual value satisfies the given <code>{@link Condition}</code>.
048       * @param <T> the type of the actual value and the type of values that given {@code Condition} takes.
049       * @param info contains information about the assertion.
050       * @param actual the actual value.
051       * @param condition the given {@code Condition}.
052       * @throws NullPointerException if the given {@code Condition} is {@code null}.
053       * @throws AssertionError if the actual value does not satisfy the given {@code Condition}.
054       */
055      public <T> void assertIs(AssertionInfo info, T actual, Condition<T> condition) {
056        assertIsNotNull(condition);
057        if (condition.matches(actual)) return;
058        throw failures.failure(info, shouldBe(actual, condition));
059      }
060    
061      /**
062       * Asserts that the actual value does not satisfy the given <code>{@link Condition}</code>.
063       * @param <T> the type of the actual value and the type of values that given {@code Condition} takes.
064       * @param info contains information about the assertion.
065       * @param actual the actual value.
066       * @param condition the given {@code Condition}.
067       * @throws NullPointerException if the given {@code Condition} is {@code null}.
068       * @throws AssertionError if the actual value satisfies the given {@code Condition}.
069       */
070      public <T> void assertIsNot(AssertionInfo info, T actual, Condition<T> condition) {
071        assertIsNotNull(condition);
072        if (!condition.matches(actual)) return;
073        throw failures.failure(info, shouldNotBe(actual, condition));
074      }
075    
076      /**
077       * Asserts that the actual value satisfies the given <code>{@link Condition}</code>.
078       * @param <T> the type of the actual value and the type of values that given {@code Condition} takes.
079       * @param info contains information about the assertion.
080       * @param actual the actual value.
081       * @param condition the given {@code Condition}.
082       * @throws NullPointerException if the given {@code Condition} is {@code null}.
083       * @throws AssertionError if the actual value does not satisfy the given {@code Condition}.
084       */
085      public <T> void assertHas(AssertionInfo info, T actual, Condition<T> condition) {
086        assertIsNotNull(condition);
087        if (condition.matches(actual)) return;
088        throw failures.failure(info, shouldHave(actual, condition));
089      }
090    
091      /**
092       * Asserts that the actual value does not satisfy the given <code>{@link Condition}</code>.
093       * @param <T> the type of the actual value and the type of values that given {@code Condition} takes.
094       * @param info contains information about the assertion.
095       * @param actual the actual value.
096       * @param condition the given {@code Condition}.
097       * @throws NullPointerException if the given {@code Condition} is {@code null}.
098       * @throws AssertionError if the actual value satisfies the given {@code Condition}.
099       */
100      public <T> void assertDoesNotHave(AssertionInfo info, T actual, Condition<T> condition) {
101        assertIsNotNull(condition);
102        if (!condition.matches(actual)) return;
103        throw failures.failure(info, shouldNotHave(actual, condition));
104      }
105    
106      /**
107       * Asserts the the given <code>{@link Condition}</code> is not null.
108       * @param condition the given {@code Condition}.
109       * @throws NullPointerException if the given {@code Condition} is {@code null}.
110       */
111      public void assertIsNotNull(Condition<?> condition) {
112        if (condition == null) throw new NullPointerException("The condition to evaluate should not be null");
113      }
114    }