4614454d3fe27c8c89327fd02e3167734304da45
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / template / ReplyGroupFilterTest.kt
1 package net.pterodactylus.sone.template
2
3 import com.google.common.base.Optional
4 import net.pterodactylus.sone.data.Post
5 import net.pterodactylus.sone.data.PostReply
6 import net.pterodactylus.sone.data.Sone
7 import net.pterodactylus.sone.test.mock
8 import net.pterodactylus.sone.test.whenever
9 import net.pterodactylus.util.template.TemplateContext
10 import org.hamcrest.MatcherAssert.assertThat
11 import org.hamcrest.Matchers.containsInAnyOrder
12 import org.hamcrest.Matchers.equalTo
13 import org.junit.Before
14 import org.junit.Test
15
16 /**
17  * Unit test for [ReplyGroupFilter].
18  */
19 class ReplyGroupFilterTest {
20
21         private val filter = ReplyGroupFilter()
22         private val replies = mutableListOf<PostReply>()
23         private val posts = mutableListOf<Post>()
24         private val sones = mutableListOf<Sone>()
25         private val templateContext = mock<TemplateContext>()
26
27         @Before
28         fun setupReplies() {
29                 (0..4).forEach {
30                         sones += mock<Sone>()
31                 }
32                 (0..7).forEach {
33                         posts += mock<Post>()
34                         whenever(posts[it].sone).thenReturn(sones[(it + 1) % sones.size])
35                 }
36                 (0..10).forEach {
37                         replies += mock<PostReply>()
38                         whenever(replies[it].sone).thenReturn(sones[it % sones.size])
39                         whenever(replies[it].post).thenReturn(Optional.of(posts[it % posts.size]))
40                 }
41         }
42
43         @Test
44         @Suppress("UNCHECKED_CAST")
45         fun `replies are grouped correctly`() {
46                 val groupReplies = filter.format(templateContext, replies, emptyMap()) as Map<Post, Map<String, *>>
47                 assertThat(groupReplies.keys, equalTo(posts.toSet()))
48                 verifyPostRepliesAndSones(groupReplies, 0, listOf(0, 3), listOf(0, 8))
49                 verifyPostRepliesAndSones(groupReplies, 1, listOf(1, 4), listOf(1, 9))
50                 verifyPostRepliesAndSones(groupReplies, 2, listOf(2, 0), listOf(2, 10))
51                 verifyPostRepliesAndSones(groupReplies, 3, listOf(3), listOf(3))
52                 verifyPostRepliesAndSones(groupReplies, 4, listOf(4), listOf(4))
53                 verifyPostRepliesAndSones(groupReplies, 5, listOf(0), listOf(5))
54                 verifyPostRepliesAndSones(groupReplies, 6, listOf(1), listOf(6))
55                 verifyPostRepliesAndSones(groupReplies, 7, listOf(2), listOf(7))
56         }
57
58         @Suppress("UNCHECKED_CAST")
59         private fun verifyPostRepliesAndSones(groupReplies: Map<Post, Map<String, *>>, postIndex: Int, soneIndices: List<Int>, replyIndices: List<Int>) {
60                 assertThat(groupReplies[posts[postIndex]]!!["sones"] as Iterable<Sone>, containsInAnyOrder(*soneIndices.map { sones[it] }.toTypedArray()))
61                 assertThat(groupReplies[posts[postIndex]]!!["replies"] as Iterable<PostReply>, containsInAnyOrder(*replyIndices.map { replies[it] }.toTypedArray()))
62         }
63
64 }