117 lines
3.0 KiB
Kotlin
117 lines
3.0 KiB
Kotlin
import kotlinx.coroutines.test.runTest
|
|
import net.sergeych.lyng.eval
|
|
import kotlin.test.Test
|
|
|
|
class TestCoroutines {
|
|
|
|
@Test
|
|
fun testLaunch() = runTest {
|
|
eval(
|
|
"""
|
|
var passed = false
|
|
val x = launch {
|
|
delay(10)
|
|
passed = true
|
|
"ok"
|
|
}
|
|
assert(!passed)
|
|
assertEquals( x.await(), "ok")
|
|
assert(passed)
|
|
assert(x.isCompleted)
|
|
""".trimIndent()
|
|
)
|
|
}
|
|
|
|
@Test
|
|
fun testCompletableDeferred() = runTest {
|
|
eval(
|
|
"""
|
|
val done = CompletableDeferred()
|
|
|
|
launch {
|
|
delay(10)
|
|
done.complete("ok")
|
|
}
|
|
|
|
assert(!done.isCompleted)
|
|
assert(done.isActive)
|
|
assertEquals( done.await(), "ok")
|
|
assert(done.isCompleted)
|
|
""".trimIndent()
|
|
)
|
|
}
|
|
|
|
@Test
|
|
fun testMutex() = runTest {
|
|
eval(
|
|
"""
|
|
var counter = 0
|
|
val mutex = Mutex()
|
|
|
|
(1..4).map {
|
|
launch {
|
|
// mutex.withLock {
|
|
val c = counter
|
|
delay(5)
|
|
counter = c + 1
|
|
// }
|
|
}
|
|
}.forEach { it.await() }
|
|
println(counter)
|
|
assert( counter < 10 )
|
|
|
|
""".trimIndent()
|
|
)
|
|
}
|
|
|
|
@Test
|
|
fun testFlows() = runTest {
|
|
eval("""
|
|
val f = flow {
|
|
println("Starting generator")
|
|
var n1 = 0
|
|
var n2 = 1
|
|
emit(n1)
|
|
emit(n2)
|
|
while(true) {
|
|
val n = n1 + n2
|
|
emit(n)
|
|
n1 = n2
|
|
n2 = n
|
|
}
|
|
}
|
|
val correctFibs = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
|
|
assertEquals( correctFibs, f.take(correctFibs.size))
|
|
|
|
""".trimIndent())
|
|
}
|
|
|
|
@Test
|
|
fun testFlow2() = runTest {
|
|
eval("""
|
|
val f = flow {
|
|
println("Starting generator")
|
|
emit("start")
|
|
emit("start2")
|
|
println("Emitting")
|
|
(1..4).forEach {
|
|
// println("you hoo "+it)
|
|
emit(it)
|
|
}
|
|
println("Done emitting")
|
|
}
|
|
// let's collect flow:
|
|
val result = []
|
|
// for( x in f ) result += x
|
|
println(result)
|
|
|
|
// let's collect it once again:
|
|
println(f.toList())
|
|
println(f.toList())
|
|
// for( x in f ) println(x)
|
|
// for( x in f ) println(x)
|
|
|
|
//assertEquals( result, f.toList() )
|
|
""".trimIndent())
|
|
}
|
|
} |