1 package net.pterodactylus.rhynodge.filters.webpages.savoy
3 import net.pterodactylus.rhynodge.states.StateManagerTest.TestState
4 import org.hamcrest.MatcherAssert.assertThat
5 import org.hamcrest.Matchers.containsInAnyOrder
6 import org.hamcrest.Matchers.empty
7 import org.hamcrest.Matchers.equalTo
8 import org.junit.Assert.assertThrows
10 import java.time.LocalDateTime
12 class SavoyMergerTest {
15 fun `merger throws exception if first state is not a movie state`() {
16 assertThrows(IllegalArgumentException::class.java) { merger.mergeStates(TestState(), MovieState(emptySet())) }
20 fun `merger throws exception if second state is not a movie state`() {
21 assertThrows(IllegalArgumentException::class.java) { merger.mergeStates(MovieState(emptySet()), TestState()) }
25 fun `merging two empty states results in an empty state`() {
26 assertThat(merger.mergeStates(MovieState(emptySet()), MovieState(emptySet())).isEmpty, equalTo(true))
30 fun `merging a non-empty state into an empty state results in a state containing all movies`() {
31 val oldState = MovieState(emptySet())
32 val newState = MovieState(setOf(Movie("1", "")))
33 val mergedState = merger.mergeStates(oldState, newState) as MovieState
34 assertThat(mergedState.movies, containsInAnyOrder(Movie("1", "")))
38 fun `merging two states keeps only movies from current state`() {
39 val oldState = MovieState(setOf(Movie("1", ""), Movie("3", "")))
40 val newState = MovieState(setOf(Movie("2", ""), Movie("4", "")))
41 val mergedState = merger.mergeStates(oldState, newState) as MovieState
42 assertThat(mergedState.movies, containsInAnyOrder(Movie("2", ""), Movie("4", "")))
46 fun `merging a state with new movies identifies new movies`() {
47 val oldState = MovieState(setOf(Movie("1", ""), Movie("2", ""), Movie("3", "")))
48 val newState = MovieState(setOf(Movie("2", ""), Movie("3", ""), Movie("4", "")))
49 val mergedState = merger.mergeStates(oldState, newState) as MovieState
50 assertThat(mergedState.newMovies, containsInAnyOrder(Movie("4", "")))
54 fun `movies with different performances are still considered the same movie`() {
55 val oldState = MovieState(setOf(Movie("1", "").apply { addPerformance(Performance(LocalDateTime.of(2024, 2, 14, 18, 45), "")) }))
56 val newState = MovieState(setOf(Movie("1", "").apply { addPerformance(Performance(LocalDateTime.of(2024, 2, 15, 14, 30), "")) }))
57 val mergedState = merger.mergeStates(oldState, newState) as MovieState
58 assertThat(mergedState.newMovies, empty())
62 fun `merging states with movies starting the same day does not create a triggered state`() {
63 val oldState = MovieState(setOf(Movie("1", "").apply { addPerformance(Performance(LocalDateTime.of(2024, 2, 14, 18, 45), "")) }))
64 val newState = MovieState(setOf(Movie("1", "").apply { addPerformance(Performance(LocalDateTime.of(2024, 2, 14, 14, 30), "")) }))
65 val mergedState = merger.mergeStates(oldState, newState) as MovieState
66 assertThat(mergedState.triggered(), equalTo(false))
70 fun `merging states with movies starting on different days does create a triggered state`() {
71 val oldState = MovieState(setOf(Movie("1", "").apply { addPerformance(Performance(LocalDateTime.of(2024, 2, 14, 18, 45), "")) }))
72 val newState = MovieState(setOf(Movie("1", "").apply { addPerformance(Performance(LocalDateTime.of(2024, 2, 15, 14, 30), "")) }))
73 val mergedState = merger.mergeStates(oldState, newState) as MovieState
74 assertThat(mergedState.triggered(), equalTo(true))
78 fun `merging states where movies have different performances but still on the same day does not create a triggered state`() {
79 val oldState = MovieState(setOf(Movie("1", "").apply {
80 addPerformance(Performance(LocalDateTime.of(2024, 2, 14, 14, 30), ""))
81 addPerformance(Performance(LocalDateTime.of(2024, 2, 14, 18, 45), ""))
83 val newState = MovieState(setOf(Movie("1", "").apply {
84 addPerformance(Performance(LocalDateTime.of(2024, 2, 14, 18, 45), ""))
86 val mergedState = merger.mergeStates(oldState, newState) as MovieState
87 assertThat(mergedState.triggered(), equalTo(false))
91 fun `merging states where movies have different performances and are not on the same day anymore does create a triggered state`() {
92 val oldState = MovieState(setOf(Movie("1", "").apply {
93 addPerformance(Performance(LocalDateTime.of(2024, 2, 14, 18, 45), ""))
94 addPerformance(Performance(LocalDateTime.of(2024, 2, 15, 14, 30), ""))
96 val newState = MovieState(setOf(Movie("1", "").apply {
97 addPerformance(Performance(LocalDateTime.of(2024, 2, 15, 14, 30), ""))
99 val mergedState = merger.mergeStates(oldState, newState) as MovieState
100 assertThat(mergedState.triggered(), equalTo(true))
103 private val merger = SavoyMerger()