blob: ba14b89ca8c0817416354c176d424ef8f5c71b4b [file] [log] [blame]
Roman Elizarov331750b2017-02-15 17:59:17 +03001/*
Roman Elizarov1f74a2d2018-06-29 19:19:45 +03002 * Copyright 2016-2018 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.*
Roman Elizarov9fe5f462018-02-21 19:05:52 +03009import org.junit.*
10import org.junit.Assert.*
Roman Elizarov331750b2017-02-15 17:59:17 +030011
12class ConvertTest : TestBase() {
Roman Elizarov331750b2017-02-15 17:59:17 +030013 @Test
Vsevolod Tolstopyatovbbaf99d2018-09-11 15:55:56 +030014 fun testToCompletableSuccess() = runBlocking {
Roman Elizarov331750b2017-02-15 17:59:17 +030015 expect(1)
Vsevolod Tolstopyatovbbaf99d2018-09-11 15:55:56 +030016 val job = launch {
Roman Elizarov331750b2017-02-15 17:59:17 +030017 expect(3)
18 }
Vsevolod Tolstopyatovd100a3f2019-07-16 16:14:35 +030019 val completable = job.asCompletable(coroutineContext.minusKey(Job))
Roman Elizarov331750b2017-02-15 17:59:17 +030020 completable.subscribe {
21 expect(4)
22 }
23 expect(2)
24 yield()
25 finish(5)
26 }
27
28 @Test
Vsevolod Tolstopyatovbbaf99d2018-09-11 15:55:56 +030029 fun testToCompletableFail() = runBlocking {
Roman Elizarov331750b2017-02-15 17:59:17 +030030 expect(1)
Vsevolod Tolstopyatovbbaf99d2018-09-11 15:55:56 +030031 val job = async(NonCancellable) { // don't kill parent on exception
Roman Elizarov331750b2017-02-15 17:59:17 +030032 expect(3)
33 throw RuntimeException("OK")
34 }
Vsevolod Tolstopyatovd100a3f2019-07-16 16:14:35 +030035 val completable = job.asCompletable(coroutineContext.minusKey(Job))
Roman Elizarov331750b2017-02-15 17:59:17 +030036 completable.subscribe {
37 expect(4)
38 }
39 expect(2)
40 yield()
41 finish(5)
42 }
43
44 @Test
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020045 fun testToMaybe() {
Roman Elizarovc32579e2018-09-09 19:21:43 +030046 val d = GlobalScope.async {
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020047 delay(50)
48 "OK"
49 }
Roman Elizarovdc29b072018-09-11 18:42:03 +030050 val maybe1 = d.asMaybe(Dispatchers.Unconfined)
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020051 checkMaybeValue(maybe1) {
52 assertEquals("OK", it)
53 }
Roman Elizarovdc29b072018-09-11 18:42:03 +030054 val maybe2 = d.asMaybe(Dispatchers.Unconfined)
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020055 checkMaybeValue(maybe2) {
56 assertEquals("OK", it)
57 }
58 }
59
60 @Test
61 fun testToMaybeEmpty() {
Roman Elizarovc32579e2018-09-09 19:21:43 +030062 val d = GlobalScope.async {
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020063 delay(50)
64 null
65 }
Roman Elizarovdc29b072018-09-11 18:42:03 +030066 val maybe1 = d.asMaybe(Dispatchers.Unconfined)
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020067 checkMaybeValue(maybe1, ::assertNull)
Roman Elizarovdc29b072018-09-11 18:42:03 +030068 val maybe2 = d.asMaybe(Dispatchers.Unconfined)
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020069 checkMaybeValue(maybe2, ::assertNull)
70 }
71
72 @Test
73 fun testToMaybeFail() {
Roman Elizarovc32579e2018-09-09 19:21:43 +030074 val d = GlobalScope.async {
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020075 delay(50)
Vsevolod Tolstopyatov0b886a32018-10-25 13:52:38 +030076 throw TestRuntimeException("OK")
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020077 }
Roman Elizarovdc29b072018-09-11 18:42:03 +030078 val maybe1 = d.asMaybe(Dispatchers.Unconfined)
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020079 checkErroneous(maybe1) {
Vsevolod Tolstopyatov0b886a32018-10-25 13:52:38 +030080 check(it is TestRuntimeException && it.message == "OK") { "$it" }
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020081 }
Roman Elizarovdc29b072018-09-11 18:42:03 +030082 val maybe2 = d.asMaybe(Dispatchers.Unconfined)
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020083 checkErroneous(maybe2) {
Vsevolod Tolstopyatov0b886a32018-10-25 13:52:38 +030084 check(it is TestRuntimeException && it.message == "OK") { "$it" }
Konrad Kamińskid6bb1482017-04-07 09:26:40 +020085 }
86 }
87
88 @Test
Roman Elizarov331750b2017-02-15 17:59:17 +030089 fun testToSingle() {
Roman Elizarovc32579e2018-09-09 19:21:43 +030090 val d = GlobalScope.async {
Roman Elizarov331750b2017-02-15 17:59:17 +030091 delay(50)
92 "OK"
93 }
Roman Elizarovdc29b072018-09-11 18:42:03 +030094 val single1 = d.asSingle(Dispatchers.Unconfined)
Roman Elizarov331750b2017-02-15 17:59:17 +030095 checkSingleValue(single1) {
96 assertEquals("OK", it)
97 }
Roman Elizarovdc29b072018-09-11 18:42:03 +030098 val single2 = d.asSingle(Dispatchers.Unconfined)
Roman Elizarov331750b2017-02-15 17:59:17 +030099 checkSingleValue(single2) {
100 assertEquals("OK", it)
101 }
102 }
103
104 @Test
105 fun testToSingleFail() {
Roman Elizarovc32579e2018-09-09 19:21:43 +0300106 val d = GlobalScope.async {
Roman Elizarov331750b2017-02-15 17:59:17 +0300107 delay(50)
Vsevolod Tolstopyatov0b886a32018-10-25 13:52:38 +0300108 throw TestRuntimeException("OK")
Roman Elizarov331750b2017-02-15 17:59:17 +0300109 }
Roman Elizarovdc29b072018-09-11 18:42:03 +0300110 val single1 = d.asSingle(Dispatchers.Unconfined)
Roman Elizarov331750b2017-02-15 17:59:17 +0300111 checkErroneous(single1) {
Vsevolod Tolstopyatov0b886a32018-10-25 13:52:38 +0300112 check(it is TestRuntimeException && it.message == "OK") { "$it" }
Roman Elizarov331750b2017-02-15 17:59:17 +0300113 }
Roman Elizarovdc29b072018-09-11 18:42:03 +0300114 val single2 = d.asSingle(Dispatchers.Unconfined)
Roman Elizarov331750b2017-02-15 17:59:17 +0300115 checkErroneous(single2) {
Vsevolod Tolstopyatov0b886a32018-10-25 13:52:38 +0300116 check(it is TestRuntimeException && it.message == "OK") { "$it" }
Roman Elizarov331750b2017-02-15 17:59:17 +0300117 }
118 }
119
120 @Test
121 fun testToObservable() {
Vsevolod Tolstopyatovbbaf99d2018-09-11 15:55:56 +0300122 val c = GlobalScope.produce {
Roman Elizarov331750b2017-02-15 17:59:17 +0300123 delay(50)
124 send("O")
125 delay(50)
126 send("K")
127 }
Roman Elizarovdc29b072018-09-11 18:42:03 +0300128 val observable = c.asObservable(Dispatchers.Unconfined)
Roman Elizarov331750b2017-02-15 17:59:17 +0300129 checkSingleValue(observable.reduce { t1, t2 -> t1 + t2 }.toSingle()) {
130 assertEquals("OK", it)
131 }
132 }
133
134 @Test
135 fun testToObservableFail() {
Vsevolod Tolstopyatovbbaf99d2018-09-11 15:55:56 +0300136 val c = GlobalScope.produce {
Roman Elizarov331750b2017-02-15 17:59:17 +0300137 delay(50)
138 send("O")
139 delay(50)
140 throw TestException("K")
141 }
Roman Elizarovdc29b072018-09-11 18:42:03 +0300142 val observable = c.asObservable(Dispatchers.Unconfined)
Vsevolod Tolstopyatovd100a3f2019-07-16 16:14:35 +0300143 val single = rxSingle(Dispatchers.Unconfined) {
Roman Elizarov331750b2017-02-15 17:59:17 +0300144 var result = ""
145 try {
Roman Elizarov7adb8762017-03-17 17:54:13 +0300146 observable.consumeEach { result += it }
Roman Elizarov331750b2017-02-15 17:59:17 +0300147 } catch(e: Throwable) {
148 check(e is TestException)
149 result += e.message
150 }
151 result
152 }
153 checkSingleValue(single) {
154 assertEquals("OK", it)
155 }
156 }
157}