001    /*
002     * Created on Apr 14, 2007
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 @2007-2010 the original author or authors.
014     */
015    package org.fest.swing.timing;
016    
017    import static org.fest.util.Strings.concat;
018    
019    import org.fest.assertions.BasicDescription;
020    import org.fest.assertions.Description;
021    
022    /**
023     * Understands a condition to verify, usually used in the method <code>{@link Pause#pause(Condition)}</code>.
024     *
025     * @author Yvonne Wang
026     * @author Alex Ruiz
027     */
028    public abstract class Condition {
029    
030      protected static final String EMPTY_TEXT = "";
031    
032      private final Description description;
033    
034      /**
035       * Creates a new <code>{@link Condition}</code>.
036       * @param description describes this condition.
037       */
038      public Condition(String description) {
039        this(new BasicDescription(description));
040      }
041    
042      /**
043       * Creates a new </code>{@link Condition}</code>.
044       * @param description describes this condition.
045       */
046      public Condition(Description description) {
047        this.description = description;
048      }
049    
050      /**
051       * Checks if the condition has been satisfied.
052       * @return <code>true</code> if the condition has been satisfied, otherwise <code>false</code>.
053       */
054      public abstract boolean test();
055    
056      /**
057       * Returns the <code>String</code> representation of this condition, which is its description.
058       * @return the description of this condition.
059       */
060      @Override public final String toString() {
061        String descriptionText = description != null ? description.value() : defaultDescription();
062        String addendum = descriptionAddendum();
063        return concat(descriptionText, addendum != null ? addendum : EMPTY_TEXT);
064      }
065    
066      private String defaultDescription() {
067        return concat("condition of type [", getClass().getName(), "]");
068      }
069    
070      /**
071       * Returns any text to be added to this condition's description. The default value is an empty <code>String</code>.
072       * @return by default, an empty <code>String</code>.
073       */
074      protected String descriptionAddendum() {
075        return EMPTY_TEXT;
076      }
077    
078      /**
079       * Notification that this condition has been evaluated. This method is invoked by
080       * <code>{@link Pause#pause(Condition)}</code> (and all overloaded methods) when this condition is evaluated (either
081       * it was satisfied or it timed-out.) This is a good place to do any necessary resource cleanup.
082       */
083      protected void done() {}
084    }