# Public input validation only: these test calls must fail before any trial is simulated. # Save as tests/testthat/test-find-n-req-validation.R test_that("find_n_req validates inputs before running simulations", { never_called <- function(...) stop("generator must not be called") args <- list( F_followup = 12, tau = 36, thresholds = list(p_risk_min = 0.10, n_risk_min = 10, p_support_min = 0.95), trial_generator = never_called, trial_args = list(A = 48), N_lower = 100, N_upper = 200, coarse_step = 20, fine_step = 10, n_coarse = 2, n_fine = 3, n_validate = 4, power_target = 0.80, search_seed = 202614, validation_seed = 202615, alpha = 0.05 ) invalid <- function(...) do.call(find_n_req, utils::modifyList(args, list(...))) expect_error(invalid(F_followup = -1), "F_followup") expect_error(invalid(tau = 0), "tau") expect_error(invalid(N_lower = 200), "N_lower") expect_error(invalid(N_upper = 100), "N_lower") expect_error(invalid(coarse_step = 0), "coarse_step") expect_error(invalid(fine_step = 0), "fine_step") expect_error(invalid(coarse_step = 15), "coarse_step") expect_error(invalid(N_upper = 205), "N_upper - N_lower") expect_error(invalid(n_coarse = 0), "n_coarse") expect_error(invalid(n_fine = 1.5), "n_fine") expect_error(invalid(n_validate = -1), "n_validate") expect_error(invalid(power_target = 1), "power_target") expect_error(invalid(alpha = 0), "alpha") expect_error(invalid(trial_generator = "not a function"), "trial_generator") expect_error(invalid(trial_args = list(N = 160)), "trial_args") expect_error(invalid(search_seed = -1), "search_seed") expect_error(invalid(validation_seed = 202614), "search_seed and validation_seed must differ") expect_error(invalid(thresholds = list(p_risk_min = 2, n_risk_min = 10, p_support_min = 0.95)), "thresholds") missing_threshold <- args missing_threshold$thresholds <- list(p_risk_min = 0.10, n_risk_min = 10) expect_error(do.call(find_n_req, missing_threshold), "thresholds") missing_sim_count <- args missing_sim_count$n_validate <- NULL expect_error(do.call(find_n_req, missing_sim_count), "n_validate") }) test_that("invalid find_n_req inputs do not consume caller RNG", { set.seed(20261015) before <- .Random.seed expect_error(find_n_req( F_followup = 12, tau = 36, thresholds = list(p_risk_min = 0.10, n_risk_min = 10, p_support_min = 0.95), trial_generator = function(...) stop("must not run"), N_lower = 100, N_upper = 200, n_coarse = 2, n_fine = 3, n_validate = 4, search_seed = 202614, validation_seed = 202614 ), "must differ") expect_identical(.Random.seed, before) })