/ tests / ttasks.nim
ttasks.nim
 1  import std/os
 2  
 3  import chronos
 4  import chronos/threadsync
 5  import chronos/unittest2/asynctests
 6  import taskpools
 7  
 8  import apatheia/tasks
 9  import apatheia/memretainers
10  
11  proc addNums(a, b: float): float {.asyncTask.} =
12    os.sleep(50)
13    return a + b
14  
15  proc addNumValues(vals: openArray[float]): float {.asyncTask.} =
16    os.sleep(100)
17    result = 0.0
18    for x in vals:
19      result += x
20  
21  proc strCompute(val: openArray[char]): int {.asyncTask.} =
22    ## note includes null terminator!
23    return val.len()
24  
25  
26  suite "async tests":
27    var tp = Taskpool.new(num_threads = 2) # Default to the number of hardware threads.
28    var jobsVar = newJobQueue[float](taskpool = tp)
29  
30    proc getJobs(): JobQueue[float] =
31      {.cast(gcsafe).}:
32        jobsVar
33  
34    asyncTest "test addNums":
35      let jobs = getJobs()
36      let res = await jobs.submit(addNums(1.0, 2.0,))
37      check res == 3.0
38  
39    asyncTest "test addNumValues":
40      let jobs = getJobs()
41      let args = @[1.0, 2.0, 3.0]
42      let res = await jobs.submit(addNumValues(args))
43      check res == 6.0
44  
45    asyncTest "test strCompute":
46      var jobs = newJobQueue[int](taskpool = tp)
47      let res = await jobs.submit(strCompute("hello world!"))
48      check res == 13 # note includes cstring null terminator
49  
50    asyncTest "testing openArrays":
51      var jobs = newJobQueue[float](taskpool = tp)
52      let fut1 = jobs.submit(addNumValues(@[1.0.float, 2.0]))
53      let fut2 = jobs.submit(addNumValues(@[3.0.float, 4.0]))
54      check retainedMemoryCount() == 2
55      let res1 = await fut1
56      let res2 = await fut2
57      check res1 == 3.0
58      check res2 == 7.0
59      check retainedMemoryCount() == 0