tests/testthat/test-if_else.R

###############################################################################
# Suppressing some functions messages because they only output the information
# on how much time they took.
###############################################################################

dummy_df <- suppressMessages(dummy_data(1000))


test_that("if. can convert values conditionally", {
    test_df <- dummy_df |>
             if.(age < 18,             age_group = "under 18") |>
        else_if.(age >= 18 & age < 65, age_group = "18 to under 65") |>
        else.   (                      age_group = "65 and older")

    expect_true("age_group" %in% names(test_df))
    expect_true(all(c("under 18", "18 to under 65", "65 and older") %in% test_df[["age_group"]]))
})


test_that("else_if. doesn't work without if.", {
    test_df <- dummy_df |>
        else_if.(age >= 18 & age < 65, age_group = "18 to under 65") |>
        else.   (                      age_group = "65 and older")

    expect_true(!"age_group" %in% names(test_df))
})


test_that("else. doesn't work without if.", {
    test_df <- dummy_df |>
        else.(age_group = "65 and older")

    expect_true(!"age_group" %in% names(test_df))
})


test_that("else_if. only alters NA values conditionally", {
    test_df1 <- dummy_df |>
             if.(age >= 18 & age < 65, age_group = "under 18") |>
        else_if.(age >= 18 & age < 65, age_group = "18 to under 65")

    test_df2 <- dummy_df |>
             if.(age < 0,              age_group = "under 18") |>
        else_if.(age >= 18 & age < 65, age_group = "18 to under 65")

    expect_true("age_group" %in% names(test_df1))
    expect_true("age_group" %in% names(test_df2))
    expect_true(!"18 to under 65" %in% test_df1[["age_group"]])
    expect_true(!"under 18" %in% test_df2[["age_group"]])
    expect_true(NA %in% test_df2[["age_group"]])
})


test_that("else. only alters every other NA value", {
    test_df1 <- dummy_df |>
        collapse::fsubset(!is.na(age)) |>
          if.(age < 101, age_group = "under 100") |>
        else.(           age_group = "100 and older")

    test_df2 <- dummy_df |>
        collapse::fsubset(!is.na(age)) |>
          if.(age < 0, age_group = "under 18") |>
        else.(         age_group = "18 and older")

    expect_true("age_group" %in% names(test_df1))
    expect_true("age_group" %in% names(test_df2))
    expect_true(!"100 and older" %in% test_df1[["age_group"]])
    expect_true(!NA %in% test_df2[["age_group"]])
})


test_that("if. and else_if. are not the same", {
    state_df <- dummy_df |>
             if.(state == 1, state_a = "State 1") |>
        else_if.(state < 11, state_a = "West") |>
        else.   (            state_a = "East")

    state_df <- dummy_df |>
          if.(state == 1, state_b = "State 1") |>
          if.(state < 11, state_b = "West") |>
        else.(            state_b = "East")

    expect_false(identical(state_df[["state_a"]], state_df[["state_b"]]))
})


test_that("Type conversion in if. block on type mismatch", {
    expect_message(test_df1 <- dummy_df |>
             if.(age < 18,             age_group = "under 18") |>
        else_if.(age >= 18 & age < 65, age_group = 1) |>
        else.   (                      age_group = "65 and older"), " ! WARNING: Type mismatch")

        expect_message(test_df2 <- dummy_df |>
             if.(age < 18,             age_group = 1) |>
        else_if.(age >= 18 & age < 65, age_group = "18 to under 65") |>
        else.   (                      age_group = 2), " ! WARNING: Type mismatch")
})

###############################################################################
# if. for subsetting
###############################################################################

test_that("Subset data frame with if.", {
    test_df <- dummy_df |> if.(sex == 1)

    expect_true(nrow(test_df) < nrow(dummy_df))
    expect_true(!2 %in% test_df[["sex"]])
})

Try the qol package in your browser

Any scripts or data that you put into this service are public.

qol documentation built on Dec. 14, 2025, 1:06 a.m.