Add filter that shortens a number of parts
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / template / ShortenFilterTest.kt
diff --git a/src/test/kotlin/net/pterodactylus/sone/template/ShortenFilterTest.kt b/src/test/kotlin/net/pterodactylus/sone/template/ShortenFilterTest.kt
new file mode 100644 (file)
index 0000000..c6990a7
--- /dev/null
@@ -0,0 +1,96 @@
+package net.pterodactylus.sone.template
+
+import net.pterodactylus.sone.data.Profile
+import net.pterodactylus.sone.data.Sone
+import net.pterodactylus.sone.test.mock
+import net.pterodactylus.sone.text.FreenetLinkPart
+import net.pterodactylus.sone.text.Part
+import net.pterodactylus.sone.text.PlainTextPart
+import net.pterodactylus.sone.text.SonePart
+import org.hamcrest.MatcherAssert.assertThat
+import org.hamcrest.Matchers.contains
+import org.junit.Test
+import org.mockito.Mockito.`when`
+
+/**
+ * Unit test for [ShortenFilter].
+ */
+class ShortenFilterTest {
+
+       private val filter = ShortenFilter()
+
+       @Suppress("UNCHECKED_CAST")
+       private fun shortenParts(length: Int, cutOffLength: Int, vararg parts: Part) =
+                       filter.format(null, listOf(*parts), mapOf("cut-off-length" to cutOffLength, "length" to length)) as Iterable<Part>
+
+       @Test
+       fun `plain text part is shortened if length exceeds maxl ength`() {
+               assertThat(shortenParts(15, 10, PlainTextPart("This is a long text.")), contains<Part>(
+                               PlainTextPart("This is a …")
+               ))
+       }
+
+       @Test
+       fun `plain text part is not shortened if length does not exceed max length`() {
+               assertThat(shortenParts(20, 10, PlainTextPart("This is a long text.")), contains<Part>(
+                               PlainTextPart("This is a long text.")
+               ))
+       }
+
+       @Test
+       fun `short parts are not shortened`() {
+               assertThat(shortenParts(15, 10, PlainTextPart("This.")), contains<Part>(
+                               PlainTextPart("This.")
+               ))
+       }
+
+       @Test
+       fun `multiple plain text parts are shortened`() {
+               assertThat(shortenParts(15, 10, PlainTextPart("This "), PlainTextPart("is a long text.")), contains<Part>(
+                               PlainTextPart("This "),
+                               PlainTextPart("is a …")
+               ))
+       }
+
+       @Test
+       fun `parts after length has been reached are ignored`() {
+               assertThat(shortenParts(15, 10, PlainTextPart("This is a long text."), PlainTextPart(" And even more.")), contains<Part>(
+                               PlainTextPart("This is a …")
+               ))
+       }
+
+       @Test
+       fun `link parts are not shortened`() {
+               assertThat(shortenParts(15, 10, FreenetLinkPart("KSK@gpl.txt", "This is a long text.", false)), contains<Part>(
+                               FreenetLinkPart("KSK@gpl.txt", "This is a long text.", false)
+               ))
+       }
+
+       @Test
+       fun `additional link parts are ignored`() {
+               assertThat(shortenParts(15, 10, PlainTextPart("This is a long text."), FreenetLinkPart("KSK@gpl.txt", "This is a long text.", false)), contains<Part>(
+                               PlainTextPart("This is a …")
+               ))
+       }
+
+       @Test
+       fun `sone parts are added but their length is ignored`() {
+               val sone = mock<Sone>()
+               `when`(sone.profile).thenReturn(Profile(sone))
+               assertThat(shortenParts(15, 10, SonePart(sone), PlainTextPart("This is a long text.")), contains<Part>(
+                               SonePart(sone),
+                               PlainTextPart("This is a …")
+               ))
+       }
+
+       @Test
+       fun `additional sone parts are ignored`() {
+               val sone = mock<Sone>()
+               `when`(sone.profile).thenReturn(Profile(sone))
+               assertThat(shortenParts(15, 10, PlainTextPart("This is a long text."), SonePart(sone)), contains<Part>(
+                               PlainTextPart("This is a …")
+               ))
+       }
+
+}
+