test_that("terralink_raster returns corridor output", { r <- terra::rast(nrows = 20, ncols = 20, xmin = 0, xmax = 2000, ymin = 0, ymax = 2000, crs = "EPSG:3857") terra::values(r) <- 0 terra::values(r)[1:10] <- 1 terra::values(r)[300:320] <- 1 result <- terralink_raster( raster = r, patch_values = 1, budget = 200, min_patch_size = 3, max_search_distance = 50, units = "pixels" ) expect_true(inherits(result, "terralink_result")) expect_true(inherits(result$patches, "SpatRaster")) expect_true(is.data.frame(result$corridors)) expect_true(is.list(result$summary)) expect_equal(result$summary$raster_delegate_backend, "vector_polygonize") }) test_that("build_contiguous_raster includes weighted corridor cells", { habitat <- terra::rast(nrows = 5, ncols = 5, xmin = 0, xmax = 5, ymin = 0, ymax = 5) terra::values(habitat) <- NA habitat_vals <- terra::values(habitat, mat = FALSE) habitat_vals[c(1, 2, 24, 25)] <- 1 terra::values(habitat) <- habitat_vals corridor <- habitat terra::values(corridor) <- NA corridor_vals <- terra::values(corridor, mat = FALSE) corridor_vals[13] <- 10 terra::values(corridor) <- corridor_vals contiguous <- build_contiguous_raster(habitat, corridor, connectivity = 8) contiguous_vals <- terra::values(contiguous, mat = FALSE) expect_false(is.na(contiguous_vals[13])) expect_gt(contiguous_vals[13], 0) }) test_that("synthetic raster fixture is stable across TerraLink 1.8 strategies", { synth <- terralink_sample_data("synthetic_raster") expect_true(length(synth) == 1) expect_true(file.exists(synth)) runs <- suppressWarnings(list( most_connected_networks = terralink_raster( raster = synth, patch_values = 1, budget = 120, min_patch_size = 4, min_corridor_width = 1, max_search_distance = 30, units = "pixels", strategy = "most_connected_networks" ), largest_single_network = terralink_raster( raster = synth, patch_values = 1, budget = 120, min_patch_size = 4, min_corridor_width = 1, max_search_distance = 30, units = "pixels", strategy = "largest_single_network" ), landscape_fluidity = terralink_raster( raster = synth, patch_values = 1, budget = 120, min_patch_size = 4, min_corridor_width = 1, max_search_distance = 30, units = "pixels", strategy = "landscape_fluidity" ) )) expected <- list( most_connected_networks = list( corridors_used = 10, budget_used = 107.15469833021086, total_connected = 231.56161108698268, largest_network = 124.40691275677182, fluidity_post = 0.002418528098365 ), largest_single_network = list( corridors_used = 8, budget_used = 84.22725598868004, total_connected = 208.63416874545186, largest_network = 124.40691275677182, fluidity_post = 0.002439916206496 ), landscape_fluidity = list( corridors_used = 6, budget_used = 54.00678845672328, total_connected = 178.4137012134951, largest_network = 124.40691275677182, fluidity_post = 0.00176125887171 ) ) expect_rel_close <- function(actual, expected, rel_tol = 0.08, abs_tol = 1e-6) { scale <- max(abs(expected), abs_tol) expect_lte(abs(actual - expected), max(scale * rel_tol, abs_tol)) } for (name in names(runs)) { result <- runs[[name]] expect_equal(result$summary$strategy, name) expect_equal(result$summary$corridors_used, expected[[name]]$corridors_used) expect_rel_close(result$summary$budget_used, expected[[name]]$budget_used) expect_equal(result$summary$raster_delegate_backend, "vector_polygonize") expect_rel_close(result$metrics$total_connected_habitat_area_post, expected[[name]]$total_connected) expect_rel_close(result$metrics$largest_network_area_post, expected[[name]]$largest_network) expect_rel_close(as.numeric(result$metrics$landscape_fluidity_post), as.numeric(expected[[name]]$fluidity_post)) } })