package org.testng.util;

import java.util.concurrent.atomic.AtomicInteger;
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;

/**
 * An implementation of IRetryAnalyzer that allows you to specify the maximum number of times you
 * want your test to be retried.
 *
 * @author tocman@gmail.com (Jeremie Lenfant-Engelmann)
 */
public abstract class RetryAnalyzerCount implements IRetryAnalyzer {

  // Default retry once.
  AtomicInteger count = new AtomicInteger(1);

  /** @param count the max number of time the method needs to be retried. */
  protected void setCount(int count) {
    this.count.set(count);
  }

  /** @return the current counter value */
  protected int getCount() {
    return this.count.get();
  }

  /**
   * Retries the test if count is not 0.
   *
   * @param result The result of the test.
   */
  @Override
  public boolean retry(ITestResult result) {
    if (count.getAndDecrement() > 0) {
      return retryMethod(result);
    }
    return false;
  }

  /**
   * The method implemented by the class that test if the test must be retried or not.
   *
   * @param result The result of the test.
   * @return true if the test must be retried, false otherwise.
   */
  public abstract boolean retryMethod(ITestResult result);
}
