All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonTest.InnerUpdateTest.kt Maven / Gradle / Ivy

package kt.mobius.extras.patterns

import kt.mobius.Next
import kt.mobius.Update
import kt.mobius.extras.patterns.InnerEffectHandlers.ignoreEffects
import kt.mobius.functions.BiFunction
import kt.mobius.functions.Function
import kotlin.test.*

class InnerUpdateTest {

    @Test
    fun canExtractInnerModel() {
        val innerUpdate =
            InnerUpdate.builder()
                .modelExtractor { "extracted_model" }
                .eventExtractor { it }
                .innerUpdate { model: String, _: String ->
                    Next.next(model)
                }
                .modelUpdater { _: String, mi: String -> mi }
                .innerEffectHandler(ignoreEffects())
                .build()

        val next = innerUpdate.update("model", "event")

        assertTrue(next.hasModel())
        assertEquals("extracted_model", next.model())
    }

    @Test
    fun canExtractInnerEvent() {
        val innerUpdate =
            InnerUpdate.builder()
                .modelExtractor { it }
                .eventExtractor { "extracted_event" }
                .innerUpdate { _: String, event: String ->
                    Next.next(event)
                }
                .modelUpdater { _: String, mi: String -> mi }
                .innerEffectHandler(ignoreEffects())
                .build()

        val next = innerUpdate.update("model", "event")

        assertTrue(next.hasModel())
        assertEquals("extracted_event", next.model())
    }

    @Test
    fun callsInnerUpdate() {
        val innerUpdate =
            InnerUpdate.builder()
                .modelExtractor { it }
                .eventExtractor { it }
                .innerUpdate { _, _ -> Next.next("inner_update") }
                .modelUpdater { _, mi -> mi }
                .innerEffectHandler(ignoreEffects())
                .build()

        val next = innerUpdate.update("model", "event")

        assertTrue(next.hasModel())
        assertEquals("inner_update", next.model())
    }

    @Test
    fun noChangesDoesNotCallModelUpdater() {
        val innerUpdate =
            InnerUpdate.builder()
                .modelExtractor { it }
                .eventExtractor { it }
                .innerUpdate { _, _ -> Next.noChange() }
                .modelUpdater { _, _ -> "model_updater" }
                .innerEffectHandler(ignoreEffects())
                .build()

        val next = innerUpdate.update("model", "event")

        assertFalse(next.hasModel())
        assertFalse(next.hasEffects())
    }

    @Test
    fun updateModelCallsModelUpdater() {
        val innerUpdate =
            InnerUpdate.builder()
                .modelExtractor { it }
                .eventExtractor { it }
                .innerUpdate { _, _ -> Next.next("inner_update") }
                .modelUpdater { _, _ -> "model_updater" }
                .innerEffectHandler(ignoreEffects())
                .build()

        val next = innerUpdate.update("model", "event")

        assertTrue(next.hasModel())
        assertEquals("model_updater", next.model())
    }

    @Test
    fun dispatchEffectCallsInnerEffectHandler() {
        val innerUpdate =
            InnerUpdate.builder()
                .modelExtractor { it }
                .eventExtractor { it }
                .innerUpdate { _, _ -> Next.dispatch(setOf("1", "2", "3")) }
                .modelUpdater { _, mi -> mi }
                .innerEffectHandler(InnerEffectHandler { _, _, _ ->
                    Next.next("effect_handler")
                })
                .build()

        val next = innerUpdate.update("model", "event")

        assertTrue(next.hasModel())
        assertEquals("effect_handler", next.model())
    }

    @Test
    fun noEffectsStillCallsInnerEffectHandler() {
        val innerUpdate =
            InnerUpdate.builder()
                .modelExtractor { it }
                .eventExtractor { it }
                .innerUpdate { _, _ -> Next.next("inner_update") }
                .modelUpdater { _, mi -> mi }
                .innerEffectHandler(InnerEffectHandler { _, _, _ ->
                    Next.next("effect_handler")
                })
                .build()

        val next = innerUpdate.update("model", "event")

        assertFalse(next.hasEffects())
        assertTrue(next.hasModel())
        assertEquals("effect_handler", next.model())
    }

    @Test
    fun noChangeNoEffectsStillCallsInnerEffectHandler() {
        val innerUpdate =
            InnerUpdate.builder()
                .modelExtractor { it }
                .eventExtractor { it }
                .innerUpdate { _, _ -> Next.noChange() }
                .modelUpdater { _, mi -> mi }
                .innerEffectHandler(InnerEffectHandler { _, _, _ ->
                    Next.next("effect_handler")
                })
                .build()

        val next = innerUpdate.update("model", "event")

        assertFalse(next.hasEffects())
        assertTrue(next.hasModel())
        assertEquals("effect_handler", next.model())
    }

    @Test
    fun updatedModelNoEffectsStillCallsInnerEffectHandler() {
        val innerUpdate =
            InnerUpdate.builder()
                .modelExtractor { it }
                .eventExtractor { it }
                .innerUpdate { _, _ -> Next.next("inner_update") }
                .modelUpdater { _, mi -> mi }
                .innerEffectHandler(InnerEffectHandler { _, _, _ ->
                    Next.next("effect_handler")
                })
                .build()

        val next = innerUpdate.update("model", "event")

        assertFalse(next.hasEffects())
        assertTrue(next.hasModel())
        assertEquals("effect_handler", next.model())
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy