package com.annimon.stream.test.hamcrest;
import com.annimon.stream.OptionalLong;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeDiagnosingMatcher;
import static org.hamcrest.CoreMatchers.is;
public class OptionalLongMatcher {
private OptionalLongMatcher() { }
public static Matcher<OptionalLong> isPresent() {
return new IsPresentMatcher();
}
public static Matcher<OptionalLong> isEmpty() {
return new IsEmptyMatcher();
}
public static Matcher<OptionalLong> hasValue(long value) {
return hasValueThat(is(value));
}
public static Matcher<OptionalLong> hasValueThat(Matcher<? super Long> matcher) {
return new HasValueMatcher(matcher);
}
public static class IsPresentMatcher extends TypeSafeDiagnosingMatcher<OptionalLong> {
@Override
protected boolean matchesSafely(OptionalLong optional, Description mismatchDescription) {
mismatchDescription.appendText("OptionalLong was empty");
return optional.isPresent();
}
@Override
public void describeTo(Description description) {
description.appendText("OptionalLong value should be present");
}
}
public static class IsEmptyMatcher extends TypeSafeDiagnosingMatcher<OptionalLong> {
@Override
protected boolean matchesSafely(OptionalLong optional, Description mismatchDescription) {
mismatchDescription.appendText("OptionalLong was present");
return !optional.isPresent();
}
@Override
public void describeTo(Description description) {
description.appendText("OptionalLong value should be empty");
}
}
public static class HasValueMatcher extends TypeSafeDiagnosingMatcher<OptionalLong> {
private final Matcher<? super Long> matcher;
public HasValueMatcher(Matcher<? super Long> matcher) {
this.matcher = matcher;
}
@Override
protected boolean matchesSafely(OptionalLong optional, Description mismatchDescription) {
if (!optional.isPresent()) {
mismatchDescription.appendText("OptionalLong was empty");
return false;
}
final Long value = optional.getAsLong();
mismatchDescription.appendText("OptionalLong value ");
matcher.describeMismatch(value, mismatchDescription);
return matcher.matches(value);
}
@Override
public void describeTo(Description description) {
description.appendText("OptionalLong value ").appendDescriptionOf(matcher);
}
}
}