From 783a021a1cb6641d0494067b44fdc02f41630493 Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Sun, 28 Oct 2018 16:08:22 +0100 Subject: 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. --- .../odcsim/engine/omega/OmegaActorSystem.kt | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) (limited to 'odcsim-engine-omega/src/main') 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(root: Behavior, 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(root: Behavior, override val name: String) */ private val registry: MutableMap> = 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(root: Behavior, override val name: String) override val time: Instant get() = this@OmegaActorSystem.time - override fun spawn(name: String, behavior: Behavior): ActorRef { + override fun spawn(behavior: Behavior, name: String): ActorRef { val ref = ActorRefImpl(self.path.child(name)) if (ref.path !in registry) { val actor = Actor(ref, behavior) @@ -125,9 +121,9 @@ class OmegaActorSystem(root: Behavior, override val name: String) return ref } - override fun stop(child: ActorRef): 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 -- cgit v1.2.3