From 52c5e4136f8251b504941d662dba7b2ffc33863d Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20=E2=80=98Bombe=E2=80=99=20Roden?= Date: Fri, 24 Jul 2015 16:11:55 +0200 Subject: [PATCH] Simplify parsing of post:// links --- .../pterodactylus/sone/text/SoneTextParser.java | 16 ++---- .../sone/text/SoneTextParserTest.java | 62 +++++++++++++++++++--- 2 files changed, 60 insertions(+), 18 deletions(-) diff --git a/src/main/java/net/pterodactylus/sone/text/SoneTextParser.java b/src/main/java/net/pterodactylus/sone/text/SoneTextParser.java index a1675d7..7194b89 100644 --- a/src/main/java/net/pterodactylus/sone/text/SoneTextParser.java +++ b/src/main/java/net/pterodactylus/sone/text/SoneTextParser.java @@ -204,19 +204,13 @@ public class SoneTextParser implements Parser { continue; } if (linkType == LinkType.POST) { - if (line.length() >= (7 + 36)) { - String postId = line.substring(7, 43); - Optional post = postProvider.getPost(postId); - if (post.isPresent()) { - parts.add(new PostPart(post.get())); - } else { - parts.add(new PlainTextPart(line.substring(0, 43))); - } - line = line.substring(43); + Optional post = postProvider.getPost(link.substring(7)); + if (post.isPresent()) { + parts.add(new PostPart(post.get())); } else { - parts.add(new PlainTextPart(line)); - line = ""; + parts.add(new PlainTextPart(link)); } + line = line.substring(link.length()); continue; } diff --git a/src/test/java/net/pterodactylus/sone/text/SoneTextParserTest.java b/src/test/java/net/pterodactylus/sone/text/SoneTextParserTest.java index 1e2928a..25ec62a 100644 --- a/src/test/java/net/pterodactylus/sone/text/SoneTextParserTest.java +++ b/src/test/java/net/pterodactylus/sone/text/SoneTextParserTest.java @@ -20,19 +20,30 @@ 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 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}. @@ -41,9 +52,9 @@ import org.junit.Test; */ 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. @@ -53,7 +64,6 @@ public class SoneTextParserTest { */ @Test public void testPlainText() throws IOException { - SoneTextParser soneTextParser = new SoneTextParser(null, null); Iterable parts; /* check basic operation. */ @@ -80,7 +90,6 @@ public class SoneTextParserTest { */ @Test public void testKSKLinks() throws IOException { - SoneTextParser soneTextParser = new SoneTextParser(null, null); Iterable parts; /* check basic links. */ @@ -108,7 +117,6 @@ public class SoneTextParserTest { */ @Test public void testEmptyLinesAndSoneLinks() throws IOException { - SoneTextParser soneTextParser = new SoneTextParser(new TestSoneProvider(), null); Iterable parts; /* check basic links. */ @@ -127,7 +135,6 @@ public class SoneTextParserTest { */ @Test public void testEmpyHttpLinks() throws IOException { - SoneTextParser soneTextParser = new SoneTextParser(new TestSoneProvider(), null); Iterable parts; /* check empty http links. */ @@ -136,6 +143,13 @@ public class SoneTextParserTest { assertThat(convertText(parts, PlainTextPart.class), is("Some text. Empty link: http:// – nice!")); } + @Test + public void linksToPostAreParsedCorrectly() throws IOException { + postProvider.addValidPostId("foo", "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|foo|Post about foo...] is awesome.")); + } + // // PRIVATE METHODS // @@ -187,6 +201,9 @@ public class SoneTextParserTest { } 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.getPost().getId()).append('|').append(postPart.getPost().getText()).append(']'); } } return text.toString(); @@ -243,4 +260,35 @@ public class SoneTextParserTest { } + private static class TestPostProvider implements PostProvider { + + private final Map posts = new HashMap(); + + private void addValidPostId(String validPostId, String text) { + posts.put(validPostId, text); + } + + @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 (posts.containsKey(postId)) { + Post post = mock(Post.class); + when(post.getId()).thenReturn(postId); + when(post.getText()).thenReturn(posts.get(postId)); + return Optional.of(post); + } + return Optional.absent(); + } + + } + } -- 2.7.4