Removed test code from coro.nim and created three real tests for coroutines

This commit is contained in:
Rokas Kupstys
2017-02-20 17:03:39 +02:00
parent f80ddbbcc6
commit 5aef77a3d3
8 changed files with 71 additions and 92 deletions

View File

@@ -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.
while alive(c):
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()

View File

@@ -2471,12 +2471,15 @@ template coroutinesSupportedPlatform(): bool =
true
when defined(nimCoroutines):
# Explicit opt-in.
when not coroutinesSupportedPlatform():
{.error: "Coroutines are not supported on this architecture and/or garbage collector.".}
const nimCoroutines* = true
elif defined(noNimCoroutines):
# Explicit opt-out.
const nimCoroutines* = false
else:
# Autodetect coroutine support.
const nimCoroutines* = false
{.push checks: off.}

View 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")

View File

@@ -0,0 +1 @@
-d:nimCoroutines

15
tests/coroutines/tgc.nim Normal file
View 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")

View File

@@ -0,0 +1 @@
-d:nimCoroutines

View 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")

View File

@@ -0,0 +1 @@
-d:nimCoroutines