
test_that("get_deps", {
  desc <- description$new(test_path("D1"))

  res <- data.frame(
    stringsAsFactors = FALSE,
    type = c("Imports", "Suggests"),
    package = c("R6", "testthat"),
    version = c("*", "*")
  )

  expect_equal(desc$get_deps(), res)
})


test_that("set_dep", {
  desc <- description$new(test_path("D1"))

  desc$set_dep("igraph")

  res <- data.frame(
    stringsAsFactors = FALSE,
    type = c("Imports", "Imports", "Suggests"),
    package = c("igraph", "R6", "testthat"),
    version = c("*", "*", "*")
  )
  expect_equal(desc$get_deps(), res)

  desc$set_dep("igraph", version = ">= 1.0.0")

  res <- data.frame(
    stringsAsFactors = FALSE,
    type = c("Imports", "Imports", "Suggests"),
    package = c("igraph", "R6", "testthat"),
    version = c(">= 1.0.0", "*", "*")
  )

  expect_equal(desc$get_deps(), res)

  desc$set_dep("igraph", type = "Depends", version = ">= 1.0.0")

  res <- data.frame(
    stringsAsFactors = FALSE,
    type = c("Imports", "Imports", "Suggests", "Depends"),
    package = c("igraph", "R6", "testthat", "igraph"),
    version = c(">= 1.0.0", "*", "*", ">= 1.0.0")
  )

  expect_equal(desc$get_deps(), res)

})

test_that("set_dep for the first dependency", {

  desc <- description$new("!new")

  expect_equal(eval(formals(desc$set_dep)[["type"]])[[1L]], "Imports")

  desc$set_dep("igraph")

  res <- data.frame(
    stringsAsFactors = FALSE,
    type = c("Imports"),
    package = c("igraph"),
    version = c("*")
  )
  expect_equal(desc$get_deps(), res)
})

test_that("set_dep preserves order", {
  desc <- description$new("!new")

  desc$set_deps(data.frame(
    stringsAsFactors = FALSE,
    type = c("Depends", "Imports", "Imports"),
    package = c("R", "covr", "testthat"),
    version = "*"
  ))
  desc$set_dep("R6", "Imports")

  expect_equal(
    desc$get_deps()$package,
    c("R", "covr", "R6", "testthat")
  )
})

test_that("set_dep inserts at end if not ordered", {
  desc <- description$new("!new")

  desc$set_deps(data.frame(
    stringsAsFactors = FALSE,
    type = "Imports",
    package = c("testthat", "covr"),
    version = "*"
  ))
  desc$set_dep("R6", "Imports")

  expect_equal(
    desc$get_deps()$package,
    c("testthat", "covr", "R6")
  )
})

test_that("del_dep", {
  desc <- description$new(test_path("D1"))

  desc$set_dep("igraph")
  desc$set_dep("igraph", type = "Depends", version = ">= 1.0.0")
  desc$del_dep("igraph")

  res <- data.frame(
    stringsAsFactors = FALSE,
    type = c("Imports", "Suggests"),
    package = c("R6", "testthat"),
    version = c("*", "*")
  )

  expect_equal(desc$get_deps(), res)

  desc <- description$new(test_path("D1"))

  desc$set_dep("igraph")
  desc$set_dep("igraph", type = "Depends", version = ">= 1.0.0")
  desc$del_dep("igraph", type = "Imports")

  res <- data.frame(
    stringsAsFactors = FALSE,
    type = c("Imports", "Suggests", "Depends"),
    package = c("R6", "testthat", "igraph"),
    version = c("*", "*", ">= 1.0.0")
  )

  expect_equal(desc$get_deps(), res)

})

test_that("deleting all dependencies", {

  desc <- description$new(test_path("D1"))
  desc$del_deps()
  expect_equal(desc$get("Imports"), c(Imports = NA_character_))
  expect_equal(desc$get("Suggests"), c(Suggests = NA_character_))

})

test_that("deleting a non-dependency is OK", {

  desc <- description$new(test_path("D1"))
  before <- desc$get("Imports")
  desc$del_dep("foobar", "Imports")
  after <- desc$get("Imports")
  expect_equal(before, after)
})

test_that("has_dep", {

  desc <- description$new(test_path("D1"))
  expect_true(desc$has_dep("R6"))
  expect_true(desc$has_dep("testthat"))

  expect_true(desc$has_dep("R6", "Imports"))
  expect_true(desc$has_dep("testthat", "Suggests"))

  expect_false(desc$has_dep("foobar"))

  expect_false(desc$has_dep("testthat", "Imports"))

  expect_error(desc$has_dep(123))
  expect_error(desc$has_dep("testthat", "xxx"))
})

test_that("has_dep works when package listed twice", {
  desc <- description$new(test_path("D2"))
  expect_true(desc$has_dep("Rcpp"))
  expect_true(desc$has_dep("Rcpp", "Imports"))
  expect_true(desc$has_dep("Rcpp", "LinkingTo"))
  expect_false(desc$has_dep("Rcpp", "Suggests"))
})

test_that("issue #34 is fine (empty dep fields)", {

  empty_deps <- data.frame(
    stringsAsFactors = FALSE,
    type = character(),
    package = character(),
    version = character()
  )

  desc <- description$new(test_path("D4"))
  expect_silent(deps <- desc$get_deps())
  expect_equal(deps, empty_deps)

  desc$set(Imports = "")
  expect_silent(deps <- desc$get_deps())
  expect_equal(deps, empty_deps)

  expect_silent(desc$set_deps(deps))
  expect_silent(deps <- desc$get_deps())
  expect_equal(deps, empty_deps)
})

test_that("no dependencies at all", {

  empty_deps <- data.frame(
    stringsAsFactors = FALSE,
    type = character(),
    package = character(),
    version = character()
  )

  desc <- description$new(test_path("D6"))
  expect_silent(deps <- desc$get_deps())
  expect_equal(deps, empty_deps)

  expect_silent(desc$set_deps(deps))
  expect_silent(deps <- desc$get_deps())
  expect_equal(deps, empty_deps)
})

test_that("extra whitespace is removed from deps, but kept in raw data", {
  D7 <- description$new(test_path("D7"))
  deps <- D7$get_deps()
  expect_equal(
    deps$version[deps$package == "lme4"],
    ">= 1.0.0"
  )
  expect_equal(
    deps$version[deps$package == "survival"],
    ">= 1.0.1"
  )
  expect_match(
    D7$get("Suggests"),
    "lme4\n        (>= 1.0.0), survival (>=\n        1.0.1)",
    fixed = TRUE
  )
})
