Add and use a matcher for incomplete posts.
[Sone.git] / src / test / java / net / pterodactylus / sone / Matchers.java
index cdafcca..3ac4972 100644 (file)
 
 package net.pterodactylus.sone;
 
-import static com.google.common.base.Objects.equal;
-import static com.google.common.collect.Iterators.size;
-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 freenet.support.SimpleFieldSet;
+import net.pterodactylus.sone.data.Album;
+import net.pterodactylus.sone.data.Image;
+import net.pterodactylus.sone.data.Post;
+import net.pterodactylus.sone.data.PostReply;
 
 import com.google.common.base.Objects;
-import com.google.common.collect.Lists;
+import com.google.common.base.Optional;
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
+import org.hamcrest.TypeSafeDiagnosingMatcher;
 import org.hamcrest.TypeSafeMatcher;
 
 /**
@@ -89,10 +87,309 @@ public class Matchers {
                        }
 
                        @Override
-                       protected void describeMismatchSafely(InputStream item, Description mismatchDescription) {
+                       protected void describeMismatchSafely(InputStream item,
+                                       Description mismatchDescription) {
                                mismatchDescription.appendValue(readData);
                        }
                };
        }
 
+       public static class IncompletePostMatcher extends TypeSafeDiagnosingMatcher<Post> {
+
+               private String id;
+               private String sender;
+               private boolean checkRecipient;
+               private String recipient;
+               private long time;
+               private String text;
+
+               private IncompletePostMatcher() {
+               }
+
+               public static IncompletePostMatcher matches() {
+                       return new IncompletePostMatcher();
+               }
+
+               public IncompletePostMatcher id(String id) {
+                       this.id = id;
+                       return this;
+               }
+
+               public IncompletePostMatcher sender(String sender) {
+                       this.sender = sender;
+                       return this;
+               }
+
+               public IncompletePostMatcher recipient(String recipient) {
+                       this.checkRecipient = true;
+                       this.recipient = recipient;
+                       return this;
+               }
+
+               public IncompletePostMatcher time(long time) {
+                       this.time = time;
+                       return this;
+               }
+
+               public IncompletePostMatcher text(String text) {
+                       this.text = text;
+                       return this;
+               }
+
+               @Override
+               protected boolean matchesSafely(Post post, Description mismatchDescription) {
+                       if ((id != null) && !id.matches(post.getId())) {
+                               mismatchDescription.appendText("ID is ").appendValue(post.getId());
+                               return false;
+                       }
+                       if ((sender != null) && !sender.matches(post.getSone().getId())) {
+                               mismatchDescription.appendText("sender is ").appendValue(post.getSone().getId());
+                               return false;
+                       }
+                       if (checkRecipient && !Objects.equal(recipient, post.getRecipientId().orNull())) {
+                               mismatchDescription.appendText("recipient is ").appendValue(post.getRecipientId().orNull());
+                               return false;
+                       }
+                       if ((time != 0) && (time != post.getTime())) {
+                               mismatchDescription.appendText("time is ").appendValue(post.getTime());
+                               return false;
+                       }
+                       if ((text != null) && !text.equals(post.getText())) {
+                               mismatchDescription.appendText("text is ").appendValue(post.getText());
+                               return false;
+                       }
+                       return true;
+               }
+
+               @Override
+               public void describeTo(Description description) {
+                       description.appendText("is post");
+                       if (id != null) {
+                               description.appendText(" with ID ").appendValue(id);
+                       }
+                       if (sender != null) {
+                               description.appendText(" with sender ").appendValue(sender);
+                       }
+                       if (checkRecipient) {
+                               description.appendText(" with recipient ").appendValue(recipient);
+                       }
+                       if (time != 0) {
+                               description.appendText(" with time ").appendValue(time);
+                       }
+                       if (text != null) {
+                               description.appendText(" with text ").appendValue(text);
+                       }
+               }
+
+       }
+
+
+       public static Matcher<Post> isPost(String postId, long time,
+                       String text, Optional<String> recipient) {
+               return IncompletePostMatcher.matches().id(postId).time(time).text(text).recipient(recipient.orNull());
+       }
+
+       public static Matcher<Post> isPostWithId(String postId) {
+               return IncompletePostMatcher.matches().id(postId);
+       }
+
+       public static Matcher<PostReply> isPostReply(String postReplyId,
+                       String postId, long time, String text) {
+               return new PostReplyMatcher(postReplyId, postId, time, text);
+       }
+
+       public static Matcher<Album> isAlbum(final String albumId,
+                       final String parentAlbumId,
+                       final String title, final String albumDescription,
+                       final String imageId) {
+               return new TypeSafeDiagnosingMatcher<Album>() {
+                       @Override
+                       protected boolean matchesSafely(Album album,
+                                       Description mismatchDescription) {
+                               if (!album.getId().equals(albumId)) {
+                                       mismatchDescription.appendText("ID is ")
+                                                       .appendValue(album.getId());
+                                       return false;
+                               }
+                               if (parentAlbumId == null) {
+                                       if (album.getParent() != null) {
+                                               mismatchDescription.appendText("has parent album");
+                                               return false;
+                                       }
+                               } else {
+                                       if (album.getParent() == null) {
+                                               mismatchDescription.appendText("has no parent album");
+                                               return false;
+                                       }
+                                       if (!album.getParent().getId().equals(parentAlbumId)) {
+                                               mismatchDescription.appendText("parent album is ")
+                                                               .appendValue(album.getParent().getId());
+                                               return false;
+                                       }
+                               }
+                               if (!title.equals(album.getTitle())) {
+                                       mismatchDescription.appendText("has title ")
+                                                       .appendValue(album.getTitle());
+                                       return false;
+                               }
+                               if (!albumDescription.equals(album.getDescription())) {
+                                       mismatchDescription.appendText("has description ")
+                                                       .appendValue(album.getDescription());
+                                       return false;
+                               }
+                               if (imageId == null) {
+                                       if (album.getAlbumImage() != null) {
+                                               mismatchDescription.appendText("has album image");
+                                               return false;
+                                       }
+                               } else {
+                                       if (album.getAlbumImage() == null) {
+                                               mismatchDescription.appendText("has no album image");
+                                               return false;
+                                       }
+                                       if (!album.getAlbumImage().getId().equals(imageId)) {
+                                               mismatchDescription.appendText("has album image ")
+                                                               .appendValue(album.getAlbumImage().getId());
+                                               return false;
+                                       }
+                               }
+                               return true;
+                       }
+
+                       @Override
+                       public void describeTo(Description description) {
+                               description.appendText("is album ").appendValue(albumId);
+                               if (parentAlbumId == null) {
+                                       description.appendText(", has no parent");
+                               } else {
+                                       description.appendText(", has parent ")
+                                                       .appendValue(parentAlbumId);
+                               }
+                               description.appendText(", has title ").appendValue(title);
+                               description.appendText(", has description ")
+                                               .appendValue(albumDescription);
+                               if (imageId == null) {
+                                       description.appendText(", has no album image");
+                               } else {
+                                       description.appendText(", has album image ")
+                                                       .appendValue(imageId);
+                               }
+                       }
+               };
+       }
+
+       public static Matcher<Image> isImage(final String id,
+                       final long creationTime,
+                       final String key, final String title,
+                       final String imageDescription,
+                       final int width, final int height) {
+               return new TypeSafeDiagnosingMatcher<Image>() {
+                       @Override
+                       protected boolean matchesSafely(Image image,
+                                       Description mismatchDescription) {
+                               if (!image.getId().equals(id)) {
+                                       mismatchDescription.appendText("ID is ")
+                                                       .appendValue(image.getId());
+                                       return false;
+                               }
+                               if (image.getCreationTime() != creationTime) {
+                                       mismatchDescription.appendText("created at @")
+                                                       .appendValue(image.getCreationTime());
+                                       return false;
+                               }
+                               if (!image.getKey().equals(key)) {
+                                       mismatchDescription.appendText("key is ")
+                                                       .appendValue(image.getKey());
+                                       return false;
+                               }
+                               if (!image.getTitle().equals(title)) {
+                                       mismatchDescription.appendText("title is ")
+                                                       .appendValue(image.getTitle());
+                                       return false;
+                               }
+                               if (!image.getDescription().equals(imageDescription)) {
+                                       mismatchDescription.appendText("description is ")
+                                                       .appendValue(image.getDescription());
+                                       return false;
+                               }
+                               if (image.getWidth() != width) {
+                                       mismatchDescription.appendText("width is ")
+                                                       .appendValue(image.getWidth());
+                                       return false;
+                               }
+                               if (image.getHeight() != height) {
+                                       mismatchDescription.appendText("height is ")
+                                                       .appendValue(image.getHeight());
+                                       return false;
+                               }
+                               return true;
+                       }
+
+                       @Override
+                       public void describeTo(Description description) {
+                               description.appendText("image with ID ").appendValue(id);
+                               description.appendText(", created at @")
+                                               .appendValue(creationTime);
+                               description.appendText(", has key ").appendValue(key);
+                               description.appendText(", has title ").appendValue(title);
+                               description.appendText(", has description ")
+                                               .appendValue(imageDescription);
+                               description.appendText(", has width ").appendValue(width);
+                               description.appendText(", has height ").appendValue(height);
+                       }
+               };
+       }
+
+       private static class PostReplyMatcher
+                       extends TypeSafeDiagnosingMatcher<PostReply> {
+
+               private final String postReplyId;
+               private final String postId;
+               private final long time;
+               private final String text;
+
+               private PostReplyMatcher(String postReplyId, String postId, long time,
+                               String text) {
+                       this.postReplyId = postReplyId;
+                       this.postId = postId;
+                       this.time = time;
+                       this.text = text;
+               }
+
+               @Override
+               protected boolean matchesSafely(PostReply postReply,
+                               Description mismatchDescription) {
+                       if (!postReply.getId().equals(postReplyId)) {
+                               mismatchDescription.appendText("is post reply ")
+                                               .appendValue(postReply.getId());
+                               return false;
+                       }
+                       if (!postReply.getPostId().equals(postId)) {
+                               mismatchDescription.appendText("is reply to ")
+                                               .appendValue(postReply.getPostId());
+                               return false;
+                       }
+                       if (postReply.getTime() != time) {
+                               mismatchDescription.appendText("is created at @").appendValue(
+                                               postReply.getTime());
+                               return false;
+                       }
+                       if (!postReply.getText().equals(text)) {
+                               mismatchDescription.appendText("says ")
+                                               .appendValue(postReply.getText());
+                               return false;
+                       }
+                       return true;
+               }
+
+               @Override
+               public void describeTo(Description description) {
+                       description.appendText("is post reply ").appendValue(postReplyId);
+                       description.appendText(", replies to post ").appendValue(postId);
+                       description.appendText(", is created at @").appendValue(time);
+                       description.appendText(", says ").appendValue(text);
+               }
+
+       }
+
 }