test_that("defineAnalysisWindows returns correct structure with defaults", { windows <- defineAnalysisWindows() expect_true(is.list(windows)) expect_length(windows, 8L) # Each element should be an analysisWindows object for (w in windows) { expect_s3_class(w, "analysisWindows") expect_true(all(c("startDay", "endDay", "windowName") %in% names(w))) expect_true(is.integer(w$startDay)) expect_true(is.integer(w$endDay)) expect_true(is.character(w$windowName)) } }) test_that("defineAnalysisWindows uses custom values", { windows <- defineAnalysisWindows( startDays = c(-30, 0), endDays = c(-1, 30) ) expect_length(windows, 2L) expect_equal(windows[[1]]$startDay, -30L) expect_equal(windows[[1]]$endDay, -1L) expect_equal(windows[[2]]$startDay, 0L) expect_equal(windows[[2]]$endDay, 30L) }) test_that("defineAnalysisWindows generates automatic window names", { windows <- defineAnalysisWindows( startDays = c(-365, 1), endDays = c(-1, 365) ) expect_equal(windows[[1]]$windowName, "-365 to -1") expect_equal(windows[[2]]$windowName, "1 to 365") }) test_that("defineAnalysisWindows accepts custom window names", { windows <- defineAnalysisWindows( startDays = c(-30, 0), endDays = c(-1, 30), windowNames = c("Pre-index", "Post-index") ) expect_equal(windows[[1]]$windowName, "Pre-index") expect_equal(windows[[2]]$windowName, "Post-index") }) test_that("defineAnalysisWindows errors on length mismatch between startDays and endDays", { expect_error( defineAnalysisWindows(startDays = c(-30, 0), endDays = c(-1)), "startDays and endDays must have the same length" ) }) test_that("defineAnalysisWindows errors on non-numeric input", { expect_error( defineAnalysisWindows(startDays = c("a", "b"), endDays = c("c", "d")), "startDays and endDays must be numeric" ) expect_error( defineAnalysisWindows(startDays = c(-30, 0), endDays = c("x", "y")), "startDays and endDays must be numeric" ) }) test_that("defineAnalysisWindows errors when startDay > endDay", { expect_error( defineAnalysisWindows(startDays = c(10), endDays = c(5)), "Each startDay must be <= its corresponding endDay" ) }) test_that("defineAnalysisWindows errors on wrong windowNames length", { expect_error( defineAnalysisWindows( startDays = c(-30, 0), endDays = c(-1, 30), windowNames = c("only_one") ), "windowNames must be a character vector of the same length" ) }) test_that("defineAnalysisWindows errors on non-character windowNames", { expect_error( defineAnalysisWindows( startDays = c(-30, 0), endDays = c(-1, 30), windowNames = c(1, 2) ), "windowNames must be a character vector of the same length" ) }) test_that("defineAnalysisWindows errors on empty string windowNames", { expect_error( defineAnalysisWindows( startDays = c(-30, 0), endDays = c(-1, 30), windowNames = c("valid", "") ), "windowNames must contain non-empty strings" ) expect_error( defineAnalysisWindows( startDays = c(-30, 0), endDays = c(-1, 30), windowNames = c("valid", " ") ), "windowNames must contain non-empty strings" ) }) test_that("defineAnalysisWindows errors on NA windowNames", { expect_error( defineAnalysisWindows( startDays = c(-30, 0), endDays = c(-1, 30), windowNames = c("valid", NA_character_) ), "windowNames must contain non-empty strings" ) }) test_that("defineAnalysisWindows handles single window", { windows <- defineAnalysisWindows(startDays = 0, endDays = 0) expect_length(windows, 1L) expect_equal(windows[[1]]$startDay, 0L) expect_equal(windows[[1]]$endDay, 0L) expect_equal(windows[[1]]$windowName, "0 to 0") }) test_that("defineAnalysisWindows coerces to integer", { windows <- defineAnalysisWindows(startDays = -30.0, endDays = -1.0) expect_true(is.integer(windows[[1]]$startDay)) expect_true(is.integer(windows[[1]]$endDay)) })