test_that("names preserved if outer name is missing", {
  x <- c("a", "z", "")

  expect_equal(outer_names(x, NULL, 3), x)
  expect_equal(outer_names(x, "", 3), x)
  expect_equal(outer_names(x, na_chr, 3), x)
})

test_that("outer name vectorised if needed", {
  expect_equal(outer_names(NULL, "x", 1L), c("x"))
  expect_equal(outer_names(NULL, "x", 2L), c("x1", "x2"))
})

test_that("outer and inner names are combined", {
  expect_equal(outer_names("x", "y", 1), c("y..x"))
})

test_that("options are created", {
  expect_identical(
    unclass(new_opts(c("a", "c"), letters[1:4])),
    c(a = TRUE, b = FALSE, c = TRUE, d = FALSE)
  )
})

test_that("can't supply unknown option", {
  expect_error(
    new_opts(c("a", "foo"), letters[1:4]),
    "Argument must be one of \"a\", \"b\", \"c\" or \"d\""
  )
  expect_error(
    new_opts(c("a", "foo"), letters[1:4], arg = "foo"),
    "`foo` must be one of \"a\", \"b\", \"c\" or \"d\""
  )
})

test_that("`has_dim()` doesn't partial match on the `dim` attribute (#948)", {
  x <- structure(1, dimB = 1)
  expect_false(has_dim(x))
})

test_that("df_has_base_subset() detects `[` methods", {
  expect_true(df_has_base_subset(foobar(mtcars)))

  out <- with_methods(
    `[.vctrs_foobar` = function(x, i, ...) {
      structure(NextMethod(), dispatched = TRUE)
    },
    df_has_base_subset(foobar(mtcars))
  )
  expect_false(out)
})

test_that("vec_common_suffix() finds common suffix", {
  x <- c("foo", "bar", "baz")
  y <- c("quux", "foo", "hop", "baz")
  expect_identical(vec_common_suffix(x, y), "baz")

  x <- c("foo", "bar", "baz")
  y <- c("quux", "foo", "bar", "baz")
  expect_identical(vec_common_suffix(x, y), x)

  x <- letters
  y <- chr()
  expect_identical(vec_common_suffix(x, y), chr())

  x <- data.frame(x = 1:3, y = c("foo", "bar", "baz"))
  y <- data.frame(x = 0:3, y = c("foo", "hop", "bar", "baz"))
  exp <- data.frame(x = 2:3, y = c("bar", "baz"))
  expect_identical(vec_common_suffix(x, y), exp)
})

test_that("fast_c() concatenates", {
  expect_identical(fast_c(character(), "foo"), "foo")
  expect_identical(fast_c("foo", character()), "foo")
  expect_identical(fast_c("foo", c("bar", "baz")), c("foo", "bar", "baz"))
  expect_identical(fast_c(c("bar", "baz"), "foo"), c("bar", "baz", "foo"))
})
