# tests/testthat/test-utils.R # Unit tests for MappingCalc utility calculation functions # ---- PANSS ---------------------------------------------------------------- test_that("panss_utility_score computes correctly against manual formula", { expected <- round(1.3103 - 0.0044*34 + 0.0025*17 - 0.0146*80 - 0.0029*40 + 0.0149*1, 3) expect_equal(panss_utility_score(34, 17, 80, 40, 1), expected) }) test_that("panss_utility_score caps at 1.000 for best possible inputs", { result <- panss_utility_score(7, 7, 16, 21, 1) expect_lte(result, 1.000) }) test_that("panss_utility_score returns numeric", { expect_type(panss_utility_score(34, 17, 80, 40, 1), "double") }) test_that("panss_utility_comparison returns 'above' or 'below'", { result <- panss_utility_comparison(34, 17, 80, 40, 1) expect_true(result %in% c("above", "below")) }) test_that("panss_utility_comparison returns 'above' for very mild symptoms", { # Very mild symptoms, young female -- should be above 0.95 expect_equal(panss_utility_comparison(7, 7, 16, 21, 1), "above") }) # ---- SQLS ----------------------------------------------------------------- test_that("sqls_utility_score returns numeric", { expect_type(sqls_utility_score(50, 50, 50, 40, 1), "double") }) test_that("sqls_utility_score computes correctly against manual formula", { ps <- 50; mo <- 50; sy <- 50; ag <- 40; ge <- 1 expected <- round(1.013 - 0.004*ps + 0.006*mo + 0.002*sy + 0.00003*(ps^2) - 0.0001*(mo^2) - 0.0001*(sy^2) - 0.003*ag + 0.030*ge, 3) expect_equal(sqls_utility_score(ps, mo, sy, ag, ge), expected) }) test_that("sqls_utility_comparison returns 'above' or 'below'", { result <- sqls_utility_comparison(50, 50, 50, 40, 1) expect_true(result %in% c("above", "below")) }) # ---- WHODAS --------------------------------------------------------------- test_that("whodas_total_utility_score returns numeric", { expect_type(whodas_total_utility_score(10), "double") }) test_that("whodas_total_utility_score floors at -0.584", { # Very high WHODAS score should floor at -0.584 result <- whodas_total_utility_score(48) expect_gte(result, -0.584) }) test_that("whodas_total_utility_score gives near 0.956 for score of 0", { result <- whodas_total_utility_score(0) expect_equal(result, round(0.9564739, 3)) }) test_that("whodas_total_utility_comparison returns 'above' or 'below'", { result <- whodas_total_utility_comparison(10) expect_true(result %in% c("above", "below")) }) # ---- EQ-5D-5L profile string ---------------------------------------------- test_that("eq5d5l_profile_string concatenates correctly", { expect_equal(eq5d5l_profile_string(1, 1, 1, 1, 1), "11111") expect_equal(eq5d5l_profile_string(3, 2, 1, 4, 5), "32145") }) test_that("eq5d5l_profile_string returns character", { expect_type(eq5d5l_profile_string(1, 2, 3, 2, 1), "character") }) # ---- Vectorisation -------------------------------------------------------- test_that("panss_utility_score vectorises over multiple rows", { result <- panss_utility_score( positive = c(20, 34), negative = c(15, 17), gps = c(40, 80), age1 = c(30, 40), gender = c(0, 1) ) expect_length(result, 2) expect_type(result, "double") }) test_that("whodas_total_utility_score vectorises over multiple rows", { result <- whodas_total_utility_score(c(0, 10, 48)) expect_length(result, 3) })