tests/testthat/test-replicates.R

default_reps <- replicates()

test_reps <- replicates(
  start_data_replicates = 1, 
  model_sample_replicates = 2, 
  end_to_end_replicates = 3
)

# Constructor tests ----------------------------------------------------------

test_that("default replicates object behavior", {
  
  # expect correct class definition 
  expect_s3_class(default_reps, "replicates") 
  
  # expect correct default values
  expect_equal(default_reps[["start_data_replicates"]], 1)
  expect_equal(default_reps[["model_sample_replicates"]], 1)
  expect_equal(default_reps[["end_to_end_replicates"]], 1)
  expect_equal(default_reps[["total_replicates"]], 1)
  
})

test_that("replicate total accounting", {
  
  # expect total replicates calculates product correctly
  expect_equal(test_reps[["total_replicates"]], 6)
  
})

test_that("replicates input type checking", {
  
  # expect error for incorrect types
  expect_error(
    replicates(start_data_replicates = FALSE), 
    regexp = "Argument `start_data_replicates` is not numeric.",
    fixed = TRUE
  )
  expect_error(
    replicates(start_data_replicates = 1.5), 
    regexp = "Argument `start_data_replicates` must be integer-valued.",
    fixed = TRUE
  )
  expect_error(
    replicates(start_data_replicates = -1), 
    regexp = "Argument `start_data_replicates` must be >= 1.",
    fixed = TRUE
  )
  expect_error(
    replicates(start_data_replicates = c(1, 2, 3)), 
    regexp = "Argument `start_data_replicates` must be length 1.",
    fixed = TRUE
  )
  
  expect_error(
    replicates(model_sample_replicates = FALSE), 
    regexp = "Argument `model_sample_replicates` is not numeric.",
    fixed = TRUE
  )
  expect_error(
    replicates(model_sample_replicates = 1.5), 
    regexp = "Argument `model_sample_replicates` must be integer-valued.",
    fixed = TRUE
  )
  expect_error(
    replicates(model_sample_replicates = -1), 
    regexp = "Argument `model_sample_replicates` must be >= 1.",
    fixed = TRUE
  )
  expect_error(
    replicates(model_sample_replicates = c(1, 2, 3)), 
    regexp = "Argument `model_sample_replicates` must be length 1.",
    fixed = TRUE
  )
  
})

test_that("replicates print function", {
  
  print_output <- utils::capture.output(print(test_reps))
  
  expect_identical(
    print_output, 
    c("Replicates", 
      "", 
      "Start Data Replicates:  1 ", 
      "Model Sample Replicates:  2 ", 
      "End-to-End Replicates:  3 ",
      "",
      "Total Replicates:  6 ")
  )
  
})

# Tidy API tests ------------------------------------------------------------

test_that("add_replicates functionality", {
  
  old_roadmap <- roadmap(conf_data = acs_conf, start_data = acs_start)
  new_roadmap <- old_roadmap |> add_replicates(test_reps)
  
  # expect new object is roadmap
  expect_s3_class(new_roadmap, "roadmap")
  
  # expect new_roadmap has right replicates object
  expect_identical(new_roadmap[["replicates"]], test_reps)
  
})

test_that("update_replicates functionality", {
  
  old_roadmap <- roadmap(conf_data = acs_conf, start_data = acs_start)
  new_roadmap <- old_roadmap |>
    update_replicates(model_sample_replicates = 5,
                      end_to_end_replicates = 7)
  
  # expect new object is roadmap
  expect_s3_class(new_roadmap, "roadmap")
  
  # expect new_roadmap has updated replicates values
  expect_equal(new_roadmap[["replicates"]][["model_sample_replicates"]], 5)
  expect_equal(new_roadmap[["replicates"]][["end_to_end_replicates"]], 7)
  
  # expect total_replicates updates
  expect_equal(new_roadmap[["replicates"]][["total_replicates"]], 35)
  
})

test_that("reset_replicates functionality", {
  
  old_roadmap <- roadmap(conf_data = acs_conf, start_data = acs_start,
                         replicates = test_reps)
  
  new_roadmap <- old_roadmap |> reset_replicates()
  
  # expect new object is roadmap
  expect_s3_class(new_roadmap, "roadmap")
  
  # expect new object has default replicate settings
  expect_identical(new_roadmap[["replicates"]], default_reps)
  
  
})

test_that("validate_replicates() catches manual overrides", {
  
  # Create basic roadmap
  data <- dplyr::select(mtcars, cyl, mpg, disp, hp, gear)
  
  test_reps <- replicates(start_data_replicates = 1, 
                          model_sample_replicates = 2, 
                          end_to_end_replicates = 3)
  
  roadmap <- roadmap(conf_data = data,
                     start_data = dplyr::select(data, cyl, gear)) |> 
    add_sequence_numeric(everything(), method = "correlation", cor_var = "mpg") |>
    add_replicates(test_reps)
  
  # Manually override start data replicates
  roadmap$replicates$start_data_replicates <- 2
  
  dt_mod <- parsnip::decision_tree() |>
    parsnip::set_engine("rpart") |>
    parsnip::set_mode("regression")
  
  synth_spec <- synth_spec(default_regression_model = dt_mod,
                           default_regression_sampler = sample_rpart)
  
  # Validator inside presynth() should catch error due to manual overriding
  expect_error(
    expect_warning(
      presynth(roadmap = roadmap,
               synth_spec = synth_spec)
    )
  )
  
})

Try the tidysynthesis package in your browser

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

tidysynthesis documentation built on March 17, 2026, 1:06 a.m.