X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Ftest%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Ftext%2FSoneTextParserTest.java;h=1161b8da0569eef8d64969a3301f4a2a10a6e3bb;hb=72413a87b9ac2eb1ea7ec8cfa37cd3ca5d3e5f8b;hp=72860012d04ea0c66e8fd0ca495ce8a5e74b47be;hpb=6e9a43ccd93ae125720547c0fe421dc81a54ba90;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 7286001..1161b8d 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–2013 David Roden + * Sone - SoneTextParserTest.java - Copyright © 2011–2016 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,120 +17,136 @@ package net.pterodactylus.sone.text; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.isIn; +import static org.hamcrest.Matchers.notNullValue; + import java.io.IOException; -import java.io.StringReader; -import java.util.Arrays; import java.util.Collection; -import com.google.common.base.Optional; - -import junit.framework.TestCase; import net.pterodactylus.sone.data.Sone; +import net.pterodactylus.sone.data.impl.IdOnlySone; import net.pterodactylus.sone.database.SoneProvider; +import com.google.common.base.Function; +import com.google.common.base.Optional; +import org.junit.Test; + /** * JUnit test case for {@link SoneTextParser}. * * @author David ‘Bombe’ Roden */ -public class SoneTextParserTest extends TestCase { - - // - // ACTIONS - // +public class SoneTextParserTest { - /** - * Tests basic plain-text operation of the parser. - * - * @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)); + parts = soneTextParser.parse("Test.", null); + assertThat("Parts", parts, notNullValue()); + assertThat("Part Text", "Test.", is(convertText(parts, PlainTextPart.class))); /* 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)); + parts = soneTextParser.parse("\nTest.\n\n", null); + assertThat("Parts", parts, notNullValue()); + assertThat("Part Text", "Test.", is(convertText(parts, PlainTextPart.class))); /* 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)); + parts = soneTextParser.parse("\nTest.\n\n\nTest.", null); + assertThat("Parts", parts, notNullValue()); + assertThat("Part Text", "Test.\n\nTest.", is(convertText(parts, PlainTextPart.class))); } - /** - * Tests parsing of KSK links. - * - * @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)); + parts = soneTextParser.parse("KSK@gpl.txt", null); + assertThat("Parts", parts, notNullValue()); + assertThat("Part Text", "[KSK@gpl.txt|gpl.txt|gpl.txt]", is(convertText(parts, FreenetLinkPart.class))); /* 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)); + parts = soneTextParser.parse("Link is KSK@gpl.txt\u200b.", null); + assertThat("Parts", parts, notNullValue()); + assertThat("Part Text", "Link is [KSK@gpl.txt|gpl.txt|gpl.txt]\u200b.", is(convertText(parts, PlainTextPart.class, FreenetLinkPart.class))); /* 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)); + parts = soneTextParser.parse("Link is KSK@gpl.txt\nKSK@test.dat\n", null); + assertThat("Parts", parts, notNullValue()); + assertThat("Part Text", "Link is [KSK@gpl.txt|gpl.txt|gpl.txt]\n[KSK@test.dat|test.dat|test.dat]", is(convertText(parts, PlainTextPart.class, FreenetLinkPart.class))); } - /** - * Test case for a bug that was discovered in 0.6.7. - * - * @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)); + parts = soneTextParser.parse("Some text.\n\nLink to sone://DAxKQzS48mtaQc7sUVHIgx3fnWZPQBz0EueBreUVWrU and stuff.", null); + assertThat("Parts", parts, notNullValue()); + assertThat("Part Text", "Some text.\n\nLink to [Sone|DAxKQzS48mtaQc7sUVHIgx3fnWZPQBz0EueBreUVWrU] and stuff.", is(convertText(parts, PlainTextPart.class, SonePart.class))); } - /** - * Test for a bug discovered in Sone 0.8.4 where a plain “http://” would be - * parsed into a link. - * - * @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)); + parts = soneTextParser.parse("Some text. Empty link: http:// – nice!", null); + assertThat("Parts", parts, notNullValue()); + assertThat("Part Text", "Some text. Empty link: http:// – nice!", is(convertText(parts, PlainTextPart.class))); + } + + @Test + public void httpLinkWithoutParensEndsAtNextClosingParen() { + SoneTextParser soneTextParser = new SoneTextParser(null, null); + Iterable parts = soneTextParser.parse("Some text (and a link: http://example.sone/abc) – nice!", null); + assertThat("Parts", parts, notNullValue()); + assertThat("Part Text", "Some text (and a link: [http://example.sone/abc|example.sone/abc|example.sone/abc]) – nice!", is(convertText(parts, PlainTextPart.class, LinkPart.class))); } - // - // PRIVATE METHODS - // + @Test + public void httpLinkWithOpenedAndClosedParensEndsAtNextClosingParen() { + SoneTextParser soneTextParser = new SoneTextParser(null, null); + Iterable parts = soneTextParser.parse("Some text (and a link: http://example.sone/abc_(def)) – nice!", null); + assertThat("Parts", parts, notNullValue()); + assertThat("Part Text", "Some text (and a link: [http://example.sone/abc_(def)|example.sone/abc_(def)|example.sone/abc_(def)]) – nice!", is(convertText(parts, PlainTextPart.class, LinkPart.class))); + } + + @Test + public void punctuationIsIgnoredAtEndOfLinkBeforeWhitespace() { + SoneTextParser soneTextParser = new SoneTextParser(null, null); + Iterable parts = soneTextParser.parse("Some text and a link: http://example.sone/abc. Nice!", null); + assertThat("Parts", parts, notNullValue()); + assertThat("Part Text", "Some text and a link: [http://example.sone/abc|example.sone/abc|example.sone/abc]. Nice!", is(convertText(parts, PlainTextPart.class, LinkPart.class))); + } + + @Test + public void multiplePunctuationCharactersAreIgnoredAtEndOfLinkBeforeWhitespace() { + SoneTextParser soneTextParser = new SoneTextParser(null, null); + Iterable parts = soneTextParser.parse("Some text and a link: http://example.sone/abc... Nice!", null); + assertThat("Parts", parts, notNullValue()); + assertThat("Part Text", "Some text and a link: [http://example.sone/abc|example.sone/abc|example.sone/abc]... Nice!", is(convertText(parts, PlainTextPart.class, LinkPart.class))); + } + + @Test + public void commasAreIgnoredAtEndOfLinkBeforeWhitespace() { + SoneTextParser soneTextParser = new SoneTextParser(null, null); + Iterable parts = soneTextParser.parse("Some text and a link: http://example.sone/abc, nice!", null); + assertThat("Parts", parts, notNullValue()); + assertThat("Part Text", "Some text and a link: [http://example.sone/abc|example.sone/abc|example.sone/abc], nice!", is(convertText(parts, PlainTextPart.class, LinkPart.class))); + } /** * Converts all given {@link Part}s into a string, validating that the @@ -146,16 +162,9 @@ public class SoneTextParserTest extends TestCase { private static String convertText(Iterable parts, Class... validClasses) { StringBuilder text = new StringBuilder(); for (Part part : parts) { - assertNotNull("Part", part); - boolean classValid = validClasses.length == 0; - for (Class validClass : validClasses) { - if (validClass.isAssignableFrom(part.getClass())) { - classValid = true; - break; - } - } - if (!classValid) { - fail("Part’s Class (" + part.getClass() + ") is not one of " + Arrays.toString(validClasses)); + assertThat("Part", part, notNullValue()); + if (validClasses.length != 0) { + assertThat("Part’s class", part.getClass(), isIn(validClasses)); } if (part instanceof PlainTextPart) { text.append(((PlainTextPart) part).getText()); @@ -180,21 +189,22 @@ 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 Optional getSone(final String soneId) { - return Optional. fromNullable(new Sone(soneId, false) { - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return soneId; - } - }); + return Optional.of(new IdOnlySone(soneId)); } /**