test_that("PDF integrates to 1 (Unity Check)", { # Full 4-parameter model int_full <- stats::integrate( f = function(x) dbetadanish(x, a = 1.5, b = 2.0, c = 3.0, k = 0.5), lower = 0, upper = Inf ) expect_equal(int_full$value, 1.0, tolerance = 1e-4) # 3-parameter submodel (a = 1) int_sub <- stats::integrate( f = function(x) dbetadanish(x, a = 1.0, b = 2.5, c = 1.5, k = 1.0), lower = 0, upper = Inf ) expect_equal(int_sub$value, 1.0, tolerance = 1e-4) }) test_that("CDF matches numerical integration of PDF", { x_test <- 2.0 a <- 2.0; b <- 1.5; c <- 2.0; k <- 0.5 cdf_analytical <- pbetadanish(x_test, a, b, c, k) cdf_numerical <- stats::integrate( f = function(t) dbetadanish(t, a, b, c, k), lower = 0, upper = x_test )$value expect_equal(cdf_analytical, cdf_numerical, tolerance = 1e-5) }) test_that("Quantile function perfectly inverts the CDF", { probs <- c(0.1, 0.5, 0.9) a <- 1.2; b <- 0.8; c <- 1.5; k <- 0.2 quantiles <- qbetadanish(probs, a, b, c, k) cdf_back <- pbetadanish(quantiles, a, b, c, k) expect_equal(cdf_back, probs, tolerance = 1e-5) }) test_that("Hazard function equals PDF / Survival", { x_test <- 1.5 a <- 1.5; b <- 2.0; c <- 1.2; k <- 0.8 haz_analytical <- hbetadanish(x_test, a, b, c, k) pdf_val <- dbetadanish(x_test, a, b, c, k) surv_val <- pbetadanish(x_test, a, b, c, k, lower.tail = FALSE) expect_equal(haz_analytical, pdf_val / surv_val, tolerance = 1e-5) }) test_that("Invalid parameters return NaN and warnings", { expect_warning(res <- dbetadanish(1, a = -1, b = 2, c = 3, k = 0.5)) expect_true(is.nan(res)) })