# Testing functions performing checks on x and y ####
#withr::local_options(joyn.verbose = FALSE)
x1 = data.frame(
id = c(1L, 1L, 2L, 3L, NA_integer_),
t = c(1L, 2L, 1L, 2L, NA_integer_),
x = 11:15
)
x1_duplicates = data.frame(
id = c(1L, 1L, 2L, 3L, NA_integer_),
x = c(1L, 2L, 1L, 2L, NA_integer_),
x = 11:15,
check.names = FALSE
)
y1 = data.table(id = c(1,2, 4),
y = c(11L, 15L, 16))
x2 = data.frame(
id = c(1, 1, 2, 3, NA),
t = c(1L, 2L, 1L, 2L, NA_integer_),
x = c(16, 12, NA, NA, 15)
)
x3 = data.frame(
id = c(1, 2, 3, 4, 5),
t = c(1L, 2L, 5L, 6L, NA_integer_),
x = c(16, 12, NA, NA, 15)
)
y2 = data.frame(
id = c(1, 2, 5, 6, 3),
yd = c(1, 2, 5, 6, 3),
y = c(11L, 15L, 20L, 13L, 10L),
x = c(16:20)
)
y3 = data.frame(
id = c(1, 2, 2, 6, 3),
yd = c(1, 2, 5, 6, 3),
y = c(11L, 15L, 20L, 13L, 10L),
x = c(16:20)
)
df1 <- data.frame(
id1 = c(1, 1, 2, 3),
id2 = c("a", "b", "b", "c"),
name = c("John", "Jane", "Bob", "Carl"),
age = c(35, 28, 42, 50)
)
df2 <- data.frame(
id1 = c(1, 2, 3, 3),
id2 = c("a", "b", "c", "e"),
salary = c(60000, 55000, 70000, 80000),
dept = c("IT", "Marketing", "Sales", "IT")
)
# Test function checking x and y ---------------------------------------------------------------
test_that("check_xy works as expected", {
# Errors
check_xy(x = x1) |>
expect_error()
check_xy(y = y1) |>
expect_error()
# Checking that msgs stored in env when error exists, and that the function
# aborts when wrong input specification
# When x has 0 length
empty_df = data.frame()
check_xy(x = empty_df,
y = y1) |>
expect_error()
expect_true(rlang::env_has(.joynenv,
"joyn_msgs"))
# When y has 0 length
check_xy(x = x1,
y = empty_df) |>
expect_error()
expect_true(rlang::env_has(.joynenv,
"joyn_msgs"))
# When both x and y have 0 length
clear_joynenv()
check_xy(x = empty_df,
y = empty_df) |>
expect_error()
expect_true(rlang::env_has(.joynenv,
"joyn_msgs"))
# No msg When no duplicate names
clear_joynenv()
check_xy(x = x1,
y = y1)
expect_false(rlang::env_has(.joynenv,
"joyn_msgs"))
# when duplicate names
clear_joynenv()
check_xy(x = x1_duplicates,
y = y1) |>
expect_error()
expect_true(rlang::env_has(.joynenv,
"joyn_msgs"))
})
# Testing function checking duplicate var names in dt ---------------------------------------
test_that("check_duplicate_names works as expected", {
# Check output when duplicates
check_duplicate_names(x1_duplicates, "x") |>
expect_equal(TRUE)
# Check output When no duplicates
check_duplicate_names(x1, "x") |>
expect_equal(FALSE)
# Check msg is stored when duplicates
clear_joynenv()
check_duplicate_names(x1_duplicates, "x")
expect_true(rlang::env_has(.joynenv, "joyn_msgs"))
})
# Test function checking reportvar ---------------------------------------------------------
test_that("check_reportvar works as expected", {
# Inputs
check_reportvar(reportvar = NULL) |>
expect_no_error()
check_reportvar(reportvar = FALSE) |>
expect_no_error()
check_reportvar(reportvar = 2) |>
expect_error()
# Output
check_reportvar(reportvar = NULL) |>
expect_equal(check_reportvar(reportvar = FALSE))
check_reportvar(reportvar = FALSE) |>
expect_equal(NULL)
# Valid name
check_reportvar(".joyn") |>
expect_equal(".joyn")
})
# Test function checking `by` input ---------------------------------------------------------------
test_that("check_by_vars function works as expected", {
# Output
res <- check_by_vars(by = 'id', x = x1, y = y1)
class(res) |>
expect_equal("list")
names(res) |>
expect_equal(c("by", "xby", "yby", "tempkey"))
res$by |>
expect_equal("id")
# Check it throws an error when by is NULL
check_by_vars(by = NULL, x = x1, y = y1) |>
expect_error()
})
# Test function checking match type consistency -------------------------------------------------
test_that("check_match_type works as expected", {
# Inputs
check_match_type(x1, y1, by= NULL) |>
expect_error()
check_match_type(x1, y1, by = "id", match_type = "invalid match_type") |>
expect_error()
# Wrong by var
check_match_type(x4, y2, by = 'id', match_type = "m:m") |>
expect_error()
# Outputs - Errors & Warnings
# If user chooses "1:1" but actually "m:1" -----------------------------------
clear_joynenv()
check_match_type(x1, y1, by = "id", match_type = "1:1") |>
expect_error()
# check error msg is stored in env
rlang::env_get(.joynenv, "joyn_msgs")$type |>
expect_equal("err")
# If user chooses "1:1" but actually "1:m" -----------------------------------
clear_joynenv()
check_match_type(x3, y3, by = "id", match_type = "1:1") |>
expect_error()
# check error msg is stored in env
rlang::env_get(.joynenv, "joyn_msgs")$type |>
expect_equal("err")
# If user chooses "1:1" but actually "m:m" -----------------------------------
clear_joynenv()
check_match_type(df1, df2, by = "id1", match_type = "1:1") |>
expect_error()
# check error msg is stored in env
rlang::env_get(.joynenv, "joyn_msgs")$type |>
expect_equal(c("err", "err"))
# If user chooses "m:1" but it is actually "m:m" -----------------------------
clear_joynenv()
check_match_type(x2, y3, by = 'id', match_type = "m:1") |>
expect_error()
# check err msg is stored in env
rlang::env_get(.joynenv, "joyn_msgs")$type |>
expect_equal(c("err"))
# If user chooses "m:1" but it is actually "1:m" -----------------------------
clear_joynenv()
check_match_type(x3, y3, by = 'id', match_type = "m:1") |>
expect_error()
rlang::env_get(.joynenv, "joyn_msgs")$type |>
expect_equal(c("err"))
# Check warning msgs are stored correctly ------------------------------------
# Warn x
check_match_type(x3, y3, by = 'id', match_type = "m:m")
rlang::env_get(.joynenv,"joyn_msgs")$type|>
expect_contains("warn")
clear_joynenv()
check_match_type(x3, y2, by = 'id', match_type = "m:1")
rlang::env_get(.joynenv,"joyn_msgs")$type|>
expect_contains("warn")
# Warn y
clear_joynenv()
check_match_type(x2, y2, by = 'id', match_type = "m:m", verbose = TRUE)
rlang::env_get(.joynenv, "joyn_msgs")$type |>
expect_equal(c("warn"))
clear_joynenv()
check_match_type(x3, y2, by = 'id', match_type = "1:m", verbose = TRUE)
rlang::env_get(.joynenv, "joyn_msgs")$type |>
expect_equal(c("warn"))
# Warn both
clear_joynenv()
check_match_type(x3, y2, by = 'id', match_type = "m:m")
rlang::env_get(.joynenv, "joyn_msgs")$type |>
expect_equal(c("warn"))
# Output when correct match type ---------------------------------------------
check_match_type(x3, y2, by = "id", match_type = "1:1") |>
expect_equal(c("1", "1"))
check_match_type(df1, df2, by = "id1", match_type = "m:m") |>
expect_equal(c("m", "m"))
check_match_type(x1, y1, by = "id", match_type = "m:1") |>
expect_equal(c("m", "1"))
check_match_type(x3, y2, by = "id", match_type = "1:m") |>
expect_equal(c("1", "m"))
# Output class
class(check_match_type(x1, y1, by = 'id', match_type = "m:1")) |>
expect_equal("character")
})
# Test function confirming if match_type_error ####
test_that("is_match_type_error works as expected", {
clear_joynenv()
# Note (Rossana): to check if this is the correct use
res <- is_match_type_error(x1, "x", by = "id", match_type_error = TRUE)
res |>
expect_equal(TRUE)
expect_true(rlang::env_has(.joynenv,
"joyn_msgs"))
})
# Test function checking vars in Y kept in output table -----------------------------------------------------------------------------
test_that("y_vars_to_keep checks work", {
## var no available ---------
y_vars_to_keep <- "f"
by <- "id"
check_y_vars_to_keep(y_vars_to_keep, y1, by) |>
expect_error()
y_vars_to_keep <- c("F", "r")
check_y_vars_to_keep(y_vars_to_keep, y1, by) |>
expect_error()
## more than one value when no string --------
y_vars_to_keep <- c(TRUE, TRUE)
check_y_vars_to_keep(y_vars_to_keep, y1, by) |>
expect_error()
## something besides character, false, or NULL ---------
check_y_vars_to_keep(NA, y1, by) |>
expect_error()
# Output -------------
check_y_vars_to_keep(NULL, y1, by) |>
expect_null()
check_y_vars_to_keep(FALSE, y1, by) |>
expect_null()
check_y_vars_to_keep("y", y1, by) |>
expect_equal("y")
check_y_vars_to_keep(c("id", "y"), y1, by) |>
expect_equal("y")
check_y_vars_to_keep(TRUE, y1, by) |>
expect_equal("y")
})
# Testing function renaming the variables in y after joining
test_that("check_new_y_vars checks work", {
## no common names, return the same ---------
check_new_y_vars(x = df1, by = "id1",
y_vars_to_keep = "salary") |>
expect_equal("salary")
## when common name, add suffix -----------
check_new_y_vars(x = df1, by = "id1",
y_vars_to_keep = c("id2", "salary")) |>
expect_equal(c("id2.y", "salary"))
class(check_new_y_vars(x = df1, by = "id1", y_vars_to_keep = "salary")) |>
expect_equal("character")
})
# Testing the function that checks if specified "many" relationship is valid ####
test_that("is_valid_m_key works as expected", {
is_valid_m_key(x1, by = 2) |>
expect_error()
is_valid_m_key(x1, by = "id") |>
expect_equal(TRUE)
is_valid_m_key(x1, by = c("id", "x")) |>
expect_equal(FALSE)
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.