# =========================================================================== # getFeatureConfigs — internal # =========================================================================== test_that("getFeatureConfigs returns all expected domains", { configs <- OdysseusCharacterizationModule:::getFeatureConfigs() expect_true(is.list(configs)) expected_keys <- c( "drugExposure", "drugEra", "conditionOccurrence", "conditionEra", "measurement", "procedureOccurrence", "visits", "observation", "deviceExposure", "payerPlanPeriod", "cohortCovariate" ) for (key in expected_keys) { expect_true(key %in% names(configs), info = paste("Missing key:", key)) } }) test_that("getFeatureConfigs entries have required fields", { configs <- OdysseusCharacterizationModule:::getFeatureConfigs() for (name in names(configs)) { cfg <- configs[[name]] expect_true("table" %in% names(cfg), info = paste(name, "missing table")) expect_true("dateCol" %in% names(cfg), info = paste(name, "missing dateCol")) expect_true("analysisName" %in% names(cfg), info = paste(name, "missing analysisName")) # conceptIdCol required for all except cohortCovariate if (name != "cohortCovariate") { expect_true("conceptIdCol" %in% names(cfg), info = paste(name, "missing conceptIdCol")) } } }) test_that("getFeatureConfigs era tables have dateColEnd", { configs <- OdysseusCharacterizationModule:::getFeatureConfigs() era_keys <- c("drugEra", "conditionEra", "visits", "payerPlanPeriod", "cohortCovariate") for (key in era_keys) { expect_true("dateColEnd" %in% names(configs[[key]]), info = paste(key, "missing dateColEnd")) expect_true(is.character(configs[[key]]$dateColEnd), info = paste(key, "dateColEnd not character")) } }) test_that("getFeatureConfigs non-era tables do not have dateColEnd", { configs <- OdysseusCharacterizationModule:::getFeatureConfigs() no_end <- c("drugExposure", "conditionOccurrence", "measurement", "procedureOccurrence", "observation", "deviceExposure") for (key in no_end) { expect_null(configs[[key]]$dateColEnd, info = paste(key, "should not have dateColEnd")) } }) test_that("getFeatureConfigs table names match OMOP CDM", { configs <- OdysseusCharacterizationModule:::getFeatureConfigs() expect_equal(configs$drugExposure$table, "drug_exposure") expect_equal(configs$drugEra$table, "drug_era") expect_equal(configs$conditionOccurrence$table, "condition_occurrence") expect_equal(configs$conditionEra$table, "condition_era") expect_equal(configs$measurement$table, "measurement") expect_equal(configs$procedureOccurrence$table, "procedure_occurrence") expect_equal(configs$visits$table, "visit_occurrence") expect_equal(configs$observation$table, "observation") expect_equal(configs$deviceExposure$table, "device_exposure") }) # =========================================================================== # .returnSqlBlock — internal (now in SqlBuildingBlock.R) # =========================================================================== test_that(".returnSqlBlock returns non-empty SQL string", { result <- OdysseusCharacterizationModule:::.returnSqlBlock() expect_true(is.character(result)) expect_true(nchar(result) > 0) }) # =========================================================================== # .ocm_can_style # =========================================================================== test_that(".ocm_can_style returns TRUE when option set to TRUE", { withr::with_options(list(OdysseusCharacterizationModule.useAnsi = TRUE), { expect_true(OdysseusCharacterizationModule:::.ocm_can_style()) }) }) test_that(".ocm_can_style returns FALSE when option set to FALSE", { withr::with_options(list(OdysseusCharacterizationModule.useAnsi = FALSE), { expect_false(OdysseusCharacterizationModule:::.ocm_can_style()) }) }) test_that(".ocm_can_style falls back to interactive() when option NULL", { withr::with_options(list(OdysseusCharacterizationModule.useAnsi = NULL), { result <- OdysseusCharacterizationModule:::.ocm_can_style() expect_equal(result, interactive()) }) }) # =========================================================================== # .ocm_can_unicode # =========================================================================== test_that(".ocm_can_unicode returns TRUE when option set to TRUE", { withr::with_options(list(OdysseusCharacterizationModule.useUnicode = TRUE), { expect_true(OdysseusCharacterizationModule:::.ocm_can_unicode()) }) }) test_that(".ocm_can_unicode returns FALSE when option set to FALSE", { withr::with_options(list(OdysseusCharacterizationModule.useUnicode = FALSE), { expect_false(OdysseusCharacterizationModule:::.ocm_can_unicode()) }) }) test_that(".ocm_can_unicode falls back to l10n_info when option NULL", { withr::with_options(list(OdysseusCharacterizationModule.useUnicode = NULL), { result <- OdysseusCharacterizationModule:::.ocm_can_unicode() expect_equal(result, l10n_info()[["UTF-8"]]) }) }) # =========================================================================== # .ocm_style # =========================================================================== test_that(".ocm_style returns text unchanged when code is NULL", { expect_equal(OdysseusCharacterizationModule:::.ocm_style("hello", NULL), "hello") }) test_that(".ocm_style wraps text in ANSI when styling available", { withr::with_options(list(OdysseusCharacterizationModule.useAnsi = TRUE), { result <- OdysseusCharacterizationModule:::.ocm_style("hello", "32") expect_true(grepl("\033\\[32m", result)) expect_true(grepl("hello", result)) expect_true(grepl("\033\\[39m", result)) }) }) test_that(".ocm_style returns plain text when styling unavailable", { withr::with_options(list(OdysseusCharacterizationModule.useAnsi = FALSE), { result <- OdysseusCharacterizationModule:::.ocm_style("hello", "32") expect_equal(result, "hello") }) }) # =========================================================================== # .ocm_symbols # =========================================================================== test_that(".ocm_symbols returns unicode symbols when unicode available", { withr::with_options(list(OdysseusCharacterizationModule.useUnicode = TRUE), { syms <- OdysseusCharacterizationModule:::.ocm_symbols() expect_true(is.list(syms)) expect_true(all(c("start", "step", "done", "skip", "warn") %in% names(syms))) expect_equal(syms$start, "\u25b6") expect_equal(syms$done, "\u2713") }) }) test_that(".ocm_symbols returns ASCII symbols when unicode unavailable", { withr::with_options(list(OdysseusCharacterizationModule.useUnicode = FALSE), { syms <- OdysseusCharacterizationModule:::.ocm_symbols() expect_equal(syms$start, ">") expect_equal(syms$step, "-") expect_equal(syms$done, "v") expect_equal(syms$skip, "o") expect_equal(syms$warn, "!") }) }) # =========================================================================== # .ocm_prefix # =========================================================================== test_that(".ocm_prefix returns string ending with space", { withr::with_options(list(OdysseusCharacterizationModule.useAnsi = FALSE, OdysseusCharacterizationModule.useUnicode = FALSE), { result <- OdysseusCharacterizationModule:::.ocm_prefix("step", indent = 0) expect_true(grepl(" $", result)) expect_true(grepl("-", result)) }) }) test_that(".ocm_prefix adds indentation", { withr::with_options(list(OdysseusCharacterizationModule.useAnsi = FALSE, OdysseusCharacterizationModule.useUnicode = FALSE), { result <- OdysseusCharacterizationModule:::.ocm_prefix("done", indent = 2) expect_true(grepl("^ ", result)) }) }) test_that(".ocm_prefix handles all levels", { withr::with_options(list(OdysseusCharacterizationModule.useAnsi = FALSE, OdysseusCharacterizationModule.useUnicode = FALSE), { for (lvl in c("start", "step", "done", "skip", "warn")) { result <- OdysseusCharacterizationModule:::.ocm_prefix(lvl) expect_true(nchar(result) > 0, info = lvl) } }) }) # =========================================================================== # .ocm_message # =========================================================================== test_that(".ocm_message is silent when quiet option is TRUE", { withr::with_options(list(OdysseusCharacterizationModule.quiet = TRUE), { expect_silent(OdysseusCharacterizationModule:::.ocm_message("test")) }) }) test_that(".ocm_message emits message when not quiet", { withr::with_options(list(OdysseusCharacterizationModule.quiet = FALSE, OdysseusCharacterizationModule.useAnsi = FALSE, OdysseusCharacterizationModule.useUnicode = FALSE), { expect_message( OdysseusCharacterizationModule:::.ocm_message("hello"), "hello" ) }) }) # =========================================================================== # .ocm_rule # =========================================================================== test_that(".ocm_rule returns string with label embedded", { withr::with_options(list(OdysseusCharacterizationModule.useUnicode = TRUE), { result <- OdysseusCharacterizationModule:::.ocm_rule("Test") expect_true(grepl("Test", result)) expect_true(grepl("^==", result)) }) }) test_that(".ocm_rule uses dashes when unicode unavailable", { withr::with_options(list(OdysseusCharacterizationModule.useUnicode = FALSE), { result <- OdysseusCharacterizationModule:::.ocm_rule("Test") expect_true(grepl("^--", result)) }) }) # =========================================================================== # .ocm_section, .ocm_step, .ocm_done, .ocm_skip # =========================================================================== test_that(".ocm_section emits message with rule", { withr::with_options(list(OdysseusCharacterizationModule.quiet = FALSE, OdysseusCharacterizationModule.useAnsi = FALSE, OdysseusCharacterizationModule.useUnicode = FALSE), { expect_message( OdysseusCharacterizationModule:::.ocm_section("Section"), "Section" ) }) }) test_that(".ocm_step emits step-level message", { withr::with_options(list(OdysseusCharacterizationModule.quiet = FALSE, OdysseusCharacterizationModule.useAnsi = FALSE, OdysseusCharacterizationModule.useUnicode = FALSE), { expect_message( OdysseusCharacterizationModule:::.ocm_step("step text"), "step text" ) }) }) test_that(".ocm_done emits done-level message", { withr::with_options(list(OdysseusCharacterizationModule.quiet = FALSE, OdysseusCharacterizationModule.useAnsi = FALSE, OdysseusCharacterizationModule.useUnicode = FALSE), { expect_message( OdysseusCharacterizationModule:::.ocm_done("done text"), "done text" ) }) }) test_that(".ocm_skip emits skip-level message", { withr::with_options(list(OdysseusCharacterizationModule.quiet = FALSE, OdysseusCharacterizationModule.useAnsi = FALSE, OdysseusCharacterizationModule.useUnicode = FALSE), { expect_message( OdysseusCharacterizationModule:::.ocm_skip("skip text"), "skip text" ) }) })