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

com.github.dakusui.crest.matcherbuilders.MatcherBuilder Maven / Gradle / Ivy

package com.github.dakusui.crest.matcherbuilders;

import com.github.dakusui.crest.core.Matcher;
import com.github.dakusui.crest.utils.printable.Predicates;

import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;

import static java.util.stream.Collectors.toList;

/*
 */
public interface MatcherBuilder> {
  enum Op {
    AND {
      @SuppressWarnings("unchecked")
      @Override
       Matcher create(List> matchers) {
        return Matcher.Conjunctive.create(false, (List>) matchers);
      }
    },
    OR {
      @SuppressWarnings("unchecked")
      @Override
       Matcher create(List> matchers) {
        return Matcher.Disjunctive.create(false, (List>) matchers);
      }
    };

    @SuppressWarnings("unchecked")
     Matcher create(List> predicates, Function function) {
      return create(
          predicates.stream(
          ).map(
              predicate -> (Matcher) Matcher.Leaf.create(predicate, function)
          ).collect(
              toList()
          )
      );
    }

    abstract  Matcher create(List> matchers);
  }

  SELF check(Predicate predicate);

   SELF check(Function function, Predicate predicate);

  default SELF check(String methodName, Object... args) {
    return check(Predicates.invoke(methodName, args));
  }

  default SELF equalTo(OUT value) {
    return this.check(Predicates.equalTo(value));
  }

  Matcher all();

  Matcher any();

  /**
   * Synonym for {@code all()}.
   *
   * @return A matcher built by this object
   * @see MatcherBuilder#all
   */
  default Matcher matcher() {
    return all();
  }

  /**
   * Synonym for {$code matcher()}. You can use this method to make your code look
   * more 'natural' (as an English sentence).
   */
  default Matcher $() {
    return matcher();
  }
}