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

org.cthul.matchers.hamcrest.IsMatchResult Maven / Gradle / Ivy

Go to download

Provides hamcrest.org matchers for strings and exceptions, allows matching code blocks, and provides several utilities for combining matchers.

The newest version!
package org.cthul.matchers.hamcrest;

import org.cthul.matchers.diagnose.result.AbstractMatchResult;
import org.cthul.matchers.diagnose.result.MatchResult;
import org.cthul.matchers.diagnose.safe.TypesafeNestedResultMatcher;
import org.hamcrest.Description;
import org.hamcrest.Factory;
import org.hamcrest.Matcher;

/**
 *
 */
public class IsMatchResult extends TypesafeNestedResultMatcher> {

    @Factory
    public static  IsMatchResult match() {
        return new IsMatchResult<>();
    }

    @Factory
    public static  IsMatchResult mismatch() {
        return new IsMatchResult<>(false);
    }
    
    @Factory
    public static  IsMatchResult match(Matcher> resultMatcher) {
        return new IsMatchResult<>(resultMatcher);
    }

    @Factory
    public static  IsMatchResult mismatch(Matcher> resultMatcher) {
        return new IsMatchResult<>(false, resultMatcher);
    }
    
    @Factory
    public static  IsMatchResult matchWithMessage(Matcher resultMatcher) {
        return match(HasDescription.message(resultMatcher));
    }

    @Factory
    public static  IsMatchResult mismatchWithMessage(Matcher resultMatcher) {
        return mismatch(HasDescription.message(resultMatcher));
    }
    
    @Factory
    public static  IsMatchResult matchWithMessage(String message) {
        return match(HasDescription.message(message));
    }

    @Factory
    public static  IsMatchResult mismatchWithMessage(String message) {
        return mismatch(HasDescription.message(message));
    }
    
    @Factory
    public static  IsMatchResult match(String message) {
        return match(HasDescription.message(message));
    }

    @Factory
    public static  IsMatchResult mismatch(String message) {
        return mismatch(HasDescription.message(message));
    }
    
    private final boolean match;
    private final Matcher> resultMatcher;

    public IsMatchResult() {
        super(MatchResult.class);
        this.match = true;
        this.resultMatcher = null;
    }

    public IsMatchResult(Matcher> resultMatcher) {
        super(MatchResult.class);
        this.match = true;
        this.resultMatcher = resultMatcher;
    }

    public IsMatchResult(boolean match) {
        super(MatchResult.class);
        this.match = match;
        this.resultMatcher = null;
    }

    public IsMatchResult(boolean match, Matcher> resultMatcher) {
        super(MatchResult.class);
        this.match = match;
        this.resultMatcher = resultMatcher;
    }

    @Override
    public void describeTo(Description description) {
        if (resultMatcher == null) {
            description
                    .appendText(match ? "a match" : " a mismatch");
        } else {
            description
                    .appendText(match ? "match " : "mismatch ");
            nestedDescribeTo(resultMatcher, description);
        }
    }

    @Override
    public int getDescriptionPrecedence() {
        return resultMatcher == null ? P_ATOMIC : P_UNARY;
    }
    
    @Override
    protected boolean matchesSafely(MatchResult item) {
        if (item.matched() != match) {
            return false;
        }
        if (resultMatcher == null) {
            return true;
        }
        return resultMatcher.matches(item);
    }

    @Override
    protected > MatchResult matchResultSafely(I item) {
        if (resultMatcher == null || item.matched() != match) {
            return valueResult(item);
        }
        MatchResult msgResult = quickMatchResult(resultMatcher, item);
        return messageResult(item, msgResult);
    }

    private > MatchResult valueResult(final I item) {
        return new AbstractMatchResult>(item, this, item.matched() == match) {
            @Override
            public void describeMatch(Description d) {
                d.appendText("was ")
                        .appendText(match ? "match " : "mismatch ")
                        .appendValue(item);
            }
            @Override
            public void describeMismatch(Description d) {
                d.appendText("was ")
                        .appendText(match ? "mismatch " : "match ")
                        .appendValue(item);
            }
        };
    }

    private > MatchResult messageResult(I item, final MatchResult mr) {
        return new NestedResult>(item, this, mr.matched()) {
            @Override
            public void describeMatch(Description d) {
                d.appendText(match ? "match " : "mismatch ");
                nestedDescribeTo(getMatchPrecedence(), mr, d);
            }
            @Override
            public void describeMismatch(Description d) {
                d.appendText(match ? "match " : "mismatch ");
                nestedDescribeTo(getMismatchPrecedence(), mr, d);
            }
        };
    }
}