test_that("keeps event loop alive", {
counter <- 0L
do <- function() {
cb <- function() {
counter <<- counter + 1L
if (counter == 3L) t$cancel()
}
t <- async_timer$new(1/100, cb)
"done"
}
start <- Sys.time()
res <- run_event_loop(do())
end <- Sys.time()
expect_null(res)
expect_true(end - start >= as.difftime(3/100, units = "secs"))
expect_true(end - start <= as.difftime(2, units = "secs"))
})
test_that("errors", {
counter <- 0L
do <- function() {
cb <- function() {
counter <<- counter + 1L
if (counter == 2L) stop("foobar")
if (counter == 3L) t$cancel()
}
t <- async_timer$new(1/100, cb)
}
expect_error(run_event_loop(do()), "foobar")
expect_equal(counter, 2L)
counter <- 0L
error <- NULL
do <- function() {
cb <- function() {
counter <<- counter + 1L
if (counter == 2L) stop("foobar")
if (counter == 3L) t$cancel()
}
t <- async_timer$new(1/100, cb)
t$listen_on("error", function(err) error <<- err)
}
expect_silent(run_event_loop(do()))
expect_equal(counter, 3L)
expect_s3_class(error, "error")
expect_equal(conditionMessage(error), "foobar")
})
test_that("mixing deferred and timers", {
counter <- 0L
do <- function(s) {
counter <<- 0L
cb <- function() {
counter <<- counter + 1L
if (counter == 3L) t$cancel()
}
t <- async_timer$new(.6, cb)
delay(s)$then(function() "OK")
}
## Once we have the output, we quit
start <- Sys.time()
res <- synchronise(do(1))
end <- Sys.time()
expect_equal(res, "OK")
expect_true(end - start >= as.difftime(1, units = "secs"))
expect_true(end - start <= as.difftime(2, units = "secs"))
expect_equal(counter, 1L)
## Run the timer to the end
start <- Sys.time()
res <- synchronise(do(3))
end <- Sys.time()
expect_equal(res, "OK")
expect_true(end - start >= as.difftime(1/5, units = "secs"))
expect_true(end - start <= as.difftime(5, units = "secs"))
expect_equal(counter, 3L)
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.