test_that("basicDistance returns dat and cost", { dat <- data.frame(x1 = 1:6, x2 = rnorm(6), z = c(1, 1, 0, 0, 0, 0), prc = rep(1L, 6)) out <- basicDistance(dat) expect_type(out, "list") expect_named(out, c("dat", "cost")) expect_s3_class(out$dat, "data.frame") expect_true(is.matrix(out$cost) || inherits(out$cost, "matrix")) expect_true(all(c("id", "z", "prc") %in% names(out$dat))) expect_equal(nrow(out$dat), 6L) n_t <- sum(dat$z == 1) n_c <- sum(dat$z == 0) expect_equal(nrow(out$cost), n_t) expect_equal(ncol(out$cost), n_c) rn <- as.numeric(rownames(out$cost)) cn <- as.numeric(colnames(out$cost)) expect_equal(sort(rn), sort(out$dat$id[out$dat$z == 1])) expect_equal(sort(cn), sort(out$dat$id[out$dat$z == 0])) }) test_that("basicDistance relabels conflicting id column", { dat <- data.frame(id = 1:4, z = c(1, 1, 0, 0), prc = 1L, w = 1:4) out <- suppressWarnings(basicDistance(dat)) expect_true("id" %in% names(out$dat)) expect_true(any(grepl("^Previous", names(out$dat)))) }) test_that("basicDistance requires z and prc columns", { expect_error(basicDistance(data.frame(x = 1:3)), "z must be a column") expect_error(basicDistance(data.frame(x = 1:3, z = 1:3)), "prc must be a column") }) test_that("basicDistance rejects invalid z", { dat <- data.frame(x = 1:3, z = c(1, 2, 0), prc = 1:3) expect_error(basicDistance(dat)) }) test_that("basicDistance with compute_distance FALSE returns dat and NULL cost", { dat <- data.frame(x1 = 1:4, x2 = rnorm(4), z = c(1, 1, 0, 0), prc = rep(1L, 4)) out <- basicDistance(dat, compute_distance = FALSE) expect_named(out, c("dat", "cost")) expect_null(out$cost) expect_true(all(c("id", "z", "prc") %in% names(out$dat))) expect_equal(nrow(out$dat), 4L) }) test_that("basicDistance requires at least one treated and one control", { dat <- data.frame(x = 1:3, z = c(1, 1, 1), prc = 1:3) expect_error(basicDistance(dat), "at least one treated") dat$z <- c(0, 0, 0) expect_error(basicDistance(dat), "at least one treated") }) test_that("basicDistance accepts logical z (coerced to numeric)", { dat <- data.frame(x = 1:4, z = c(TRUE, TRUE, FALSE, FALSE), prc = rep(1L, 4)) out <- basicDistance(dat) expect_equal(out$dat$z, c(1, 1, 0, 0)) }) test_that(".validate_cost rejects wrong cost dimensions or names", { dat <- basicDistance(data.frame(x = 1:4, z = c(1, 1, 0, 0), prc = rep(1L, 4)))$dat cost_ok <- matrix(1:4, 2, 2, dimnames = list(c("1", "2"), c("3", "4"))) expect_true(blockDesign:::.validate_cost(cost_ok, dat)) cost_bad_dim <- matrix(1, 1, 2, dimnames = list("1", c("3", "4"))) expect_error(blockDesign:::.validate_cost(cost_bad_dim, dat), "nrow") cost_bad_names <- matrix(1:4, 2, 2, dimnames = list(c("1", "2"), c("3", "9"))) expect_error(blockDesign:::.validate_cost(cost_bad_names, dat), "match") })