X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Ftest%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2FMatchers.java;h=88732782cb3466bfc3fb3131077b8ca8df345bc4;hb=8a6efbfb639dea6c707dfe26aafcb6c5029dda9a;hp=4bf7aa5785da7b89946ba83e4c65b4fbd781246d;hpb=1df489f8cc3a4e905dcaa03444f8f72e421a53ef;p=Sone.git diff --git a/src/test/java/net/pterodactylus/sone/Matchers.java b/src/test/java/net/pterodactylus/sone/Matchers.java index 4bf7aa5..8873278 100644 --- a/src/test/java/net/pterodactylus/sone/Matchers.java +++ b/src/test/java/net/pterodactylus/sone/Matchers.java @@ -17,8 +17,17 @@ package net.pterodactylus.sone; +import static java.util.Arrays.asList; import static java.util.regex.Pattern.compile; +import java.io.IOException; +import java.io.InputStream; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import com.google.common.base.Objects; +import com.google.common.collect.Lists; import org.hamcrest.Description; import org.hamcrest.Matcher; import org.hamcrest.TypeSafeMatcher; @@ -44,4 +53,103 @@ public class Matchers { }; } + public static Matcher> contains(T... items) { + return contains(asList(items)); + } + + public static Matcher> contains(final Collection items) { + return new TypeSafeMatcher>() { + @Override + protected boolean matchesSafely(Iterator iterator) { + for (T item : items) { + if (!iterator.hasNext()) { + return false; + } + T nextItem = iterator.next(); + if (!Objects.equal(item, nextItem)) { + return false; + } + } + if (iterator.hasNext()) { + return false; + } + return true; + } + + @Override + public void describeTo(Description description) { + description.appendText("contains ").appendValue(items); + } + }; + } + + public static Matcher> containsInAnyOrder(T... items) { + return containsInAnyOrder(asList(items)); + } + + public static Matcher> containsInAnyOrder(final Collection items) { + return new TypeSafeMatcher>() { + private final List remainingItems = Lists.newArrayList(items); + @Override + protected boolean matchesSafely(Iterator iterator) { + while (iterator.hasNext()) { + T item = iterator.next(); + if (remainingItems.isEmpty()) { + return false; + } + if (!remainingItems.remove(item)) { + return false; + } + } + if (!remainingItems.isEmpty()) { + return false; + } + return true; + } + + @Override + public void describeTo(Description description) { + description.appendText("contains ").appendValue(items); + } + }; + } + + public static Matcher delivers(final byte[] data) { + return new TypeSafeMatcher() { + byte[] readData = new byte[data.length]; + + @Override + protected boolean matchesSafely(InputStream inputStream) { + int offset = 0; + try { + while (true) { + int r = inputStream.read(); + if (r == -1) { + return offset == data.length; + } + if (offset == data.length) { + return false; + } + if (data[offset] != (readData[offset] = (byte) r)) { + return false; + } + offset++; + } + } catch (IOException ioe1) { + return false; + } + } + + @Override + public void describeTo(Description description) { + description.appendValue(data); + } + + @Override + protected void describeMismatchSafely(InputStream item, Description mismatchDescription) { + mismatchDescription.appendValue(readData); + } + }; + } + }