# enframe -----------------------------------------------------------------

test_that("can convert unnamed vector", {
  expect_identical(
    enframe(3:1),
    tibble(name = 1:3, value = 3:1)
  )
})

test_that("can convert unnamed list", {
  expect_identical(
    enframe(as.list(3:1)),
    tibble(name = 1:3, value = as.list(3:1))
  )
})

test_that("can convert named vector", {
  expect_identical(
    enframe(c(a = 2, b = 1)),
    tibble(name = letters[1:2], value = as.numeric(2:1))
  )
})

test_that("can convert zero-length vector", {
  expect_identical(
    enframe(logical()),
    tibble(name = integer(), value = logical())
  )
})

test_that("can convert NULL (#352)", {
  expect_identical(
    enframe(NULL),
    tibble(name = integer(), value = logical())
  )
})

test_that("can use custom names", {
  expect_identical(
    enframe(letters, name = "index", value = "letter"),
    tibble(
      index = seq_along(letters),
      letter = letters
    )
  )
})

test_that("can enframe without names", {
  expect_identical(
    enframe(letters, name = NULL, value = "letter"),
    tibble(letter = letters)
  )
})

test_that("can't use value = NULL", {
  expect_tibble_abort(
    enframe(letters, value = NULL),
    abort_enframe_value_null()
  )
})

test_that("can't pass non-vector", {
  expect_tibble_abort(
    enframe(lm(speed ~ ., cars)),
    abort_enframe_must_be_vector(lm(speed ~ ., cars))
  )
})


# deframe -----------------------------------------------------------------

test_that("can deframe two-column data frame", {
  expect_identical(
    deframe(tibble(name = letters[1:3], value = 3:1)),
    c(a = 3L, b = 2L, c = 1L)
  )
})

test_that("can deframe one-column data frame", {
  expect_identical(
    deframe(tibble(value = 3:1)),
    3:1
  )
})

test_that("can deframe tibble with list column", {
  expect_identical(
    deframe(tibble(name = letters[1:3], value = as.list(3:1))),
    setNames(as.list(3:1), nm = letters[1:3])
  )
})

test_that("can deframe three-column data frame with warning", {
  expect_warning(
    expect_identical(
      deframe(tibble(name = letters[1:3], value = 3:1, oops = 1:3)),
      c(a = 3L, b = 2L, c = 1L)
    ),
    "one- or two-column",
    fixed = TRUE
  )
})


# roundtrip----------------------------------------------------------------

test_that("can roundtrip record", {
  rcrd <- new_rcrd(data.frame(a = 1:3))
  expect_identical(deframe(enframe(rcrd)), rcrd)
  expect_identical(deframe(enframe(rcrd, name = NULL)), rcrd)
  rcrd_named <- new_rcrd(data.frame(a = 1:3, row.names = letters[1:3]))
  expect_identical(deframe(enframe(rcrd_named)), rcrd_named)
})


# output ------------------------------------------------------------------


test_that("output test", {
  expect_snapshot(error = TRUE, {
    enframe(1:3, value = NULL)

    nrow(enframe(Titanic))
    vec_names(enframe(Titanic)$value)
    enframe(Titanic)$value
  })
})
