From 1d2c7e187754f01e0d08cec27e8c93ef1a03ba8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20R=C3=BCmpelein?= Date: Fri, 1 May 2020 15:44:45 +0200 Subject: [PATCH] Proper single parameter handling. --- build.gradle.kts | 17 ++- .../kotlin/de/pheerai/rcdbquery/Sample.kt | 8 +- .../rcdbquery/dataMappings/Classification.kt | 27 ----- .../dataMappings/MultiParamBuilder.kt | 104 ------------------ .../de/pheerai/rcdbquery/dataMappings/Page.kt | 23 ---- .../rcdbquery/dataMappings/SearchTerm.kt | 23 ---- .../rcdbquery/dataMappings/StartsWith.kt | 24 ---- .../classification/Classification.kt | 20 ++++ .../classification/ClassificationBuilder.kt | 14 +++ .../classification/paramBuilder.kt | 10 ++ .../internal/MultiParamBuilder.kt | 23 ++++ .../{ => internal}/RcdbParamOption.kt | 2 +- .../{ => internal}/RelevantForAll.kt | 2 +- .../dataMappings/{ => order}/Order.kt | 17 +-- .../dataMappings/order/OrderBuilder.kt | 47 ++++++++ .../dataMappings/order/paramBuilder.kt | 10 ++ .../rcdbquery/dataMappings/page/Page.kt | 13 +++ .../dataMappings/page/paramBuilder.kt | 7 ++ .../dataMappings/searchTerm/SearchTerm.kt | 13 +++ .../dataMappings/searchTerm/paramBuilder.kt | 9 ++ .../{ => searchType}/SearchType.kt | 15 +-- .../dataMappings/searchType/paramBuilder.kt | 7 ++ .../dataMappings/startsWith/StartsWith.kt | 16 +++ .../dataMappings/startsWith/paramBuilder.kt | 8 ++ .../dataMappings/{ => status}/Status.kt | 10 +- .../dataMappings/status/StatusBuilder.kt | 15 +++ .../dataMappings/status/paramBuilder.kt | 10 ++ .../rcdbquery/dataMappings/unknownParams.kt | 7 +- .../dataMappings/{ => vendor}/Vendor.kt | 30 +++-- .../dataMappings/vendor/VendorBuilder.kt | 17 +++ .../dataMappings/vendor/paramBuilder.kt | 10 ++ .../de/pheerai/rcdbquery/dsl/rcdbQueryDsl.kt | 32 +++--- .../pheerai/rcdbquery/dsl/RcdbQueryDslTest.kt | 55 +++++---- 33 files changed, 350 insertions(+), 295 deletions(-) delete mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Classification.kt delete mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/MultiParamBuilder.kt delete mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Page.kt delete mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/SearchTerm.kt delete mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/StartsWith.kt create mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/classification/Classification.kt create mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/classification/ClassificationBuilder.kt create mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/classification/paramBuilder.kt create mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/internal/MultiParamBuilder.kt rename src/main/kotlin/de/pheerai/rcdbquery/dataMappings/{ => internal}/RcdbParamOption.kt (68%) rename src/main/kotlin/de/pheerai/rcdbquery/dataMappings/{ => internal}/RelevantForAll.kt (54%) rename src/main/kotlin/de/pheerai/rcdbquery/dataMappings/{ => order}/Order.kt (80%) create mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/order/OrderBuilder.kt create mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/order/paramBuilder.kt create mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/page/Page.kt create mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/page/paramBuilder.kt create mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/searchTerm/SearchTerm.kt create mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/searchTerm/paramBuilder.kt rename src/main/kotlin/de/pheerai/rcdbquery/dataMappings/{ => searchType}/SearchType.kt (50%) create mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/searchType/paramBuilder.kt create mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/startsWith/StartsWith.kt create mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/startsWith/paramBuilder.kt rename src/main/kotlin/de/pheerai/rcdbquery/dataMappings/{ => status}/Status.kt (72%) create mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/status/StatusBuilder.kt create mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/status/paramBuilder.kt rename src/main/kotlin/de/pheerai/rcdbquery/dataMappings/{ => vendor}/Vendor.kt (93%) create mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/vendor/VendorBuilder.kt create mode 100644 src/main/kotlin/de/pheerai/rcdbquery/dataMappings/vendor/paramBuilder.kt diff --git a/build.gradle.kts b/build.gradle.kts index b45d67b..9c9759d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -24,10 +24,19 @@ application { dependencies { implementation(kotlin("stdlib-jdk8")) - testImplementation(kotlin("test-junit")) +// testImplementation(kotlin("test-junit")) + testImplementation("io.kotest:kotest-runner-junit5-jvm:4.0.5") + testImplementation("io.kotest:kotest-assertions-core-jvm:4.0.5") } -val compileKotlin: KotlinCompile by tasks -compileKotlin.kotlinOptions { - freeCompilerArgs = listOf("-XXLanguage:+InlineClasses") +tasks { + withType().configureEach { + kotlinOptions { + freeCompilerArgs = listOf("-XXLanguage:+InlineClasses") + } + } + + test { + useJUnitPlatform() + } } diff --git a/src/main/kotlin/de/pheerai/rcdbquery/Sample.kt b/src/main/kotlin/de/pheerai/rcdbquery/Sample.kt index d790c0b..e95825b 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/Sample.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/Sample.kt @@ -1,6 +1,12 @@ package de.pheerai.rcdbquery -import de.pheerai.rcdbquery.dataMappings.* +import de.pheerai.rcdbquery.dataMappings.order.sortBy +import de.pheerai.rcdbquery.dataMappings.page.page +import de.pheerai.rcdbquery.dataMappings.searchTerm.searchTerm +import de.pheerai.rcdbquery.dataMappings.searchType.SearchType +import de.pheerai.rcdbquery.dataMappings.searchType.searchType +import de.pheerai.rcdbquery.dataMappings.vendor.Vendor +import de.pheerai.rcdbquery.dataMappings.vendor.vendors import de.pheerai.rcdbquery.dsl.* fun main() { diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Classification.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Classification.kt deleted file mode 100644 index f9e226e..0000000 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Classification.kt +++ /dev/null @@ -1,27 +0,0 @@ -package de.pheerai.rcdbquery.dataMappings - -import de.pheerai.rcdbquery.dsl.ParamsBuilder - -enum class Classification( - override val prettyName: String, - override val fullName: String, - override val paramValue: Int - ) : RcdbParamOption { - ROLLERCOASTER("Roller Coaster", 277), - POWERED_COASTER("Powered Coaster", 278), - MOUNTAIN_COASTER("Mountain Coaster", 279) - ; - - constructor(name: String, paramValue: Int): this(name, name, paramValue) - - companion object { - const val staticParamName = "cs"; - } -} - -fun ParamsBuilder.classification(body: ClassificationBuilder.() -> ClassificationBuilder): ParamsBuilder { - val builder = ClassificationBuilder() - builder.body() - this[Classification.staticParamName] = builder.build() - return this -} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/MultiParamBuilder.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/MultiParamBuilder.kt deleted file mode 100644 index 9018a0b..0000000 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/MultiParamBuilder.kt +++ /dev/null @@ -1,104 +0,0 @@ -package de.pheerai.rcdbquery.dataMappings - -// TODO: Find way to only have one generic parameter -sealed class MultiParamBuilder> { - private val paramList: MutableList = mutableListOf() - - open fun add(param: T): MultiParamBuilder { - paramList.add(param) - return this - } - - protected open fun addAll(items: Array): MultiParamBuilder { - paramList.addAll(items) - return this - } - - protected open fun addAll(items: Collection): MultiParamBuilder { - paramList.addAll(items) - return this - } - - fun build() = paramList.toList() -} - -class VendorBuilder : MultiParamBuilder() { - override fun add(param: Vendor): VendorBuilder { - super.add(param) - return this - } - - fun of(vendor: Vendor) = this.add(vendor) - fun vekoma() = this.add(Vendor.VEKOMA) - fun intamin() = this.add(Vendor.INTAMIN) - fun mack() = this.add(Vendor.MACK) - fun bandm() = this.add(Vendor.B_AND_M) - fun gerstlauer() = this.add(Vendor.GERSTLAUER) -} - -class OrderBuilder : MultiParamBuilder() { - override fun add(param: Order): OrderBuilder { - super.add(param) - return this - } - - override fun addAll(items: Array): OrderBuilder { - super.addAll(items) - return this - } - - override fun addAll(items: Collection): OrderBuilder { - super.addAll(items) - return this - } - - fun of(order: Order) = this.add(order) - fun manufacturer() = this.add(Order.MANUFACTURER) - fun inversions() = this.add(Order.INVERSIONS) - fun name() = this.add(Order.NAME) - fun location() = this.add(Order.LOCATION) - fun park() = this.add(Order.PARK) - fun opened() = this.add(Order.OPENED) - fun closed() = this.add(Order.CLOSED) - fun entered() = this.add(Order.ENTERED) - fun type() = this.add(Order.TYPE) - fun design() = this.add(Order.DESIGN) - fun classification() = this.add(Order.CLASSIFICATION) - fun layout() = this.add(Order.LAYOUT) - fun model() = this.add(Order.MODEL) - fun modelLine() = this.add(Order.MODEL_LINE) - fun speed() = this.add(Order.SPEED) - fun height() = this.add(Order.HEIGHT) - fun drop() = this.add(Order.DROP) - fun length() = this.add(Order.LENGTH) - fun angle() = this.add(Order.ANGLE) - fun serialNo() = this.add(Order.SERIAL_NO) - fun scale() = this.add(Order.SCALE) - fun rideTime() = this.add(Order.RIDE_TIME) - fun state() = this.add(Order.STATUS) - fun closing() = this.add(Order.CLOSING) - fun allRelevant() = this.addAll(Order.values().filter { it.relevantForAll }) -} - -class StatusBuilder : MultiParamBuilder() { - override fun add(param: Status): StatusBuilder { - super.add(param) - return this - } - - fun sbno() = this.add(Status.SBNO) - fun operating() = this.add(Status.OPERATING) - fun underConstruction() = this.add(Status.UNDER_CONSTRUCTION) - fun stored() = this.add(Status.STORED) -} - -class ClassificationBuilder : MultiParamBuilder() { - override fun add(param: Classification): ClassificationBuilder { - super.add(param) - return this - } - - fun rollerCoaster() = this.add(Classification.ROLLERCOASTER) - fun poweredCoaster() = this.add(Classification.POWERED_COASTER) - fun mountainCoaster() = this.add(Classification.MOUNTAIN_COASTER) -} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Page.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Page.kt deleted file mode 100644 index 1429845..0000000 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Page.kt +++ /dev/null @@ -1,23 +0,0 @@ -package de.pheerai.rcdbquery.dataMappings - -import de.pheerai.rcdbquery.dsl.ParamsBuilder - -class Page(override val paramValue: Int) : RcdbParamOption { - override val fullName = "The page to show" - override val prettyName = "Page" - - companion object { - const val staticParamName = "page" - } -} - -fun ParamsBuilder.page(page: Int) = if (Page.staticParamName !in this.keys()) { - also { this[Page.staticParamName] = listOf(Page(page)) } -} else { - error( - """Only one page must be given! - | Old page: ${this.getMulti(Page.staticParamName)!![0].paramValue} - | New page: $page - """.trimMargin() - ) -} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/SearchTerm.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/SearchTerm.kt deleted file mode 100644 index 5caecaa..0000000 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/SearchTerm.kt +++ /dev/null @@ -1,23 +0,0 @@ -package de.pheerai.rcdbquery.dataMappings - -import de.pheerai.rcdbquery.dsl.ParamsBuilder - -class SearchTerm(override val paramValue: String) : RcdbParamOption { - override val prettyName = "Search Term" - override val fullName = "Search for elements whose name contain this term" - - companion object { - const val staticParamName = "nc" - } -} - -fun ParamsBuilder.searchTerm(term: String) = - if (SearchTerm.staticParamName !in this.keys()) { - also { this[SearchTerm.staticParamName] = listOf(SearchTerm(term)) } - } else { - error( - """Only one search term must ever be set - | Old term: ${this.getMulti(SearchTerm.staticParamName)!![0].paramValue} - | New term: $term""".trimMargin() - ) - } diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/StartsWith.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/StartsWith.kt deleted file mode 100644 index 196b969..0000000 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/StartsWith.kt +++ /dev/null @@ -1,24 +0,0 @@ -@file:Suppress("unused") - -package de.pheerai.rcdbquery.dataMappings - -import de.pheerai.rcdbquery.dsl.ParamsBuilder - -class StartsWith(override val paramValue: String) : RcdbParamOption { - override val prettyName = "Starts with" - override val fullName = "Name starting with term" - - companion object { - const val staticParamName = "nl" - } -} - -fun ParamsBuilder.startsWith(term: String) = if (StartsWith.staticParamName !in this.keys()) { - also { this[StartsWith.staticParamName] = listOf(StartsWith(term)) } -} else { - error( - """Only one starts with term must ever be set - | Old term: ${this.getMulti(StartsWith.staticParamName)!![0].paramValue} - | New term: $term""".trimMargin() - ) -} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/classification/Classification.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/classification/Classification.kt new file mode 100644 index 0000000..c0f8b29 --- /dev/null +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/classification/Classification.kt @@ -0,0 +1,20 @@ +package de.pheerai.rcdbquery.dataMappings.classification + +import de.pheerai.rcdbquery.dataMappings.internal.RcdbParamOption + +enum class Classification( + override val prettyName: String, + override val fullName: String, + override val paramValue: Int +) : RcdbParamOption { + ROLLER_COASTER("Roller Coaster", 277), + POWERED_COASTER("Powered Coaster", 278), + MOUNTAIN_COASTER("Mountain Coaster", 279) + ; + + constructor(name: String, paramValue: Int) : this(name, name, paramValue) + + companion object { + const val staticParamName = "cs" + } +} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/classification/ClassificationBuilder.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/classification/ClassificationBuilder.kt new file mode 100644 index 0000000..d89f614 --- /dev/null +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/classification/ClassificationBuilder.kt @@ -0,0 +1,14 @@ +package de.pheerai.rcdbquery.dataMappings.classification + +import de.pheerai.rcdbquery.dataMappings.internal.MultiParamBuilder + +class ClassificationBuilder : MultiParamBuilder() { + override fun add(param: Classification): ClassificationBuilder { + super.add(param) + return this + } + + fun rollerCoaster() = this.add(Classification.ROLLER_COASTER) + fun poweredCoaster() = this.add(Classification.POWERED_COASTER) + fun mountainCoaster() = this.add(Classification.MOUNTAIN_COASTER) +} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/classification/paramBuilder.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/classification/paramBuilder.kt new file mode 100644 index 0000000..220596b --- /dev/null +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/classification/paramBuilder.kt @@ -0,0 +1,10 @@ +package de.pheerai.rcdbquery.dataMappings.classification + +import de.pheerai.rcdbquery.dsl.ParamsCollector + +fun ParamsCollector.classification(body: ClassificationBuilder.() -> ClassificationBuilder): ParamsCollector { + val builder = ClassificationBuilder() + builder.body() + this[Classification.staticParamName] = builder.build() + return this +} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/internal/MultiParamBuilder.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/internal/MultiParamBuilder.kt new file mode 100644 index 0000000..829f4b2 --- /dev/null +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/internal/MultiParamBuilder.kt @@ -0,0 +1,23 @@ +package de.pheerai.rcdbquery.dataMappings.internal + +open class MultiParamBuilder> { + private val paramList: MutableList = mutableListOf() + + open fun add(param: T): MultiParamBuilder { + paramList.add(param) + return this + } + + protected open fun addAll(items: Array): MultiParamBuilder { + paramList.addAll(items) + return this + } + + protected open fun addAll(items: Collection): MultiParamBuilder { + paramList.addAll(items) + return this + } + + fun build() = paramList.toList() +} + diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/RcdbParamOption.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/internal/RcdbParamOption.kt similarity index 68% rename from src/main/kotlin/de/pheerai/rcdbquery/dataMappings/RcdbParamOption.kt rename to src/main/kotlin/de/pheerai/rcdbquery/dataMappings/internal/RcdbParamOption.kt index f3a3ba1..c681935 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/RcdbParamOption.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/internal/RcdbParamOption.kt @@ -1,4 +1,4 @@ -package de.pheerai.rcdbquery.dataMappings +package de.pheerai.rcdbquery.dataMappings.internal interface RcdbParamOption { val prettyName: String diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/RelevantForAll.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/internal/RelevantForAll.kt similarity index 54% rename from src/main/kotlin/de/pheerai/rcdbquery/dataMappings/RelevantForAll.kt rename to src/main/kotlin/de/pheerai/rcdbquery/dataMappings/internal/RelevantForAll.kt index 55bee8a..fdd6d7c 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/RelevantForAll.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/internal/RelevantForAll.kt @@ -1,4 +1,4 @@ -package de.pheerai.rcdbquery.dataMappings +package de.pheerai.rcdbquery.dataMappings.internal interface RelevantForAll { val relevantForAll: Boolean diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Order.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/order/Order.kt similarity index 80% rename from src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Order.kt rename to src/main/kotlin/de/pheerai/rcdbquery/dataMappings/order/Order.kt index f8d42a3..f4dd8a6 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Order.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/order/Order.kt @@ -1,6 +1,7 @@ -package de.pheerai.rcdbquery.dataMappings +package de.pheerai.rcdbquery.dataMappings.order -import de.pheerai.rcdbquery.dsl.ParamsBuilder +import de.pheerai.rcdbquery.dataMappings.internal.RcdbParamOption +import de.pheerai.rcdbquery.dataMappings.internal.RelevantForAll @Suppress("unused") enum class Order( @@ -8,7 +9,8 @@ enum class Order( override val fullName: String, override val paramValue: Int, override val relevantForAll: Boolean = true -) : RcdbParamOption, RelevantForAll { +) : RcdbParamOption, + RelevantForAll { IMAGES("Images", "Amount of Images", 0), NAME("Name", "Name of the Coaster", 1), AKA("AKA", "Is/was also known as", 2, relevantForAll = false), @@ -44,16 +46,9 @@ enum class Order( CLOSING("Closing", "(Future) closign date for temporary installations", 31) ; - constructor(name: String, paramId: Int, deprecated: Boolean = false) : this(name, name, paramId) + constructor(name: String, paramId: Int) : this(name, name, paramId) companion object { const val staticParamName = "order" } } - -fun ParamsBuilder.sortBy(body: OrderBuilder.() -> OrderBuilder): ParamsBuilder { - val builder = OrderBuilder() - builder.body() - this[Order.staticParamName] = builder.build() - return this -} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/order/OrderBuilder.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/order/OrderBuilder.kt new file mode 100644 index 0000000..24ca0a3 --- /dev/null +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/order/OrderBuilder.kt @@ -0,0 +1,47 @@ +package de.pheerai.rcdbquery.dataMappings.order + +import de.pheerai.rcdbquery.dataMappings.internal.MultiParamBuilder + +class OrderBuilder : MultiParamBuilder() { + override fun add(param: Order): OrderBuilder { + super.add(param) + return this + } + + override fun addAll(items: Array): OrderBuilder { + super.addAll(items) + return this + } + + override fun addAll(items: Collection): OrderBuilder { + super.addAll(items) + return this + } + + fun of(order: Order) = this.add(order) + fun manufacturer() = this.add(Order.MANUFACTURER) + fun inversions() = this.add(Order.INVERSIONS) + fun name() = this.add(Order.NAME) + fun location() = this.add(Order.LOCATION) + fun park() = this.add(Order.PARK) + fun opened() = this.add(Order.OPENED) + fun closed() = this.add(Order.CLOSED) + fun entered() = this.add(Order.ENTERED) + fun type() = this.add(Order.TYPE) + fun design() = this.add(Order.DESIGN) + fun classification() = this.add(Order.CLASSIFICATION) + fun layout() = this.add(Order.LAYOUT) + fun model() = this.add(Order.MODEL) + fun modelLine() = this.add(Order.MODEL_LINE) + fun speed() = this.add(Order.SPEED) + fun height() = this.add(Order.HEIGHT) + fun drop() = this.add(Order.DROP) + fun length() = this.add(Order.LENGTH) + fun angle() = this.add(Order.ANGLE) + fun serialNo() = this.add(Order.SERIAL_NO) + fun scale() = this.add(Order.SCALE) + fun rideTime() = this.add(Order.RIDE_TIME) + fun state() = this.add(Order.STATUS) + fun closing() = this.add(Order.CLOSING) + fun allRelevant() = this.addAll(Order.values().filter { it.relevantForAll }) +} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/order/paramBuilder.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/order/paramBuilder.kt new file mode 100644 index 0000000..1622e47 --- /dev/null +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/order/paramBuilder.kt @@ -0,0 +1,10 @@ +package de.pheerai.rcdbquery.dataMappings.order + +import de.pheerai.rcdbquery.dsl.ParamsCollector + +fun ParamsCollector.sortBy(body: OrderBuilder.() -> OrderBuilder): ParamsCollector { + val builder = OrderBuilder() + builder.body() + this[Order.staticParamName] = builder.build() + return this +} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/page/Page.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/page/Page.kt new file mode 100644 index 0000000..dcc40a5 --- /dev/null +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/page/Page.kt @@ -0,0 +1,13 @@ +package de.pheerai.rcdbquery.dataMappings.page + +import de.pheerai.rcdbquery.dataMappings.internal.RcdbParamOption + +class Page(override val paramValue: Int) : + RcdbParamOption { + override val fullName = "The page to show" + override val prettyName = "Page" + + companion object { + const val staticParamName = "page" + } +} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/page/paramBuilder.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/page/paramBuilder.kt new file mode 100644 index 0000000..c7d4c62 --- /dev/null +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/page/paramBuilder.kt @@ -0,0 +1,7 @@ +package de.pheerai.rcdbquery.dataMappings.page + +import de.pheerai.rcdbquery.dsl.ParamsCollector + +fun ParamsCollector.page(page: Int) = also { this[Page.staticParamName] = + Page(page) +} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/searchTerm/SearchTerm.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/searchTerm/SearchTerm.kt new file mode 100644 index 0000000..6206e1d --- /dev/null +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/searchTerm/SearchTerm.kt @@ -0,0 +1,13 @@ +package de.pheerai.rcdbquery.dataMappings.searchTerm + +import de.pheerai.rcdbquery.dataMappings.internal.RcdbParamOption + +class SearchTerm(override val paramValue: String) : + RcdbParamOption { + override val prettyName = "Search Term" + override val fullName = "Search for elements whose name contain this term" + + companion object { + const val staticParamName = "nc" + } +} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/searchTerm/paramBuilder.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/searchTerm/paramBuilder.kt new file mode 100644 index 0000000..522a627 --- /dev/null +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/searchTerm/paramBuilder.kt @@ -0,0 +1,9 @@ +package de.pheerai.rcdbquery.dataMappings.searchTerm + +import de.pheerai.rcdbquery.dsl.ParamsCollector + +fun ParamsCollector.searchTerm(term: String) = also { + it[SearchTerm.staticParamName] = listOf( + SearchTerm(term) + ) +} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/SearchType.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/searchType/SearchType.kt similarity index 50% rename from src/main/kotlin/de/pheerai/rcdbquery/dataMappings/SearchType.kt rename to src/main/kotlin/de/pheerai/rcdbquery/dataMappings/searchType/SearchType.kt index c3de8e4..e12ef9c 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/SearchType.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/searchType/SearchType.kt @@ -1,6 +1,6 @@ -package de.pheerai.rcdbquery.dataMappings +package de.pheerai.rcdbquery.dataMappings.searchType -import de.pheerai.rcdbquery.dsl.ParamsBuilder +import de.pheerai.rcdbquery.dataMappings.internal.RcdbParamOption @Suppress("unused") enum class SearchType( @@ -18,14 +18,3 @@ enum class SearchType( const val staticParamName = "ot" } } - -fun ParamsBuilder.searchType(searchType: SearchType) = - if (SearchType.staticParamName !in this.keys()) { - also { this[SearchType.staticParamName] = listOf(searchType) } - } else { - error( - """Only one search type must ever be set - | Old type: ${this.getMulti(SearchType.staticParamName)!![0].prettyName} - | New type: ${searchType.prettyName}""".trimMargin() - ) - } diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/searchType/paramBuilder.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/searchType/paramBuilder.kt new file mode 100644 index 0000000..343ead7 --- /dev/null +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/searchType/paramBuilder.kt @@ -0,0 +1,7 @@ +package de.pheerai.rcdbquery.dataMappings.searchType + +import de.pheerai.rcdbquery.dsl.ParamsCollector + +fun ParamsCollector.searchType(searchType: SearchType) = also { + it[SearchType.staticParamName] = searchType +} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/startsWith/StartsWith.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/startsWith/StartsWith.kt new file mode 100644 index 0000000..2faac58 --- /dev/null +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/startsWith/StartsWith.kt @@ -0,0 +1,16 @@ +@file:Suppress("unused") + +package de.pheerai.rcdbquery.dataMappings.startsWith + +import de.pheerai.rcdbquery.dataMappings.internal.RcdbParamOption + +class StartsWith(override val paramValue: String) : + RcdbParamOption { + override val prettyName = "Starts with" + override val fullName = "Name starting with term" + + companion object { + const val staticParamName = "nl" + } +} + diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/startsWith/paramBuilder.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/startsWith/paramBuilder.kt new file mode 100644 index 0000000..1004e45 --- /dev/null +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/startsWith/paramBuilder.kt @@ -0,0 +1,8 @@ +package de.pheerai.rcdbquery.dataMappings.startsWith + +import de.pheerai.rcdbquery.dsl.ParamsCollector + +fun ParamsCollector.startsWith(term: String) = also { + this[StartsWith.staticParamName] = + StartsWith(term) +} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Status.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/status/Status.kt similarity index 72% rename from src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Status.kt rename to src/main/kotlin/de/pheerai/rcdbquery/dataMappings/status/Status.kt index e1eb85f..e1a82f9 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Status.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/status/Status.kt @@ -1,6 +1,6 @@ -package de.pheerai.rcdbquery.dataMappings +package de.pheerai.rcdbquery.dataMappings.status -import de.pheerai.rcdbquery.dsl.ParamsBuilder +import de.pheerai.rcdbquery.dataMappings.internal.RcdbParamOption @Suppress("unused") enum class Status( @@ -29,9 +29,3 @@ enum class Status( } } -fun ParamsBuilder.status(body: StatusBuilder.() -> StatusBuilder): ParamsBuilder { - val builder = StatusBuilder() - builder.body() - this[Status.staticParamName] = builder.build() - return this -} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/status/StatusBuilder.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/status/StatusBuilder.kt new file mode 100644 index 0000000..448a3c8 --- /dev/null +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/status/StatusBuilder.kt @@ -0,0 +1,15 @@ +package de.pheerai.rcdbquery.dataMappings.status + +import de.pheerai.rcdbquery.dataMappings.internal.MultiParamBuilder + +class StatusBuilder : MultiParamBuilder() { + override fun add(param: Status): StatusBuilder { + super.add(param) + return this + } + + fun sbno() = this.add(Status.SBNO) + fun operating() = this.add(Status.OPERATING) + fun underConstruction() = this.add(Status.UNDER_CONSTRUCTION) + fun stored() = this.add(Status.STORED) +} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/status/paramBuilder.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/status/paramBuilder.kt new file mode 100644 index 0000000..7ef7c0d --- /dev/null +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/status/paramBuilder.kt @@ -0,0 +1,10 @@ +package de.pheerai.rcdbquery.dataMappings.status + +import de.pheerai.rcdbquery.dsl.ParamsCollector + +fun ParamsCollector.status(body: StatusBuilder.() -> StatusBuilder): ParamsCollector { + val builder = StatusBuilder() + builder.body() + this[Status.staticParamName] = builder.build() + return this +} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/unknownParams.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/unknownParams.kt index 583ae5c..da1678c 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/unknownParams.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/unknownParams.kt @@ -1,13 +1,14 @@ package de.pheerai.rcdbquery.dataMappings -import de.pheerai.rcdbquery.dsl.ParamsBuilder +import de.pheerai.rcdbquery.dataMappings.order.Order +import de.pheerai.rcdbquery.dsl.ParamsCollector @Suppress("unused") @Deprecated( "The parameter for extra columns has not yet been discovered (if it even exists). Use multiple values in the `sortBy` param instead (first values take sorting precedence)", ReplaceWith("sortBy"), DeprecationLevel.ERROR ) -fun ParamsBuilder.extraColumns(orders: List): Nothing = +fun ParamsCollector.extraColumns(orders: List): Nothing = error("The parameter for extra columns has not yet been discovered (if it even exists). Use multiple values in the `sortBy` param instead (first values take sorting precedence)") @Suppress("unused") @@ -15,5 +16,5 @@ fun ParamsBuilder.extraColumns(orders: List): Nothing = "The parameter for extra columns has not yet been discovered (if it even exists). Use multiple values in the `sortBy` param instead (first values take sorting precedence)", ReplaceWith("sortBy"), DeprecationLevel.ERROR ) -fun ParamsBuilder.extraColumns(vararg orders: Order): Nothing = +fun ParamsCollector.extraColumns(vararg orders: Order): Nothing = error("The parameter for extra columns has not yet been discovered (if it even exists). Use multiple values in the `sortBy` param instead (first values take sorting precedence)") diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Vendor.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/vendor/Vendor.kt similarity index 93% rename from src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Vendor.kt rename to src/main/kotlin/de/pheerai/rcdbquery/dataMappings/vendor/Vendor.kt index 15d6c41..abb6b12 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Vendor.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/vendor/Vendor.kt @@ -1,6 +1,6 @@ -package de.pheerai.rcdbquery.dataMappings +package de.pheerai.rcdbquery.dataMappings.vendor -import de.pheerai.rcdbquery.dsl.ParamsBuilder +import de.pheerai.rcdbquery.dataMappings.internal.RcdbParamOption @Suppress("unused") enum class Vendor( @@ -28,19 +28,19 @@ enum class Vendor( MOLINA_AND_SONS("Molina & Son's", 6871), ALLAN_HERSCHELL("Allan Herschell Company", 6872), SDC("S.D.C.", 6873), - HENSEL_PHELPS("Hensel Phelps","Hensel Phelps Construction Co.", 6879), + HENSEL_PHELPS("Hensel Phelps", "Hensel Phelps Construction Co.", 6879), HOPKINS("Hopkins", 6881), CHANCE("Chance", "Chance Rides", 6887), BRADLEY_AND_KAYE("Bradley and Kaye", 6894), SARTORI("Sartori", "Sartori Rides", 6895), - MICHAEL_BLACK("Michael Black Assoc.","Michael Black and Associates", 6898), + MICHAEL_BLACK("Michael Black Assoc.", "Michael Black and Associates", 6898), REVERCHON("Reverchon", 6902), TOP_FUN("Top Fun", 6903), WISDOM("WISDOM", "Wisdom Rides", 6904), L_AND_T("L&T", "L&T Systems", 6906), COASTER_WORKS("Coaster Works", "Coaster Works, Inc.", 6907), GIOVANOLA("Giovanola", 6908), - B_A_SCHIFF("B. A. Schiff Assoc.","B. A. Schiff & Associates", 6914), + B_A_SCHIFF("B. A. Schiff Assoc.", "B. A. Schiff & Associates", 6914), RCCA("RCCA", "Roller Coaster Corporation of America", 6918), CARIPRO("Caripro", 6919), SETPOINT("Setpoint", 6920), @@ -55,12 +55,12 @@ enum class Vendor( BHS("BHS", "Bayerische Berg-, Hütten- und Salzwerke AG", 6951), FABBRI("Fabbri", 6953), MEISHO("Meisho", "Meisho Amusement Machines", 6954), - SENYO_KOGYO("Senyo","Senyo Kogyo Co., Ltd.", 6957), + SENYO_KOGYO("Senyo", "Senyo Kogyo Co., Ltd.", 6957), NIPPON("Nippon", 6958), OKAMOTO("Okamoto", "Okamoto Co., Ltd.", 6970), PAX("Pax", "Pax Company", 6971), HOEI_SANGYO("Hoei Sangyo", "Hoei Sangyo Co., Ltd.", 6973), - THOMPSON("Thompson","L.A. Thompson Scenic Railway Company", 6975), + THOMPSON("Thompson", "L.A. Thompson Scenic Railway Company", 6975), WGH_TRANSPORTATION("WGH Transportation", 6979), HARTON("TM Harton", "TM Harton Company", 7000), APPLE("Apple", 7030), @@ -111,7 +111,7 @@ enum class Vendor( CAM_BABY_KART("CAM Baby Kart", 7400), EOS("EOS", 7418), ACA("ACA", 7446), - IKEDA("Ikeda","Ikeda Works", 7447), + IKEDA("Ikeda", "Ikeda Works", 7447), BUTLIN("Butlin", 7452), TAKAHASHI_KIKAI_SANGYO("Takahashi Kikai Sangyo", 7472), DYNAMIC("Dynamic Attractions", 7489), @@ -125,7 +125,7 @@ enum class Vendor( DEBRINQUEDO("DeBrinquedo", 7567), ZHEJIANG_JUMA_AMUSEMENT_EQUIPMENT("Zhejiang Juma Amusement Equipment Co., Ltd.", 7573), SAEKI("Saeki", 7582), - KUMBAK("KumbaK","""KumbaK "The Amusement Engineers"""", 7608), + KUMBAK("KumbaK", """KumbaK "The Amusement Engineers"""", 7608), PINTO_BROTHERS("Pinto Brothers", 7657), CEDEAL("Cedeal Rides", 7688), DOPPELMAYR("Doppelmayr", 7700), @@ -138,7 +138,10 @@ enum class Vendor( VAFAEI("Vafaei Rides", 7953), VOSTOK("Vostok", 7959), PARKASH_AMUSEMENTS("Parkash Amusements", 7963), - HEBEI_ZHONGYE_METALLURGICAL_EQUIPMENT_MANUFACTURING("Hebei Zhongye Metallurgical Equipment Manufacturing Co., Ltd", 7980), + HEBEI_ZHONGYE_METALLURGICAL_EQUIPMENT_MANUFACTURING( + "Hebei Zhongye Metallurgical Equipment Manufacturing Co., Ltd", + 7980 + ), R_AND_R("R&R", 8006), ABC("abc", "abc rides", 8026), // Not a test object TECHNICAL_PARK("Technical Park", 8046), @@ -253,10 +256,3 @@ enum class Vendor( } } } - -fun ParamsBuilder.vendors(body: VendorBuilder.() -> VendorBuilder): ParamsBuilder { - val builder = VendorBuilder() - builder.body() - this[Vendor.staticParamName] = builder.build() - return this -} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/vendor/VendorBuilder.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/vendor/VendorBuilder.kt new file mode 100644 index 0000000..35b0153 --- /dev/null +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/vendor/VendorBuilder.kt @@ -0,0 +1,17 @@ +package de.pheerai.rcdbquery.dataMappings.vendor + +import de.pheerai.rcdbquery.dataMappings.internal.MultiParamBuilder + +class VendorBuilder : MultiParamBuilder() { + override fun add(param: Vendor): VendorBuilder { + super.add(param) + return this + } + + fun of(vendor: Vendor) = this.add(vendor) + fun vekoma() = this.add(Vendor.VEKOMA) + fun intamin() = this.add(Vendor.INTAMIN) + fun mack() = this.add(Vendor.MACK) + fun bandm() = this.add(Vendor.B_AND_M) + fun gerstlauer() = this.add(Vendor.GERSTLAUER) +} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/vendor/paramBuilder.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/vendor/paramBuilder.kt new file mode 100644 index 0000000..ac07339 --- /dev/null +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/vendor/paramBuilder.kt @@ -0,0 +1,10 @@ +package de.pheerai.rcdbquery.dataMappings.vendor + +import de.pheerai.rcdbquery.dsl.ParamsCollector + +fun ParamsCollector.vendors(body: VendorBuilder.() -> VendorBuilder): ParamsCollector { + val builder = VendorBuilder() + builder.body() + this[Vendor.staticParamName] = builder.build() + return this +} diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dsl/rcdbQueryDsl.kt b/src/main/kotlin/de/pheerai/rcdbquery/dsl/rcdbQueryDsl.kt index b74d278..82498fb 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dsl/rcdbQueryDsl.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dsl/rcdbQueryDsl.kt @@ -1,7 +1,9 @@ package de.pheerai.rcdbquery.dsl -import de.pheerai.rcdbquery.dataMappings.RcdbParamOption -import de.pheerai.rcdbquery.dataMappings.SearchType +import de.pheerai.rcdbquery.dataMappings.internal.RcdbParamOption +import de.pheerai.rcdbquery.dataMappings.searchType.SearchType + +// TODO: Restructure data class RcdbParams( val multiParams: MultiParams, @@ -12,7 +14,7 @@ data class RcdbParams( .params .asSequence() .map { e -> e.key to e.value.joinToString(separator = ",") } - val singleParamSequence: Sequence> = this.singleParams + val singleParamSequence: Sequence> = this.singleParams .params .asSequence() .map { it.toPair() } @@ -22,15 +24,16 @@ data class RcdbParams( } } -// In preparation for new handler sealed class Params { abstract val params: Map } +class ParamAlreadySetException(message: String) : IllegalArgumentException(message) + class MultiParams(override val params: Map>) : Params>() class SingleParams(override val params: Map) : Params() -class ParamsBuilder { +class ParamsCollector { private val multiParams: MutableMap>> = mutableMapOf() private val singleParams: MutableMap> = mutableMapOf() @@ -41,16 +44,16 @@ class ParamsBuilder { * If no Search type has been set, this will default to "Coaster" */ private fun buildMulti() = multiParams.apply { - putIfAbsent(SearchType.staticParamName, listOf(SearchType.COASTER)) + // Defaults go here, if any } .filter { it.value.isNotEmpty() } .mapValues { e -> e.value.map { o -> o.paramValue.toString() } } .let { MultiParams(it) } private fun buildSingle() = singleParams.apply { - // Defaults go here + putIfAbsent(SearchType.staticParamName, SearchType.COASTER) } - .mapValues { it.toString() } + .mapValues { e -> e.value.paramValue.toString() } .let { SingleParams(it) } operator fun set(paramName: String, options: List>) { @@ -58,7 +61,11 @@ class ParamsBuilder { } operator fun set(paramName: String, option: RcdbParamOption) { - this.singleParams[paramName] = option + if (paramName !in singleParams && paramName !in multiParams) { + this.singleParams[paramName] = option + } else { + throw ParamAlreadySetException("Parameter $paramName already set.") + } } fun getSingle(paramName: String) = this.multiParams[paramName] ?: this.singleParams[paramName] @@ -69,7 +76,7 @@ class ParamsBuilder { private fun singleKeys() = this.singleParams.keys.toSet() } -fun rcdbQuery(body: ParamsBuilder.() -> ParamsBuilder) = +fun rcdbQuery(body: ParamsCollector.() -> ParamsCollector) = RcdbUrlQuery("https://www.rcdb.com/r.htm?", rcdbQueryParams(body)).toString() data class RcdbUrlQuery(val baseUrl: String, val params: RcdbParams) { @@ -82,9 +89,8 @@ data class RcdbUrlQuery(val baseUrl: String, val params: RcdbParams) { /** * Builder for the parameters only (mainly because it might be possilbe in the future to have an API with a POST search object? */ -fun rcdbQueryParams(body: ParamsBuilder.() -> ParamsBuilder): RcdbParams { - val builder = ParamsBuilder() +fun rcdbQueryParams(body: ParamsCollector.() -> ParamsCollector): RcdbParams { + val builder = ParamsCollector() builder.body() return builder.build() } - diff --git a/src/test/kotlin/de/pheerai/rcdbquery/dsl/RcdbQueryDslTest.kt b/src/test/kotlin/de/pheerai/rcdbquery/dsl/RcdbQueryDslTest.kt index de81bea..af911c3 100644 --- a/src/test/kotlin/de/pheerai/rcdbquery/dsl/RcdbQueryDslTest.kt +++ b/src/test/kotlin/de/pheerai/rcdbquery/dsl/RcdbQueryDslTest.kt @@ -1,27 +1,38 @@ package de.pheerai.rcdbquery.dsl -import de.pheerai.rcdbquery.dataMappings.Vendor -import de.pheerai.rcdbquery.dataMappings.sortBy -import de.pheerai.rcdbquery.dataMappings.vendors -import kotlin.test.Test -import kotlin.test.assertEquals +import de.pheerai.rcdbquery.dataMappings.vendor.Vendor +import de.pheerai.rcdbquery.dataMappings.order.sortBy +import de.pheerai.rcdbquery.dataMappings.vendor.vendors +import io.kotest.core.spec.style.StringSpec +import io.kotest.matchers.shouldBe +import io.kotest.matchers.string.shouldContain -class RcdbQueryDslTest { - @Test - fun testQueryParamBuilder() { - assertEquals( - "https://www.rcdb.com/r.htm?mk=6836,6856,6905&order=24,30&ot=2", - rcdbQuery { - vendors { - vekoma() - mack() - of(Vendor.MAURER) - } - sortBy { - inversions() - manufacturer() - } +class RcdbQueryDslTest : StringSpec({ + + "should generate a proper URL" { + val actual = rcdbQuery { + vendors { + vekoma() + mack() + of(Vendor.MAURER) } - ) + sortBy { + inversions() + manufacturer() + } + } + + actual.length shouldBe 61 + actual.shouldContain("https://www.rcdb.com/r.htm?") + actual.shouldContain("mk=") + actual.shouldContain("6836") + actual.shouldContain("6856") + actual.shouldContain("6905") + actual.shouldContain("order=") + actual.shouldContain("24") + actual.shouldContain("30") + actual.shouldContain("ot=2") + actual.filter { it == '&' }.length shouldBe 2 } -} +}) +