59 lines
1.3 KiB
Nim
59 lines
1.3 KiB
Nim
discard """
|
|
file: "tawaitsemantics.nim"
|
|
exitcode: 0
|
|
output: '''
|
|
Error caught
|
|
Test infix
|
|
Test call
|
|
'''
|
|
"""
|
|
|
|
import asyncdispatch
|
|
|
|
# This tests the behaviour of 'await' under different circumstances.
|
|
# For example, when awaiting Future variable and this future has failed the
|
|
# exception shouldn't be raised as described here
|
|
# https://github.com/nim-lang/Nim/issues/4170
|
|
|
|
proc thrower(): Future[void] =
|
|
result = newFuture[void]()
|
|
result.fail(newException(Exception, "Test"))
|
|
|
|
proc dummy: Future[void] =
|
|
result = newFuture[void]()
|
|
result.complete()
|
|
|
|
proc testInfix() {.async.} =
|
|
# Test the infix operator semantics.
|
|
var fut = thrower()
|
|
var fut2 = dummy()
|
|
await fut or fut2 # Shouldn't raise.
|
|
# TODO: what about: await thrower() or fut2?
|
|
|
|
proc testCall() {.async.} =
|
|
await thrower()
|
|
|
|
proc tester() {.async.} =
|
|
# Test that we can handle exceptions without 'try'
|
|
var fut = thrower()
|
|
doAssert fut.finished
|
|
doAssert fut.failed
|
|
doAssert fut.error.msg == "Test"
|
|
await fut # We are awaiting a 'Future', so no `read` occurs.
|
|
doAssert fut.finished
|
|
doAssert fut.failed
|
|
doAssert fut.error.msg == "Test"
|
|
echo("Error caught")
|
|
|
|
fut = testInfix()
|
|
await fut
|
|
doAssert fut.finished
|
|
doAssert(not fut.failed)
|
|
echo("Test infix")
|
|
|
|
fut = testCall()
|
|
await fut
|
|
doAssert fut.failed
|
|
echo("Test call")
|
|
|
|
waitFor(tester())
|