lean4-htt/tests/lean/run/async_surface_sleep.lean
Henrik Böving e6a643770f
feat: implement basic async IO with timers (#6505)
This PR implements a basic async framework as well as asynchronously
running timers using libuv.

---------

Co-authored-by: Sofia Rodrigues <sofia@algebraic.dev>
Co-authored-by: Markus Himmel <markus@himmel-villmar.de>
Co-authored-by: Markus Himmel <markus@lean-fro.org>
2025-01-13 18:11:04 +00:00

99 lines
2.2 KiB
Text

import Std.Internal.Async.Timer
/-
these tests are just some preliminary ones as `async_sleep.lean` already contains extensive tests
for the entire timer state machine and `Async.Timer` is merely a light wrapper around it.
-/
open Std.Internal.IO.Async
def BASE_DURATION : Std.Time.Millisecond.Offset := 10
namespace SleepTest
def oneSleep : IO Unit := do
let task ← go
assert! (← task.block) == 37
where
go : IO (AsyncTask Nat) := do
let sleep ← Sleep.mk BASE_DURATION
(← sleep.wait).mapIO fun _ =>
return 37
def doubleSleep : IO Unit := do
let task ← go
assert! (← task.block) == 37
where
go : IO (AsyncTask Nat) := do
let sleep ← Sleep.mk BASE_DURATION
(← sleep.wait).bindIO fun _ => do
(← sleep.wait).mapIO fun _ =>
return 37
def resetSleep : IO Unit := do
let task ← go
assert! (← task.block) == 37
where
go : IO (AsyncTask Nat) := do
let sleep ← Sleep.mk BASE_DURATION
let waiter ← sleep.wait
sleep.reset
waiter.mapIO fun _ =>
return 37
def simpleSleep : IO Unit := do
let task ← go
assert! (← task.block) == 37
where
go : IO (AsyncTask Nat) := do
(← sleep BASE_DURATION).mapIO fun _ =>
return 37
#eval oneSleep
#eval doubleSleep
#eval resetSleep
#eval simpleSleep
end SleepTest
namespace IntervalTest
def oneSleep : IO Unit := do
let task ← go
assert! (← task.block) == 37
where
go : IO (AsyncTask Nat) := do
let interval ← Interval.mk BASE_DURATION
(← interval.tick).mapIO fun _ => do
interval.stop
return 37
def doubleSleep : IO Unit := do
let task ← go
assert! (← task.block) == 37
where
go : IO (AsyncTask Nat) := do
let interval ← Interval.mk BASE_DURATION
(← interval.tick).bindIO fun _ => do
(← interval.tick).mapIO fun _ => do
interval.stop
return 37
def resetSleep : IO Unit := do
let task ← go
assert! (← task.block) == 37
where
go : IO (AsyncTask Nat) := do
let interval ← Interval.mk BASE_DURATION
(← interval.tick).bindIO fun _ => do
let waiter ← interval.tick
interval.reset
waiter.mapIO fun _ => do
interval.stop
return 37
#eval oneSleep
#eval doubleSleep
#eval resetSleep
end IntervalTest