test_that("rename_loc() requires named vectors", {
  expect_error(
    rename_loc(letters, c(foo = a)),
    "unnamed vector"
  )
})

test_that("rename_loc() partially renames", {
  expect_identical(
    rename_loc(mtcars, c(foo = cyl, bar = disp)),
    int(foo = 2, bar = 3)
  )
})

test_that("rename_loc() allows renaming to self", {
  expect_identical(
    rename_loc(mtcars, c(mpg = mpg, cyl = cyl)),
    int(mpg = 1, cyl = 2)
  )
})

test_that("rename() always preserves order", {
  expect_identical(
    rename(mtcars, c(disp = disp, cyl = cyl, mpg = mpg)),
    mtcars
  )
})

test_that("rename_loc() partially renames", {
  expect_identical(
    rename_loc(mtcars, c(foo = cyl, bar = disp)),
    int(foo = 2, bar = 3)
  )
})

test_that("rename_loc() requires unique names", {
  expect_error(
    rename_loc(mtcars, c(foo = cyl, foo = disp)),
    class = "vctrs_error_names_must_be_unique"
  )
  expect_error(
    rename_loc(mtcars, c(cyl = mpg, foo = disp)),
    class = "vctrs_error_names_must_be_unique"
  )
})

test_that("rename_loc() disambiguates if necessary", {
  expect_identical(
    rename_loc(mtcars, c(foo = starts_with("d"))),
    int(foo1 = 3, foo2 = 5)
  )
  expect_identical(
    rename_loc(unclass(mtcars), c(foo = starts_with("d"))),
    int(foo = 3, foo = 5)
  )
})

test_that("rename_loc() allows renaming to existing variable that is also renamed", {
  expect_identical(
    rename_loc(mtcars, c(cyl = mpg, foo = cyl)),
    int(cyl = 1, foo = 2)
  )
})

test_that("rename_loc() allows fixing duplicates by locations", {
  dups <- vctrs::new_data_frame(list(x = 1, x = 2))
  expect_identical(
    rename_loc(dups, c(foo = 2L)),
    int(foo = 2)
  )
})

test_that("rename_loc() works with predicate functions", {
  x <- data.frame(a = 1, b = 2, c = "x", stringsAsFactors = FALSE)
  expect_equal(rename_loc(x, c(var = where(is.numeric))), c(var1 = 1, var2 = 2))
  expect_snapshot(rename_loc(x, where(is.numeric)), error = TRUE)
})

test_that("rename_loc() requires named inputs", {
  expect_error(rename_loc(iris, Species), "named")
  expect_error(rename_loc(iris, c(contains("Width"))), "named")
})

test_that("rename_loc() uses names inside c()", {
  expect_identical(rename_loc(iris, c(foo = Species)), c(foo = 5L))
})

test_that("rename_loc() throws helpful errors", {
  expect_snapshot(error = TRUE, {
    "Unnamed vector"
    rename_loc(letters, c(foo = a))

    "Duplicate names (FIXME)"
    rename_loc(mtcars, c(foo = cyl, foo = disp))

    "Unnamed inputs"
    rename_loc(iris, Species)
  })
})
