diff --git a/kotlin-libraries/build.gradle b/kotlin-libraries/build.gradle
index b244df34b0..afb92de49e 100644
--- a/kotlin-libraries/build.gradle
+++ b/kotlin-libraries/build.gradle
@@ -7,6 +7,7 @@ version '1.0-SNAPSHOT'
buildscript {
ext.kotlin_version = '1.2.41'
ext.ktor_version = '0.9.2'
+ ext.khttp_version = '0.1.0'
repositories {
mavenCentral()
@@ -47,11 +48,16 @@ dependencies {
compile "io.ktor:ktor-server-netty:$ktor_version"
compile "ch.qos.logback:logback-classic:1.2.1"
compile "io.ktor:ktor-gson:$ktor_version"
+ compile "khttp:khttp:$khttp_version"
testCompile group: 'junit', name: 'junit', version: '4.12'
+ testCompile group: 'org.jetbrains.spek', name: 'spek-api', version: '1.1.5'
+ testCompile group: 'org.jetbrains.spek', name: 'spek-subject-extension', version: '1.1.5'
+ testCompile group: 'org.jetbrains.spek', name: 'spek-junit-platform-engine', version: '1.1.5'
implementation 'com.beust:klaxon:3.0.1'
+ implementation 'io.reactivex.rxjava2:rxkotlin:2.3.0'
}
task runServer(type: JavaExec) {
main = 'APIServer'
classpath = sourceSets.main.runtimeClasspath
-}
\ No newline at end of file
+}
diff --git a/kotlin-libraries/pom.xml b/kotlin-libraries/pom.xml
index 3d2c7337b0..b75c77f358 100644
--- a/kotlin-libraries/pom.xml
+++ b/kotlin-libraries/pom.xml
@@ -166,6 +166,12 @@
2.6
compile
+
+
+ io.reactivex.rxjava2
+ rxkotlin
+ 2.3.0
+
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/rxkotlin/RxKotlinTest.kt b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/rxkotlin/RxKotlinTest.kt
new file mode 100644
index 0000000000..979ed3f809
--- /dev/null
+++ b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/rxkotlin/RxKotlinTest.kt
@@ -0,0 +1,157 @@
+package com.baeldung.kotlin.rxkotlin
+
+import io.reactivex.Maybe
+import io.reactivex.Observable
+import io.reactivex.functions.BiFunction
+import io.reactivex.rxkotlin.*
+import io.reactivex.subjects.PublishSubject
+import org.junit.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertFalse
+
+class RxKotlinTest {
+
+ @Test
+ fun whenBooleanArrayToObserver_thenBooleanObserver() {
+ val observable = listOf(true, false, false).toObservable()
+ observable.test().assertValues(true, false, false)
+ }
+
+ @Test
+ fun whenBooleanArrayToFlowable_thenBooleanFlowable() {
+ val flowable = listOf(true, false, false).toFlowable()
+ flowable.buffer(2).test().assertValues(listOf(true, false), listOf(false))
+ }
+
+ @Test
+ fun whenIntArrayToObserver_thenIntObserver() {
+ val observable = listOf(1, 1, 2, 3).toObservable()
+ observable.test().assertValues(1, 1, 2, 3)
+ }
+
+ @Test
+ fun whenIntArrayToFlowable_thenIntFlowable() {
+ val flowable = listOf(1, 1, 2, 3).toFlowable()
+ flowable.buffer(2).test().assertValues(listOf(1, 1), listOf(2, 3))
+ }
+
+ @Test
+ fun whenObservablePairToMap_thenSingleNoDuplicates() {
+ val list = listOf(Pair("a", 1), Pair("b", 2), Pair("c", 3), Pair("a", 4))
+ val observable = list.toObservable()
+ val map = observable.toMap()
+ assertEquals(mapOf(Pair("a", 4), Pair("b", 2), Pair("c", 3)), map.blockingGet())
+ }
+
+ @Test
+ fun whenObservablePairToMap_thenSingleWithDuplicates() {
+ val list = listOf(Pair("a", 1), Pair("b", 2), Pair("c", 3), Pair("a", 4))
+ val observable = list.toObservable()
+ val map = observable.toMultimap()
+ assertEquals(
+ mapOf(Pair("a", listOf(1, 4)), Pair("b", listOf(2)), Pair("c", listOf(3))),
+ map.blockingGet())
+ }
+
+ @Test
+ fun whenMergeAll_thenStream() {
+ val subject = PublishSubject.create>()
+ val observable = subject.mergeAll()
+ val testObserver = observable.test()
+ subject.onNext(Observable.just("first", "second"))
+ testObserver.assertValues("first", "second")
+ subject.onNext(Observable.just("third", "fourth"))
+ subject.onNext(Observable.just("fifth"))
+ testObserver.assertValues("first", "second", "third", "fourth", "fifth")
+ }
+
+ @Test
+ fun whenConcatAll_thenStream() {
+ val subject = PublishSubject.create>()
+ val observable = subject.concatAll()
+ val testObserver = observable.test()
+ subject.onNext(Observable.just("first", "second"))
+ testObserver.assertValues("first", "second")
+ subject.onNext(Observable.just("third", "fourth"))
+ subject.onNext(Observable.just("fifth"))
+ testObserver.assertValues("first", "second", "third", "fourth", "fifth")
+ }
+
+ @Test
+ fun whenSwitchLatest_thenStream() {
+ val subject = PublishSubject.create>()
+ val observable = subject.switchLatest()
+ val testObserver = observable.test()
+ subject.onNext(Observable.just("first", "second"))
+ testObserver.assertValues("first", "second")
+ subject.onNext(Observable.just("third", "fourth"))
+ subject.onNext(Observable.just("fifth"))
+ testObserver.assertValues("first", "second", "third", "fourth", "fifth")
+ }
+
+ @Test
+ fun whenMergeAllMaybes_thenObservable() {
+ val subject = PublishSubject.create>()
+ val observable = subject.mergeAllMaybes()
+ val testObserver = observable.test()
+ subject.onNext(Maybe.just(1))
+ subject.onNext(Maybe.just(2))
+ subject.onNext(Maybe.empty())
+ testObserver.assertValues(1, 2)
+ subject.onNext(Maybe.error(Exception("")))
+ subject.onNext(Maybe.just(3))
+ testObserver.assertValues(1, 2).assertError(Exception::class.java)
+ }
+
+ @Test
+ fun whenMerge_thenStream() {
+ val observables = mutableListOf(Observable.just("first", "second"))
+ val observable = observables.merge()
+ observables.add(Observable.just("third", "fourth"))
+ observables.add(Observable.error(Exception("e")))
+ observables.add(Observable.just("fifth"))
+
+ observable.test().assertValues("first", "second", "third", "fourth").assertError(Exception::class.java)
+ }
+
+ @Test
+ fun whenMergeDelayError_thenStream() {
+ val observables = mutableListOf>(Observable.error(Exception("e1")))
+ val observable = observables.mergeDelayError()
+ observables.add(Observable.just("1", "2"))
+ observables.add(Observable.error(Exception("e2")))
+ observables.add(Observable.just("3"))
+
+ observable.test().assertValues("1", "2", "3").assertError(Exception::class.java)
+ }
+
+ @Test
+ fun whenCast_thenUniformType() {
+ val observable = Observable.just(1, 1, 2, 3)
+ observable.cast().test().assertValues(1, 1, 2, 3)
+ }
+
+ @Test
+ fun whenOfType_thenFilter() {
+ val observable = Observable.just(1, "and", 2, "and")
+ observable.ofType().test().assertValues(1, 2)
+ }
+
+ @Test
+ fun whenFunction_thenCompletable() {
+ var value = 0
+ val completable = { value = 3 }.toCompletable()
+ assertFalse(completable.test().isCancelled)
+ assertEquals(3, value)
+ }
+
+ @Test
+ fun whenHelper_thenMoreIdiomaticKotlin() {
+ val zipWith = Observable.just(1).zipWith(Observable.just(2)) { a, b -> a + b }
+ zipWith.subscribeBy(onNext = { println(it) })
+ val zip = Observables.zip(Observable.just(1), Observable.just(2)) { a, b -> a + b }
+ zip.subscribeBy(onNext = { println(it) })
+ val zipOrig = Observable.zip(Observable.just(1), Observable.just(2), BiFunction { a, b -> a + b })
+ zipOrig.subscribeBy(onNext = { println(it) })
+ }
+}
diff --git a/rule-engines/easy-rules/pom.xml b/rule-engines/easy-rules/pom.xml
index 5b88ce4e94..369451c56c 100644
--- a/rule-engines/easy-rules/pom.xml
+++ b/rule-engines/easy-rules/pom.xml
@@ -10,6 +10,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../..
@@ -23,4 +24,4 @@
3.0.0
-
\ No newline at end of file
+
diff --git a/rule-engines/openl-tablets/pom.xml b/rule-engines/openl-tablets/pom.xml
index 3bd6055fc9..b19ec8d3f1 100644
--- a/rule-engines/openl-tablets/pom.xml
+++ b/rule-engines/openl-tablets/pom.xml
@@ -10,6 +10,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../..
@@ -29,4 +30,4 @@
5.19.4
-
\ No newline at end of file
+
diff --git a/rule-engines/rulebook/pom.xml b/rule-engines/rulebook/pom.xml
index 90b5e55417..5e0b900bd9 100644
--- a/rule-engines/rulebook/pom.xml
+++ b/rule-engines/rulebook/pom.xml
@@ -10,6 +10,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../..
@@ -24,4 +25,4 @@
0.6.2
-
\ No newline at end of file
+