blob: 4454190f8ff9badb673dff25b920d4409bc97692 [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 Elizarovdaae9a92018-02-23 21:24:30 +03007import io.reactivex.*
Roman Elizarov0950dfa2018-07-13 10:33:25 +03008import kotlinx.coroutines.*
Roman Elizarovdaae9a92018-02-23 21:24:30 +03009import org.junit.*
Dmitry Khalanskiy387d1dd2020-02-10 18:42:28 +030010import org.junit.Test
Roman Elizarovdaae9a92018-02-23 21:24:30 +030011import java.util.concurrent.*
Dmitry Khalanskiy387d1dd2020-02-10 18:42:28 +030012import kotlin.test.*
Roman Elizarov331750b2017-02-15 17:59:17 +030013
Vsevolod Tolstopyatov9a2eb382019-10-29 14:51:41 +030014class ObservableSingleTest : TestBase() {
Vsevolod Tolstopyatov1652bb92019-10-29 19:48:49 +030015 @Before
16 fun setup() {
17 ignoreLostThreads("RxComputationThreadPool-", "RxCachedWorkerPoolEvictor-", "RxSchedulerPurge-")
18 }
19
Roman Elizarov331750b2017-02-15 17:59:17 +030020 @Test
21 fun testSingleNoWait() {
Vsevolod Tolstopyatov835ed4d2019-09-19 17:29:04 +030022 val observable = rxObservable {
Roman Elizarov331750b2017-02-15 17:59:17 +030023 send("OK")
24 }
25
26 checkSingleValue(observable) {
27 assertEquals("OK", it)
28 }
29 }
30
31 @Test
32 fun testSingleAwait() = runBlocking {
33 assertEquals("OK", Observable.just("O").awaitSingle() + "K")
34 }
35
36 @Test
37 fun testSingleEmitAndAwait() {
Vsevolod Tolstopyatov835ed4d2019-09-19 17:29:04 +030038 val observable = rxObservable {
Roman Elizarov331750b2017-02-15 17:59:17 +030039 send(Observable.just("O").awaitSingle() + "K")
40 }
41
42 checkSingleValue(observable) {
43 assertEquals("OK", it)
44 }
45 }
46
47 @Test
48 fun testSingleWithDelay() {
Vsevolod Tolstopyatov835ed4d2019-09-19 17:29:04 +030049 val observable = rxObservable {
Roman Elizarov331750b2017-02-15 17:59:17 +030050 send(Observable.timer(50, TimeUnit.MILLISECONDS).map { "O" }.awaitSingle() + "K")
51 }
52
53 checkSingleValue(observable) {
54 assertEquals("OK", it)
55 }
56 }
57
58 @Test
59 fun testSingleException() {
Vsevolod Tolstopyatov835ed4d2019-09-19 17:29:04 +030060 val observable = rxObservable {
Roman Elizarov331750b2017-02-15 17:59:17 +030061 send(Observable.just("O", "K").awaitSingle() + "K")
62 }
63
64 checkErroneous(observable) {
Roman Elizarovdaae9a92018-02-23 21:24:30 +030065 assertTrue(it is IllegalArgumentException)
Roman Elizarov331750b2017-02-15 17:59:17 +030066 }
67 }
68
69 @Test
70 fun testAwaitFirst() {
Vsevolod Tolstopyatov835ed4d2019-09-19 17:29:04 +030071 val observable = rxObservable {
Roman Elizarov331750b2017-02-15 17:59:17 +030072 send(Observable.just("O", "#").awaitFirst() + "K")
73 }
74
75 checkSingleValue(observable) {
76 assertEquals("OK", it)
77 }
78 }
79
80 @Test
Roman Elizarov4a67afb2017-03-16 11:10:47 +030081 fun testAwaitFirstOrDefault() {
Vsevolod Tolstopyatov835ed4d2019-09-19 17:29:04 +030082 val observable = rxObservable {
Roman Elizarov4a67afb2017-03-16 11:10:47 +030083 send(Observable.empty<String>().awaitFirstOrDefault("O") + "K")
84 }
85
86 checkSingleValue(observable) {
87 assertEquals("OK", it)
88 }
89 }
90
91 @Test
92 fun testAwaitFirstOrDefaultWithValues() {
Vsevolod Tolstopyatov835ed4d2019-09-19 17:29:04 +030093 val observable = rxObservable {
Roman Elizarov4a67afb2017-03-16 11:10:47 +030094 send(Observable.just("O", "#").awaitFirstOrDefault("!") + "K")
95 }
96
97 checkSingleValue(observable) {
98 assertEquals("OK", it)
99 }
100 }
101
102 @Test
Konrad Kamińskib8ed47c2018-02-06 12:17:53 +0100103 fun testAwaitFirstOrNull() {
Vsevolod Tolstopyatov835ed4d2019-09-19 17:29:04 +0300104 val observable = rxObservable<String> {
Konrad Kamińskib8ed47c2018-02-06 12:17:53 +0100105 send(Observable.empty<String>().awaitFirstOrNull() ?: "OK")
106 }
107
108 checkSingleValue(observable) {
109 assertEquals("OK", it)
110 }
111 }
112
113 @Test
114 fun testAwaitFirstOrNullWithValues() {
Vsevolod Tolstopyatov835ed4d2019-09-19 17:29:04 +0300115 val observable = rxObservable {
Konrad Kamińskib8ed47c2018-02-06 12:17:53 +0100116 send((Observable.just("O", "#").awaitFirstOrNull() ?: "!") + "K")
117 }
118
119 checkSingleValue(observable) {
120 assertEquals("OK", it)
121 }
122 }
123
124 @Test
125 fun testAwaitFirstOrElse() {
Vsevolod Tolstopyatov835ed4d2019-09-19 17:29:04 +0300126 val observable = rxObservable {
Konrad Kamińskib8ed47c2018-02-06 12:17:53 +0100127 send(Observable.empty<String>().awaitFirstOrElse { "O" } + "K")
128 }
129
130 checkSingleValue(observable) {
131 assertEquals("OK", it)
132 }
133 }
134
135 @Test
136 fun testAwaitFirstOrElseWithValues() {
Vsevolod Tolstopyatov835ed4d2019-09-19 17:29:04 +0300137 val observable = rxObservable {
Konrad Kamińskib8ed47c2018-02-06 12:17:53 +0100138 send(Observable.just("O", "#").awaitFirstOrElse { "!" } + "K")
139 }
140
141 checkSingleValue(observable) {
142 assertEquals("OK", it)
143 }
144 }
145
146 @Test
Roman Elizarov331750b2017-02-15 17:59:17 +0300147 fun testAwaitLast() {
Vsevolod Tolstopyatov835ed4d2019-09-19 17:29:04 +0300148 val observable = rxObservable {
Roman Elizarov331750b2017-02-15 17:59:17 +0300149 send(Observable.just("#", "O").awaitLast() + "K")
150 }
151
152 checkSingleValue(observable) {
153 assertEquals("OK", it)
154 }
155 }
156
157 @Test
158 fun testExceptionFromObservable() {
Vsevolod Tolstopyatov835ed4d2019-09-19 17:29:04 +0300159 val observable = rxObservable {
Roman Elizarov331750b2017-02-15 17:59:17 +0300160 try {
161 send(Observable.error<String>(RuntimeException("O")).awaitFirst())
162 } catch (e: RuntimeException) {
163 send(Observable.just(e.message!!).awaitLast() + "K")
164 }
165 }
166
167 checkSingleValue(observable) {
168 assertEquals("OK", it)
169 }
170 }
171
172 @Test
173 fun testExceptionFromCoroutine() {
Vsevolod Tolstopyatov835ed4d2019-09-19 17:29:04 +0300174 val observable = rxObservable<String> {
Vsevolod Tolstopyatov1652bb92019-10-29 19:48:49 +0300175 throw IllegalStateException(Observable.just("O").awaitSingle() + "K")
Roman Elizarov331750b2017-02-15 17:59:17 +0300176 }
177
178 checkErroneous(observable) {
Roman Elizarovdaae9a92018-02-23 21:24:30 +0300179 assertTrue(it is IllegalStateException)
Roman Elizarov331750b2017-02-15 17:59:17 +0300180 assertEquals("OK", it.message)
181 }
182 }
183
184 @Test
185 fun testObservableIteration() {
Vsevolod Tolstopyatov835ed4d2019-09-19 17:29:04 +0300186 val observable = rxObservable {
Roman Elizarov331750b2017-02-15 17:59:17 +0300187 var result = ""
Vsevolod Tolstopyatov0685dc42019-04-24 12:16:56 +0300188 Observable.just("O", "K").collect { result += it }
Roman Elizarov331750b2017-02-15 17:59:17 +0300189 send(result)
190 }
191
192 checkSingleValue(observable) {
193 assertEquals("OK", it)
194 }
195 }
196
197 @Test
198 fun testObservableIterationFailure() {
Vsevolod Tolstopyatov835ed4d2019-09-19 17:29:04 +0300199 val observable = rxObservable {
Roman Elizarov331750b2017-02-15 17:59:17 +0300200 try {
Vsevolod Tolstopyatov0685dc42019-04-24 12:16:56 +0300201 Observable.error<String>(RuntimeException("OK")).collect { fail("Should not be here") }
Roman Elizarov331750b2017-02-15 17:59:17 +0300202 send("Fail")
203 } catch (e: RuntimeException) {
204 send(e.message!!)
205 }
206 }
207
208 checkSingleValue(observable) {
209 assertEquals("OK", it)
210 }
211 }
212}