test_that("addMatch errors when dat lacks z or id", { dat0 <- data.frame(x = rnorm(6), z = c(1, 1, 0, 0, 0, 0), prc = rep(1L, 6)) bd <- basicDistance(dat0) dat <- bd$dat cost <- bd$cost id1 <- dat$id[dat$z == 1] id2 <- dat$id[dat$z == 0] seedM <- blockDesign:::seedMatch(id1[1:2], id2, dat, cost, 0, ncontrols = 1, solver = "rlemon") bad_dat <- dat[, setdiff(names(dat), "z"), drop = FALSE] expect_error( blockDesign:::addMatch(id1, id2, seedM, bad_dat, cost, J = 4L, seed_tc = TRUE, solver = "rlemon" ), "addMatch, z must be" ) }) test_that("addMatch extends a seed match (treated–control)", { set.seed(1) n <- 12L dat0 <- data.frame(x = rnorm(n), z = c(rep(1, 4), rep(0, 8)), prc = rep(1L, n)) bd <- basicDistance(dat0) dat <- bd$dat cost <- bd$cost id1 <- dat$id[dat$z == 1] id2 <- dat$id[dat$z == 0] seedM <- blockDesign:::seedMatch(id1[1:2], id2, dat, cost, 0, ncontrols = 1, solver = "rlemon") am <- blockDesign:::addMatch( id1, id2, seedM, dat, cost, J = 4L, seed_tc = TRUE, solver = "rlemon" ) expect_s3_class(am, "data.frame") expect_true(all(c("mset", "type", "z") %in% names(am))) expect_true(nrow(am) >= nrow(seedM)) expect_equal(levels(am$type), c("seed", "add", "single")) }) test_that("addMatch extends a seed match (control–treated)", { set.seed(2) n <- 12L dat0 <- data.frame(x = rnorm(n), z = c(rep(1, 4), rep(0, 8)), prc = rep(1L, n)) bd <- basicDistance(dat0) dat <- bd$dat cost <- bd$cost id1 <- dat$id[dat$z == 0] id2 <- dat$id[dat$z == 1] seedM <- blockDesign:::seedMatch(id1[1:2], id2, dat, t(cost), 0, ncontrols = 1, solver = "rlemon") seedM <- seedM[order(seedM$mset, 1 - seedM$z), ] am <- blockDesign:::addMatch( id1, id2, seedM, dat, cost, J = 4L, seed_tc = FALSE, solver = "rlemon" ) expect_s3_class(am, "data.frame") expect_true(all(c("mset", "type", "z") %in% names(am))) expect_true(nrow(am) >= nrow(seedM)) expect_equal(levels(am$type), c("seed", "add", "single")) }) test_that("addMatch requires J >= 2", { set.seed(1) n <- 12L dat0 <- data.frame(x = rnorm(n), z = c(rep(1, 4), rep(0, 8)), prc = rep(1L, n)) bd <- basicDistance(dat0) dat <- bd$dat cost <- bd$cost id1 <- dat$id[dat$z == 1] id2 <- dat$id[dat$z == 0] seedM <- blockDesign:::seedMatch(id1[1:2], id2, dat, cost, 0, ncontrols = 1, solver = "rlemon") expect_error( blockDesign:::addMatch( id1, id2, seedM, dat, cost, J = 1L, seed_tc = TRUE, solver = "rlemon" ), "`J`" ) }) test_that("addMatch requires id and z on sdm", { set.seed(1) n <- 12L dat0 <- data.frame(x = rnorm(n), z = c(rep(1, 4), rep(0, 8)), prc = rep(1L, n)) bd <- basicDistance(dat0) dat <- bd$dat cost <- bd$cost id1 <- dat$id[dat$z == 1] id2 <- dat$id[dat$z == 0] seedM <- blockDesign:::seedMatch(id1[1:2], id2, dat, cost, 0, ncontrols = 1, solver = "rlemon") bad_sdm <- seedM[, setdiff(names(seedM), "id"), drop = FALSE] expect_error( blockDesign:::addMatch( id1, id2, bad_sdm, dat, cost, J = 4L, seed_tc = TRUE, solver = "rlemon" ), "column of sdm" ) })