test_that("tick", {
  do <- async(function() {
    deferred$new(
      function(resolve, progress) {
        for (i in 1:10) progress(list(tick = 1))
        progress(list(tick = 1))
        resolve("done")
      }
    )
  })
  expect_equal(synchronise(do()), "done")

  ticked <- 0
  do <- async(function() {
    deferred$new(
      function(resolve, progress) {
        for (i in 1:10) progress(list(tick = 1))
        resolve("done")
      },
      function(data) ticked <<- ticked + data$tick
    )
  })
  expect_equal(synchronise(do()), "done")
  expect_equal(ticked, 10)
})

test_that("total", {
  ticked <- 0
  totalx <- NULL
  do <- async(function() {
    deferred$new(
      function(resolve, progress) {
        progress(list(total = 10))
        for (i in 1:10) progress(list(tick = 1))
        resolve("done")
      },
      function(data) {
        if (!is.null(data$total)) totalx <<- data$total
        if (!is.null(data$tick)) ticked <<- ticked + data$tick
      }
    )
  })
  expect_equal(synchronise(do()), "done")
  expect_equal(ticked, 10)
  expect_equal(totalx, 10)
})

test_that("ratio", {
  ratiox <- 0
  do <- async(function() {
    deferred$new(
      function(resolve, progress) {
        for (i in 1:10) progress(list(ratio = i / 10))
        resolve("done")
      },
      function(data) ratiox <<- c(ratiox, data$ratio)
    )
  })
  expect_equal(synchronise(do()), "done")
  expect_equal(ratiox, (0:10) / 10)
})

test_that("amount", {
  amountx <- 0
  totalx <- 0
  do <- async(function() {
    deferred$new(
      function(resolve, progress) {
        progress(list(total = 100))
        for (i in 1:10) progress(list(amount = 10))
        resolve("done")
      },
      function(data) {
        if (!is.null(data$total)) totalx <<- data$total
        if (!is.null(data$amount)) amountx <<- amountx + data$amount
      }
    )
  })
  expect_equal(synchronise(do()), "done")
  expect_equal(totalx, 100)
  expect_equal(amountx, 100)
})
