tests/testthat/test-expect_length_linter.R

test_that("expect_length_linter skips allowed usages", {
  expect_lint("expect_equal(nrow(x), 4L)", NULL, expect_length_linter())
  # NB: also applies to tinytest, but it's sufficient to test testthat
  expect_lint("testthat::expect_equal(nrow(x), 4L)", NULL, expect_length_linter())

  # only check the first argument. yoda tests in the second argument will be
  #   missed, but there are legitimate uses of length() in argument 2
  expect_lint("expect_equal(nrow(x), length(y))", NULL, expect_length_linter())

  # expect_length() doesn't have info= or label= arguments
  expect_lint("expect_equal(length(x), n, info = 'x should have size n')", NULL, expect_length_linter())
  expect_lint("expect_equal(length(x), n, label = 'x size')", NULL, expect_length_linter())
  expect_lint("expect_equal(length(x), n, expected.label = 'target size')", NULL, expect_length_linter())
})

test_that("expect_length_linter blocks simple disallowed usages", {
  expect_lint(
    "expect_equal(length(x), 2L)",
    rex::rex("expect_length(x, n) is better than expect_equal(length(x), n)"),
    expect_length_linter()
  )

  expect_lint(
    "testthat::expect_equal(length(DF), length(old))",
    rex::rex("expect_length(x, n) is better than expect_equal(length(x), n)"),
    expect_length_linter()
  )

  # yoda test cases
  expect_lint(
    "expect_equal(2, length(x))",
    rex::rex("expect_length(x, n) is better than expect_equal(length(x), n)"),
    expect_length_linter()
  )

  expect_lint(
    "expect_equal(2L, length(x))",
    rex::rex("expect_length(x, n) is better than expect_equal(length(x), n)"),
    expect_length_linter()
  )
})

test_that("expect_length_linter blocks expect_identical usage as well", {
  expect_lint(
    "expect_identical(length(x), 2L)",
    rex::rex("expect_length(x, n) is better than expect_identical(length(x), n)"),
    expect_length_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.