@@ -37,7 +37,7 @@ suite "Asynchronous sync primitives test suite":
3737 discard testLock (9 , lock)
3838 lock.release ()
3939 # # There must be exactly 20 poll() calls
40- for i in 0 ..< 20 :
40+ for i in 0 ..< 20 :
4141 poll ()
4242 result = testLockResult
4343
@@ -344,13 +344,97 @@ suite "Asynchronous sync primitives test suite":
344344 var queue1 = newAsyncPriorityQueue [int ](10 )
345345 var queue2 = newAsyncPriorityQueue [int ](1 )
346346
347- var fut1 = task2 (queue1)
347+ discard task2 (queue1)
348348 let r1 = waitFor task1 (queue1)
349- var fut2 = task2 (queue2)
349+ discard task2 (queue2)
350350 let r2 = waitFor task1 (queue2)
351351
352352 return r1 == " 0123456789" and r2 == " 6593482107"
353353
354+ proc testAsyncSemaphoreBehavior (): bool =
355+ var res = " "
356+
357+ proc testSemaphore (n: int , sem: AsyncSemaphore ) {.async .} =
358+ await sem.acquire ()
359+ res = res & $ n
360+ sem.release ()
361+
362+ proc test (): Future [string ] {.async .} =
363+ var sem = newAsyncSemaphore ()
364+ await sem.acquire ()
365+ discard testSemaphore (0 , sem)
366+ discard testSemaphore (1 , sem)
367+ discard testSemaphore (2 , sem)
368+ discard testSemaphore (3 , sem)
369+ discard testSemaphore (4 , sem)
370+ discard testSemaphore (5 , sem)
371+ discard testSemaphore (6 , sem)
372+ discard testSemaphore (7 , sem)
373+ discard testSemaphore (8 , sem)
374+ discard testSemaphore (9 , sem)
375+ sem.release ()
376+ for i in 0 ..< 20 :
377+ poll ()
378+ return res
379+
380+ return waitFor (test ()) == " 0123456789"
381+
382+ proc testAsyncSemaphoreDoubleRelease (): bool =
383+ var res = " "
384+
385+ proc testSemaphore (n: int , sem: AsyncSemaphore ) {.async .} =
386+ await sem.acquire ()
387+ res = res & $ n
388+ sem.release ()
389+
390+ proc test (): Future [bool ] {.async .} =
391+ var sem = newAsyncSemaphore ()
392+ await sem.acquire ()
393+ var fut1 = testSemaphore (0 , sem)
394+ sem.release ()
395+ await sem.acquire ()
396+ await sleepAsync (50 .milliseconds)
397+ if fut1.finished () == true :
398+ return false
399+ sem.release ()
400+ await sleepAsync (50 .milliseconds)
401+ if fut1.finished () == false :
402+ return false
403+ return res == " 0"
404+
405+ return waitFor (test ())
406+
407+ proc testAsyncSemaphoreCounter (): bool =
408+ var res = " "
409+
410+ proc testSemaphore (n: int , sem: AsyncSemaphore ) {.async .} =
411+ await sem.acquire ()
412+ res = res & $ n
413+
414+ proc test (): Future [bool ] {.async .} =
415+ var sem = newAsyncSemaphore (3 )
416+ discard testSemaphore (0 , sem)
417+ discard testSemaphore (1 , sem)
418+ discard testSemaphore (2 , sem)
419+ discard testSemaphore (3 , sem)
420+ discard testSemaphore (4 , sem)
421+ discard testSemaphore (5 , sem)
422+ await sleepAsync (50 .milliseconds)
423+ if res != " 012" :
424+ return false
425+ sem.release ()
426+ await sleepAsync (50 .milliseconds)
427+ if res != " 0123" :
428+ return false
429+ sem.release ()
430+ sem.release ()
431+ await sleepAsync (50 .milliseconds)
432+ if res != " 012345" :
433+ return false
434+ return true
435+
436+ return waitFor (test ())
437+
354438 test " AsyncLock() behavior test" :
355439 check:
356440 test1 () == " 0123456789"
@@ -392,3 +476,9 @@ suite "Asynchronous sync primitives test suite":
392476 check testPriorityBehavior () == 3000
393477 test " AsyncPriorityQueue() priority test" :
394478 check testPriorityQueue () == true
479+ test " AsyncSemaphore() behavior test" :
480+ check testAsyncSemaphoreBehavior () == true
481+ test " AsyncSemaphore() double release test" :
482+ check testAsyncSemaphoreDoubleRelease () == true
483+ test " AsyncSemaphore() counter test" :
484+ check testAsyncSemaphoreCounter () == true
0 commit comments