test_that("returns the correct linting", {
  linter <- trailing_whitespace_linter()

  expect_lint("blah", NULL, linter)

  expect_lint(
    "blah <- 1  ",
    list(message = rex::rex("Trailing whitespace is superfluous."), column_number = 10L),
    linter
  )

  expect_lint(
    "blah <- 1  \n'hi'",
    rex::rex("Trailing whitespace is superfluous."),
    linter
  )

  expect_lint(
    "blah <- 1\n'hi'\na <- 2  ",
    list(message = rex::rex("Trailing whitespace is superfluous."), line_number = 3L),
    linter
  )
})

test_that("also handles completely empty lines per allow_empty_lines argument", {
  linter <- trailing_whitespace_linter()

  expect_lint(
    "blah <- 1\n  \n'hi'\na <- 2",
    list(message = rex::rex("Trailing whitespace is superfluous."), line_number = 2L),
    linter
  )

  expect_lint(
    "blah <- 1  ",
    list(message = rex::rex("Trailing whitespace is superfluous."), column_number = 10L),
    trailing_whitespace_linter(allow_empty_lines = TRUE)
  )

  expect_lint(
    "blah <- 1\n  \n'hi'\na <- 2",
    NULL,
    trailing_whitespace_linter(allow_empty_lines = TRUE)
  )
})

test_that("also handles trailing whitespace in string constants", {
  linter <- trailing_whitespace_linter()
  lint_msg <- rex::rex("Trailing whitespace is superfluous.")

  expect_lint("blah <- '  \n  \n'", NULL, linter)
  # Don't exclude past the end of string
  expect_lint(
    "blah <- '  \n  \n'  ",
    list(message = lint_msg, line_number = 3L),
    linter
  )
  # can be enabled with allow_in_strings = FALSE
  expect_lint(
    "blah <- '  \n  \n'",
    list(message = lint_msg, line_number = 1L),
    trailing_whitespace_linter(allow_empty_lines = TRUE, allow_in_strings = FALSE)
  )
  expect_lint(
    "blah <- '  \n  \n'",
    list(
      list(message = lint_msg, line_number = 1L),
      list(message = lint_msg, line_number = 2L)
    ),
    trailing_whitespace_linter(allow_in_strings = FALSE)
  )
})
