tests/testthat/test-p_median.R

test_that("p_median returns correct structure", {
  skip_if_not_installed("sf")
  skip("Rust compilation required")

  set.seed(42)
  demand <- sf::st_as_sf(
    data.frame(x = runif(30), y = runif(30), pop = rpois(30, 100)),
    coords = c("x", "y")
  )
  facilities <- sf::st_as_sf(
    data.frame(x = runif(10), y = runif(10)),
    coords = c("x", "y")
  )

  result <- p_median(demand, facilities, n_facilities = 3, weight_col = "pop")

  expect_type(result, "list")
  expect_s3_class(result$demand, "sf")
  expect_s3_class(result$facilities, "sf")
  expect_true(".facility" %in% names(result$demand))
  expect_true(".selected" %in% names(result$facilities))
  expect_equal(sum(result$facilities$.selected), 3)
})

test_that("p_median assigns all demand to selected facilities", {
  skip_if_not_installed("sf")
  skip("Rust compilation required")

  set.seed(42)
  demand <- sf::st_as_sf(
    data.frame(x = runif(20), y = runif(20), pop = rep(1, 20)),
    coords = c("x", "y")
  )
  facilities <- sf::st_as_sf(
    data.frame(x = runif(8), y = runif(8)),
    coords = c("x", "y")
  )

  result <- p_median(demand, facilities, n_facilities = 4, weight_col = "pop")

  # All assignments should be to selected facilities
  selected_ids <- which(result$facilities$.selected)
  expect_true(all(result$demand$.facility %in% selected_ids))
})

Try the spopt package in your browser

Any scripts or data that you put into this service are public.

spopt documentation built on April 22, 2026, 9:07 a.m.