test_that( "amr_hotspot returns the expected result structure", { skip_if_not_installed("sf") skip_if_not_installed("spdep") geometry <- sf::st_make_grid( sf::st_as_sfc( sf::st_bbox( c( xmin = 0, ymin = 0, xmax = 3, ymax = 3 ), crs = sf::st_crs(4326) ) ), n = c(3, 3) ) geometry <- sf::st_sf( geometry = geometry ) dat <- data.frame( AMR_rate = c( 10, 20, 30, 20, 50, 40, 30, 40, 60 ) ) result <- amr_hotspot( data = dat, geometry = geometry, variable = "AMR_rate" ) expect_s3_class( result, "data.frame" ) expect_equal( nrow(result), 9 ) expect_equal( ncol(result), 10 ) expect_true( all( c( "observation", "AMR", "local_moran_I", "expected_I", "variance_I", "z_score", "p_value", "spatial_lag", "cluster", "significant" ) %in% names(result) ) ) expect_equal( result$observation, seq_len(9) ) expect_equal( result$AMR, dat$AMR_rate ) expect_true( is.numeric(result$local_moran_I) ) expect_true( is.numeric(result$p_value) ) expect_true( is.logical(result$significant) ) expect_true( all( result$cluster %in% c( "Not significant", "High-High", "Low-Low", "High-Low", "Low-High" ) ) ) } ) test_that( "amr_hotspot works with queen neighbourhoods", { skip_if_not_installed("sf") skip_if_not_installed("spdep") geometry <- sf::st_make_grid( sf::st_as_sfc( sf::st_bbox( c( xmin = 0, ymin = 0, xmax = 3, ymax = 3 ), crs = sf::st_crs(4326) ) ), n = c(3, 3) ) geometry <- sf::st_sf( geometry = geometry ) dat <- data.frame( AMR = c( 1, 2, 3, 2, 5, 4, 3, 4, 6 ) ) result <- amr_hotspot( data = dat, geometry = geometry, variable = "AMR", queen = TRUE ) expect_equal( nrow(result), 9 ) expect_true( all( is.finite(result$spatial_lag) ) ) } ) test_that( "amr_hotspot works with rook neighbourhoods", { skip_if_not_installed("sf") skip_if_not_installed("spdep") geometry <- sf::st_make_grid( sf::st_as_sfc( sf::st_bbox( c( xmin = 0, ymin = 0, xmax = 3, ymax = 3 ), crs = sf::st_crs(4326) ) ), n = c(3, 3) ) geometry <- sf::st_sf( geometry = geometry ) dat <- data.frame( AMR = c( 1, 2, 3, 2, 5, 4, 3, 4, 6 ) ) result <- amr_hotspot( data = dat, geometry = geometry, variable = "AMR", queen = FALSE ) expect_equal( nrow(result), 9 ) expect_true( all( is.finite(result$spatial_lag) ) ) } ) test_that( "amr_hotspot accepts a custom p-value", { skip_if_not_installed("sf") skip_if_not_installed("spdep") geometry <- sf::st_make_grid( sf::st_as_sfc( sf::st_bbox( c( xmin = 0, ymin = 0, xmax = 3, ymax = 3 ), crs = sf::st_crs(4326) ) ), n = c(3, 3) ) geometry <- sf::st_sf( geometry = geometry ) dat <- data.frame( AMR = c( 1, 2, 3, 2, 5, 4, 3, 4, 6 ) ) result <- amr_hotspot( data = dat, geometry = geometry, variable = "AMR", p_value = 0.10 ) expect_equal( nrow(result), 9 ) expect_true( all( is.na(result$p_value) | ( result$p_value >= 0 & result$p_value <= 1 ) ) ) } ) test_that( "amr_hotspot rejects non-data-frame input", { skip_if_not_installed("sf") geometry <- sf::st_sf( geometry = sf::st_sfc( sf::st_point(c(0, 0)) ) ) expect_error( amr_hotspot( data = c(1, 2), geometry = geometry, variable = "AMR" ), "data must be a data frame" ) } ) test_that( "amr_hotspot rejects non-sf geometry", { dat <- data.frame( AMR = c(1, 2) ) expect_error( amr_hotspot( data = dat, geometry = data.frame(x = c(1, 2)), variable = "AMR" ), "geometry must be an sf object" ) } ) test_that( "amr_hotspot rejects invalid variable name", { skip_if_not_installed("sf") geometry <- sf::st_make_grid( sf::st_as_sfc( sf::st_bbox( c( xmin = 0, ymin = 0, xmax = 2, ymax = 2 ), crs = sf::st_crs(4326) ) ), n = c(2, 2) ) geometry <- sf::st_sf( geometry = geometry ) dat <- data.frame( AMR = c(1, 2, 3, 4) ) expect_error( amr_hotspot( data = dat, geometry = geometry, variable = "missing" ), "was not found in data" ) } ) test_that( "amr_hotspot rejects non-numeric AMR variable", { skip_if_not_installed("sf") geometry <- sf::st_make_grid( sf::st_as_sfc( sf::st_bbox( c( xmin = 0, ymin = 0, xmax = 2, ymax = 2 ), crs = sf::st_crs(4326) ) ), n = c(2, 2) ) geometry <- sf::st_sf( geometry = geometry ) dat <- data.frame( AMR = c( "low", "high", "low", "high" ) ) expect_error( amr_hotspot( data = dat, geometry = geometry, variable = "AMR" ), "must be numeric" ) } ) test_that( "amr_hotspot rejects invalid p-value", { skip_if_not_installed("sf") geometry <- sf::st_make_grid( sf::st_as_sfc( sf::st_bbox( c( xmin = 0, ymin = 0, xmax = 2, ymax = 2 ), crs = sf::st_crs(4326) ) ), n = c(2, 2) ) geometry <- sf::st_sf( geometry = geometry ) dat <- data.frame( AMR = c(1, 2, 3, 4) ) expect_error( amr_hotspot( data = dat, geometry = geometry, variable = "AMR", p_value = 1 ), "p_value must be a single number" ) expect_error( amr_hotspot( data = dat, geometry = geometry, variable = "AMR", p_value = 0 ), "p_value must be a single number" ) } ) test_that( "amr_hotspot rejects mismatched data and geometry rows", { skip_if_not_installed("sf") geometry <- sf::st_make_grid( sf::st_as_sfc( sf::st_bbox( c( xmin = 0, ymin = 0, xmax = 2, ymax = 2 ), crs = sf::st_crs(4326) ) ), n = c(2, 2) ) geometry <- sf::st_sf( geometry = geometry ) dat <- data.frame( AMR = c(1, 2, 3) ) expect_error( amr_hotspot( data = dat, geometry = geometry, variable = "AMR" ), "same number of rows" ) } ) test_that( "amr_hotspot rejects missing AMR values", { skip_if_not_installed("sf") geometry <- sf::st_make_grid( sf::st_as_sfc( sf::st_bbox( c( xmin = 0, ymin = 0, xmax = 2, ymax = 2 ), crs = sf::st_crs(4326) ) ), n = c(2, 2) ) geometry <- sf::st_sf( geometry = geometry ) dat <- data.frame( AMR = c( 1, 2, NA, 4 ) ) expect_error( amr_hotspot( data = dat, geometry = geometry, variable = "AMR" ), "contains missing values" ) } ) test_that( "amr_hotspot rejects data with only one unique value", { skip_if_not_installed("sf") geometry <- sf::st_make_grid( sf::st_as_sfc( sf::st_bbox( c( xmin = 0, ymin = 0, xmax = 2, ymax = 2 ), crs = sf::st_crs(4326) ) ), n = c(2, 2) ) geometry <- sf::st_sf( geometry = geometry ) dat <- data.frame( AMR = c( 5, 5, 5, 5 ) ) expect_error( amr_hotspot( data = dat, geometry = geometry, variable = "AMR" ), "at least two distinct values" ) } ) test_that( "amr_hotspot rejects zero variance", { skip_if_not_installed("sf") geometry <- sf::st_make_grid( sf::st_as_sfc( sf::st_bbox( c( xmin = 0, ymin = 0, xmax = 2, ymax = 2 ), crs = sf::st_crs(4326) ) ), n = c(2, 2) ) geometry <- sf::st_sf( geometry = geometry ) dat <- data.frame( AMR = rep( 5, 4 ) ) expect_error( amr_hotspot( data = dat, geometry = geometry, variable = "AMR" ), "at least two distinct values|zero variance" ) } )