expect_legacy_error <- function(code, ...) {
  expect_error(code)
}

expect_legacy_warning <- function(code, ...) {
  suppressWarnings(expect_warning(code))
}

skip_legacy <- function() {
  skip_if(packageVersion("tibble") >= "2.99.99")
}

skip_brk_add_row_vctrs <- function() {
  # BRK: add_row() uses vctrs coercion rules
  skip_legacy()
}

skip_brk_auto_splice_anonymous <- function() {
  # ENH: tibble() auto-splices anonymous tibble arguments
  skip_legacy()
}

skip_brk_inner_data_frames <- function() {
  # BRK: data frame columns are no longer coerced to tibbles
  skip_legacy()
}

skip_brk_inner_names_not_stripped <- function() {
  # BRK: inner names not stripped from coluns
  skip_legacy()
}

skip_brk_inner_dim_not_stripped <- function() {
  # BRK: inner dim not stripped from coluns
  skip_legacy()
}

skip_brk_no_recursive_indexing <- function() {
  # BRK: no recursive indexing in [[
  skip_legacy()
}

skip_brk_logical_subsetting_no_base_recycling <- function() {
  # BRK: logical indexes must be length one or match the length
  skip_legacy()
}

skip_brk_character_subsetting_no_negative <- function() {
  # BRK: character subsetting for rows no longer supports negative numbers
  skip_legacy()
}

skip_dep_oob_subsetting_warning <- function() {
  # DEP: numeric indexes give warning when indexing OOB
  skip_legacy()
}

skip_dep_rowname_subsetting_warning <- function() {
  # DEP: character indexes give warning with OOB matching
  skip_legacy()
}

skip_dep_new_tibble_subclass <- function() {
  # DEP: new_tibble() warns with subclass argument
  skip_legacy()
}

skip_dep_glimpse <- function() {
  # DEP: glimpse() and format_v() now in pillar
  skip_legacy()
}

skip_enh_posixlt_supported <- function() {
  # ENH: POSIXlt supported
  skip_legacy()
}

skip_enh_as_tibble_rownames <- function() {
  # ENH: rownames argument to as_tibble() works if data frame or matrix doesn't have row names
  skip_legacy()
}

skip_enh_tibble_null <- function() {
  # ENH: NULL arguments to tibble() are silently removed
  skip_legacy()
}

skip_enh_new_tibble_nrow_null <- function() {
  # ENH: new_tibble(nrow = NULL), #781
  skip_legacy()
}

skip_enh_empty_tribble_unspecified <- function() {
  # ENH: zero-row tribbles create unspecified columns
  skip_legacy()
}

skip_enh_as_tibble_retired <- function() {
  # ENH: retiring as_tibble() for vectors and lists, #447
  skip_legacy()
}

skip_enh_bullets_format <- function() {
  # ENH: new bullets format
  skip_legacy()
}

skip_enh_enframe_vector <- function() {
  # ENH: enframe() supports all vectors (#730)
  skip_legacy()
}

skip_enh_print_tbl_args <- function() {
  # ENH: print() and format() support more arguments
  skip_legacy()
}

skip_int_error_unknown_names <- function() {
  # INT: error_unknown_names() no longer implemented
  skip_legacy()
}

skip_int_error_names_must_be_null <- function() {
  # INT: error_names_must_be_null() no longer implemented
  skip_legacy()
}

skip_int_data_frame_tibble_diff <- function() {
  # INT: changed data_frame_() implementation to support custom deprecation warning
  skip_legacy()
}

skip_int_lifecycle <- function() {
  # INT: lifecycle changes classes for deprecation messages in R < 3.6
  skip_legacy()
}

universal_names <- function(...) {
  # INT: universal_names() no longer implemented
  skip_legacy()
}

set_universal_names <- function(...) {
  # INT: set_universal_names() no longer implemented
  skip_legacy()
}

unique_names <- function(...) {
  # INT: unique_names() no longer implemented
  skip_legacy()
}

minimal_names <- function(...) {
  # INT: minimal_names() no longer implemented
  skip_legacy()
}

set_minimal_names <- function(...) {
  # INT: set_minimal_names() no longer implemented
  skip_legacy()
}

make_syntactic <- function(...) {
  # INT: make_syntactic() no longer implemented
  skip_legacy()
}

make_unique <- function(...) {
  # INT: make_unique() no longer implemented
  skip_legacy()
}

two_to_three_dots <- function(...) {
  # INT: two_to_three_dots() no longer implemented
  skip_legacy()
}

expect_output <- function(...) {
  suppressWarnings(testthat::expect_output(...))
}
