tests/testthat/test-HandlerStack.R

fun1 <- function(...) {
    length(list(...))
}
fun2 <- function(...) {
    ..1
}

test_that("Handlers can be added and removed", {
    stack <- HandlerStack$new()
    fun1 <- function(...) {
        length(list(...))
    }
    fun2 <- function(...) {
        ..1
    }
    stack$add(fun1, 'a')
    stack$add(fun2, 'b')
    expect_equal(stack$length(), 2)
    expect_true(stack$contains('a'))
    expect_true(stack$contains('b'))
    expect_false(stack$contains('c'))
    expect_equal(stack$position('b'), 2)
    expect_equal(stack$position(c('a', 'c')), c(1, NA_integer_))

    fun1return <- stack$remove('a')
    expect_equal(stack$length(), 1)
    expect_false(stack$contains('a'))
    expect_true(stack$contains('b'))
    expect_equal(stack$position('b'), 1)
    expect_equal(stack$position(c('a', 'c')), c(NA_integer_, NA_integer_))
    expect_equal(fun1return, fun1)

    fun2return <- stack$remove('b')
    expect_equal(stack$length(), 0)
    expect_false(stack$contains('a'))
    expect_false(stack$contains('b'))
    expect_equal(stack$position('b'), NA_integer_)
    expect_equal(fun2return, fun2)
})

test_that('Inserting at position works', {
    stack <- HandlerStack$new()
    stack$add(length, 'length')
    stack$add(str, 'str')
    stack$add(sum, 'sum')

    stack$add(min, 'min', 1)
    expect_equal(stack$position('min'), 1)

    stack$add(max, 'max', 100)
    expect_equal(stack$position('max'), 5)

    stack$add(mean, 'mean', 3)
    expect_equal(stack$position('mean'), 3)
})

test_that('Assertions throw errors', {
    rs <- r_session()
    rs(stack <- fiery:::HandlerStack$new())
    expect_snapshot(rs(stack$add('string', 'id')), error = TRUE)
    expect_snapshot(rs(stack$add(c(min, max), 'id')), error = TRUE)
    expect_snapshot(rs(stack$add(min, 3)), error = TRUE)
    expect_snapshot(rs(stack$add(min, 3:5)), error = TRUE)
    expect_snapshot(rs(stack$add(min, 'min', 'position')), error = TRUE)
    expect_snapshot(rs(stack$add(min, 'min', 1:4)), error = TRUE)
    expect_snapshot(rs(stack$add(min, 'min', 1.5)), error = TRUE)
    expect_snapshot(rs(stack$remove(1)), error = TRUE)
    expect_snapshot(rs(stack$remove(c('1', '2'))), error = TRUE)
    expect_snapshot(rs(stack$position(1)), error = TRUE)
    expect_snapshot(rs(stack$contains(1)), error = TRUE)
})

test_that('Dispatch works', {
    stack <- HandlerStack$new(list(safe_call = function(x, ...) force(x)))
    args <- 1:10
    expect_type(stack$dispatch(args), 'list')
    expect_length(stack$dispatch(args), 0)
    expect_null(names(stack$dispatch(args)))

    stack$add(min, 'min')
    stack$add(mean, 'mean')
    stack$add(max, 'max')

    expect_type(stack$dispatch(args), 'list')
    expect_length(stack$dispatch(args), 3)
    expect_named(stack$dispatch(args), c('min', 'mean', 'max'))
    expect_equal(stack$dispatch(args), list(min = min(args), mean = mean(args), max = max(args)))
})

Try the fiery package in your browser

Any scripts or data that you put into this service are public.

fiery documentation built on Aug. 21, 2025, 5:44 p.m.