X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Ftest%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Ftext%2FSoneTextParserTest.java;h=31334833d498056b74c0fe3be8f6f5b66d6cb997;hb=3664f236f71364b4c99ca42f262730ecb36cef5c;hp=e1857a0ebc11715aaf3445e71db5b51323b3ef35;hpb=77804f0dda317541f8451a0649785e7cb192d696;p=Sone.git diff --git a/src/test/java/net/pterodactylus/sone/text/SoneTextParserTest.java b/src/test/java/net/pterodactylus/sone/text/SoneTextParserTest.java index e1857a0..3133483 100644 --- a/src/test/java/net/pterodactylus/sone/text/SoneTextParserTest.java +++ b/src/test/java/net/pterodactylus/sone/text/SoneTextParserTest.java @@ -1,5 +1,5 @@ /* - * Sone - SoneTextParserTest.java - Copyright © 2011–2012 David Roden + * Sone - SoneTextParserTest.java - Copyright © 2011–2013 David Roden * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,24 +17,44 @@ package net.pterodactylus.sone.text; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + import java.io.IOException; import java.io.StringReader; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; -import junit.framework.TestCase; -import net.pterodactylus.sone.core.SoneProvider; +import net.pterodactylus.sone.data.Post; import net.pterodactylus.sone.data.Sone; +import net.pterodactylus.sone.data.impl.IdOnlySone; +import net.pterodactylus.sone.database.PostProvider; +import net.pterodactylus.sone.database.SoneProvider; + +import com.google.common.base.Function; +import com.google.common.base.Optional; +import org.junit.Test; +import org.mockito.Mockito; +import org.mockito.stubbing.OngoingStubbing; /** * JUnit test case for {@link SoneTextParser}. * * @author David ‘Bombe’ Roden */ -public class SoneTextParserTest extends TestCase { +public class SoneTextParserTest { - // - // ACTIONS - // + private final SoneProvider soneProvider = new TestSoneProvider(); + private final TestPostProvider postProvider = new TestPostProvider(); + private final SoneTextParser soneTextParser = new SoneTextParser(soneProvider, postProvider); /** * Tests basic plain-text operation of the parser. @@ -42,25 +62,24 @@ public class SoneTextParserTest extends TestCase { * @throws IOException * if an I/O error occurs */ - @SuppressWarnings("static-method") + @Test public void testPlainText() throws IOException { - SoneTextParser soneTextParser = new SoneTextParser(null, null); Iterable parts; /* check basic operation. */ parts = soneTextParser.parse(null, new StringReader("Test.")); - assertNotNull("Parts", parts); - assertEquals("Part Text", "Test.", convertText(parts, PlainTextPart.class)); + assertThat(parts, notNullValue()); + assertThat(convertText(parts, PlainTextPart.class), is("Test.")); /* check empty lines at start and end. */ parts = soneTextParser.parse(null, new StringReader("\nTest.\n\n")); - assertNotNull("Parts", parts); - assertEquals("Part Text", "Test.", convertText(parts, PlainTextPart.class)); + assertThat(parts, notNullValue()); + assertThat(convertText(parts, PlainTextPart.class), is("Test.")); /* check duplicate empty lines in the text. */ parts = soneTextParser.parse(null, new StringReader("\nTest.\n\n\nTest.")); - assertNotNull("Parts", parts); - assertEquals("Part Text", "Test.\n\nTest.", convertText(parts, PlainTextPart.class)); + assertThat(parts, notNullValue()); + assertThat(convertText(parts, PlainTextPart.class), is("Test.\n\nTest.")); } /** @@ -69,25 +88,25 @@ public class SoneTextParserTest extends TestCase { * @throws IOException * if an I/O error occurs */ - @SuppressWarnings("static-method") + @Test public void testKSKLinks() throws IOException { - SoneTextParser soneTextParser = new SoneTextParser(null, null); Iterable parts; /* check basic links. */ parts = soneTextParser.parse(null, new StringReader("KSK@gpl.txt")); - assertNotNull("Parts", parts); - assertEquals("Part Text", "[KSK@gpl.txt|gpl.txt|gpl.txt]", convertText(parts, FreenetLinkPart.class)); + assertThat(parts, notNullValue()); + assertThat(convertText(parts, FreenetLinkPart.class), is("[KSK@gpl.txt|gpl.txt|gpl.txt]")); /* check embedded links. */ parts = soneTextParser.parse(null, new StringReader("Link is KSK@gpl.txt\u200b.")); - assertNotNull("Parts", parts); - assertEquals("Part Text", "Link is [KSK@gpl.txt|gpl.txt|gpl.txt]\u200b.", convertText(parts, PlainTextPart.class, FreenetLinkPart.class)); + assertThat(parts, notNullValue()); + assertThat(convertText(parts, PlainTextPart.class, FreenetLinkPart.class), is("Link is [KSK@gpl.txt|gpl.txt|gpl.txt]\u200b.")); /* check embedded links and line breaks. */ parts = soneTextParser.parse(null, new StringReader("Link is KSK@gpl.txt\nKSK@test.dat\n")); - assertNotNull("Parts", parts); - assertEquals("Part Text", "Link is [KSK@gpl.txt|gpl.txt|gpl.txt]\n[KSK@test.dat|test.dat|test.dat]", convertText(parts, PlainTextPart.class, FreenetLinkPart.class)); + assertThat(parts, notNullValue()); + assertThat(convertText(parts, PlainTextPart.class, FreenetLinkPart.class), + is("Link is [KSK@gpl.txt|gpl.txt|gpl.txt]\n[KSK@test.dat|test.dat|test.dat]")); } /** @@ -96,15 +115,15 @@ public class SoneTextParserTest extends TestCase { * @throws IOException * if an I/O error occurs */ - @SuppressWarnings({ "synthetic-access", "static-method" }) + @Test public void testEmptyLinesAndSoneLinks() throws IOException { - SoneTextParser soneTextParser = new SoneTextParser(new TestSoneProvider(), null); Iterable parts; /* check basic links. */ parts = soneTextParser.parse(null, new StringReader("Some text.\n\nLink to sone://DAxKQzS48mtaQc7sUVHIgx3fnWZPQBz0EueBreUVWrU and stuff.")); - assertNotNull("Parts", parts); - assertEquals("Part Text", "Some text.\n\nLink to [Sone|DAxKQzS48mtaQc7sUVHIgx3fnWZPQBz0EueBreUVWrU] and stuff.", convertText(parts, PlainTextPart.class, SonePart.class)); + assertThat(parts, notNullValue()); + assertThat(convertText(parts, PlainTextPart.class, SonePart.class), + is("Some text.\n\nLink to [Sone|DAxKQzS48mtaQc7sUVHIgx3fnWZPQBz0EueBreUVWrU] and stuff.")); } /** @@ -114,15 +133,28 @@ public class SoneTextParserTest extends TestCase { * @throws IOException * if an I/O error occurs */ - @SuppressWarnings({ "synthetic-access", "static-method" }) + @Test public void testEmpyHttpLinks() throws IOException { - SoneTextParser soneTextParser = new SoneTextParser(new TestSoneProvider(), null); Iterable parts; /* check empty http links. */ parts = soneTextParser.parse(null, new StringReader("Some text. Empty link: http:// – nice!")); - assertNotNull("Parts", parts); - assertEquals("Part Text", "Some text. Empty link: http:// – nice!", convertText(parts, PlainTextPart.class)); + assertThat(parts, notNullValue()); + assertThat(convertText(parts, PlainTextPart.class), is("Some text. Empty link: http:// – nice!")); + } + + @Test + public void linksToPostAreParsedCorrectly() throws IOException { + postProvider.addValidPostId("foo", "internal", "Post about foo..."); + Iterable parts = soneTextParser.parse(null, new StringReader("This post://foo is awesome.")); + assertThat(convertText(parts, PlainTextPart.class, PostPart.class), is("This [post|new|foo|Post about foo...] is awesome.")); + } + + @Test + public void linksToPostsWithOldIdsAreParsedCorrectly() throws IOException { + postProvider.addValidPostId("foo", "internal", "Post about foo..."); + Iterable parts = soneTextParser.parse(null, new StringReader("This post://internal is awesome.")); + assertThat(convertText(parts, PlainTextPart.class, PostPart.class), is("This [post|old|foo|Post about foo...] is awesome.")); } // @@ -143,7 +175,7 @@ public class SoneTextParserTest extends TestCase { private static String convertText(Iterable parts, Class... validClasses) { StringBuilder text = new StringBuilder(); for (Part part : parts) { - assertNotNull("Part", part); + assertThat(part, notNullValue()); boolean classValid = validClasses.length == 0; for (Class validClass : validClasses) { if (validClass.isAssignableFrom(part.getClass())) { @@ -151,20 +183,40 @@ public class SoneTextParserTest extends TestCase { break; } } - if (!classValid) { - fail("Part’s Class (" + part.getClass() + ") is not one of " + Arrays.toString(validClasses)); - } + assertThat("Part’s Class (" + part.getClass() + ") is not one of " + Arrays.toString(validClasses), classValid, is(true)); if (part instanceof PlainTextPart) { - text.append(((PlainTextPart) part).getText()); + text.append(part.getText()); } else if (part instanceof FreenetLinkPart) { FreenetLinkPart freenetLinkPart = (FreenetLinkPart) part; - text.append('[').append(freenetLinkPart.getLink()).append('|').append(freenetLinkPart.isTrusted() ? "trusted|" : "").append(freenetLinkPart.getTitle()).append('|').append(freenetLinkPart.getText()).append(']'); + text.append('[') + .append(freenetLinkPart.getLink()) + .append('|') + .append(freenetLinkPart.isTrusted() ? "trusted|" : "") + .append(freenetLinkPart.getTitle()) + .append('|') + .append(freenetLinkPart.getText()) + .append(']'); } else if (part instanceof LinkPart) { LinkPart linkPart = (LinkPart) part; - text.append('[').append(linkPart.getLink()).append('|').append(linkPart.getTitle()).append('|').append(linkPart.getText()).append(']'); + text.append('[') + .append(linkPart.getLink()) + .append('|') + .append(linkPart.getTitle()) + .append('|') + .append(linkPart.getText()) + .append(']'); } else if (part instanceof SonePart) { SonePart sonePart = (SonePart) part; text.append("[Sone|").append(sonePart.getSone().getId()).append(']'); + } else if (part instanceof PostPart) { + PostPart postPart = (PostPart) part; + text.append("[post|") + .append(postPart.usesDeprecatedLink() ? "old" : "new") + .append('|') + .append(postPart.getPost().getId()) + .append('|') + .append(postPart.getPost().getText()) + .append(']'); } } return text.toString(); @@ -177,21 +229,88 @@ public class SoneTextParserTest extends TestCase { */ private static class TestSoneProvider implements SoneProvider { + @Override + public Function> soneLoader() { + return new Function>() { + @Override + public Optional apply(String soneId) { + return getSone(soneId); + } + }; + } + /** * {@inheritDoc} */ @Override - public Sone getSone(final String soneId, boolean create) { - return new Sone(soneId) { + public Optional getSone(final String soneId) { + return Optional.of(new IdOnlySone(soneId)); + } - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return soneId; - } - }; + /** + * {@inheritDocs} + */ + @Override + public Collection getSones() { + return null; + } + + /** + * {@inheritDocs} + */ + @Override + public Collection getLocalSones() { + return null; + } + + /** + * {@inheritDocs} + */ + @Override + public Collection getRemoteSones() { + return null; + } + + } + + private static class TestPostProvider implements PostProvider { + + private final Map postTexts = new HashMap(); + private final Map postInternalIds = new HashMap(); + private final Map internalIdPosts = new HashMap(); + + private void addValidPostId(String validPostId, String internalId, String text) { + postTexts.put(validPostId, text); + postInternalIds.put(validPostId, internalId); + internalIdPosts.put(internalId, validPostId); + } + + @Override + public Collection getDirectedPosts(String recipientId) { + return Collections.emptyList(); + } + + @Override + public Collection getPosts(String soneId) { + return Collections.emptyList(); + } + + @Override + public Optional getPost(String postId) { + if (postTexts.containsKey(postId)) { + Post post = mock(Post.class); + when(post.getId()).thenReturn(postId); + when(post.getInternalId()).thenReturn(postInternalIds.get(postId)); + when(post.getText()).thenReturn(postTexts.get(postId)); + return Optional.of(post); + } else if (internalIdPosts.containsKey(postId)) { + Post post = mock(Post.class); + when(post.getId()).thenReturn(internalIdPosts.get(postId)); + when(post.getInternalId()).thenReturn(postId); + when(post.getText()).thenReturn(postTexts.get(internalIdPosts.get(postId))); + return Optional.of(post); + } + return Optional.absent(); } }