tests/testthat/test-allow-custom-functions.R

library(dplyr)

my_pop <- declare_model(N = 100)

# case 1

test_that("a bare function can be used in a design", {
  my_simple_func <- function(data) {
    data$my_var <- 5
    data
  }

  des <- my_pop + my_simple_func
  dat <- draw_data(des)

  expect_equal(names(dat), c("ID", "my_var"))
})


# case 2

test_that("a dplyr pipeline can be used in a design", {

  # include without parens
  des <- my_pop + . %>% mutate(my_var = 5)
  dat <- draw_data(des)

  expect_equal(names(dat), c("ID", "my_var"))

  # include with parens
  des <- my_pop + (. %>% mutate(my_var = 5))
  dat <- draw_data(des)

  expect_equal(names(dat), c("ID", "my_var"))
})

# Use dyplr functions as handlers ?

test_that("dplyr::mutate can be handlers", {

  design2 <- declare_model(N = 5, X = rnorm(N)) + declare_step(Y = 4, handler = mutate)

  df <- draw_data(design2)

  expect_equal(df$Y, rep(4,5))
})

test_that("dplyr filter can be handlers", {
  
  design2 <- declare_model(N = 5, X = rnorm(N)) + declare_step(ID > 3, handler = filter)
  
  df <- draw_data(design2)
  
  expect_equal(df$ID, as.character(4:5))
 expect_true(DeclareDesign:::is_implicit_data_arg(environment(design2[[2]])$dots))
})

test_that("dplyr filter can be handlers with explicit .data", {
  
  design2 <- declare_model(N = 5, X = rnorm(N)) + declare_step(.data=data, ID > 3, handler = filter)
  
  df <- draw_data(design2)
  
  expect_equal(df$ID, as.character(4:5))
 expect_false(DeclareDesign:::is_implicit_data_arg(environment(design2[[2]])$dots))
})
graemeblair/DeclareDesign documentation built on April 13, 2024, 4:30 p.m.