test_that( "amr_cusum returns the expected output", { x <- c( 0.20, 0.21, 0.22, 0.30, 0.40, 0.45 ) result <- amr_cusum(x) expect_s3_class( result, "data.frame" ) expect_equal( nrow(result), length(x) ) expect_true( all( c( "observation", "observed", "cusum", "target", "threshold", "alert" ) %in% names(result) ) ) } ) test_that( "amr_cusum preserves observations", { x <- c( 0.10, 0.15, 0.20, 0.25 ) result <- amr_cusum(x) expect_equal( result$observed, x ) } ) test_that( "amr_cusum starts at zero or positive value", { x <- c( 0.10, 0.10, 0.10, 0.10 ) result <- amr_cusum( x, target = 0.10 ) expect_true( all(result$cusum >= 0) ) } ) test_that( "amr_cusum detects sustained increase", { x <- c( 0.10, 0.10, 0.10, 0.50, 0.60, 0.70, 0.80 ) result <- amr_cusum( x, target = 0.10, k = 0, h = 0.5 ) expect_true( any(result$alert) ) } ) test_that( "amr_cusum rejects non-numeric input", { expect_error( amr_cusum( c("R", "S", "R") ) ) } ) test_that( "amr_cusum rejects missing values", { expect_error( amr_cusum( c(0.10, NA, 0.20) ) ) } )