test_that( "amr_alert returns the expected structure", { x <- c( 0.10, 0.12, 0.11, 0.13, 0.15, 0.20, 0.30, 0.40 ) result <- amr_alert(x) expect_s3_class( result, "data.frame" ) expect_equal( nrow(result), length(x) ) expect_true( all( c( "observation", "observed", "ewma", "ewma_alert", "cusum", "cusum_alert", "overall_alert" ) %in% names(result) ) ) } ) test_that( "amr_alert preserves observed values", { x <- c( 0.10, 0.20, 0.30, 0.40, 0.50 ) result <- amr_alert(x) expect_equal( result$observed, x ) expect_equal( result$observation, seq_along(x) ) } ) test_that( "amr_alert combines EWMA and CUSUM alerts", { x <- c( 0.10, 0.10, 0.10, 0.10, 0.50, 0.60, 0.70, 0.80 ) result <- amr_alert( x, lambda = 0.2, L = 3, h = 5 ) expect_equal( result$overall_alert, result$ewma_alert | result$cusum_alert ) } ) test_that( "amr_alert accepts custom parameters", { x <- c( 0.10, 0.12, 0.15, 0.20, 0.25, 0.30 ) result <- amr_alert( x, lambda = 0.3, L = 2, h = 3 ) expect_equal( nrow(result), length(x) ) } )