From 52340f8d999f1a93141f6d522ec6badf4b72c54a Mon Sep 17 00:00:00 2001 From: dkozak Date: Mon, 5 Nov 2018 12:06:32 +0100 Subject: [PATCH] implement first test search, just a simple num game and fix all the issues that were found on the way --- .idea/kotlinc.xml | 8 +++++++ .idea/modules/search_main.iml | 5 ++-- .idea/modules/search_test.iml | 5 ++-- build.gradle.kts | 6 ++++- src/main/io/dkozak/search/engine/engine.kt | 4 ++-- .../search/model/EngineConfiguration.kt | 12 +++++----- .../search/model/QueueBasedSearchQueue.kt | 13 ++++++++++ .../io/dkozak/search/model/SearchQueue.kt | 8 +++---- .../io/dkozak/search/engine/EngineTest.kt | 24 +++++++++++++++++++ 9 files changed, 68 insertions(+), 17 deletions(-) create mode 100644 .idea/kotlinc.xml create mode 100644 src/main/io/dkozak/search/model/QueueBasedSearchQueue.kt create mode 100644 src/test/io/dkozak/search/engine/EngineTest.kt diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..1d2cf4e --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules/search_main.iml b/.idea/modules/search_main.iml index 3986b0c..3387ca1 100644 --- a/.idea/modules/search_main.iml +++ b/.idea/modules/search_main.iml @@ -6,14 +6,15 @@ diff --git a/.idea/modules/search_test.iml b/.idea/modules/search_test.iml index 529fed8..115ddaa 100644 --- a/.idea/modules/search_test.iml +++ b/.idea/modules/search_test.iml @@ -6,14 +6,15 @@ diff --git a/build.gradle.kts b/build.gradle.kts index 53dac30..51698ed 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,18 +1,22 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - kotlin("jvm") version "1.2.60" + kotlin("jvm") version "1.3.0" } group = "io.dkozak" version = "1.0-SNAPSHOT" +val junitVersion = "5.3.1" + repositories { mavenCentral() } dependencies { compile(kotlin("stdlib-jdk8")) + compile("org.junit.jupiter:junit-jupiter-api:$junitVersion") + compile("org.junit.jupiter:junit-jupiter-engine:$junitVersion") } tasks.withType { diff --git a/src/main/io/dkozak/search/engine/engine.kt b/src/main/io/dkozak/search/engine/engine.kt index 1b11a6d..df71341 100644 --- a/src/main/io/dkozak/search/engine/engine.kt +++ b/src/main/io/dkozak/search/engine/engine.kt @@ -4,9 +4,9 @@ import io.dkozak.search.model.EngineConfiguration import io.dkozak.search.model.Node -fun search(engineConfiguration: EngineConfiguration, logger: (String) -> Unit = {}) = engineConfiguration.executeSearch(logger) +fun search(engineConfiguration: EngineConfiguration, logger: (String) -> Unit = {}) = engineConfiguration.executeSearch(logger) -private fun EngineConfiguration.executeSearch(logger: (String) -> Unit): Node? { +private fun EngineConfiguration.executeSearch(logger: (String) -> Unit): Node? { val queue = searchQueue queue.addNode(initialState) while (!queue.isEmpty()) { diff --git a/src/main/io/dkozak/search/model/EngineConfiguration.kt b/src/main/io/dkozak/search/model/EngineConfiguration.kt index 6efa372..974e6b1 100644 --- a/src/main/io/dkozak/search/model/EngineConfiguration.kt +++ b/src/main/io/dkozak/search/model/EngineConfiguration.kt @@ -1,10 +1,10 @@ package io.dkozak.search.model -class EngineConfiguration +class EngineConfiguration ( - val initialState: Node, - val searchQueue: SearchQueue, - val expandNode: (Node) -> List, - val nodeFilter: (Node) -> Boolean, - val isFinalState: (Node) -> Boolean + val initialState: NodeType, + val searchQueue: SearchQueue, + val expandNode: (NodeType) -> List, + val nodeFilter: (NodeType) -> Boolean, + val isFinalState: (NodeType) -> Boolean ) diff --git a/src/main/io/dkozak/search/model/QueueBasedSearchQueue.kt b/src/main/io/dkozak/search/model/QueueBasedSearchQueue.kt new file mode 100644 index 0000000..4760b2e --- /dev/null +++ b/src/main/io/dkozak/search/model/QueueBasedSearchQueue.kt @@ -0,0 +1,13 @@ +package io.dkozak.search.model + +import java.util.* + +class QueueBasedSearchQueue : SearchQueue { + private val queue: Deque = LinkedList() + + override fun next(): NodeType = queue.poll() + + override fun addNodes(nodes: List) = nodes.forEach { queue.addLast(it) } + + override fun isEmpty(): Boolean = queue.isEmpty() +} \ No newline at end of file diff --git a/src/main/io/dkozak/search/model/SearchQueue.kt b/src/main/io/dkozak/search/model/SearchQueue.kt index 3b0d3ce..6f0f931 100644 --- a/src/main/io/dkozak/search/model/SearchQueue.kt +++ b/src/main/io/dkozak/search/model/SearchQueue.kt @@ -1,9 +1,9 @@ package io.dkozak.search.model -interface SearchQueue { - fun next(): Node - fun addNodes(nodes: List) +interface SearchQueue { + fun next(): NodeType + fun addNodes(nodes: List) fun isEmpty(): Boolean - fun addNode(node: Node) = addNodes(listOf(node)) + fun addNode(node: NodeType) = addNodes(listOf(node)) } \ No newline at end of file diff --git a/src/test/io/dkozak/search/engine/EngineTest.kt b/src/test/io/dkozak/search/engine/EngineTest.kt new file mode 100644 index 0000000..e0f4aae --- /dev/null +++ b/src/test/io/dkozak/search/engine/EngineTest.kt @@ -0,0 +1,24 @@ +package io.dkozak.search.engine + +import io.dkozak.search.model.EngineConfiguration +import io.dkozak.search.model.Node +import io.dkozak.search.model.QueueBasedSearchQueue +import org.junit.jupiter.api.Test + +data class NumNode(val num: Int) : Node + +class EngineTest { + + @Test + fun `simpleNumberGame solution should be found`() { + val configuration = EngineConfiguration( + initialState = NumNode(1), + searchQueue = QueueBasedSearchQueue(), + expandNode = { node -> listOf(1, 2, 3, 4, 5).map { NumNode(it + node.num) } }, + nodeFilter = { node -> true }, + isFinalState = { node -> node.num == 42 } + ) + val result = search(configuration, { msg -> println(msg) }) + println("Found result $result") + } +} \ No newline at end of file