test_that("res_make_empty_df", {
  df <- res_make_empty_df()
  expect_true(inherits(df, "tbl"))
  expect_equal(nrow(df), 0L)
})

test_that("res_df_defaults", {
  empty <- res_make_empty_df()
  def <- res_df_defaults()
  expect_true(all_named(def))
  expect_true(all(names(def) %in% names(empty)))

  def_types <- vcapply(def, class)
  empty_types <- res_df_entry_types()[names(def)]
  expect_true(all(def_types == empty_types | def_types == "call"))

  lengths <- viapply(def, length)
  expect_true(all(lengths == 1L | vcapply(def, class) == "call"))
})

test_that("res_df_entry_types", {
  types <- res_df_entry_types()
  expect_true(all_named(types))
  expect_true(is.character(types))
  expect_false(any(types == ""))
})

test_that("res_df_must_have", {
  types <- res_df_must_have()
  def <- res_df_defaults()
  expect_true(length(intersect(types, def)) == 0)
})

test_that("res_add_df_entries", {
  good <- list(
    ref = "package",
    type = "standard",
    package = "package",
    version = "1.0.0",
    sources = c("url1", "url2")
  )

  empty <- res_make_empty_df()

  df <- res_add_df_entries(empty, good)
  expect_identical(names(df), names(empty))
  expect_equal(nrow(df), 1)

  good2 <- data_frame(
    ref = "package",
    type = "standard",
    package = "package",
    version = "1.0.0",
    sources = list(c("url1", "url2"))
  )

  empty <- res_make_empty_df()

  df2 <- res_add_df_entries(empty, good2)
  expect_identical(df2, df)

  good3 <- data_frame(
    ref = c("package1", "package2"),
    type = c("standard", "cran"),
    package = c("package1", "package2"),
    version = c("1.0.0", "2.0.0"),
    sources = list(c("url1", "url2"), "url3")
  )

  empty <- res_make_empty_df()

  df3 <- res_add_df_entries(empty, good3)
  expect_identical(names(df3), names(empty))
  expect_equal(nrow(df3), 2)
})
