Add completeExceptionally, cancelAndJoin, and refine LaunchPool spec

- CompletableDeferred.completeExceptionally(exception): fails the deferred
  with a Lyng exception; the original exception object is preserved as
  errorObject so assertThrows/catch see the correct class (works for both
  built-in ObjException and user-declared class instances)
- LaunchPool: add maxQueueSize parameter (suspends launch when full),
  add cancelAndJoin() for graceful shutdown that waits for running tasks,
  clarify all semantics in the extern declaration comments
- Two tests for completeExceptionally (built-in and user-defined exception)
- Fix parallelism.md channel doc-test to be illustration-only (avoid
  flakiness from coroutine scheduling in the doc-test runner)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sergeychandClaude Sonnet 4.6 committed 2026-04-18 03:00:40 +03:00
1 parent f9a07f176a
commit 145c3ae34a
4 files changed
+116 -20

No files matched your search

@@ -58,6 +58,38 @@ class TestCoroutines {
)
}
@Test
fun testCompletableExceptionally() = runTest {
eval(
"""
val done = CompletableDeferred()
launch {
delay(10)
done.completeExceptionally(IllegalStateException("boom"))
}
assert(!done.isCompleted)
assertThrows(IllegalStateException) { done.await() }
assert(done.isCompleted)
""".trimIndent()
)
}
@Test
fun testCompletableExceptionallyWithCustomException() = runTest {
eval(
"""
class MyError(msg) : Exception(msg) {}
val done = CompletableDeferred()
done.completeExceptionally(MyError("custom failure"))
assertThrows(MyError) { done.await() }
""".trimIndent()
)
}
@Test
fun testDeferredCancel() = runTest {
eval(