test_that("has ok print method", { pf <- vec_ptype2(partial_frame(x = 1L), data.frame(y = 2)) expect_snapshot(pf) expect_equal(vec_ptype_abbr(pf), "prtl") }) test_that("order of variables comes from data", { pf <- partial_frame(y = 1, x = 2) df <- data.frame(x = 1, y = 2) expect_named(vec_ptype_common(pf, df), c("x", "y")) expect_named(vec_ptype_common(df, pf), c("x", "y")) }) test_that("partial variables added to end if not in data", { pf <- partial_frame(y = 1) df <- data.frame(x = 1) expect_named(vec_ptype_common(pf, df), c("x", "y")) expect_named(vec_ptype_common(df, pf), c("x", "y")) }) test_that("can assert partial frames based on column presence", { pf <- partial_frame(y = 1) expect_true(vec_is(data.frame(y = 2), pf)) expect_false(vec_is(data.frame(x = 1), pf)) expect_true(vec_is(data.frame(x = 1, y = 2), pf)) expect_true(vec_is(data.frame(x = 1, y = 2, z = 3), pf)) pf <- partial_frame(y = 1, z = 3) expect_false(vec_is(data.frame(y = 2), pf)) expect_false(vec_is(data.frame(x = 1), pf)) expect_false(vec_is(data.frame(x = 1, y = 2), pf)) expect_true(vec_is(data.frame(x = 1, y = 2, z = 3), pf)) }) test_that("can assert partial frames based on column type", { pf <- partial_frame(y = 1) expect_false(vec_is(data.frame(y = "2"), pf)) }) test_that("incompatible data frames are an error", { df <- data.frame(y = 1) expect_error(vec_ptype2(df, partial_frame(y = chr())), class = "vctrs_error_incompatible_type") expect_error(new_partial_frame(df, data.frame(y = chr())), class = "vctrs_error_incompatible_type") }) test_that("dispatch is symmetric with tibbles", { # Now causes infloop with the new double-dispatch mechanism because # of the way we call vec_ptype2() from is_same_type() for partial # types return(expect_true(TRUE)) left <- vec_ptype2(partial_frame(x = 1), tibble::tibble(x = 1)) right <- vec_ptype2(tibble::tibble(x = 1), partial_frame(x = 1)) expect_identical(left, right) }) test_that("can take the common type with partial frames", { exp <- data.frame(x = dbl(), y = chr(), a = chr()) out <- vec_ptype_common( partial_frame(x = double(), a = character()), data.frame(x = 1L, y = "a") ) expect_identical(out, exp) out <- vec_ptype_common( data.frame(x = 1L, y = "a"), partial_frame(x = double(), a = character()) ) expect_identical(out, data.frame(x = dbl(), y = chr(), a = chr())) }) test_that("can rbind with a partial frame prototype", { out <- vec_rbind( data.frame(x = 1L, y = "a"), data.frame(x = FALSE, z = 10), .ptype = partial_frame(x = double(), a = character()) ) exp <- data.frame( x = dbl(1, 0), y = chr("a", NA), z = dbl(NA, 10), a = chr(NA, NA) ) expect_identical(out, exp) })