Skip to content

Commit

Permalink
Update engine tasks to self-sort and more unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
GregHib committed May 4, 2020
1 parent 0e3d3c9 commit e8a153a
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 68 deletions.
1 change: 0 additions & 1 deletion engine/src/main/kotlin/rs/dusk/engine/Engine.kt
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ class Engine {

fun start() {
val tasks: EngineTasks = get()
tasks.sort()
val tick = Tick(tasks)
executor.scheduleAtFixedRate(tick, ENGINE_DELAY, ENGINE_DELAY, TimeUnit.MILLISECONDS)
}
Expand Down
3 changes: 2 additions & 1 deletion engine/src/main/kotlin/rs/dusk/engine/EngineTasks.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package rs.dusk.engine

import org.koin.dsl.module
import java.util.*

/**
* @author Greg Hibberd <greg@greghibberd.com>
* @since April 22, 2020
*/
data class EngineTasks(val data: MutableList<EngineTask> = mutableListOf()) : MutableList<EngineTask> by data
data class EngineTasks(val data: TreeSet<EngineTask> = TreeSet()) : MutableSet<EngineTask> by data

val engineModule = module {
single { EngineTasks() }
Expand Down
47 changes: 47 additions & 0 deletions engine/src/test/kotlin/rs/dusk/engine/EngineTaskTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package rs.dusk.engine

import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
import org.koin.core.get
import org.koin.dsl.module
import rs.dusk.engine.script.KoinMock

/**
* @author Greg Hibberd <greg@greghibberd.com>
* @since May 03, 2020
*/
internal class EngineTaskTest : KoinMock() {

private class TestTask(tasks: EngineTasks, priority: Int) : EngineTask(tasks, priority) {
override fun run() {
}
}

override val modules = listOf(engineModule, module {
single { TestTask(get(), 1) }
})

@Test
fun `Adds self to task list`() {
// Given
val tasks: EngineTasks = get()
val updateTask: TestTask = get()
// Then
assert(tasks.contains(updateTask))
}

@Test
fun `Multiple tasks are ordered by priority`() {
// Given
val tasks: EngineTasks = get()
val third = TestTask(tasks, 1)
val first = TestTask(tasks, 3)
val second = TestTask(tasks, 2)
// Then
val expected = listOf(first, second, third)
tasks.data.forEachIndexed { index, task ->
assertEquals(expected[index], task)
}
}

}
57 changes: 0 additions & 57 deletions engine/src/test/kotlin/rs/dusk/engine/EngineTasksTest.kt

This file was deleted.

34 changes: 34 additions & 0 deletions engine/src/test/kotlin/rs/dusk/engine/ParallelEngineTaskTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package rs.dusk.engine

import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import org.junit.jupiter.api.Test
import kotlin.system.measureTimeMillis

/**
* @author Greg Hibberd <greg@greghibberd.com>
* @since May 03, 2020
*/
internal class ParallelEngineTaskTest {

private class TestTask(tasks: EngineTasks) : ParallelEngineTask(tasks)

@Test
fun `Tasks run in parallel`() {
// Given
val tasks = EngineTasks()
val first = TestTask(tasks)
first.defers.add(GlobalScope.async {
delay(100)
})
first.defers.add(GlobalScope.async {
delay(100)
})
// When
val took = measureTimeMillis {
first.run()
}
assert(took < 200)// This could be temperamental
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import org.koin.core.qualifier.named
import org.koin.dsl.module
import rs.dusk.core.io.read.BufferReader
import rs.dusk.core.io.write.BufferWriter
import rs.dusk.engine.EngineTasks
import rs.dusk.engine.engineModule
import rs.dusk.engine.entity.list.entityListModule
import rs.dusk.engine.entity.list.npc.NPCs
Expand Down Expand Up @@ -43,14 +42,6 @@ internal class PreUpdateEncodingTaskTest : KoinMock() {

override val modules = listOf(engineModule, entityListModule, clientUpdateModule, encoderModule)

@Test
fun `Adds self to task list`() {
// Given
val tasks: EngineTasks = get()
val updateTask: PreUpdateEncodingTask = get()
// Then
assert(tasks.contains(updateTask))
}

@Test
fun `Run runs all in parallel`() {
Expand Down

0 comments on commit e8a153a

Please sign in to comment.