tests/testthat/test-nested_ifelse_linter.R

test_that("nested_ifelse_linter skips allowed usages", {
  linter <- nested_ifelse_linter()

  expect_lint("if (TRUE) 1 else 2", NULL, linter)
  expect_lint("if (TRUE) 1 else if (TRUE) 2 else 3", NULL, linter)

  expect_lint("ifelse(runif(10) > .2, 4, 6)", NULL, linter)

  # don't block suggested alternatives
  expect_lint("fcase(l1, v1, l2, v2)", NULL, linter)
  expect_lint("case_when(l1 ~ v1, l2 ~ v2)", NULL, linter)
})

test_that("nested_ifelse_linter blocks simple disallowed usages", {
  expect_lint(
    "ifelse(l1, v1, ifelse(l2, v2, v3))",
    rex::rex("Don't use nested ifelse() calls"),
    nested_ifelse_linter()
  )

  expect_lint(
    "ifelse(l1, ifelse(l2, v1, v2), v3)",
    rex::rex("Don't use nested ifelse() calls"),
    nested_ifelse_linter()
  )
})

test_that("nested_ifelse_linter also catches dplyr::if_else", {
  expect_lint(
    "if_else(l1, v1, if_else(l2, v2, v3))",
    rex::rex("Don't use nested if_else() calls"),
    nested_ifelse_linter()
  )

  expect_lint(
    "dplyr::if_else(l1, dplyr::if_else(l2, v1, v2), v3)",
    rex::rex("Don't use nested if_else() calls"),
    nested_ifelse_linter()
  )
})

test_that("nested_ifelse_linter also catches data.table::fifelse", {
  expect_lint(
    "fifelse(l1, v1, fifelse(l2, v2, v3))",
    rex::rex("Don't use nested fifelse() calls"),
    nested_ifelse_linter()
  )

  expect_lint(
    "data.table::fifelse(l1, v1, data.table::fifelse(l2, v2, v3))",
    rex::rex("Don't use nested fifelse() calls"),
    nested_ifelse_linter()
  )

  # not sure why anyone would do this, but the readability still argument holds
  expect_lint(
    "data.table::fifelse(l1, dplyr::if_else(l2, v1, v2), v3)",
    rex::rex("Don't use nested if_else() calls"),
    nested_ifelse_linter()
  )
})

Try the lintr package in your browser

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

lintr documentation built on Nov. 7, 2023, 5:07 p.m.