Skip to content

Commit

Permalink
feat(core): add requirements provider
Browse files Browse the repository at this point in the history
  • Loading branch information
xetra11 committed Aug 25, 2022
1 parent 86267f2 commit 66d1849
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/main/kotlin/com/goulash/core/ActivityManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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<Actor, Activity> = mutableMapOf()
private val activityDurations: MutableMap<Actor, Double> = mutableMapOf()
Expand Down
37 changes: 37 additions & 0 deletions src/main/kotlin/com/goulash/core/RequirementsProvider.kt
Original file line number Diff line number Diff line change
@@ -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<Actor, MutableList<String>> = 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<String> {
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)
}

}
68 changes: 68 additions & 0 deletions src/test/kotlin/com/goulash/core/RequirementsProviderTest.kt
Original file line number Diff line number Diff line change
@@ -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")
}

}

Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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
Expand Down

0 comments on commit 66d1849

Please sign in to comment.