1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
/*
* Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
*/
package kotlinx.coroutines.selects
import kotlinx.coroutines.*
import kotlin.coroutines.*
import kotlin.coroutines.intrinsics.*
import kotlin.test.*
class SelectBuilderImplTest : TestBase() {
@Test
fun testIdempotentSelectResumeInline() {
var resumed = false
val delegate = object : Continuation<String> {
override val context: CoroutineContext get() = EmptyCoroutineContext
override fun resumeWith(result: Result<String>) {
check(result.getOrNull() == "OK")
resumed = true
}
}
val c = SelectBuilderImpl(delegate)
// still running builder
check(!c.isSelected)
check(c.trySelect("SELECT"))
check(c.isSelected)
check(!c.trySelect("OTHER"))
check(c.trySelect("SELECT"))
c.completion.resume("OK")
check(!resumed) // still running builder, didn't invoke delegate
check(c.isSelected)
check(!c.trySelect("OTHER"))
check(c.trySelect("SELECT"))
check(c.getResult() === "OK") // then builder returns
}
@Test
fun testIdempotentSelectResumeSuspended() {
var resumed = false
val delegate = object : Continuation<String> {
override val context: CoroutineContext get() = EmptyCoroutineContext
override fun resumeWith(result: Result<String>) {
check(result.getOrNull() == "OK")
resumed = true
}
}
val c = SelectBuilderImpl(delegate)
check(c.getResult() === COROUTINE_SUSPENDED) // suspend first
check(!c.isSelected)
check(c.trySelect("SELECT"))
check(c.isSelected)
check(!c.trySelect("OTHER"))
check(c.trySelect("SELECT"))
check(!resumed)
c.completion.resume("OK")
check(resumed)
check(c.isSelected)
check(!c.trySelect("OTHER"))
check(c.trySelect("SELECT"))
}
@Test
fun testIdempotentSelectResumeWithExceptionInline() {
var resumed = false
val delegate = object : Continuation<String> {
override val context: CoroutineContext get() = EmptyCoroutineContext
override fun resumeWith(result: Result<String>) {
check(result.exceptionOrNull() is TestException)
resumed = true
}
}
val c = SelectBuilderImpl(delegate)
// still running builder
check(!c.isSelected)
check(c.trySelect("SELECT"))
check(c.isSelected)
check(!c.trySelect("OTHER"))
check(c.trySelect("SELECT"))
c.completion.resumeWithException(TestException())
check(!resumed) // still running builder, didn't invoke delegate
check(c.isSelected)
check(!c.trySelect("OTHER"))
check(c.trySelect("SELECT"))
try {
c.getResult() // the builder should throw exception
error("Failed")
} catch (e: Throwable) {
check(e is TestException)
}
}
@Test
fun testIdempotentSelectResumeWithExceptionSuspended() {
var resumed = false
val delegate = object : Continuation<String> {
override val context: CoroutineContext get() = EmptyCoroutineContext
override fun resumeWith(result: Result<String>) {
check(result.exceptionOrNull() is TestException)
resumed = true
}
}
val c = SelectBuilderImpl(delegate)
check(c.getResult() === COROUTINE_SUSPENDED) // suspend first
check(!c.isSelected)
check(c.trySelect("SELECT"))
check(c.isSelected)
check(!c.trySelect("OTHER"))
check(c.trySelect("SELECT"))
check(!resumed)
c.completion.resumeWithException(TestException())
check(resumed)
check(c.isSelected)
check(!c.trySelect("OTHER"))
check(c.trySelect("SELECT"))
}
}
|