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

com.annimon.stream.test.hamcrest.StreamMatcher Maven / Gradle / Ivy

There is a newer version: 1.2.2
Show newest version
package com.annimon.stream.test.hamcrest;

import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;

import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeDiagnosingMatcher;

import java.util.List;

import static org.hamcrest.CoreMatchers.not;

public class StreamMatcher {

    private StreamMatcher() { }

    public static Matcher> isEmpty() {
        return new IsEmptyMatcher();
    }

    /**
     * @deprecated Use not({@link StreamMatcher#isEmpty()}) or {@link StreamMatcher#hasElements()} instead
     */
    @Deprecated
    public static Matcher> isNotEmpty() {
        return not(isEmpty());
    }

    public static Matcher> hasElements() {
        return new HasElementsMatcher();
    }

    public static  Matcher> elements(Matcher> matcher) {
        return new ElementsMatcher(matcher);
    }

    public static class IsEmptyMatcher extends TypeSafeDiagnosingMatcher> {

        @Override
        protected boolean matchesSafely(Stream stream, Description mismatchDescription) {
            mismatchDescription.appendText("Stream was not empty");
            return stream.count() == 0;
        }

        @Override
        public void describeTo(Description description) {
            description.appendText("an empty stream");
        }
    }

    public static class HasElementsMatcher extends TypeSafeDiagnosingMatcher> {

        @Override
        protected boolean matchesSafely(Stream stream, Description mismatchDescription) {
            mismatchDescription.appendText("Stream was empty");
            return stream.count() > 0;
        }

        @Override
        public void describeTo(Description description) {
            description.appendText("a non-empty stream");
        }
    }

    public static class ElementsMatcher extends TypeSafeDiagnosingMatcher> {

        private final Matcher> matcher;
        private List streamElements;

        public ElementsMatcher(Matcher> matcher) {
            this.matcher = matcher;
        }

        @Override
        protected boolean matchesSafely(Stream stream, Description mismatchDescription) {
            final List elements;
            if (streamElements == null) {
                elements = stream.collect(Collectors.toList());
                streamElements = elements;
            } else {
                elements = streamElements;
            }
            if (!matcher.matches(elements)) {
                mismatchDescription.appendText("Stream elements ");
                matcher.describeMismatch(elements, mismatchDescription);
                return false;
            }
            return true;
        }

        @Override
        public void describeTo(Description description) {
            description.appendText("Stream elements ").appendDescriptionOf(matcher);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy