tests/testthat/test-when-any.R

test_that("when_any", {
  do <- async(function() {
    d1 <- delay(1/10)$then(function(value) "foo")
    d2 <- delay(1/10000)$then(function(value) "bar")

    when_any(d1, d2)$
      then(function(value) expect_equal(value, "bar"))
  })
  synchronise(do())
})

test_that("when_any, non-deferred", {
  do <- async(function() {
    d1 <- delay(1/100)$then(function(value) "foo")
    d2 <- "bar"

    when_any(d1, d2)$
      then(function(value) expect_equal(value, "bar"))$
      then(function(.) d1)$
      catch(error = identity)
  })
  synchronise(do())
})

test_that("when_any, non-deferred only", {
  do <- async(function() {
    d1 <- "foo"
    d2 <- "bar"

    dx <- when_any(d1, d2)$
      then(function(value) expect_true(value %in% c("foo", "bar")))
  })
  synchronise(do())
})

test_that("when_any, error first, success then", {
  do <- async(function() {
    d1 <- delay(1/10000)$then(function(value) stop("foo"))
    d2 <- delay(1/10)$then(function(value) "bar")

    dx <- when_any(d1, d2)$
      then(function(value) expect_equal(value, "bar"))
  })
  synchronise(do())
})

test_that("when_any, late error is ignored", {
  do <- async(function() {
    d1 <- delay(1/10)$then(function(value) stop("foo"))
    d2 <- delay(1/10000)$then(function(value) "bar")

    dx <- when_any(d1, d2)$
      catch(error = function(value) expect_equal(value, "bar"))
  })
  expect_silent(synchronise(do()))
})

test_that("when_any, multiple errors", {
  skip_on_cran()
  errors <- list()
  do <- async(function() {
    d1 <- delay(1/10  )$then(function(value) stop("foo"))
    d2 <- delay(1/100000)$then(function(value) stop("bar"))

    dx <- when_any(d1, d2)$
      catch(error = function(reason) {
        errors <<- reason$errors
      })
  })
  synchronise(do())
  expect_match(conditionMessage(errors[[1]]), "bar")
  expect_match(conditionMessage(errors[[2]]), "foo")
})
gaborcsardi/async documentation built on Nov. 20, 2024, 4:51 p.m.