From 66d18491e99b3316acb52192cdbabbab489cb588 Mon Sep 17 00:00:00 2001 From: Charlie Date: Thu, 25 Aug 2022 15:48:04 +0200 Subject: [PATCH] feat(core): add requirements provider GH-3 --- .../com/goulash/core/ActivityManager.kt | 2 + .../com/goulash/core/RequirementsProvider.kt | 37 ++++++++++ .../goulash/core/RequirementsProviderTest.kt | 68 +++++++++++++++++++ .../simulation/SimpleSimulationTest.kt | 5 ++ 4 files changed, 112 insertions(+) create mode 100644 src/main/kotlin/com/goulash/core/RequirementsProvider.kt create mode 100644 src/test/kotlin/com/goulash/core/RequirementsProviderTest.kt diff --git a/src/main/kotlin/com/goulash/core/ActivityManager.kt b/src/main/kotlin/com/goulash/core/ActivityManager.kt index 7eaa548..ecb5f2c 100644 --- a/src/main/kotlin/com/goulash/core/ActivityManager.kt +++ b/src/main/kotlin/com/goulash/core/ActivityManager.kt @@ -2,7 +2,9 @@ package com.goulash.core import com.goulash.core.activity.Activity import com.goulash.core.domain.Actor +import org.springframework.stereotype.Service +@Service class ActivityManager { private val actorActivities: MutableMap = mutableMapOf() private val activityDurations: MutableMap = mutableMapOf() diff --git a/src/main/kotlin/com/goulash/core/RequirementsProvider.kt b/src/main/kotlin/com/goulash/core/RequirementsProvider.kt new file mode 100644 index 0000000..7460cc7 --- /dev/null +++ b/src/main/kotlin/com/goulash/core/RequirementsProvider.kt @@ -0,0 +1,37 @@ +package com.goulash.core + +import com.goulash.core.domain.Actor + +/** + * Stores provided requirements to be accessed by individual [Actor]s + * to satisfy their activity requirements. + */ +object RequirementsProvider { + private val providedRequirements: MutableMap> = mutableMapOf() + + fun satisfy(actor: Actor, requirement: String) { + val provided = providedRequirements.getOrDefault(actor, null) + if (provided == null) { + providedRequirements[actor] = mutableListOf(requirement) + } else { + provided.add(requirement) + } + } + + fun providesAll(actor: Actor): List { + return providedRequirements.getOrElse(actor) { listOf() } + } + + fun isProvided(actor: Actor, requirement: String): Boolean { + val provided = providedRequirements.getOrElse(actor) { mutableListOf() } + if (provided.isEmpty()) return false + return provided.contains(requirement) + } + + fun consume(actor: Actor, requirement: String): Boolean { + val provided = providedRequirements.getOrElse(actor) { mutableListOf() } + if (provided.isEmpty()) return false + return provided.remove(requirement) + } + +} diff --git a/src/test/kotlin/com/goulash/core/RequirementsProviderTest.kt b/src/test/kotlin/com/goulash/core/RequirementsProviderTest.kt new file mode 100644 index 0000000..0176f92 --- /dev/null +++ b/src/test/kotlin/com/goulash/core/RequirementsProviderTest.kt @@ -0,0 +1,68 @@ +package com.goulash.core + +import assertk.assertThat +import assertk.assertions.contains +import assertk.assertions.containsAll +import assertk.assertions.hasSize +import assertk.assertions.isEmpty +import assertk.assertions.isFalse +import assertk.assertions.isTrue +import com.goulash.core.domain.Actor +import io.mockk.mockk +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Test + +internal class RequirementsProviderTest { + @Test + fun `should add multiple requirements`() { + val actor: Actor = mockk() + RequirementsProvider.satisfy(actor, "food") + RequirementsProvider.satisfy(actor, "food") + + assertThat(RequirementsProvider.providesAll(actor)).hasSize(2) + assertThat(RequirementsProvider.providesAll(actor)).containsAll("food", "food") + } + + @Test + fun `should consume multiple requirements`() { + val actor: Actor = mockk() + RequirementsProvider.satisfy(actor, "food") + RequirementsProvider.satisfy(actor, "food") + + assertThat(RequirementsProvider.consume(actor, "food")).isTrue() + assertThat(RequirementsProvider.isProvided(actor, "food")).isTrue() + assertThat(RequirementsProvider.consume(actor, "food")).isTrue() + assertThat(RequirementsProvider.isProvided(actor, "food")).isFalse() + } + + @Test + fun `should consume requirement`() { + val actor: Actor = mockk() + RequirementsProvider.satisfy(actor, "food") + + assertThat(RequirementsProvider.consume(actor, "food")).isTrue() + assertThat(RequirementsProvider.isProvided(actor, "food")).isFalse() + } + + @Test + fun `should check if requirement is provided`() { + val actor: Actor = mockk() + RequirementsProvider.satisfy(actor, "food") + + assertThat(RequirementsProvider.isProvided(actor, "food")).isTrue() + } + + @Test + fun `should return empty list`() { + assertThat(RequirementsProvider.providesAll(mockk())).isEmpty() + } + + @Test + fun `should add requirement to the provided map`() { + val actor: Actor = mockk() + RequirementsProvider.satisfy(actor, "food") + assertThat(RequirementsProvider.providesAll(actor)).contains("food") + } + +} + diff --git a/src/test/kotlin/com/goulash/simulation/SimpleSimulationTest.kt b/src/test/kotlin/com/goulash/simulation/SimpleSimulationTest.kt index e3bc3e1..5b696ce 100644 --- a/src/test/kotlin/com/goulash/simulation/SimpleSimulationTest.kt +++ b/src/test/kotlin/com/goulash/simulation/SimpleSimulationTest.kt @@ -3,12 +3,15 @@ package com.goulash.simulation import assertk.assertThat import assertk.assertions.isEqualTo import assertk.assertions.isNull +import com.goulash.core.ActivityManager import com.goulash.core.domain.Container import com.goulash.factory.BaseActorFactory import com.goulash.script.loader.ScriptLoader import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.Test import org.junit.jupiter.api.io.TempDir +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest import java.io.File class SimpleSimulationTest { @@ -21,6 +24,8 @@ class SimpleSimulationTest { repeat(5) { manualSimulationRunner.tick() } assertThat(person.urges.getUrgeOrNull("hunger")).isEqualTo(5.0) + repeat(5) { manualSimulationRunner.tick() } + assertThat(person.urges.getUrgeOrNull("hunger")).isNull() } @Test