blob: a43366555ec55b7dc1858e8bb6c9a70c04136739 [file] [log] [blame]
Roman Elizarov331750b2017-02-15 17:59:17 +03001/*
Vsevolod Tolstopyatov39f5cf82019-06-28 16:47:30 +03002 * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
Roman Elizarov331750b2017-02-15 17:59:17 +03003 */
4
Roman Elizarov0950dfa2018-07-13 10:33:25 +03005package kotlinx.coroutines.rx2
Roman Elizarov331750b2017-02-15 17:59:17 +03006
Roman Elizarov0950dfa2018-07-13 10:33:25 +03007import kotlinx.coroutines.*
8import kotlinx.coroutines.channels.*
Dmitry Khalanskiy387d1dd2020-02-10 18:42:28 +03009import org.junit.Assert
10import org.junit.Test
11import kotlin.test.*
Roman Elizarov331750b2017-02-15 17:59:17 +030012
13class ConvertTest : TestBase() {
Roman Elizarov331750b2017-02-15 17:59:17 +030014 @Test
Vsevolod Tolstopyatovbbaf99d2018-09-11 15:55:56 +030015 fun testToCompletableSuccess() = runBlocking {
Roman Elizarov331750b2017-02-15 17:59:17 +030016 expect(1)
Vsevolod Tolstopyatovbbaf99d2018-09-11 15:55:56 +030017 val job = launch {
Roman Elizarov331750b2017-02-15 17:59:17 +030018 expect(3)
19 }
Vsevolod Tolstopyatovd100a3f2019-07-16 16:14:35 +030020 val completable = job.asCompletable(coroutineContext.minusKey(Job))
Roman Elizarov331750b2017-02-15 17:59:17 +030021 completable.subscribe {
22 expect(4)
23 }
24 expect(2)
25 yield()
26 finish(5)
27 }
28
29 @Test
Vsevolod Tolstopyatovbbaf99d2018-09-11 15:55:56 +030030 fun testToCompletableFail() = runBlocking {
Roman Elizarov331750b2017-02-15 17:59:17 +030031 expect(1)
Vsevolod Tolstopyatovbbaf99d2018-09-11 15:55:56 +030032 val job = async(NonCancellable) { // don't kill parent on exception
Roman Elizarov331750b2017-02-15 17:59:17 +030033 expect(3)
34 throw RuntimeException("OK")
35 }
Vsevolod Tolstopyatovd100a3f2019-07-16 16:14:35 +030036 val completable = job.asCompletable(coroutineContext.minusKey(Job))
Roman Elizarov331750b2017-02-15 17:59:17 +030037 completable.subscribe {
38 expect(4)
39 }
40 expect(2)
41 yield()
42 finish(5)
43 }
44
45 @Test
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020046 fun testToMaybe() {
Roman Elizarovc32579e2018-09-09 19:21:43 +030047 val d = GlobalScope.async {
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020048 delay(50)
49 "OK"
50 }
Roman Elizarovdc29b072018-09-11 18:42:03 +030051 val maybe1 = d.asMaybe(Dispatchers.Unconfined)
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020052 checkMaybeValue(maybe1) {
53 assertEquals("OK", it)
54 }
Roman Elizarovdc29b072018-09-11 18:42:03 +030055 val maybe2 = d.asMaybe(Dispatchers.Unconfined)
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020056 checkMaybeValue(maybe2) {
57 assertEquals("OK", it)
58 }
59 }
60
61 @Test
62 fun testToMaybeEmpty() {
Roman Elizarovc32579e2018-09-09 19:21:43 +030063 val d = GlobalScope.async {
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020064 delay(50)
65 null
66 }
Roman Elizarovdc29b072018-09-11 18:42:03 +030067 val maybe1 = d.asMaybe(Dispatchers.Unconfined)
Dmitry Khalanskiy387d1dd2020-02-10 18:42:28 +030068 checkMaybeValue(maybe1, Assert::assertNull)
Roman Elizarovdc29b072018-09-11 18:42:03 +030069 val maybe2 = d.asMaybe(Dispatchers.Unconfined)
Dmitry Khalanskiy387d1dd2020-02-10 18:42:28 +030070 checkMaybeValue(maybe2, Assert::assertNull)
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020071 }
72
73 @Test
74 fun testToMaybeFail() {
Roman Elizarovc32579e2018-09-09 19:21:43 +030075 val d = GlobalScope.async {
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020076 delay(50)
Vsevolod Tolstopyatov0b886a32018-10-25 13:52:38 +030077 throw TestRuntimeException("OK")
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020078 }
Roman Elizarovdc29b072018-09-11 18:42:03 +030079 val maybe1 = d.asMaybe(Dispatchers.Unconfined)
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020080 checkErroneous(maybe1) {
Vsevolod Tolstopyatov0b886a32018-10-25 13:52:38 +030081 check(it is TestRuntimeException && it.message == "OK") { "$it" }
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020082 }
Roman Elizarovdc29b072018-09-11 18:42:03 +030083 val maybe2 = d.asMaybe(Dispatchers.Unconfined)
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020084 checkErroneous(maybe2) {
Vsevolod Tolstopyatov0b886a32018-10-25 13:52:38 +030085 check(it is TestRuntimeException && it.message == "OK") { "$it" }
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020086 }
87 }
88
89 @Test
Roman Elizarov331750b2017-02-15 17:59:17 +030090 fun testToSingle() {
Roman Elizarovc32579e2018-09-09 19:21:43 +030091 val d = GlobalScope.async {
Roman Elizarov331750b2017-02-15 17:59:17 +030092 delay(50)
93 "OK"
94 }
Roman Elizarovdc29b072018-09-11 18:42:03 +030095 val single1 = d.asSingle(Dispatchers.Unconfined)
Roman Elizarov331750b2017-02-15 17:59:17 +030096 checkSingleValue(single1) {
97 assertEquals("OK", it)
98 }
Roman Elizarovdc29b072018-09-11 18:42:03 +030099 val single2 = d.asSingle(Dispatchers.Unconfined)
Roman Elizarov331750b2017-02-15 17:59:17 +0300100 checkSingleValue(single2) {
101 assertEquals("OK", it)
102 }
103 }
104
105 @Test
106 fun testToSingleFail() {
Roman Elizarovc32579e2018-09-09 19:21:43 +0300107 val d = GlobalScope.async {
Roman Elizarov331750b2017-02-15 17:59:17 +0300108 delay(50)
Vsevolod Tolstopyatov0b886a32018-10-25 13:52:38 +0300109 throw TestRuntimeException("OK")
Roman Elizarov331750b2017-02-15 17:59:17 +0300110 }
Roman Elizarovdc29b072018-09-11 18:42:03 +0300111 val single1 = d.asSingle(Dispatchers.Unconfined)
Roman Elizarov331750b2017-02-15 17:59:17 +0300112 checkErroneous(single1) {
Vsevolod Tolstopyatov0b886a32018-10-25 13:52:38 +0300113 check(it is TestRuntimeException && it.message == "OK") { "$it" }
Roman Elizarov331750b2017-02-15 17:59:17 +0300114 }
Roman Elizarovdc29b072018-09-11 18:42:03 +0300115 val single2 = d.asSingle(Dispatchers.Unconfined)
Roman Elizarov331750b2017-02-15 17:59:17 +0300116 checkErroneous(single2) {
Vsevolod Tolstopyatov0b886a32018-10-25 13:52:38 +0300117 check(it is TestRuntimeException && it.message == "OK") { "$it" }
Roman Elizarov331750b2017-02-15 17:59:17 +0300118 }
119 }
120
121 @Test
122 fun testToObservable() {
Vsevolod Tolstopyatovbbaf99d2018-09-11 15:55:56 +0300123 val c = GlobalScope.produce {
Roman Elizarov331750b2017-02-15 17:59:17 +0300124 delay(50)
125 send("O")
126 delay(50)
127 send("K")
128 }
Roman Elizarovdc29b072018-09-11 18:42:03 +0300129 val observable = c.asObservable(Dispatchers.Unconfined)
Roman Elizarov331750b2017-02-15 17:59:17 +0300130 checkSingleValue(observable.reduce { t1, t2 -> t1 + t2 }.toSingle()) {
131 assertEquals("OK", it)
132 }
133 }
134
135 @Test
136 fun testToObservableFail() {
Vsevolod Tolstopyatovbbaf99d2018-09-11 15:55:56 +0300137 val c = GlobalScope.produce {
Roman Elizarov331750b2017-02-15 17:59:17 +0300138 delay(50)
139 send("O")
140 delay(50)
141 throw TestException("K")
142 }
Roman Elizarovdc29b072018-09-11 18:42:03 +0300143 val observable = c.asObservable(Dispatchers.Unconfined)
Vsevolod Tolstopyatovd100a3f2019-07-16 16:14:35 +0300144 val single = rxSingle(Dispatchers.Unconfined) {
Roman Elizarov331750b2017-02-15 17:59:17 +0300145 var result = ""
146 try {
Vsevolod Tolstopyatov97863c32019-07-17 17:02:14 +0300147 observable.collect { result += it }
Roman Elizarov331750b2017-02-15 17:59:17 +0300148 } catch(e: Throwable) {
149 check(e is TestException)
150 result += e.message
151 }
152 result
153 }
154 checkSingleValue(single) {
155 assertEquals("OK", it)
156 }
157 }
158}