test_that("bump_version() presents all possible incremented versions", {
  expect_identical(
    bump_version("1.1.1.9000"),
    c(major = "2.0.0", minor = "1.2.0", patch = "1.1.2", dev = "1.1.1.9001")
  )
})

test_that("use_version() and use_dev_version() require a package", {
  create_local_project()
  expect_usethis_error(use_version("major"), "not an R package")
  expect_usethis_error(use_dev_version(), "not an R package")
})

test_that("use_version() errors for invalid `which`", {
  create_local_package()
  expect_snapshot(error = TRUE, use_version("1.2.3"))
})

test_that("use_version() increments version in DESCRIPTION, edits NEWS", {
  create_local_package()
  proj_desc_field_update(
    key = "Version",
    value = "1.1.1.9000",
    overwrite = TRUE
  )
  local_cran_version("1.1.1")
  use_news_md()

  use_version("major")
  expect_identical(proj_version(), "2.0.0")

  expect_snapshot(
    writeLines(read_utf8(proj_path("NEWS.md"))),
    transform = scrub_testpkg
  )
})

test_that("use_dev_version() appends .9000 to Version, exactly once", {
  create_local_package()
  proj_desc_field_update(key = "Version", value = "0.0.1", overwrite = TRUE)
  use_dev_version()
  expect_identical(proj_version(), "0.0.1.9000")
  use_dev_version()
  expect_identical(proj_version(), "0.0.1.9000")
})

test_that("use_version() updates (development version) directly", {
  create_local_package()
  proj_desc_field_update(key = "Version", value = "0.0.1", overwrite = TRUE)
  local_cran_version("0.0.1")
  use_news_md()

  # bump to dev to set (development version)
  use_dev_version()

  # directly overwrite development header
  use_version("patch")

  expect_snapshot(
    writeLines(read_utf8(proj_path("NEWS.md"))),
    transform = scrub_testpkg
  )
})

test_that("use_version() updates version.c", {
  create_local_package()
  proj_desc_field_update(key = "Version", value = "1.0.0", overwrite = TRUE)

  name <- project_name()
  src_path <- proj_path("src")
  ver_path <- path(src_path, "version.c")
  dir_create(src_path)

  write_utf8(
    ver_path,
    glue(
      '
    foo;
    const char {name}_version = "1.0.0";
    bar;'
    )
  )

  use_dev_version()

  lines <- read_utf8(ver_path)
  expect_snapshot(writeLines(lines), transform = scrub_testpkg)
})

test_that("is_dev_version() detects dev version directly and with DESCRIPTION", {
  expect_true(is_dev_version("0.0.1.9000"))
  expect_false(is_dev_version("0.0.1"))

  create_local_package()
  proj_desc_field_update(key = "Version", value = "1.0.0", overwrite = TRUE)
  expect_false(is_dev_version())
  use_dev_version()
  expect_true(is_dev_version())
})
