summaryrefslogtreecommitdiff
path: root/odcsim-engine-omega/src/main
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2018-10-28 16:08:22 +0100
committerFabian Mastenbroek <mail.fabianm@gmail.com>2019-05-06 18:19:43 +0200
commit783a021a1cb6641d0494067b44fdc02f41630493 (patch)
tree692e2d0227e910b3139c242a4bb559ef0cfdbec1 /odcsim-engine-omega/src/main
parentdecb8fb5297c7772f5319a47c784d44bf8bdbe9c (diff)
test: Create initial test suite for API
This change creates the initial conformance test suite for the API design and tries to specify most of the requirements and assumptions made for implementors.
Diffstat (limited to 'odcsim-engine-omega/src/main')
-rw-r--r--odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt22
1 files changed, 9 insertions, 13 deletions
diff --git a/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt b/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt
index ffc68d0b..3eaddf51 100644
--- a/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt
+++ b/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt
@@ -34,7 +34,6 @@ import com.atlarge.odcsim.Instant
import com.atlarge.odcsim.PostStop
import com.atlarge.odcsim.PreStart
import com.atlarge.odcsim.Signal
-import mu.KotlinLogging
import java.util.PriorityQueue
import kotlin.math.max
@@ -56,7 +55,7 @@ class OmegaActorSystem<in T : Any>(root: Behavior<T>, override val name: String)
/**
* The path to the root actor.
*/
- override val path: ActorPath = ActorPath.Root()
+ override val path: ActorPath = ActorPath.Root(name = "/user")
/**
* The event queue to process
@@ -70,19 +69,16 @@ class OmegaActorSystem<in T : Any>(root: Behavior<T>, override val name: String)
*/
private val registry: MutableMap<ActorPath, Actor<*>> = HashMap()
- private val logger = KotlinLogging.logger {}
-
override fun run(until: Duration) {
- require(until >= .0) { "The given instant must be a positive number" }
+ require(until >= .0) { "The given instant must be a non-negative number" }
while (true) {
val envelope = queue.peek() ?: break
val delivery = envelope.time.takeUnless { it > until } ?: break
- if (delivery < time) {
- // Message out of order
- logger.warn { "Message delivered out of order [expected=$delivery, actual=$time]" }
- }
+ // A message should never be delivered out of order in this single-threaded implementation. Assert for
+ // sanity
+ assert(delivery >= time) { "Message delivered out of order [expected=$delivery, actual=$time]" }
time = delivery
queue.poll()
@@ -114,7 +110,7 @@ class OmegaActorSystem<in T : Any>(root: Behavior<T>, override val name: String)
override val time: Instant
get() = this@OmegaActorSystem.time
- override fun <U : Any> spawn(name: String, behavior: Behavior<U>): ActorRef<U> {
+ override fun <U : Any> spawn(behavior: Behavior<U>, name: String): ActorRef<U> {
val ref = ActorRefImpl<U>(self.path.child(name))
if (ref.path !in registry) {
val actor = Actor(ref, behavior)
@@ -125,9 +121,9 @@ class OmegaActorSystem<in T : Any>(root: Behavior<T>, override val name: String)
return ref
}
- override fun <U : Any> stop(child: ActorRef<U>): Boolean {
- if (child.path.root != this@OmegaActorSystem.path) {
- // This child is not part of the hierarchy.
+ override fun stop(child: ActorRef<*>): Boolean {
+ if (child.path.parent != self.path) {
+ // This is not a child of this actor
return false
}
val ref = registry[child.path] ?: return false