test_that("SpatRaster mutate", {
  f <- system.file("extdata/cyl_temp.tif", package = "tidyterra")
  spatrast <- terra::rast(f)

  mod <- spatrast %>%
    mutate(exp_lyr1 = exp(tavg_04 / 10))

  expect_true(compare_spatrasters(spatrast, mod))
  expect_gt(terra::nlyr(mod), terra::nlyr(spatrast))
})


test_that("SpatRaster mutate and check names", {
  f <- system.file("extdata/cyl_temp.tif", package = "tidyterra")

  init <- terra::rast(f)

  spatrast <- init
  names(spatrast) <- c("a", "a", "b")


  expect_snapshot(fixed_names <- dplyr::mutate(spatrast, b2 = a + 100))

  all_eq <- all(names(fixed_names) == make.names(c(
    names(spatrast),
    "b2"
  ), unique = TRUE))

  expect_true(all_eq)

  expect_true(compare_spatrasters(init, fixed_names))


  # Same with layer names as x,y
  names(spatrast) <- c("x", "x", "y")
  expect_snapshot(
    fixed_names2 <- dplyr::mutate(spatrast, b2 = x.1 + x.2 + y.1)
  )

  all_eq <- all(names(fixed_names2) == make.names(
    c(
      "x", "y",
      names(spatrast),
      "b2"
    ),
    unique = TRUE
  )[-c(1, 2)])

  expect_true(all_eq)

  expect_true(compare_spatrasters(init, fixed_names2))
})

test_that("SpatVector", {
  # SpatVector method
  f <- system.file("extdata/cyl.gpkg", package = "tidyterra")
  v <- terra::vect(f)

  mutated <- mutate(v, cpro2 = paste0(cpro, "-CyL"))

  expect_s4_class(mutated, "SpatVector")
  expect_gt(ncol(mutated), ncol(v))
  expect_identical(
    mutated$cpro2,
    paste0(v$cpro, "-CyL")
  )
})


test_that("mutate preserves grouping", {
  df <- tibble::tibble(x = 1:2, y = 2)
  df <- as_spatvector(df, geom = c("x", "y"), keepgeom = TRUE)
  gf <- group_by(df, x)

  out <- mutate(gf, x = 1)
  expect_equal(group_vars(out), "x")
  expect_equal(nrow(group_data(out)), 1)

  out <- mutate(gf, z = 1)
  expect_equal(group_data(out), group_data(gf))
})