# incompatible type error validates `action`

    Code
      (expect_error(stop_incompatible_type(1, 1, x_arg = "", y_arg = "", action = "c"))
      )
    Output
      <error/rlang_error>
      Error in `stop_incompatible_type()`:
      ! `action` must be one of "combine" or "convert", not "c".
    Code
      (expect_error(stop_incompatible_type(1, 1, x_arg = "", y_arg = "", action = 1)))
    Output
      <error/rlang_error>
      Error in `stop_incompatible_type()`:
      ! `action` must be a character vector, not the number 1.

# can override arg in OOB conditions

    Code
      (expect_error(with_subscript_data(vec_slice(set_names(letters), "foo"), NULL),
      class = "vctrs_error_subscript_oob"))
    Output
      <error/vctrs_error_subscript_oob>
      Error in `vec_slice()`:
      ! Can't subset elements that don't exist.
      x Element `foo` doesn't exist.
    Code
      (expect_error(with_subscript_data(vec_slice(set_names(letters), "foo"), quote(
        foo)), class = "vctrs_error_subscript_oob"))
    Output
      <error/vctrs_error_subscript_oob>
      Error in `vec_slice()`:
      ! Can't subset elements that don't exist.
      x Element `foo` doesn't exist.
    Code
      (expect_error(with_subscript_data(vec_slice(set_names(letters), "foo"), quote(
        foo(bar))), class = "vctrs_error_subscript_oob"))
    Output
      <error/vctrs_error_subscript_oob>
      Error in `vec_slice()`:
      ! Can't subset elements that don't exist.
      x Element `foo` doesn't exist.

# scalar type errors are informative

    Code
      (expect_error(vec_slice(foobar(list(1)), 1), class = "vctrs_error_scalar_type"))
    Output
      <error/vctrs_error_scalar_type>
      Error in `vec_slice()`:
      ! `x` must be a vector, not a <vctrs_foobar> object.
    Code
      (expect_error(stop_scalar_type(foobar(list(1)), arg = "foo"), class = "vctrs_error_scalar_type")
      )
    Output
      <error/vctrs_error_scalar_type>
      Error:
      ! `foo` must be a vector, not a <vctrs_foobar> object.

# empty names errors are informative

    Code
      (expect_error(vec_as_names(c("x", "", "y"), repair = "check_unique"), class = "vctrs_error_names_cannot_be_empty")
      )
    Output
      <error/vctrs_error_names_cannot_be_empty>
      Error:
      ! Names can't be empty.
      x Empty name found at location 2.
    Code
      (expect_error(vec_as_names(c("x", "", "y", ""), repair = "check_unique"),
      class = "vctrs_error_names_cannot_be_empty"))
    Output
      <error/vctrs_error_names_cannot_be_empty>
      Error:
      ! Names can't be empty.
      x Empty names found at locations 2 and 4.
    Code
      (expect_error(vec_as_names(rep("", 10), repair = "check_unique"), class = "vctrs_error_names_cannot_be_empty")
      )
    Output
      <error/vctrs_error_names_cannot_be_empty>
      Error:
      ! Names can't be empty.
      x Empty names found at locations 1, 2, 3, 4, 5, etc.

# dot dot names errors are informative

    Code
      (expect_error(vec_as_names(c("..1", "..1", "..1", "...", "z"), repair = "check_unique"),
      class = "vctrs_error_names_cannot_be_dot_dot"))
    Output
      <error/vctrs_error_names_cannot_be_dot_dot>
      Error:
      ! Names can't be of the form `...` or `..j`.
      x These names are invalid:
        * "..1" at locations 1, 2, and 3.
        * "..." at location 4.
    Code
      (expect_error(vec_as_names(c(rep("..1", 20), rep(c("..2", "..3", "..4", "...",
        "..5"), 2)), repair = "check_unique"), class = "vctrs_error_names_cannot_be_dot_dot")
      )
    Output
      <error/vctrs_error_names_cannot_be_dot_dot>
      Error:
      ! Names can't be of the form `...` or `..j`.
      x These names are invalid:
        * "..1" at locations 1, 2, 3, 4, 5, etc.
        * "..2" at locations 21 and 26.
        * "..3" at locations 22 and 27.
        * "..4" at locations 23 and 28.
        * "..." at locations 24 and 29.
        * ...

# unique names errors are informative

    Code
      (expect_error(vec_as_names(c("x", "x", "x", "y", "y", "z"), repair = "check_unique"),
      class = "vctrs_error_names_must_be_unique"))
    Output
      <error/vctrs_error_names_must_be_unique>
      Error:
      ! Names must be unique.
      x These names are duplicated:
        * "x" at locations 1, 2, and 3.
        * "y" at locations 4 and 5.
    Code
      (expect_error(vec_as_names(c(rep("x", 20), rep(c("a", "b", "c", "d", "e"), 2)),
      repair = "check_unique"), class = "vctrs_error_names_must_be_unique"))
    Output
      <error/vctrs_error_names_must_be_unique>
      Error:
      ! Names must be unique.
      x These names are duplicated:
        * "x" at locations 1, 2, 3, 4, 5, etc.
        * "a" at locations 21 and 26.
        * "b" at locations 22 and 27.
        * "c" at locations 23 and 28.
        * "d" at locations 24 and 29.
        * ...

# lossy cast from character to factor mentions loss of generality

    Code
      (expect_error(vec_cast("a", factor("b")), class = "vctrs_error_cast_lossy"))
    Output
      <error/vctrs_error_cast_lossy>
      Error:
      ! Can't convert from `"a"` <character> to <factor<9b7e3>> due to loss of generality.
      * Locations: 1

# lossy cast `conditionMessage()` result matches `cnd_message()` (#1592)

    Code
      cat(conditionMessage(cnd))
    Output
      Can't convert from `1.5` <double> to <integer> due to loss of precision.
      * Locations: 1

# ordered cast failures mention conversion

    Code
      (expect_error(vec_cast(ordered("x"), ordered("y")), class = "vctrs_error_incompatible_type")
      )
    Output
      <error/vctrs_error_cast>
      Error:
      ! Can't convert `ordered("x")` <ordered<bf275>> to <ordered<fd1ad>>.

# incompatible size errors

    Code
      (expect_error(stop_incompatible_size(1:2, 3:5, 2L, 3L, x_arg = "", y_arg = "")))
    Output
      <error/vctrs_error_incompatible_size>
      Error:
      ! Can't recycle input of size 2 to size 3.
    Code
      (expect_error(stop_incompatible_size(1:2, 3:5, 2L, 3L, x_arg = quote(foo),
      y_arg = "")))
    Output
      <error/vctrs_error_incompatible_size>
      Error:
      ! Can't recycle `foo` (size 2) to size 3.
    Code
      (expect_error(stop_incompatible_size(1:2, 3:5, 2L, 3L, x_arg = "", y_arg = "bar"))
      )
    Output
      <error/vctrs_error_incompatible_size>
      Error:
      ! Can't recycle input of size 2 to match `bar` (size 3).
    Code
      (expect_error(stop_incompatible_size(1:2, 3:5, 2L, 3L, x_arg = quote(foo),
      y_arg = quote(bar))))
    Output
      <error/vctrs_error_incompatible_size>
      Error:
      ! Can't recycle `foo` (size 2) to match `bar` (size 3).

