test_that("summary helpers calculate and fill time correctly", { data = make_gap_signal() # make_gap_signal() is 1 Hz, so AI is NA with a warning expect_warning( ai_sparse <- acti_calculate_ai(data, ensure_all_time = FALSE, verbose = TRUE), "fewer than 2 samples") expect_warning( ai_full <- acti_calculate_ai(data, ensure_all_time = TRUE, verbose = TRUE), "fewer than 2 samples") expect_equal(nrow(ai_sparse) + 1L, nrow(ai_full)) expect_true("AI" %in% names(ai_full)) expect_warning( ai_index <- acti_calculate_activity_index( data, ensure_all_time = FALSE, verbose = TRUE ), "fewer than 2 samples") expect_equal(ai_sparse, ai_index) dt = data.table::as.data.table(data) expect_warning( ai_dt <- acti_calculate_ai(dt, ensure_all_time = FALSE, verbose = TRUE), "fewer than 2 samples") expect_true(data.table::is.data.table(ai_dt)) mad = acti_calculate_mad(data, ensure_all_time = FALSE, verbose = TRUE) expect_true(all(c("MAD", "ENMO_t", "AI_DEFINED") %in% names(mad))) expect_equal( nrow(acti_calculate_enmo(data, ensure_all_time = FALSE)), nrow(mad) ) expect_equal( nrow(acti_calculate_ai_defined(data, ensure_all_time = FALSE)), nrow(mad) ) auc = acti_calculate_auc( data, allow_truncation = TRUE, ensure_all_time = FALSE, verbose = TRUE ) expect_true(all(c("AUC_X", "AUC_Y", "AUC_Z", "AUC") %in% names(auc))) expect_error(acti_calculate_flags(data), "flag is not in the data") }) test_that("flag and idle summaries work on flagged data", { data = make_flagged_signal() flags = acti_calculate_flags(data, ensure_all_time = FALSE) expect_true("flag_low" %in% names(flags)) expect_true("n_samples_in_unit" %in% names(flags)) idle = acti_calculate_n_idle(data, ensure_all_time = FALSE) expect_true("n_idle" %in% names(idle)) expect_true(any(idle$n_idle > 0)) }) test_that("calculate_measures combines summary outputs", { if (!can_run_agcounts() || !can_load_pkg("MIMSunit")) { skip("agcounts or MIMSunit is not runnable in this session") } data = make_example_signal(12000) measures = acti_calculate_measures( data, calculate_mims = TRUE, calculate_ac = TRUE, flag_data = TRUE, dynamic_range = c(-10, 10), ensure_all_time = FALSE, verbose = TRUE ) expect_true("time" %in% names(measures)) expect_true("AC" %in% names(measures)) expect_true(any(grepl("MIMS", names(measures)))) expect_true("flags" %in% names(measures)) }) test_that("MIMS and combined measures ignore additional sensor columns", { skip_if_not_installed("MIMSunit") data = make_regular_signal(12000) with_sensors = data with_sensors$light = rep(c(100, 200), length.out = nrow(data)) with_sensors$temperature = rep(c(20, 21), length.out = nrow(data)) mims_args = list(dynamic_range = c(-2, 2), ensure_all_time = FALSE) expect_equal( do.call(acti_calculate_mims, c(list(data = with_sensors), mims_args)), do.call(acti_calculate_mims, c(list(data = data), mims_args)) ) measure_args = list( calculate_ac = FALSE, flag_data = FALSE, fix_zeros = FALSE, dynamic_range = c(-2, 2), ensure_all_time = FALSE, verbose = FALSE ) expect_equal( do.call(acti_calculate_measures, c(list(data = with_sensors), measure_args)), do.call(acti_calculate_measures, c(list(data = data), measure_args)) ) }) test_that("data.table input stays data.table for summary branches", { data = data.table::as.data.table(make_gap_signal()) mad = acti_calculate_mad(data, ensure_all_time = FALSE, verbose = TRUE) expect_true(data.table::is.data.table(mad)) }) test_that("dynamic range checks support AccData inputs", { data = make_gap_signal() expect_warning( acti_calculate_mims( data, dynamic_range = c(-0.5, 0.5), ensure_all_time = FALSE ), "Dynamic range does not cover all the data" ) })