test_that("singleEventSurvival validates required columns", { bad <- data.frame(subject_id = 1:3, time = c(1, 2, 3)) expect_error( OdysseusSurvivalModule:::singleEventSurvival(bad), "must contain: subject_id, time, status" ) }) test_that("singleEventSurvival returns expected overall structure for KM", { df <- data.frame( subject_id = 1:10, time = c(5, 8, 12, 20, 30, 9, 15, 21, 25, 40), status = c(1, 0, 1, 1, 0, 1, 0, 1, 0, 1) ) out <- OdysseusSurvivalModule:::singleEventSurvival( survivalData = df, timeScale = "days", model = "km" ) expect_s3_class(out, "singleEventSurvival") expect_true("overall" %in% names(out)) expect_true(all(c("data", "summary") %in% names(out$overall))) expect_true(all(c("time", "n_risk", "n_event", "survival") %in% names(out$overall$data))) expect_equal(out$overall$summary$n, nrow(df)) }) test_that("singleEventSurvival supports gender and age_group strata", { df <- data.frame( subject_id = 1:12, time = c(5, 8, 12, 20, 30, 9, 15, 21, 25, 40, 18, 27), status = c(1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0), gender = c("Male", "Male", "Female", "Female", "Male", "Female", "Male", "Female", "Male", "Female", "Male", "Female"), age_years = c(22, 35, 41, 59, 66, 28, 47, 73, 52, 61, 19, 45) ) out <- OdysseusSurvivalModule:::singleEventSurvival( survivalData = df, model = "km", strata = c("gender", "age_group"), ageBreaks = list(c(18, 44), c(45, 64), c(65, Inf)) ) expect_true("overall" %in% names(out)) expect_true(any(grepl("^gender=", names(out)))) expect_true(any(grepl("^age_group=", names(out)))) expect_true("logrank_test_gender" %in% names(out)) expect_true("logrank_test_age_group" %in% names(out)) expect_true(all(out$logrank_test_gender$testType == "pairwise")) expect_true(all(out$logrank_test_age_group$testType == "pairwise")) }) test_that("singleEventSurvival requires age_years for age_group strata", { df <- data.frame( subject_id = 1:6, time = c(3, 5, 7, 9, 11, 13), status = c(1, 0, 1, 0, 1, 0) ) expect_error( OdysseusSurvivalModule:::singleEventSurvival( survivalData = df, model = "km", strata = c("age_group") ), "age_years" ) }) test_that("singleEventSurvival supports parametric model output", { df <- data.frame( subject_id = 1:10, time = c(5, 8, 12, 20, 30, 9, 15, 21, 25, 40), status = c(1, 0, 1, 1, 0, 1, 0, 1, 0, 1), age_years = c(22, 35, 41, 59, 66, 28, 47, 73, 52, 61) ) out <- OdysseusSurvivalModule:::singleEventSurvival( survivalData = df, model = "weibull", covariates = c("age_years"), timeScale = "months" ) expect_true("overall" %in% names(out)) expect_true(all(c("data", "summary") %in% names(out$overall))) expect_true(all(c("lower", "upper", "hazard") %in% names(out$overall$data))) expect_true(all(is.na(out$overall$data$lower))) expect_true(all(is.na(out$overall$data$upper))) expect_equal(out$overall$summary$timeScale, "months") })