package com.annimon.stream.test.hamcrest; import com.annimon.stream.DoubleStream; import com.annimon.stream.function.Function; import com.annimon.stream.function.IntFunction; import org.hamcrest.Description; import org.hamcrest.Matcher; import org.hamcrest.TypeSafeDiagnosingMatcher; import static org.hamcrest.MatcherAssert.assertThat; public class DoubleStreamMatcher { private DoubleStreamMatcher() { } public static Matcher<DoubleStream> isEmpty() { return new IsEmptyMatcher(); } public static Matcher<DoubleStream> hasElements() { return new HasElementsMatcher(); } public static Matcher<DoubleStream> elements(Matcher<Double[]> matcher) { return new ElementsMatcher(matcher); } public static Function<DoubleStream, Void> assertIsEmpty() { return new Function<DoubleStream, Void>() { @Override public Void apply(DoubleStream t) { assertThat(t, isEmpty()); return null; } }; } public static Function<DoubleStream, Void> assertHasElements() { return new Function<DoubleStream, Void>() { @Override public Void apply(DoubleStream t) { assertThat(t, hasElements()); return null; } }; } public static Function<DoubleStream, Void> assertElements(final Matcher<Double[]> matcher) { return new Function<DoubleStream, Void>() { @Override public Void apply(DoubleStream t) { assertThat(t, elements(matcher)); return null; } }; } public static class IsEmptyMatcher extends TypeSafeDiagnosingMatcher<DoubleStream> { @Override protected boolean matchesSafely(DoubleStream stream, Description mismatchDescription) { mismatchDescription.appendText("DoubleStream was not empty"); return stream.count() == 0; } @Override public void describeTo(Description description) { description.appendText("an empty stream"); } } public static class HasElementsMatcher extends TypeSafeDiagnosingMatcher<DoubleStream> { @Override protected boolean matchesSafely(DoubleStream stream, Description mismatchDescription) { mismatchDescription.appendText("DoubleStream was empty"); return stream.count() > 0; } @Override public void describeTo(Description description) { description.appendText("a non-empty stream"); } } public static class ElementsMatcher extends TypeSafeDiagnosingMatcher<DoubleStream> { private final Matcher<Double[]> matcher; private Double[] streamElements; public ElementsMatcher(Matcher<Double[]> matcher) { this.matcher = matcher; } @Override protected boolean matchesSafely(DoubleStream stream, Description mismatchDescription) { final Double[] elements; if (streamElements == null) { elements = stream.boxed().toArray(BOXED_ARRAY_CREATOR); streamElements = elements; } else { elements = streamElements; } if (!matcher.matches(elements)) { mismatchDescription.appendText("DoubleStream elements "); matcher.describeMismatch(elements, mismatchDescription); return false; } return true; } @Override public void describeTo(Description description) { description.appendText("DoubleStream elements ").appendDescriptionOf(matcher); } } private static final IntFunction<Double[]> BOXED_ARRAY_CREATOR = new IntFunction<Double[]>() { @Override public Double[] apply(int value) { return new Double[value]; } }; }