test_that("Index calculation is stable", {
  skip_if_not_installed("terra")
  # covr can't instrument the local block properly
  skip_if(nzchar(Sys.getenv("is_covr")))
  skip_on_cran()
  index_out <- tempfile(fileext = ".tif")
  expect_no_error(
    out <- calculate_indices(
      system.file("rasters/example_sentinel1.tif", package = "rsi"),
      suppressWarnings(filter_platforms(
        spectral_indices(download_indices = FALSE, update_cache = FALSE),
        platforms = "Sentinel-1 (Dual Polarisation VV-VH)"
      )),
      index_out,
      names_suffix = "sentinel1"
    )
  )

  expect_no_error(terra::rast(out))

  expect_equal(
    terra::values(terra::rast(out, lyrs = "DPDD_sentinel1")),
    terra::values(terra::rast(system.file("rasters/dpdd.tif", package = "rsi")))
  )
})

test_that("Extra objects can be passed to calculate_indices()", {
  skip_if_not_installed("terra")
  # covr can't instrument the local block properly
  skip_if(nzchar(Sys.getenv("is_covr")))
  skip_on_cran()
  index_out <- tempfile(fileext = ".tif")

  idx <- suppressWarnings(filter_platforms(
    spectral_indices(download_indices = FALSE, update_cache = FALSE),
    platforms = "Sentinel-1 (Dual Polarisation VV-VH)"
  ))[1, ]
  idx$formula <- "pmax(VH, 1000)"

  expect_warning(
    out <- calculate_indices(
      system.file("rasters/example_sentinel1.tif", package = "rsi"),
      idx,
      index_out,
      names_suffix = "sentinel1",
      extra_objects = list(`pmax` = pmax)
    ),
    class = "rsi_extra_objects"
  )

  expect_true(
    all(terra::values(terra::rast(out)) == 1000)
  )
})

test_that("Index calculations fail when missing a column", {
  skip_on_cran()
  index_out <- tempfile(fileext = ".tif")
  expect_error(
    calculate_indices(
      system.file("rasters/example_sentinel1.tif", package = "rsi"),
      suppressWarnings(filter_platforms(
        spectral_indices(download_indices = FALSE, update_cache = FALSE),
        platforms = "Sentinel-1 (Dual Polarisation VV-VH)"
      ))["formula"],
      index_out
    ),
    class = "rsi_missing_column"
  )
})

test_that("Index calculations fail when missing bands", {
  skip_on_cran()
  index_out <- tempfile(fileext = ".tif")
  expect_error(
    calculate_indices(
      system.file("rasters/example_sentinel1.tif", package = "rsi"),
      suppressWarnings(filter_platforms(
        spectral_indices(download_indices = FALSE, update_cache = FALSE),
        platforms = "Landsat-OLI"
      )),
      index_out
    ),
    class = "rsi_missing_indices"
  )
})

test_that("Index calculations stop obvious security issues", {
  skip_on_cran()
  example_indices <- suppressWarnings(filter_platforms(
    spectral_indices(download_indices = FALSE, update_cache = FALSE),
    platforms = "Sentinel-1 (Dual Polarisation VV-VH)"
  ))[1, ]
  example_indices$formula <- 'system("echo something bad")'
  expect_error(calculate_indices(
    system.file("rasters/example_sentinel1.tif", package = "rsi"),
    example_indices,
    tempfile(fileext = ".tif")
  ))
})
