Removed test code from coro.nim and created three real tests for coroutines
This commit is contained in:
parent
f80ddbbcc6
commit
5aef77a3d3
8 changed files with 71 additions and 92 deletions
|
|
@ -294,95 +294,3 @@ proc wait*(c: proc(), interval=0.01) =
|
||||||
## Returns only after coroutine ``c`` has returned. ``interval`` is time in seconds how often.
|
## Returns only after coroutine ``c`` has returned. ``interval`` is time in seconds how often.
|
||||||
while alive(c):
|
while alive(c):
|
||||||
suspend(interval)
|
suspend(interval)
|
||||||
|
|
||||||
when isMainModule:
|
|
||||||
var
|
|
||||||
stackCheckValue = 1100220033
|
|
||||||
first: float64 = 0
|
|
||||||
second: float64 = 1
|
|
||||||
steps = 10
|
|
||||||
i: int
|
|
||||||
order = newSeq[int](10)
|
|
||||||
|
|
||||||
proc testFibonacci(id: int, sleep: float32) =
|
|
||||||
var sleepTime: float
|
|
||||||
while steps > 0:
|
|
||||||
echo id, " executing, slept for ", sleepTime
|
|
||||||
order[i] = id
|
|
||||||
i += 1
|
|
||||||
steps -= 1
|
|
||||||
swap first, second
|
|
||||||
second += first
|
|
||||||
var sleepStart = getTicks()
|
|
||||||
suspend(sleep)
|
|
||||||
sleepTime = float(getTicks() - sleepStart) / 1_000_000_000
|
|
||||||
|
|
||||||
start(proc() = testFibonacci(1, 0.01))
|
|
||||||
start(proc() = testFibonacci(2, 0.021))
|
|
||||||
run()
|
|
||||||
doAssert stackCheckValue == 1100220033
|
|
||||||
doAssert first == 55.0
|
|
||||||
doAssert order == @[1, 2, 1, 1, 2, 1, 1, 2, 1, 1]
|
|
||||||
|
|
||||||
order = newSeq[int](10)
|
|
||||||
i = 0
|
|
||||||
|
|
||||||
proc testExceptions(id: int, sleep: float) =
|
|
||||||
try:
|
|
||||||
order[i] = id; i += 1
|
|
||||||
suspend(sleep)
|
|
||||||
order[i] = id; i += 1
|
|
||||||
raise (ref ValueError)()
|
|
||||||
except:
|
|
||||||
order[i] = id; i += 1
|
|
||||||
suspend(sleep)
|
|
||||||
order[i] = id; i += 1
|
|
||||||
suspend(sleep)
|
|
||||||
order[i] = id; i += 1
|
|
||||||
|
|
||||||
start(proc() = testExceptions(1, 0.01))
|
|
||||||
start(proc() = testExceptions(2, 0.021))
|
|
||||||
run()
|
|
||||||
doAssert order == @[1, 2, 1, 1, 1, 2, 2, 1, 2, 2]
|
|
||||||
doAssert stackCheckValue == 1100220033
|
|
||||||
|
|
||||||
order = newSeq[int](10)
|
|
||||||
i = 0
|
|
||||||
|
|
||||||
iterator suspendingIterator(sleep: float): int =
|
|
||||||
for i in 0..4:
|
|
||||||
yield i
|
|
||||||
suspend(sleep)
|
|
||||||
|
|
||||||
proc terstIterators(id: int, sleep: float) =
|
|
||||||
for n in suspendingIterator(sleep):
|
|
||||||
order[i] = n
|
|
||||||
i += 1
|
|
||||||
|
|
||||||
start(proc() = terstIterators(1, 0.01))
|
|
||||||
start(proc() = terstIterators(2, 0.021))
|
|
||||||
run()
|
|
||||||
doAssert order == @[0, 0, 1, 2, 1, 3, 4, 2, 3, 4]
|
|
||||||
doAssert stackCheckValue == 1100220033
|
|
||||||
|
|
||||||
type Foo = ref object
|
|
||||||
number: int
|
|
||||||
|
|
||||||
GC_fullCollect()
|
|
||||||
var occupiedMemory = getOccupiedMem()
|
|
||||||
|
|
||||||
i = 0
|
|
||||||
var objects = newSeq[Foo](100)
|
|
||||||
proc terstGc(id: int, sleep: float) =
|
|
||||||
for n in 0..<50:
|
|
||||||
objects[i] = Foo(number: n)
|
|
||||||
i += 1
|
|
||||||
|
|
||||||
start(proc() = terstIterators(1, 0.01))
|
|
||||||
start(proc() = terstIterators(2, 0.021))
|
|
||||||
run()
|
|
||||||
|
|
||||||
doAssert occupiedMemory < getOccupiedMem()
|
|
||||||
objects = nil
|
|
||||||
GC_fullCollect()
|
|
||||||
doAssert occupiedMemory >= getOccupiedMem()
|
|
||||||
|
|
|
||||||
|
|
@ -2471,12 +2471,15 @@ template coroutinesSupportedPlatform(): bool =
|
||||||
true
|
true
|
||||||
|
|
||||||
when defined(nimCoroutines):
|
when defined(nimCoroutines):
|
||||||
|
# Explicit opt-in.
|
||||||
when not coroutinesSupportedPlatform():
|
when not coroutinesSupportedPlatform():
|
||||||
{.error: "Coroutines are not supported on this architecture and/or garbage collector.".}
|
{.error: "Coroutines are not supported on this architecture and/or garbage collector.".}
|
||||||
const nimCoroutines* = true
|
const nimCoroutines* = true
|
||||||
elif defined(noNimCoroutines):
|
elif defined(noNimCoroutines):
|
||||||
|
# Explicit opt-out.
|
||||||
const nimCoroutines* = false
|
const nimCoroutines* = false
|
||||||
else:
|
else:
|
||||||
|
# Autodetect coroutine support.
|
||||||
const nimCoroutines* = false
|
const nimCoroutines* = false
|
||||||
|
|
||||||
{.push checks: off.}
|
{.push checks: off.}
|
||||||
|
|
|
||||||
24
tests/coroutines/texceptions.nim
Normal file
24
tests/coroutines/texceptions.nim
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
import coro
|
||||||
|
var
|
||||||
|
stackCheckValue = 1100220033
|
||||||
|
numbers = newSeq[int](10)
|
||||||
|
i = 0
|
||||||
|
|
||||||
|
proc testExceptions(id: int, sleep: float) =
|
||||||
|
try:
|
||||||
|
numbers[i] = id; inc(i)
|
||||||
|
suspend(sleep)
|
||||||
|
numbers[i] = id; inc(i)
|
||||||
|
raise (ref ValueError)()
|
||||||
|
except:
|
||||||
|
numbers[i] = id; inc(i)
|
||||||
|
suspend(sleep)
|
||||||
|
numbers[i] = id; inc(i)
|
||||||
|
suspend(sleep)
|
||||||
|
numbers[i] = id; inc(i)
|
||||||
|
|
||||||
|
start(proc() = testExceptions(1, 0.01))
|
||||||
|
start(proc() = testExceptions(2, 0.011))
|
||||||
|
run()
|
||||||
|
doAssert(stackCheckValue == 1100220033, "Thread stack got corrupted")
|
||||||
|
doAssert(numbers == @[1, 2, 1, 2, 1, 2, 1, 2, 1, 2], "Coroutines executed in incorrect order")
|
||||||
1
tests/coroutines/texceptions.nim.cfg
Normal file
1
tests/coroutines/texceptions.nim.cfg
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
-d:nimCoroutines
|
||||||
15
tests/coroutines/tgc.nim
Normal file
15
tests/coroutines/tgc.nim
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
import coro
|
||||||
|
|
||||||
|
var maxOccupiedMemory = 0
|
||||||
|
|
||||||
|
proc testGC() =
|
||||||
|
var numbers = newSeq[int](100)
|
||||||
|
maxOccupiedMemory = max(maxOccupiedMemory, getOccupiedMem())
|
||||||
|
suspend(0)
|
||||||
|
|
||||||
|
start(testGC)
|
||||||
|
start(testGC)
|
||||||
|
run()
|
||||||
|
|
||||||
|
GC_fullCollect()
|
||||||
|
doAssert(getOccupiedMem() < maxOccupiedMemory, "GC did not free any memory allocated in coroutines")
|
||||||
1
tests/coroutines/tgc.nim.cfg
Normal file
1
tests/coroutines/tgc.nim.cfg
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
-d:nimCoroutines
|
||||||
26
tests/coroutines/titerators.nim
Normal file
26
tests/coroutines/titerators.nim
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
import coro
|
||||||
|
include system/timers
|
||||||
|
|
||||||
|
var
|
||||||
|
stackCheckValue = 1100220033
|
||||||
|
numbers = newSeq[int](10)
|
||||||
|
i = 0
|
||||||
|
|
||||||
|
iterator theIterator(id: int, sleep: float): int =
|
||||||
|
for i in 0..<5:
|
||||||
|
yield 10 * id + i
|
||||||
|
suspend(sleep)
|
||||||
|
|
||||||
|
proc theCoroutine(id: int, sleep: float32) =
|
||||||
|
for n in theIterator(id, sleep):
|
||||||
|
numbers[i] = n
|
||||||
|
inc(i)
|
||||||
|
|
||||||
|
var start = getTicks()
|
||||||
|
start(proc() = theCoroutine(1, 0.01))
|
||||||
|
start(proc() = theCoroutine(2, 0.011))
|
||||||
|
run()
|
||||||
|
var executionTime = getTicks() - start
|
||||||
|
doAssert(executionTime >= 55_000_000.Nanos and executionTime < 56_000_000.Nanos, "Coroutines executed too short")
|
||||||
|
doAssert(stackCheckValue == 1100220033, "Thread stack got corrupted")
|
||||||
|
doAssert(numbers == @[10, 20, 11, 21, 12, 22, 13, 23, 14, 24], "Coroutines executed in incorrect order")
|
||||||
1
tests/coroutines/titerators.nim.cfg
Normal file
1
tests/coroutines/titerators.nim.cfg
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
-d:nimCoroutines
|
||||||
Loading…
Add table
Add a link
Reference in a new issue