All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fj.test.Result Maven / Gradle / Ivy

package fj.test;

import fj.F;
import fj.P1;
import fj.data.List;
import fj.data.Option;
import static fj.data.Option.none;
import static fj.data.Option.some;

/**
 * The result of evaluating a property.
 *
 * @version %build.number%
 */
public final class Result {
  private final Option>> args;
  private final R r;
  private final Option t;

  private enum R {
    Unfalsified, Falsified, Proven, Exception, NoResult
  }

  private Result(final Option>> args, final R r, final Option t) {
    this.args = args;
    this.r = r;
    this.t = t;
  }

  /**
   * Returns the potential arguments associated with this result. This will only have a value, if
   * and only if {@link #noResult(Option) !noResult()} holds.
   *
   * @return The potential arguments associated with this result.
   */
  public Option>> args() {
    return args;
  }

  /**
   * Returns the potential exception associated with this result. This will only have a value if and
   * only if this result is an exception result.
   *
   * @return The potential exception associated with this result.
   */
  public Option exception() {
    return t;
  }

  /**
   * Returns true if this result is unfalsified; otherwise, false.
   *
   * @return true if this result is unfalsified; otherwise, false.
   */
  public boolean isUnfalsified() {
    return r == R.Unfalsified;
  }

  /**
   * Returns true if this result is falsified; otherwise, false.
   *
   * @return true if this result is falsified; otherwise, false.
   */
  public boolean isFalsified() {
    return r == R.Falsified;
  }

  /**
   * Returns true if this result is proven; otherwise, false.
   *
   * @return true if this result is proven; otherwise, false.
   */
  public boolean isProven() {
    return r == R.Proven;
  }

  /**
   * Returns true if this result is an exception; otherwise, false.
   *
   * @return true if this result is an exception; otherwise, false.
   */
  public boolean isException() {
    return r == R.Exception;
  }

  /**
   * Returns true if this result is no result; otherwise, false.
   *
   * @return true if this result is no result; otherwise, false.
   */
  public boolean isNoResult() {
    return r == R.NoResult;
  }

  /**
   * Returns true if this result is falsified or an exception; otherwise,
   * false.
   *
   * @return true if this result is falsified or an exception; otherwise,
   * false.
   */
  public boolean failed() {
    return isFalsified() || isException();
  }

  /**
   * Returns true if this result is unfalsified or proven; otherwise,
   * false.
   *
   * @return true if this result is unfalsified or proven; otherwise,
   * false.
   */
  public boolean passed() {
    return isUnfalsified() || isProven();
  }

  /**
   * If this result is proven, alter it to be unfalsified with the same arguments; otherwise, return
   * this.
   *
   * @return If this result is proven, alter it to be unfalsified with the same arguments;
   * otherwise, return this.
   */
  public Result provenAsUnfalsified() {
    return isProven() ? unfalsified(args.some()) : this;
  }

  /**
   * Adds an argument to this result.
   *
   * @param a The argument to add.
   * @return A result with the new argument.
   */
  public Result addArg(final Arg a) {
    final F, F>, List>>> cons = List.cons();
    return new Result(args.map(cons.f(a)), r, t);
  }

  /**
   * Returns a potential result for this result. This will have a value if this result is
   * {@link #noResult(Option) !noResult()}.
   *
   * @return A potential result for this result.
   */
  @SuppressWarnings({"IfMayBeConditional"})
  public Option toOption() {
    if(isNoResult())
      return none();
    else
      return some(this);
  }

  /**
   * Returns a result from the given potential result.
   *
   * @param r The potential result.
   * @return The result that may be {@link #noResult() noResult()}.
   */
  public static Result noResult(final Option r) {
    return r.orSome(() -> noResult());
  }

  /**
   * Returns a result representing no result.
   *
   * @return A result representing no result.
   */
  public static Result noResult() {
    return new Result(Option.>>none(), R.NoResult, Option.none());
  }

  /**
   * Returns an unfalsified result.
   *
   * @param args The arguments used during the failure of falsification.
   * @return An unfalsified result.
   */
  public static Result unfalsified(final List> args) {
    return new Result(some(args), R.Unfalsified, Option.none());
  }

  /**
   * Returns a falsified result.
   *
   * @param args The arguments used during falsification.
   * @return A falsified result.
   */
  public static Result falsified(final List> args) {
    return new Result(some(args), R.Falsified, Option.none());
  }

  /**
   * Returns a proven result.
   *
   * @param args The arguments used during proof.
   * @return A proven result.
   */
  public static Result proven(final List> args) {
    return new Result(some(args), R.Proven, Option.none());
  }

  /**
   * Returns an exception result.
   *
   * @param args The arguments used when the exception occurred.
   * @param t The exception that occurred.
   * @return A exception result.
   */
  public static Result exception(final List> args, final Throwable t) {
    return new Result(some(args), R.Exception, some(t));
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy